dock: Improve set_parent in StackPanel insert_panel to use defer instead of spawn (#205)
This commit is contained in:
parent
8ece86cd0c
commit
73e82c785a
3 changed files with 15 additions and 32 deletions
|
|
@ -55,12 +55,9 @@ impl StoryWorkspace {
|
||||||
let dock_area = cx.new_view(|cx| DockArea::new("main-dock", stack_panel.clone(), cx));
|
let dock_area = cx.new_view(|cx| DockArea::new("main-dock", stack_panel.clone(), cx));
|
||||||
let weak_dock_area = dock_area.downgrade();
|
let weak_dock_area = dock_area.downgrade();
|
||||||
|
|
||||||
let center_tab_panel =
|
let center_tab_panel = cx.new_view(|cx| TabPanel::new(weak_dock_area.clone(), cx));
|
||||||
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(weak_dock_area.clone(), cx));
|
||||||
let left_tab_panel =
|
let right_tab_panel = cx.new_view(|cx| TabPanel::new(weak_dock_area.clone(), cx));
|
||||||
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));
|
|
||||||
|
|
||||||
stack_panel.update(cx, |view, cx| {
|
stack_panel.update(cx, |view, cx| {
|
||||||
let left_stack_panel = cx.new_view(|cx| StackPanel::new(Axis::Vertical, cx));
|
let left_stack_panel = cx.new_view(|cx| StackPanel::new(Axis::Vertical, cx));
|
||||||
|
|
|
||||||
|
|
@ -191,26 +191,16 @@ impl StackPanel {
|
||||||
})
|
})
|
||||||
.detach();
|
.detach();
|
||||||
|
|
||||||
cx.spawn(|view, mut cx| {
|
let view = cx.view().clone();
|
||||||
let panel = panel.clone();
|
let panel1 = panel.clone();
|
||||||
async move {
|
cx.window_context().defer(move |cx| {
|
||||||
if let Some(view) = view.upgrade() {
|
// If the panel is a TabPanel, set its parent to this.
|
||||||
cx.update(|cx| {
|
if let Ok(tab_panel) = panel1.view().downcast::<TabPanel>() {
|
||||||
// If the panel is a TabPanel, set its parent to this.
|
tab_panel.update(cx, |tab_panel, _| tab_panel.set_parent(view));
|
||||||
if let Ok(tab_panel) = panel.view().downcast::<TabPanel>() {
|
} else if let Ok(stack_panel) = panel1.view().downcast::<Self>() {
|
||||||
tab_panel.update(cx, |tab_panel, _| tab_panel.set_parent(view.clone()));
|
stack_panel.update(cx, |stack_panel, _| stack_panel.parent = Some(view));
|
||||||
} else if let Ok(stack_panel) = panel.view().downcast::<Self>() {
|
|
||||||
stack_panel.update(cx, |stack_panel, _| {
|
|
||||||
stack_panel.parent = Some(view.clone())
|
|
||||||
});
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
.detach();
|
|
||||||
|
|
||||||
let ix = if ix > self.panels.len() {
|
let ix = if ix > self.panels.len() {
|
||||||
self.panels.len()
|
self.panels.len()
|
||||||
|
|
|
||||||
|
|
@ -71,15 +71,11 @@ pub struct TabPanel {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TabPanel {
|
impl TabPanel {
|
||||||
pub fn new(
|
pub fn new(dock_area: WeakView<DockArea>, cx: &mut ViewContext<Self>) -> Self {
|
||||||
stack_panel: Option<View<StackPanel>>,
|
|
||||||
dock_area: WeakView<DockArea>,
|
|
||||||
cx: &mut ViewContext<Self>,
|
|
||||||
) -> Self {
|
|
||||||
Self {
|
Self {
|
||||||
focus_handle: cx.focus_handle(),
|
focus_handle: cx.focus_handle(),
|
||||||
dock_area,
|
dock_area,
|
||||||
stack_panel,
|
stack_panel: None,
|
||||||
panels: Vec::new(),
|
panels: Vec::new(),
|
||||||
active_ix: 0,
|
active_ix: 0,
|
||||||
tab_bar_scroll_handle: ScrollHandle::new(),
|
tab_bar_scroll_handle: ScrollHandle::new(),
|
||||||
|
|
@ -455,7 +451,7 @@ impl TabPanel {
|
||||||
) {
|
) {
|
||||||
let dock_area = self.dock_area.clone();
|
let dock_area = self.dock_area.clone();
|
||||||
// wrap the panel in a TabPanel
|
// 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| {
|
new_tab_panel.update(cx, |view, cx| {
|
||||||
view.add_panel(panel, cx);
|
view.add_panel(panel, cx);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue