From 73e82c785a934e12855676837fcc3e370fe4fa86 Mon Sep 17 00:00:00 2001 From: Jason Lee Date: Tue, 3 Sep 2024 11:18:57 +0800 Subject: [PATCH] dock: Improve set_parent in StackPanel insert_panel to use `defer` instead of `spawn` (#205) --- crates/app/src/story_workspace.rs | 9 +++------ crates/ui/src/dock/stack_panel.rs | 28 +++++++++------------------- crates/ui/src/dock/tab_panel.rs | 10 +++------- 3 files changed, 15 insertions(+), 32 deletions(-) diff --git a/crates/app/src/story_workspace.rs b/crates/app/src/story_workspace.rs index ffcb318b..baeb03d8 100644 --- a/crates/app/src/story_workspace.rs +++ b/crates/app/src/story_workspace.rs @@ -55,12 +55,9 @@ impl StoryWorkspace { let dock_area = cx.new_view(|cx| DockArea::new("main-dock", stack_panel.clone(), cx)); let weak_dock_area = dock_area.downgrade(); - let center_tab_panel = - cx.new_view(|cx| TabPanel::new(Some(stack_panel.clone()), weak_dock_area.clone(), cx)); - let left_tab_panel = - cx.new_view(|cx| TabPanel::new(Some(stack_panel.clone()), weak_dock_area.clone(), cx)); - let right_tab_panel = - cx.new_view(|cx| TabPanel::new(Some(stack_panel.clone()), weak_dock_area.clone(), cx)); + let center_tab_panel = cx.new_view(|cx| TabPanel::new(weak_dock_area.clone(), cx)); + let left_tab_panel = cx.new_view(|cx| TabPanel::new(weak_dock_area.clone(), cx)); + let right_tab_panel = cx.new_view(|cx| TabPanel::new(weak_dock_area.clone(), cx)); stack_panel.update(cx, |view, cx| { let left_stack_panel = cx.new_view(|cx| StackPanel::new(Axis::Vertical, cx)); diff --git a/crates/ui/src/dock/stack_panel.rs b/crates/ui/src/dock/stack_panel.rs index ed4f4c2c..e0088dd4 100644 --- a/crates/ui/src/dock/stack_panel.rs +++ b/crates/ui/src/dock/stack_panel.rs @@ -191,26 +191,16 @@ impl StackPanel { }) .detach(); - cx.spawn(|view, mut cx| { - let panel = panel.clone(); - async move { - if let Some(view) = view.upgrade() { - cx.update(|cx| { - // If the panel is a TabPanel, set its parent to this. - if let Ok(tab_panel) = panel.view().downcast::() { - tab_panel.update(cx, |tab_panel, _| tab_panel.set_parent(view.clone())); - } else if let Ok(stack_panel) = panel.view().downcast::() { - stack_panel.update(cx, |stack_panel, _| { - stack_panel.parent = Some(view.clone()) - }); - } - }) - } else { - Ok(()) - } + let view = cx.view().clone(); + let panel1 = panel.clone(); + cx.window_context().defer(move |cx| { + // If the panel is a TabPanel, set its parent to this. + if let Ok(tab_panel) = panel1.view().downcast::() { + tab_panel.update(cx, |tab_panel, _| tab_panel.set_parent(view)); + } else if let Ok(stack_panel) = panel1.view().downcast::() { + stack_panel.update(cx, |stack_panel, _| stack_panel.parent = Some(view)); } - }) - .detach(); + }); let ix = if ix > self.panels.len() { self.panels.len() diff --git a/crates/ui/src/dock/tab_panel.rs b/crates/ui/src/dock/tab_panel.rs index b5cc7348..002986ac 100644 --- a/crates/ui/src/dock/tab_panel.rs +++ b/crates/ui/src/dock/tab_panel.rs @@ -71,15 +71,11 @@ pub struct TabPanel { } impl TabPanel { - pub fn new( - stack_panel: Option>, - dock_area: WeakView, - cx: &mut ViewContext, - ) -> Self { + pub fn new(dock_area: WeakView, cx: &mut ViewContext) -> Self { Self { focus_handle: cx.focus_handle(), dock_area, - stack_panel, + stack_panel: None, panels: Vec::new(), active_ix: 0, tab_bar_scroll_handle: ScrollHandle::new(), @@ -455,7 +451,7 @@ impl TabPanel { ) { let dock_area = self.dock_area.clone(); // wrap the panel in a TabPanel - let new_tab_panel = cx.new_view(|cx| Self::new(None, dock_area.clone(), cx)); + let new_tab_panel = cx.new_view(|cx| Self::new(dock_area.clone(), cx)); new_tab_panel.update(cx, |view, cx| { view.add_panel(panel, cx); });