@@ -460,6 +460,7 @@ impl MultiWorkspace {
.update(cx, |workspace, cx| workspace.focus_panel::<T>(window, cx))
}
+ // used in a test
pub fn toggle_modal<V: ModalView, B>(
&mut self,
window: &mut Window,
@@ -722,9 +723,12 @@ impl Render for MultiWorkspace {
None
};
+ let workspace = self.workspace().clone();
+ let workspace_key_context = workspace.update(cx, |workspace, cx| workspace.key_context(cx));
+ let root = workspace.update(cx, |workspace, cx| workspace.actions(h_flex(), window, cx));
+
client_side_decorations(
- h_flex()
- .key_context("Workspace")
+ root.key_context(workspace_key_context)
.relative()
.size_full()
.on_action(cx.listener(Self::close_window))
@@ -777,7 +781,8 @@ impl Render for MultiWorkspace {
.overflow_hidden()
.when(is_zoomed, |this| this.absolute().inset_0())
.child(self.workspace().clone()),
- ),
+ )
+ .child(self.workspace().read(cx).modal_layer.clone()),
window,
cx,
Tiling {
@@ -1251,7 +1251,7 @@ pub struct Workspace {
last_active_center_pane: Option<WeakEntity<Pane>>,
last_active_view_id: Option<proto::ViewId>,
status_bar: Entity<StatusBar>,
- modal_layer: Entity<ModalLayer>,
+ pub(crate) modal_layer: Entity<ModalLayer>,
toast_layer: Entity<ToastLayer>,
titlebar_item: Option<AnyView>,
notifications: Notifications,
@@ -6333,7 +6333,47 @@ impl Workspace {
})
}
- fn actions(&self, div: Div, window: &mut Window, cx: &mut Context<Self>) -> Div {
+ pub fn key_context(&self, cx: &App) -> KeyContext {
+ let mut context = KeyContext::new_with_defaults();
+ context.add("Workspace");
+ context.set("keyboard_layout", cx.keyboard_layout().name().to_string());
+ if let Some(status) = self
+ .debugger_provider
+ .as_ref()
+ .and_then(|provider| provider.active_thread_state(cx))
+ {
+ match status {
+ ThreadStatus::Running | ThreadStatus::Stepping => {
+ context.add("debugger_running");
+ }
+ ThreadStatus::Stopped => context.add("debugger_stopped"),
+ ThreadStatus::Exited | ThreadStatus::Ended => {}
+ }
+ }
+
+ if self.left_dock.read(cx).is_open() {
+ if let Some(active_panel) = self.left_dock.read(cx).active_panel() {
+ context.set("left_dock", active_panel.panel_key());
+ }
+ }
+
+ if self.right_dock.read(cx).is_open() {
+ if let Some(active_panel) = self.right_dock.read(cx).active_panel() {
+ context.set("right_dock", active_panel.panel_key());
+ }
+ }
+
+ if self.bottom_dock.read(cx).is_open() {
+ if let Some(active_panel) = self.bottom_dock.read(cx).active_panel() {
+ context.set("bottom_dock", active_panel.panel_key());
+ }
+ }
+
+ context
+ }
+
+ /// Multiworkspace uses this to add workspace action handling to itself
+ pub fn actions(&self, div: Div, window: &mut Window, cx: &mut Context<Self>) -> Div {
self.add_workspace_actions_listeners(div, window, cx)
.on_action(cx.listener(
|_workspace, action_sequence: &settings::ActionSequence, window, cx| {
@@ -7390,40 +7430,6 @@ impl Render for Workspace {
if FIRST_PAINT.swap(false, std::sync::atomic::Ordering::Relaxed) {
log::info!("Rendered first frame");
}
- let mut context = KeyContext::new_with_defaults();
- context.add("Workspace");
- context.set("keyboard_layout", cx.keyboard_layout().name().to_string());
- if let Some(status) = self
- .debugger_provider
- .as_ref()
- .and_then(|provider| provider.active_thread_state(cx))
- {
- match status {
- ThreadStatus::Running | ThreadStatus::Stepping => {
- context.add("debugger_running");
- }
- ThreadStatus::Stopped => context.add("debugger_stopped"),
- ThreadStatus::Exited | ThreadStatus::Ended => {}
- }
- }
-
- if self.left_dock.read(cx).is_open() {
- if let Some(active_panel) = self.left_dock.read(cx).active_panel() {
- context.set("left_dock", active_panel.panel_key());
- }
- }
-
- if self.right_dock.read(cx).is_open() {
- if let Some(active_panel) = self.right_dock.read(cx).active_panel() {
- context.set("right_dock", active_panel.panel_key());
- }
- }
-
- if self.bottom_dock.read(cx).is_open() {
- if let Some(active_panel) = self.bottom_dock.read(cx).active_panel() {
- context.set("bottom_dock", active_panel.panel_key());
- }
- }
let centered_layout = self.centered_layout
&& self.center.panes().len() == 1
@@ -7461,8 +7467,7 @@ impl Render for Workspace {
.collect::<Vec<_>>();
let bottom_dock_layout = WorkspaceSettings::get_global(cx).bottom_dock_layout;
- self.actions(div(), window, cx)
- .key_context(context)
+ div()
.relative()
.size_full()
.flex()
@@ -7862,7 +7867,6 @@ impl Render for Workspace {
.when(self.status_bar_visible(cx), |parent| {
parent.child(self.status_bar.clone())
})
- .child(self.modal_layer.clone())
.child(self.toast_layer.clone()),
)
}
@@ -10057,6 +10061,7 @@ mod tests {
let project_b = Project::test(fs, ["root".as_ref()], cx).await;
let multi_workspace_handle =
cx.add_window(|window, cx| MultiWorkspace::test_new(project_a.clone(), window, cx));
+ cx.run_until_parked();
let workspace_a = multi_workspace_handle
.read_with(cx, |mw, _| mw.workspace().clone())
@@ -10636,8 +10641,9 @@ mod tests {
init_test(cx);
let fs = FakeFs::new(cx.executor());
let project = Project::test(fs, [], cx).await;
- let (workspace, cx) =
- cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx));
+ let (multi_workspace, cx) =
+ cx.add_window_view(|window, cx| MultiWorkspace::test_new(project, window, cx));
+ let workspace = multi_workspace.read_with(cx, |mw, _| mw.workspace().clone());
workspace.update_in(cx, |workspace, window, cx| {
let first_item = cx.new(|cx| {
@@ -11131,8 +11137,9 @@ mod tests {
init_test(cx);
let fs = FakeFs::new(cx.executor());
let project = Project::test(fs, [], cx).await;
- let (workspace, cx) =
- cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx));
+ let (multi_workspace, cx) =
+ cx.add_window_view(|window, cx| MultiWorkspace::test_new(project, window, cx));
+ let workspace = multi_workspace.read_with(cx, |mw, _| mw.workspace().clone());
// Open two docks (left and right) with one panel each
let (left_panel, right_panel) = workspace.update_in(cx, |workspace, window, cx| {
@@ -11563,8 +11570,9 @@ mod tests {
let fs = FakeFs::new(cx.executor());
let project = Project::test(fs, [], cx).await;
- let (workspace, cx) =
- cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx));
+ let (multi_workspace, cx) =
+ cx.add_window_view(|window, cx| MultiWorkspace::test_new(project, window, cx));
+ let workspace = multi_workspace.read_with(cx, |mw, _| mw.workspace().clone());
let (panel_1, panel_2) = workspace.update_in(cx, |workspace, window, cx| {
let panel_1 = cx.new(|cx| TestPanel::new(DockPosition::Left, 100, cx));
@@ -12471,8 +12479,9 @@ mod tests {
init_test(cx);
let fs = FakeFs::new(cx.executor());
let project = Project::test(fs, [], cx).await;
- let (workspace, cx) =
- cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx));
+ let (multi_workspace, cx) =
+ cx.add_window_view(|window, cx| MultiWorkspace::test_new(project, window, cx));
+ let workspace = multi_workspace.read_with(cx, |mw, _| mw.workspace().clone());
// Add a new panel to the right dock, opening the dock and setting the
// focus to the new panel.
@@ -13161,8 +13170,9 @@ mod tests {
let fs = FakeFs::new(cx.executor());
let project = Project::test(fs, [], cx).await;
- let (workspace, cx) =
- cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx));
+ let (multi_workspace, cx) =
+ cx.add_window_view(|window, cx| MultiWorkspace::test_new(project, window, cx));
+ let workspace = multi_workspace.read_with(cx, |mw, _| mw.workspace().clone());
let panel = workspace.update_in(cx, |workspace, window, cx| {
let panel = cx.new(|cx| TestPanel::new(DockPosition::Right, 100, cx));
workspace.add_panel(panel.clone(), window, cx);
@@ -13226,6 +13236,7 @@ mod tests {
let multi_workspace_handle =
cx.add_window(|window, cx| MultiWorkspace::test_new(project_a.clone(), window, cx));
+ cx.run_until_parked();
let workspace_a = multi_workspace_handle
.read_with(cx, |mw, _| mw.workspace().clone())