Remove the ability to retrieve the view's parent

Antonio Scandurra created

Change summary

crates/collab_ui/src/collab_titlebar_item.rs |  3 ++-
crates/context_menu/src/context_menu.rs      | 14 ++++++--------
crates/copilot_button/src/copilot_button.rs  |  3 ++-
crates/editor/src/editor.rs                  |  4 +++-
crates/gpui/src/app.rs                       |  4 ----
crates/gpui/src/app/window.rs                | 10 ----------
crates/project_panel/src/project_panel.rs    |  3 ++-
crates/terminal_view/src/terminal_button.rs  |  3 ++-
crates/terminal_view/src/terminal_view.rs    |  3 ++-
crates/workspace/src/pane.rs                 |  5 +++--
10 files changed, 22 insertions(+), 30 deletions(-)

Detailed changes

crates/collab_ui/src/collab_titlebar_item.rs 🔗

@@ -165,6 +165,7 @@ impl CollabTitlebarItem {
             }),
         );
 
+        let view_id = cx.view_id();
         Self {
             workspace: workspace.weak_handle(),
             project,
@@ -172,7 +173,7 @@ impl CollabTitlebarItem {
             client,
             contacts_popover: None,
             user_menu: cx.add_view(|cx| {
-                let mut menu = ContextMenu::new(cx);
+                let mut menu = ContextMenu::new(view_id, cx);
                 menu.set_position_mode(OverlayPositionMode::Local);
                 menu
             }),

crates/context_menu/src/context_menu.rs 🔗

@@ -127,7 +127,7 @@ pub struct ContextMenu {
     visible: bool,
     previously_focused_view_id: Option<usize>,
     clicked: bool,
-    parent_view_id: usize,
+    view_id: usize,
     _actions_observation: Subscription,
 }
 
@@ -178,9 +178,7 @@ impl View for ContextMenu {
 }
 
 impl ContextMenu {
-    pub fn new(cx: &mut ViewContext<Self>) -> Self {
-        let parent_view_id = cx.parent().unwrap();
-
+    pub fn new(view_id: usize, cx: &mut ViewContext<Self>) -> Self {
         Self {
             show_count: 0,
             anchor_position: Default::default(),
@@ -191,7 +189,7 @@ impl ContextMenu {
             visible: Default::default(),
             previously_focused_view_id: Default::default(),
             clicked: false,
-            parent_view_id,
+            view_id,
             _actions_observation: cx.observe_actions(Self::action_dispatched),
         }
     }
@@ -227,7 +225,7 @@ impl ContextMenu {
                 match action {
                     ContextMenuItemAction::Action(action) => {
                         let window_id = cx.window_id();
-                        let view_id = self.parent_view_id;
+                        let view_id = self.view_id;
                         let action = action.boxed_clone();
                         cx.app_context()
                             .spawn(|mut cx| async move {
@@ -381,7 +379,7 @@ impl ContextMenu {
 
                                 match action {
                                     ContextMenuItemAction::Action(action) => KeystrokeLabel::new(
-                                        self.parent_view_id,
+                                        self.view_id,
                                         action.boxed_clone(),
                                         style.keystroke.container,
                                         style.keystroke.text.clone(),
@@ -421,7 +419,7 @@ impl ContextMenu {
                     match item {
                         ContextMenuItem::Item { label, action } => {
                             let action = action.clone();
-                            let view_id = self.parent_view_id;
+                            let view_id = self.view_id;
                             MouseEventHandler::<MenuItem, ContextMenu>::new(ix, cx, |state, _| {
                                 let style =
                                     style.item.style_for(state, Some(ix) == self.selected_index);

crates/copilot_button/src/copilot_button.rs 🔗

@@ -142,8 +142,9 @@ impl View for CopilotButton {
 
 impl CopilotButton {
     pub fn new(cx: &mut ViewContext<Self>) -> Self {
+        let button_view_id = cx.view_id();
         let menu = cx.add_view(|cx| {
-            let mut menu = ContextMenu::new(cx);
+            let mut menu = ContextMenu::new(button_view_id, cx);
             menu.set_position_mode(OverlayPositionMode::Local);
             menu
         });

crates/editor/src/editor.rs 🔗

@@ -1227,6 +1227,7 @@ impl Editor {
         get_field_editor_theme: Option<Arc<GetFieldEditorTheme>>,
         cx: &mut ViewContext<Self>,
     ) -> Self {
+        let editor_view_id = cx.view_id();
         let display_map = cx.add_model(|cx| {
             let settings = cx.global::<Settings>();
             let style = build_style(&*settings, get_field_editor_theme.as_deref(), None, cx);
@@ -1274,7 +1275,8 @@ impl Editor {
             background_highlights: Default::default(),
             nav_history: None,
             context_menu: None,
-            mouse_context_menu: cx.add_view(context_menu::ContextMenu::new),
+            mouse_context_menu: cx
+                .add_view(|cx| context_menu::ContextMenu::new(editor_view_id, cx)),
             completion_tasks: Default::default(),
             next_completion_id: 0,
             available_code_actions: Default::default(),

crates/gpui/src/app.rs 🔗

@@ -2767,10 +2767,6 @@ impl<'a, 'b, V: View> ViewContext<'a, 'b, V> {
         WeakViewHandle::new(self.window_id, self.view_id)
     }
 
-    pub fn parent(&self) -> Option<usize> {
-        self.window_context.parent(self.view_id)
-    }
-
     pub fn window_id(&self) -> usize {
         self.window_id
     }

crates/gpui/src/app/window.rs 🔗

@@ -1073,16 +1073,6 @@ impl<'a> WindowContext<'a> {
             }))
     }
 
-    /// Returns the id of the parent of the given view, or none if the given
-    /// view is the root.
-    pub(crate) fn parent(&self, view_id: usize) -> Option<usize> {
-        if let Some(view_id) = self.window.parents.get(&view_id) {
-            Some(*view_id)
-        } else {
-            None
-        }
-    }
-
     // Traverses the parent tree. Walks down the tree toward the passed
     // view calling visit with true. Then walks back up the tree calling visit with false.
     // If `visit` returns false this function will immediately return.

crates/project_panel/src/project_panel.rs 🔗

@@ -196,6 +196,7 @@ impl ProjectPanel {
             })
             .detach();
 
+            let view_id = cx.view_id();
             let mut this = Self {
                 project: project.clone(),
                 list: Default::default(),
@@ -206,7 +207,7 @@ impl ProjectPanel {
                 edit_state: None,
                 filename_editor,
                 clipboard_entry: None,
-                context_menu: cx.add_view(ContextMenu::new),
+                context_menu: cx.add_view(|cx| ContextMenu::new(view_id, cx)),
                 dragged_entry_destination: None,
                 workspace: workspace.weak_handle(),
             };

crates/terminal_view/src/terminal_button.rs 🔗

@@ -107,11 +107,12 @@ impl View for TerminalButton {
 
 impl TerminalButton {
     pub fn new(workspace: ViewHandle<Workspace>, cx: &mut ViewContext<Self>) -> Self {
+        let button_view_id = cx.view_id();
         cx.observe(&workspace, |_, _, cx| cx.notify()).detach();
         Self {
             workspace: workspace.downgrade(),
             popup_menu: cx.add_view(|cx| {
-                let mut menu = ContextMenu::new(cx);
+                let mut menu = ContextMenu::new(button_view_id, cx);
                 menu.set_position_mode(OverlayPositionMode::Local);
                 menu
             }),

crates/terminal_view/src/terminal_view.rs 🔗

@@ -124,6 +124,7 @@ impl TerminalView {
         workspace_id: WorkspaceId,
         cx: &mut ViewContext<Self>,
     ) -> Self {
+        let view_id = cx.view_id();
         cx.observe(&terminal, |_, _, cx| cx.notify()).detach();
         cx.subscribe(&terminal, |this, _, event, cx| match event {
             Event::Wakeup => {
@@ -162,7 +163,7 @@ impl TerminalView {
             terminal,
             has_new_content: true,
             has_bell: false,
-            context_menu: cx.add_view(ContextMenu::new),
+            context_menu: cx.add_view(|cx| ContextMenu::new(view_id, cx)),
             blink_state: true,
             blinking_on: false,
             blinking_paused: false,

crates/workspace/src/pane.rs 🔗

@@ -226,8 +226,9 @@ impl Pane {
         background_actions: BackgroundActions,
         cx: &mut ViewContext<Self>,
     ) -> Self {
+        let pane_view_id = cx.view_id();
         let handle = cx.weak_handle();
-        let context_menu = cx.add_view(ContextMenu::new);
+        let context_menu = cx.add_view(|cx| ContextMenu::new(pane_view_id, cx));
         context_menu.update(cx, |menu, _| {
             menu.set_position_mode(OverlayPositionMode::Local)
         });
@@ -252,7 +253,7 @@ impl Pane {
                 kind: TabBarContextMenuKind::New,
                 handle: context_menu,
             },
-            tab_context_menu: cx.add_view(ContextMenu::new),
+            tab_context_menu: cx.add_view(|cx| ContextMenu::new(pane_view_id, cx)),
             docked,
             _background_actions: background_actions,
             workspace,