From 79e6dedb7a98bcc5b7f97aed91f5953579a4d6dd Mon Sep 17 00:00:00 2001 From: Julia Date: Fri, 8 Dec 2023 13:49:42 -0500 Subject: [PATCH] Track focus shenanigans with context menu Co-Authored-By: Max Brunsfeld --- crates/terminal_view2/src/terminal_element.rs | 16 ++---------- crates/terminal_view2/src/terminal_view.rs | 25 +++++++++---------- crates/ui2/src/components/context_menu.rs | 6 +---- 3 files changed, 15 insertions(+), 32 deletions(-) diff --git a/crates/terminal_view2/src/terminal_element.rs b/crates/terminal_view2/src/terminal_element.rs index d61ba5988e23f3ccfe5adb9264b549859373adf7..907e8cd9c159907e294f0b42464c678ae183d3a9 100644 --- a/crates/terminal_view2/src/terminal_element.rs +++ b/crates/terminal_view2/src/terminal_element.rs @@ -5,7 +5,7 @@ use gpui::{ FontStyle, FontWeight, HighlightStyle, Hsla, InteractiveElement, InteractiveElementState, IntoElement, LayoutId, Model, ModelContext, ModifiersChangedEvent, MouseButton, Pixels, PlatformInputHandler, Point, Rgba, ShapedLine, Size, StatefulInteractiveElement, Styled, - TextRun, TextStyle, TextSystem, UnderlineStyle, View, WhiteSpace, WindowContext, + TextRun, TextStyle, TextSystem, UnderlineStyle, WhiteSpace, WindowContext, }; use itertools::Itertools; use language::CursorShape; @@ -27,8 +27,6 @@ use ui::Tooltip; use std::mem; use std::{fmt::Debug, ops::RangeInclusive}; -use crate::TerminalView; - ///The information generated during layout that is necessary for painting pub struct LayoutState { cells: Vec, @@ -149,7 +147,6 @@ impl LayoutRect { ///We need to keep a reference to the view for mouse events, do we need it for any other terminal stuff, or can we move that to connection? pub struct TerminalElement { terminal: Model, - terminal_view: View, focus: FocusHandle, focused: bool, cursor_visible: bool, @@ -168,7 +165,6 @@ impl StatefulInteractiveElement for TerminalElement {} impl TerminalElement { pub fn new( terminal: Model, - terminal_view: View, focus: FocusHandle, focused: bool, cursor_visible: bool, @@ -176,7 +172,6 @@ impl TerminalElement { ) -> TerminalElement { TerminalElement { terminal, - terminal_view, focused, focus: focus.clone(), cursor_visible, @@ -774,18 +769,11 @@ impl Element for TerminalElement { (layout_id, interactive_state) } - fn paint( - mut self, - bounds: Bounds, - state: &mut Self::State, - cx: &mut WindowContext<'_>, - ) { + fn paint(self, bounds: Bounds, state: &mut Self::State, cx: &mut WindowContext<'_>) { let mut layout = self.compute_layout(bounds, cx); let theme = cx.theme(); - let dispatch_context = self.terminal_view.read(cx).dispatch_context(cx); - self.interactivity().key_context = Some(dispatch_context); cx.paint_quad( bounds, Default::default(), diff --git a/crates/terminal_view2/src/terminal_view.rs b/crates/terminal_view2/src/terminal_view.rs index c4f1512e8cc22df8175eb1cf6af3d73ae2846f7c..d41e535d50eee6bc999ec7eea995fab8a84a9b59 100644 --- a/crates/terminal_view2/src/terminal_view.rs +++ b/crates/terminal_view2/src/terminal_view.rs @@ -632,7 +632,6 @@ impl Render for TerminalView { fn render(&mut self, cx: &mut ViewContext) -> Self::Element { let terminal_handle = self.terminal.clone(); - let this_view = cx.view().clone(); let self_id = cx.entity_id(); let focused = self.focus_handle.is_focused(cx); @@ -640,22 +639,25 @@ impl Render for TerminalView { div() .size_full() .relative() + .track_focus(&self.focus_handle) + .key_context(self.dispatch_context(cx)) + .on_action(cx.listener(TerminalView::send_text)) + .on_action(cx.listener(TerminalView::send_keystroke)) + .on_action(cx.listener(TerminalView::copy)) + .on_action(cx.listener(TerminalView::paste)) + .on_action(cx.listener(TerminalView::clear)) + .on_action(cx.listener(TerminalView::show_character_palette)) + .on_action(cx.listener(TerminalView::select_all)) + .on_focus_in(cx.listener(Self::focus_in)) + .on_focus_out(cx.listener(Self::focus_out)) + .on_key_down(cx.listener(Self::key_down)) .child( div() .z_index(0) .absolute() .size_full() - .on_key_down(cx.listener(Self::key_down)) - .on_action(cx.listener(TerminalView::send_text)) - .on_action(cx.listener(TerminalView::send_keystroke)) - .on_action(cx.listener(TerminalView::copy)) - .on_action(cx.listener(TerminalView::paste)) - .on_action(cx.listener(TerminalView::clear)) - .on_action(cx.listener(TerminalView::show_character_palette)) - .on_action(cx.listener(TerminalView::select_all)) .child(TerminalElement::new( terminal_handle, - this_view, self.focus_handle.clone(), focused, self.should_show_cursor(focused, cx), @@ -675,9 +677,6 @@ impl Render for TerminalView { .anchor(gpui::AnchorCorner::TopLeft) .child(menu.clone()) })) - .track_focus(&self.focus_handle) - .on_focus_in(cx.listener(Self::focus_in)) - .on_focus_out(cx.listener(Self::focus_out)) } } diff --git a/crates/ui2/src/components/context_menu.rs b/crates/ui2/src/components/context_menu.rs index 0d6a632db58f3d750bcd8e60cf6a9a92b5405468..c2dc0abe1ab3dd87557dc52abb5b50032ab3be34 100644 --- a/crates/ui2/src/components/context_menu.rs +++ b/crates/ui2/src/components/context_menu.rs @@ -239,7 +239,6 @@ impl Render for ContextMenu { action, } => { let handler = handler.clone(); - let dismiss = cx.listener(|_, _, cx| cx.emit(DismissEvent)); let label_element = if let Some(icon) = icon { h_stack() @@ -263,10 +262,7 @@ impl Render for ContextMenu { })), ) .selected(Some(ix) == self.selected_index) - .on_click(move |event, cx| { - handler(cx); - dismiss(event, cx) - }) + .on_click(move |_, cx| handler(cx)) .into_any_element() } },