dock: Support hide dock toggle buttons (#726)

This commit is contained in:
Floyd Wang 2025-03-21 11:55:02 +08:00 committed by GitHub
parent a89f971108
commit 0d1c40a56a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 35 additions and 1 deletions

View file

@ -22,6 +22,7 @@ pub struct AddPanel(DockPlacement);
pub struct TogglePanelVisible(SharedString);
impl_internal_actions!(story, [AddPanel, TogglePanelVisible]);
actions!(story, [ToggleDockToggleButton]);
const MAIN_DOCK_AREA: DockAreaTab = DockAreaTab {
id: "main-dock",
@ -41,6 +42,7 @@ pub struct StoryWorkspace {
title_bar: Entity<AppTitleBar>,
dock_area: Entity<DockArea>,
last_layout_state: Option<DockAreaState>,
toggle_button_visible: bool,
_save_layout_task: Option<Task<()>>,
}
@ -122,6 +124,11 @@ impl StoryWorkspace {
Box::new(AddPanel(DockPlacement::Bottom)),
)
.separator()
.menu(
"Show / Hide Dock Toggle Button",
Box::new(ToggleDockToggleButton),
)
.separator()
.menu_with_check(
"Sidebar",
!invisible_panels
@ -133,7 +140,7 @@ impl StoryWorkspace {
"Modal",
!invisible_panels
.read(cx)
.contains(&SharedString::from("SidebModalar")),
.contains(&SharedString::from("Modal")),
Box::new(TogglePanelVisible(SharedString::from("Modal"))),
)
.menu_with_check(
@ -161,6 +168,7 @@ impl StoryWorkspace {
dock_area,
title_bar,
last_layout_state: None,
toggle_button_visible: true,
_save_layout_task: None,
}
}
@ -468,6 +476,19 @@ impl StoryWorkspace {
});
cx.notify();
}
fn on_action_toggle_dock_toggle_button(
&mut self,
_: &ToggleDockToggleButton,
_: &mut Window,
cx: &mut Context<Self>,
) {
self.toggle_button_visible = !self.toggle_button_visible;
self.dock_area.update(cx, |dock_area, _| {
dock_area.show_toggle_button(self.toggle_button_visible);
});
}
}
pub fn open_new(
@ -494,6 +515,7 @@ impl Render for StoryWorkspace {
.id("story-workspace")
.on_action(cx.listener(Self::on_action_add_panel))
.on_action(cx.listener(Self::on_action_toggle_panel_visible))
.on_action(cx.listener(Self::on_action_toggle_dock_toggle_button))
.relative()
.size_full()
.flex()

View file

@ -51,6 +51,8 @@ pub struct DockArea {
/// The entity_id of the [`TabPanel`](TabPanel) where each toggle button should be displayed,
toggle_button_panels: Edges<Option<EntityId>>,
/// Whether to show the toggle button.
toggle_button_visible: bool,
/// The left dock of the dock_area.
left_dock: Option<Entity<Dock>>,
/// The bottom dock of the dock_area.
@ -456,6 +458,7 @@ impl DockArea {
items: dock_item,
zoom_view: None,
toggle_button_panels: Edges::default(),
toggle_button_visible: true,
left_dock: None,
right_dock: None,
bottom_dock: None,
@ -680,6 +683,7 @@ impl DockArea {
}
}
/// Toggle the dock at the given placement.
pub fn toggle_dock(
&self,
placement: DockPlacement,
@ -700,6 +704,11 @@ impl DockArea {
}
}
/// Show or hide the toggle button.
pub fn show_toggle_button(&mut self, visible: bool) {
self.toggle_button_visible = visible;
}
/// Add a panel item to the dock area at the given placement.
pub fn add_panel(
&mut self,

View file

@ -492,6 +492,9 @@ impl TabPanel {
}
let dock_area = self.dock_area.upgrade()?.read(cx);
if !dock_area.toggle_button_visible {
return None;
}
if !dock_area.is_dock_collapsible(placement, cx) {
return None;
}