use crate::app_context::ContextManager;
use crate::layout::docking::DockPanel;
use crate::input::core::coordinator::{InputCoordinator, LayerId};
use crate::input::core::sense::Sense;
use crate::input::core::widget_kind::WidgetKind;
use crate::layout::{LayoutManager, LayoutNodeId, WidgetNode};
use crate::render::RenderContext;
use crate::types::{Rect, WidgetId, CompositeId};
use super::render::{draw_tab, TabView};
use super::settings::TabSettings;
use super::state::TabState;
pub fn register_tab(
coord: &mut InputCoordinator,
tab_id: impl Into<WidgetId>,
rect: Rect,
sense: Sense,
close_btn_rect: Option<Rect>,
) -> CompositeId {
let id = coord.register_composite(tab_id, WidgetKind::ChromeTab, rect, sense, &LayerId::main());
if let Some(close_rect) = close_btn_rect {
let close_id = format!("{}:close", id.0.0);
coord.register_child(&id, close_id, WidgetKind::Button, close_rect, Sense::CLICK);
}
id
}
pub fn register_tab_on_layer(
coord: &mut InputCoordinator,
tab_id: impl Into<WidgetId>,
rect: Rect,
sense: Sense,
close_btn_rect: Option<Rect>,
layer: &LayerId,
) -> CompositeId {
let id = coord.register_composite(tab_id, WidgetKind::ChromeTab, rect, sense, layer);
if let Some(close_rect) = close_btn_rect {
let close_id = format!("{}:close", id.0.0);
coord.register_child(&id, close_id, WidgetKind::Button, close_rect, Sense::CLICK);
}
id
}
pub fn register_chrome_tab(
coord: &mut InputCoordinator,
tab_id: impl Into<WidgetId>,
rect: Rect,
close_btn_rect: Option<Rect>,
) -> CompositeId {
register_tab(coord, tab_id, rect, Sense::CLICK | Sense::HOVER, close_btn_rect)
}
pub fn register_sidebar_tab(
coord: &mut InputCoordinator,
tab_id: impl Into<WidgetId>,
rect: Rect,
layer: &LayerId,
) -> CompositeId {
register_tab_on_layer(coord, tab_id, rect, Sense::CLICK | Sense::HOVER, None, layer)
}
pub fn register_horizontal_tab(
coord: &mut InputCoordinator,
tab_id: impl Into<WidgetId>,
rect: Rect,
close_btn_rect: Option<Rect>,
layer: &LayerId,
) -> CompositeId {
register_tab_on_layer(coord, tab_id, rect, Sense::CLICK | Sense::HOVER, close_btn_rect, layer)
}
pub fn register_input_coordinator_tab(
coord: &mut InputCoordinator,
tab_id: impl Into<WidgetId>,
rect: Rect,
sense: Sense,
close_btn_rect: Option<Rect>,
layer: &LayerId,
state: &mut TabState,
) -> CompositeId {
let _ = state; register_tab_on_layer(coord, tab_id, rect, sense, close_btn_rect, layer)
}
pub fn register_context_manager_tab(
ctx: &mut ContextManager,
render: &mut dyn RenderContext,
tab_id: impl Into<WidgetId>,
rect: Rect,
close_btn_rect: Option<Rect>,
layer: &LayerId,
view: &TabView<'_>,
settings: &TabSettings,
) -> CompositeId {
let tab_id: WidgetId = tab_id.into();
let state = ctx.registry.get_or_insert_with(tab_id.clone(), TabState::default);
let id = register_input_coordinator_tab(
&mut ctx.input,
tab_id,
rect,
Sense::CLICK | Sense::HOVER,
close_btn_rect,
layer,
state,
);
draw_tab(render, rect, view, settings);
id
}
pub fn register_layout_manager_tab<P: DockPanel>(
layout: &mut LayoutManager<P>,
render: &mut dyn RenderContext,
parent: LayoutNodeId,
tab_id: impl Into<WidgetId>,
rect: Rect,
close_btn_rect: Option<Rect>,
view: &TabView<'_>,
settings: &TabSettings,
) -> CompositeId {
let tab_id: WidgetId = tab_id.into();
let layer = layout.compute_layer_for(parent);
layout.tree_mut().add_widget(parent, WidgetNode { id: tab_id.clone(), kind: WidgetKind::ChromeTab, rect, sense: Sense::CLICK | Sense::HOVER, label: None });
register_context_manager_tab(
layout.ctx_mut(), render, tab_id, rect, close_btn_rect, &layer, view, settings,
)
}