dock: Add panel_style to support always show TabBar. (#444)
Close #441 ```rs DockArea::new(MAIN_DOCK_AREA.id, Some(MAIN_DOCK_AREA.version), cx).panel_style(PanelStyle::TabBar) ``` <img width="1433" alt="image" src="https://github.com/user-attachments/assets/2013188e-990b-4709-ac7e-43c2de8bc895">
This commit is contained in:
parent
53fe5823ef
commit
7fe91e4e12
3 changed files with 33 additions and 9 deletions
|
|
@ -37,28 +37,31 @@ pub enum DockEvent {
|
|||
/// The main area of the dock.
|
||||
pub struct DockArea {
|
||||
id: SharedString,
|
||||
/// The version is used to special the default layout, this is like the `panel_version` in `trait Panel`.
|
||||
/// The version is used to special the default layout, this is like the `panel_version` in [`Panel`](Panel).
|
||||
version: Option<usize>,
|
||||
pub(crate) bounds: Bounds<Pixels>,
|
||||
|
||||
/// The center view of the dockarea.
|
||||
items: DockItem,
|
||||
|
||||
/// The entity_id of the TabPanel where each toggle button should be displayed,
|
||||
/// The entity_id of the [`TabPanel`](TabPanel) where each toggle button should be displayed,
|
||||
toggle_button_panels: Edges<Option<EntityId>>,
|
||||
|
||||
/// The left dock of the dockarea.
|
||||
/// The left dock of the dock_area.
|
||||
left_dock: Option<View<Dock>>,
|
||||
/// The bottom dock of the dockarea.
|
||||
/// The bottom dock of the dock_area.
|
||||
bottom_dock: Option<View<Dock>>,
|
||||
/// The right dock of the dockarea.
|
||||
/// The right dock of the dock_area.
|
||||
right_dock: Option<View<Dock>>,
|
||||
/// The top zoom view of the dockarea, if any.
|
||||
/// The top zoom view of the dock_area, if any.
|
||||
zoom_view: Option<AnyView>,
|
||||
|
||||
/// Lock panels layout, but allow to resize.
|
||||
is_locked: bool,
|
||||
|
||||
/// The panel style, default is [`PanelStyle::Default`](PanelStyle::Default).
|
||||
pub(crate) panel_style: PanelStyle,
|
||||
|
||||
_subscriptions: Vec<Subscription>,
|
||||
}
|
||||
|
||||
|
|
@ -296,6 +299,7 @@ impl DockArea {
|
|||
right_dock: None,
|
||||
bottom_dock: None,
|
||||
is_locked: false,
|
||||
panel_style: PanelStyle::Default,
|
||||
_subscriptions: vec![],
|
||||
};
|
||||
|
||||
|
|
@ -304,6 +308,12 @@ impl DockArea {
|
|||
this
|
||||
}
|
||||
|
||||
/// Set the panel style of the dock area.
|
||||
pub fn panel_style(mut self, style: PanelStyle) -> Self {
|
||||
self.panel_style = style;
|
||||
self
|
||||
}
|
||||
|
||||
/// Set version of the dock area.
|
||||
pub fn set_version(&mut self, version: usize, cx: &mut ViewContext<Self>) {
|
||||
self.version = Some(version);
|
||||
|
|
|
|||
|
|
@ -16,6 +16,15 @@ pub enum PanelEvent {
|
|||
LayoutChanged,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum PanelStyle {
|
||||
/// Display the TabBar when there are multiple tabs, otherwise display the simple title.
|
||||
Default,
|
||||
/// Always display the tab bar.
|
||||
TabBar,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub struct TitleStyle {
|
||||
pub background: Hsla,
|
||||
pub foreground: Hsla,
|
||||
|
|
|
|||
|
|
@ -20,8 +20,8 @@ use crate::{
|
|||
};
|
||||
|
||||
use super::{
|
||||
ClosePanel, DockArea, DockItemState, DockPlacement, Panel, PanelEvent, PanelView, StackPanel,
|
||||
ToggleZoom,
|
||||
ClosePanel, DockArea, DockItemState, DockPlacement, Panel, PanelEvent, PanelStyle, PanelView,
|
||||
StackPanel, ToggleZoom,
|
||||
};
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
|
|
@ -455,11 +455,16 @@ impl TabPanel {
|
|||
fn render_title_bar(&self, state: TabState, cx: &mut ViewContext<Self>) -> impl IntoElement {
|
||||
let view = cx.view().clone();
|
||||
|
||||
let Some(dock_area) = self.dock_area.upgrade() else {
|
||||
return div().into_any_element();
|
||||
};
|
||||
let panel_style = dock_area.read(cx).panel_style;
|
||||
|
||||
let left_dock_button = self.render_dock_toggle_button(DockPlacement::Left, cx);
|
||||
let bottom_dock_button = self.render_dock_toggle_button(DockPlacement::Bottom, cx);
|
||||
let right_dock_button = self.render_dock_toggle_button(DockPlacement::Right, cx);
|
||||
|
||||
if self.panels.len() == 1 {
|
||||
if self.panels.len() == 1 && panel_style == PanelStyle::Default {
|
||||
let panel = self.panels.get(0).unwrap();
|
||||
let title_style = panel.title_style(cx);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue