mirror of
https://github.com/zed-industries/zed.git
synced 2025-02-05 10:20:51 +00:00
Don't close panel on event unless active; add tests
This commit is contained in:
parent
bd795d7607
commit
6c60853842
3 changed files with 52 additions and 12 deletions
|
@ -12,8 +12,8 @@ use gpui::{
|
||||||
geometry::vector::Vector2F,
|
geometry::vector::Vector2F,
|
||||||
keymap_matcher::KeymapContext,
|
keymap_matcher::KeymapContext,
|
||||||
platform::{CursorStyle, MouseButton, PromptLevel},
|
platform::{CursorStyle, MouseButton, PromptLevel},
|
||||||
AnyElement, AppContext, Axis, ClipboardItem, Element, Entity, ModelHandle, Task, View,
|
AnyElement, AppContext, ClipboardItem, Element, Entity, ModelHandle, Task, View, ViewContext,
|
||||||
ViewContext, ViewHandle, WeakViewHandle,
|
ViewHandle, WeakViewHandle,
|
||||||
};
|
};
|
||||||
use menu::{Confirm, SelectNext, SelectPrev};
|
use menu::{Confirm, SelectNext, SelectPrev};
|
||||||
use project::{Entry, EntryKind, Project, ProjectEntryId, ProjectPath, Worktree, WorktreeId};
|
use project::{Entry, EntryKind, Project, ProjectEntryId, ProjectPath, Worktree, WorktreeId};
|
||||||
|
|
|
@ -180,16 +180,20 @@ impl Dock {
|
||||||
pub fn add_panel<T: Panel>(&mut self, panel: ViewHandle<T>, cx: &mut ViewContext<Self>) {
|
pub fn add_panel<T: Panel>(&mut self, panel: ViewHandle<T>, cx: &mut ViewContext<Self>) {
|
||||||
let subscriptions = [
|
let subscriptions = [
|
||||||
cx.observe(&panel, |_, _, cx| cx.notify()),
|
cx.observe(&panel, |_, _, cx| cx.notify()),
|
||||||
cx.subscribe(&panel, |this, view, event, cx| {
|
cx.subscribe(&panel, |this, panel, event, cx| {
|
||||||
if view.read(cx).should_activate_on_event(event, cx) {
|
if panel.read(cx).should_activate_on_event(event, cx) {
|
||||||
if let Some(ix) = this
|
if let Some(ix) = this
|
||||||
.panel_entries
|
.panel_entries
|
||||||
.iter()
|
.iter()
|
||||||
.position(|entry| entry.panel.id() == view.id())
|
.position(|entry| entry.panel.id() == panel.id())
|
||||||
{
|
{
|
||||||
|
this.set_open(true, cx);
|
||||||
this.activate_panel(ix, cx);
|
this.activate_panel(ix, cx);
|
||||||
|
cx.focus(&panel);
|
||||||
}
|
}
|
||||||
} else if view.read(cx).should_close_on_event(event, cx) {
|
} else if panel.read(cx).should_close_on_event(event, cx)
|
||||||
|
&& this.active_panel().map_or(false, |p| p.id() == panel.id())
|
||||||
|
{
|
||||||
this.set_open(false, cx);
|
this.set_open(false, cx);
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -3091,7 +3091,7 @@ mod tests {
|
||||||
use std::{cell::RefCell, rc::Rc};
|
use std::{cell::RefCell, rc::Rc};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
dock::test::TestPanel,
|
dock::test::{TestPanel, TestPanelEvent},
|
||||||
item::test::{TestItem, TestItemEvent, TestProjectItem},
|
item::test::{TestItem, TestItemEvent, TestProjectItem},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3767,14 +3767,50 @@ mod tests {
|
||||||
assert!(!workspace.left_dock().read(cx).is_open());
|
assert!(!workspace.left_dock().read(cx).is_open());
|
||||||
// The bottom dock is sized based on the panel's default size,
|
// The bottom dock is sized based on the panel's default size,
|
||||||
// since the panel orientation changed from vertical to horizontal.
|
// since the panel orientation changed from vertical to horizontal.
|
||||||
|
let bottom_dock = workspace.bottom_dock();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
workspace
|
bottom_dock.read(cx).active_panel_size().unwrap(),
|
||||||
.bottom_dock()
|
|
||||||
.read(cx)
|
|
||||||
.active_panel_size()
|
|
||||||
.unwrap(),
|
|
||||||
panel_1.default_size(cx),
|
panel_1.default_size(cx),
|
||||||
);
|
);
|
||||||
|
// Close bottom dock and move panel_1 back to the left.
|
||||||
|
bottom_dock.update(cx, |bottom_dock, cx| bottom_dock.set_open(false, cx));
|
||||||
|
panel_1.set_position(DockPosition::Left, cx);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Emit activated event on panel 1
|
||||||
|
panel_1.update(cx, |_, cx| cx.emit(TestPanelEvent::Activated));
|
||||||
|
|
||||||
|
// Now the left dock is open and panel_1 is active and focused.
|
||||||
|
workspace.read_with(cx, |workspace, cx| {
|
||||||
|
let left_dock = workspace.left_dock();
|
||||||
|
assert!(left_dock.read(cx).is_open());
|
||||||
|
assert_eq!(
|
||||||
|
left_dock.read(cx).active_panel().unwrap().id(),
|
||||||
|
panel_1.id()
|
||||||
|
);
|
||||||
|
assert!(panel_1.is_focused(cx));
|
||||||
|
});
|
||||||
|
|
||||||
|
// Emit closed event on panel 2, which is not active
|
||||||
|
panel_2.update(cx, |_, cx| cx.emit(TestPanelEvent::Closed));
|
||||||
|
|
||||||
|
// Wo don't close the left dock, because panel_2 wasn't the active panel
|
||||||
|
workspace.read_with(cx, |workspace, cx| {
|
||||||
|
let left_dock = workspace.left_dock();
|
||||||
|
assert!(left_dock.read(cx).is_open());
|
||||||
|
assert_eq!(
|
||||||
|
left_dock.read(cx).active_panel().unwrap().id(),
|
||||||
|
panel_1.id()
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Emit closed event on panel 1, which is active
|
||||||
|
panel_1.update(cx, |_, cx| cx.emit(TestPanelEvent::Closed));
|
||||||
|
|
||||||
|
// Now the left dock is closed, because panel_1 was the active panel
|
||||||
|
workspace.read_with(cx, |workspace, cx| {
|
||||||
|
let left_dock = workspace.left_dock();
|
||||||
|
assert!(!left_dock.read(cx).is_open());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue