use std::collections::HashMap;
use crate::core::types::Rect;
use crate::app_context::{ContextManager, layout::types::LayoutNode};
use crate::types::WidgetId;
use crate::ui::widgets::composite::modal::state::ModalState;
use crate::ui::widgets::composite::popup::state::PopupState;
use crate::ui::widgets::composite::dropdown::state::DropdownState;
use crate::ui::widgets::composite::toolbar::state::ToolbarState;
use crate::ui::widgets::composite::sidebar::state::SidebarState;
use crate::ui::widgets::composite::context_menu::state::ContextMenuState;
use crate::ui::widgets::composite::chrome::state::ChromeState;
use super::chrome_slot::ChromeSlot;
use super::edge_panels::EdgePanels;
use super::dock_state::DockState;
use super::overlay_stack::OverlayStack;
use super::tree::LayoutTree;
use super::types::LayoutSolved;
use super::window::WindowProvider;
use super::registry::{CompositeRegistration, DismissFrame};
use super::ClickDispatcher;
use crate::layout::docking::DockPanel;
pub struct WindowBranch<P: DockPanel> {
pub provider: Box<dyn WindowProvider>,
pub rect: Rect,
pub initialised: bool,
pub tick_count: u64,
pub tick_rate: crate::render::TickRate,
pub chrome: ChromeSlot,
pub edges: EdgePanels,
pub dock: DockState<P>,
pub tree: LayoutTree,
pub last_solved: Option<LayoutSolved>,
pub last_window: Option<Rect>,
pub ctx: ContextManager,
pub dispatcher: ClickDispatcher,
pub composite_registry: Vec<CompositeRegistration>,
pub dismiss_frames: Vec<DismissFrame>,
pub overlays: OverlayStack,
pub last_hovered: Option<WidgetId>,
pub last_click: Option<(WidgetId, (f64, f64))>,
pub last_right_click: Option<(WidgetId, (f64, f64))>,
pub last_pointer_pos: Option<(f64, f64)>,
pub last_scroll: (f64, f64),
pub last_pressed: Option<WidgetId>,
pub modals: HashMap<WidgetId, ModalState>,
pub popups: HashMap<WidgetId, PopupState>,
pub dropdowns: HashMap<WidgetId, DropdownState>,
pub toolbars: HashMap<WidgetId, ToolbarState>,
pub sidebars: HashMap<WidgetId, SidebarState>,
pub context_menus: HashMap<WidgetId, ContextMenuState>,
pub chrome_widget_state: ChromeState,
pub widget_to_slot: HashMap<WidgetId, String>,
}
impl<P: DockPanel> WindowBranch<P> {
pub fn new(provider: Box<dyn WindowProvider>, rect: Rect) -> Self {
Self {
provider,
rect,
initialised: false,
tick_count: 0,
tick_rate: crate::render::TickRate::Capped(60),
chrome: ChromeSlot::default(),
edges: EdgePanels::new(),
dock: DockState::new(),
tree: LayoutTree::new(),
last_solved: None,
last_window: None,
ctx: ContextManager::new(LayoutNode::new("__layout_root__")),
dispatcher: ClickDispatcher::new(),
composite_registry: Vec::new(),
dismiss_frames: Vec::new(),
overlays: OverlayStack::new(),
last_hovered: None,
last_click: None,
last_right_click: None,
last_pointer_pos: None,
last_scroll: (0.0, 0.0),
last_pressed: None,
modals: HashMap::new(),
popups: HashMap::new(),
dropdowns: HashMap::new(),
toolbars: HashMap::new(),
sidebars: HashMap::new(),
context_menus: HashMap::new(),
chrome_widget_state: ChromeState::default(),
widget_to_slot: HashMap::new(),
}
}
}
pub type WindowSlot<P> = WindowBranch<P>;