From e507eadb4b08d284d04a906ddd80517193104ceb Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 10 May 2023 15:43:44 +0200 Subject: [PATCH] Rely on root getting re-focused when panel isn't rendered This achieves two things: - When a panel like `TerminalPanel` closes its last tab, the focus is returned to the root view (the `Workspace`) - When a panel is moved from a dock to another, it will get rendered in another spot but the focus will be kept on the panel This also ensures the focus is not lost when a panel is moved from a dock to another because that view --- crates/workspace/src/dock.rs | 11 +++------- crates/workspace/src/workspace.rs | 35 +++++++++++-------------------- 2 files changed, 15 insertions(+), 31 deletions(-) diff --git a/crates/workspace/src/dock.rs b/crates/workspace/src/dock.rs index 6f7f6b1c12a9c6c31ab9c265fd0cf8053059fa86..0948140e8e5b2bf03c526f2714cb6d67a2d3bca1 100644 --- a/crates/workspace/src/dock.rs +++ b/crates/workspace/src/dock.rs @@ -81,10 +81,6 @@ impl From<&dyn PanelHandle> for AnyViewHandle { } } -pub enum Event { - Close, -} - pub struct Dock { position: DockPosition, panels: Vec, @@ -182,7 +178,6 @@ impl Dock { } pub fn toggle_open(&mut self, cx: &mut ViewContext) { - if self.is_open {} self.is_open = !self.is_open; cx.notify(); } @@ -200,7 +195,7 @@ impl Dock { this.activate_item(ix, cx); } } else if view.read(cx).should_close_on_event(event, cx) { - cx.emit(Event::Close); + this.set_open(false, cx); } }), ]; @@ -226,7 +221,7 @@ impl Dock { { if panel_ix == self.active_item_ix { self.active_item_ix = 0; - cx.emit(Event::Close); + self.set_open(false, cx); } self.panels.remove(panel_ix); cx.notify(); @@ -261,7 +256,7 @@ impl Dock { } impl Entity for Dock { - type Event = Event; + type Event = (); } impl View for Dock { diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index d147557103e94550958dd7e55ea066dd47e5cd68..497b28cff10425da6c6a0bf6324b5594a9e9d479 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -612,9 +612,18 @@ impl Workspace { .spawn(DB.set_window_bounds(workspace_id, bounds, display)) .detach_and_log_err(cx); }), - Self::register_dock(&left_dock, cx), - Self::register_dock(&bottom_dock, cx), - Self::register_dock(&right_dock, cx), + cx.observe(&left_dock, |this, _, cx| { + this.serialize_workspace(cx); + cx.notify(); + }), + cx.observe(&bottom_dock, |this, _, cx| { + this.serialize_workspace(cx); + cx.notify(); + }), + cx.observe(&right_dock, |this, _, cx| { + this.serialize_workspace(cx); + cx.notify(); + }), ]; let mut this = Workspace { @@ -1359,26 +1368,6 @@ impl Workspace { } } - fn register_dock(dock: &ViewHandle, cx: &mut ViewContext) -> Subscription { - cx.subscribe(dock, Self::handle_dock_event) - } - - fn handle_dock_event( - &mut self, - dock: ViewHandle, - event: &dock::Event, - cx: &mut ViewContext, - ) { - match event { - dock::Event::Close => { - dock.update(cx, |dock, cx| dock.set_open(false, cx)); - self.serialize_workspace(cx); - cx.focus_self(); - cx.notify(); - } - } - } - pub fn toggle_dock(&mut self, dock_side: DockPosition, cx: &mut ViewContext) { let dock = match dock_side { DockPosition::Left => &mut self.left_dock,