use crate::app_context::ContextManager;
use crate::layout::docking::DockPanel;
use crate::input::core::coordinator::LayerId;
use crate::input::{InputCoordinator, Sense, WidgetKind};
use crate::layout::{LayoutManager, LayoutNodeId, WidgetNode};
use crate::render::RenderContext;
use crate::types::{IconId, Rect, WidgetId, WidgetState};
use super::render::{draw_item, ItemView};
use super::settings::ItemSettings;
use super::state::ItemState;
use super::types::ItemRenderKind;
pub fn register(
coord: &mut InputCoordinator,
id: impl Into<WidgetId>,
rect: Rect,
layer: &LayerId,
) {
coord.register_atomic(id, WidgetKind::Item, rect, Sense::NONE, layer);
}
pub fn register_input_coordinator_item(
coord: &mut InputCoordinator,
id: impl Into<WidgetId>,
rect: Rect,
layer: &LayerId,
_state: &mut ItemState,
) {
coord.register_atomic(id, WidgetKind::Item, rect, Sense::NONE, layer);
}
pub fn register_context_manager_item<'a>(
ctx: &mut ContextManager,
render: &mut dyn RenderContext,
id: impl Into<WidgetId>,
rect: Rect,
layer: &LayerId,
widget_state: WidgetState,
view: &ItemView<'a>,
settings: &ItemSettings,
kind: &ItemRenderKind<'a>,
) {
let id: WidgetId = id.into();
let state = ctx.registry.get_or_insert_with(id.clone(), ItemState::default);
register_input_coordinator_item(&mut ctx.input, id, rect, layer, state);
draw_item(
render,
rect,
widget_state,
view,
settings,
kind,
|_, _: &IconId, _, _| {},
|_, _, _, _| {},
);
}
pub fn register_layout_manager_item<'a, P: DockPanel>(
layout: &mut LayoutManager<P>,
render: &mut dyn RenderContext,
parent: LayoutNodeId,
id: impl Into<WidgetId>,
rect: Rect,
widget_state: WidgetState,
view: &ItemView<'a>,
settings: &ItemSettings,
kind: &ItemRenderKind<'a>,
) {
let id: WidgetId = id.into();
let layer = layout.compute_layer_for(parent);
layout.tree_mut().add_widget(parent, WidgetNode { id: id.clone(), kind: WidgetKind::Item, rect, sense: Sense::NONE, label: None });
register_context_manager_item(
layout.ctx_mut(), render, id, rect, &layer, widget_state, view, settings, kind,
);
}