diff --git a/crates/ui/src/dock/stack_panel.rs b/crates/ui/src/dock/stack_panel.rs index a9f20cb7..4ff76fe0 100644 --- a/crates/ui/src/dock/stack_panel.rs +++ b/crates/ui/src/dock/stack_panel.rs @@ -20,7 +20,7 @@ use gpui::{ use smallvec::SmallVec; pub struct StackPanel { - pub(super) parent: Option>, + pub(super) parent: Option>, pub(super) axis: Axis, focus_handle: FocusHandle, pub(crate) panels: SmallVec<[Arc; 2]>, @@ -180,9 +180,11 @@ impl StackPanel { move |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)); + tab_panel.update(cx, |tab_panel, _| tab_panel.set_parent(view.downgrade())); } else if let Ok(stack_panel) = panel.view().downcast::() { - stack_panel.update(cx, |stack_panel, _| stack_panel.parent = Some(view)); + stack_panel.update(cx, |stack_panel, _| { + stack_panel.parent = Some(view.downgrade()) + }); } // Subscribe to the panel's layout change event. @@ -258,7 +260,7 @@ impl StackPanel { let view = cx.view().clone(); if let Some(parent) = self.parent.as_ref() { - parent.update(cx, |parent, cx| { + _ = parent.update(cx, |parent, cx| { parent.remove_panel(Arc::new(view.clone()), cx); }); } @@ -291,8 +293,8 @@ impl StackPanel { ) -> bool { let first_panel = self.panels.first(); - if let Some(parent) = &self.parent { - if check_parent { + if check_parent { + if let Some(parent) = self.parent.as_ref().and_then(|parent| parent.upgrade()) { return parent.read(cx).is_top_left_panel(panel, true, cx); } } @@ -320,8 +322,8 @@ impl StackPanel { self.panels.last() }; - if let Some(parent) = &self.parent { - if check_parent { + if check_parent { + if let Some(parent) = self.parent.as_ref().and_then(|parent| parent.upgrade()) { return parent.read(cx).is_top_right_panel(panel, true, cx); } } diff --git a/crates/ui/src/dock/tab_panel.rs b/crates/ui/src/dock/tab_panel.rs index b037b674..84a40e8f 100644 --- a/crates/ui/src/dock/tab_panel.rs +++ b/crates/ui/src/dock/tab_panel.rs @@ -60,7 +60,7 @@ pub struct TabPanel { focus_handle: FocusHandle, dock_area: WeakView, /// The stock_panel can be None, if is None, that means the panels can't be split or move - stack_panel: Option>, + stack_panel: Option>, pub(crate) panels: Vec>, pub(crate) active_ix: usize, /// If this is true, the Panel closeable will follow the active panel's closeable, @@ -128,7 +128,7 @@ impl Panel for TabPanel { impl TabPanel { pub fn new( - stack_panel: Option>, + stack_panel: Option>, dock_area: WeakView, cx: &mut ViewContext, ) -> Self { @@ -146,8 +146,8 @@ impl TabPanel { } } - pub(super) fn set_parent(&mut self, parent: View) { - self.stack_panel = Some(parent); + pub(super) fn set_parent(&mut self, view: WeakView) { + self.stack_panel = Some(view); } /// Return current active_panel View @@ -253,9 +253,9 @@ impl TabPanel { let tab_view = cx.view().clone(); if let Some(stack_panel) = self.stack_panel.as_ref() { - stack_panel.update(cx, |view, cx| { + _ = stack_panel.update(cx, |view, cx| { view.remove_panel(Arc::new(tab_view), cx); - }) + }); } } @@ -365,8 +365,11 @@ impl TabPanel { if self_is_left_dock || self_is_right_dock || self_is_bottom_dock { return None; } - - if let Some(parent) = self.stack_panel.as_ref() { + if let Some(parent) = self + .stack_panel + .as_ref() + .and_then(|parent| parent.upgrade()) + { if !parent .read(cx) .is_top_left_panel(cx.view().clone(), true, cx) @@ -384,7 +387,11 @@ impl TabPanel { return None; } - if let Some(parent) = self.stack_panel.as_ref() { + if let Some(parent) = self + .stack_panel + .as_ref() + .and_then(|parent| parent.upgrade()) + { if !parent .read(cx) .is_top_right_panel(cx.view().clone(), true, cx) @@ -749,7 +756,11 @@ impl TabPanel { view.add_panel(panel, cx); }); - let stack_panel = self.stack_panel.as_ref().unwrap(); + let stack_panel = match self.stack_panel.as_ref().and_then(|panel| panel.upgrade()) { + Some(panel) => panel, + None => return, + }; + let parent_axis = stack_panel.read(cx).axis; let ix = stack_panel @@ -796,7 +807,7 @@ impl TabPanel { } else { cx.new_view(|cx| { let mut panel = StackPanel::new(placement.axis(), cx); - panel.parent = Some(stack_panel.clone()); + panel.parent = Some(stack_panel.downgrade()); panel }) }; @@ -812,7 +823,7 @@ impl TabPanel { } }); - if *stack_panel != new_stack_panel { + if stack_panel != new_stack_panel { stack_panel.update(cx, |view, cx| { view.replace_panel(Arc::new(tab_panel.clone()), new_stack_panel.clone(), cx); }); diff --git a/crates/ui/src/resizable/panel.rs b/crates/ui/src/resizable/panel.rs index 7453a531..f76f67c0 100644 --- a/crates/ui/src/resizable/panel.rs +++ b/crates/ui/src/resizable/panel.rs @@ -4,7 +4,7 @@ use gpui::{ canvas, div, prelude::FluentBuilder, px, relative, Along, AnyElement, AnyView, Axis, Bounds, Element, Entity, EntityId, EventEmitter, IntoElement, IsZero, MouseMoveEvent, MouseUpEvent, ParentElement, Pixels, Render, StatefulInteractiveElement as _, Style, Styled, View, - ViewContext, VisualContext as _, WindowContext, + ViewContext, VisualContext as _, WeakView, WindowContext, }; use crate::{h_flex, v_flex, AxisExt}; @@ -96,7 +96,7 @@ impl ResizablePanelGroup { pub fn add_child(&mut self, panel: ResizablePanel, cx: &mut ViewContext) { let mut panel = panel; panel.axis = self.axis; - panel.group = Some(cx.view().clone()); + panel.group = Some(cx.view().downgrade()); self.sizes.push(panel.initial_size.unwrap_or_default()); self.panels.push(cx.new_view(|_| panel)); } @@ -104,7 +104,7 @@ impl ResizablePanelGroup { pub fn insert_child(&mut self, panel: ResizablePanel, ix: usize, cx: &mut ViewContext) { let mut panel = panel; panel.axis = self.axis; - panel.group = Some(cx.view().clone()); + panel.group = Some(cx.view().downgrade()); self.sizes .insert(ix, panel.initial_size.unwrap_or_default()); @@ -128,7 +128,7 @@ impl ResizablePanelGroup { panel.initial_size = old_panel_initial_size; panel.size_ratio = old_panel_size_ratio; panel.axis = self.axis; - panel.group = Some(cx.view().clone()); + panel.group = Some(cx.view().downgrade()); self.sizes[ix] = panel.initial_size.unwrap_or_default(); self.panels[ix] = cx.new_view(|_| panel); cx.notify() @@ -275,7 +275,7 @@ impl Render for ResizablePanelGroup { } pub struct ResizablePanel { - group: Option>, + group: Option>, /// Initial size is the size that the panel has when it is created. initial_size: Option, /// size is the size that the panel has when it is resized or adjusted by flex layout. @@ -332,7 +332,7 @@ impl ResizablePanel { let panel_view = cx.view().clone(); if let Some(group) = self.group.as_ref() { - group.update(cx, |view, _| { + _ = group.update(cx, |view, _| { if let Some(ix) = view .panels .iter() @@ -340,7 +340,7 @@ impl ResizablePanel { { view.sizes[ix] = new_size; } - }) + }); } cx.notify(); } @@ -351,7 +351,11 @@ impl FluentBuilder for ResizablePanel {} impl Render for ResizablePanel { fn render(&mut self, cx: &mut ViewContext) -> impl IntoElement { let view = cx.view().clone(); - let total_size = self.group.as_ref().map(|group| group.read(cx).total_size()); + let total_size = self + .group + .as_ref() + .and_then(|group| group.upgrade()) + .map(|group| group.read(cx).total_size()); div() .flex()