use crate::app_context::ContextManager;
use crate::docking::panels::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::{Rect, WidgetId, WidgetState};
use super::render::{draw_input, draw_input_cursor, InputResult, InputView};
use super::settings::TextInputSettings;
use super::state::TextFieldStore;
pub fn register(
coord: &mut InputCoordinator,
id: impl Into<WidgetId>,
rect: Rect,
layer: &LayerId,
_settings: &TextInputSettings,
) {
let id = id.into();
let sense = Sense::CLICK.with_focus().with_text();
coord.register_atomic(id, crate::input::WidgetKind::Custom, rect, sense, layer);
}
pub fn register_input_coordinator_text_input(
coord: &mut InputCoordinator,
id: impl Into<WidgetId>,
rect: Rect,
layer: &LayerId,
settings: &TextInputSettings,
_state: &mut TextFieldStore,
) {
register(coord, id, rect, layer, settings);
}
pub fn register_context_manager_text_input(
ctx: &mut ContextManager,
render: &mut dyn RenderContext,
id: impl Into<WidgetId>,
rect: Rect,
layer: &LayerId,
widget_state: WidgetState,
view: &InputView<'_>,
settings: &TextInputSettings,
) -> InputResult {
let id: WidgetId = id.into();
let state = ctx.registry.get_or_insert_with(id.clone(), TextFieldStore::default);
register_input_coordinator_text_input(&mut ctx.input, id, rect, layer, settings, state);
draw_input(render, rect, widget_state, view, settings)
}
pub fn register_layout_manager_text_input<P: DockPanel>(
layout: &mut LayoutManager<P>,
render: &mut dyn RenderContext,
parent: LayoutNodeId,
id: impl Into<WidgetId>,
rect: Rect,
widget_state: WidgetState,
view: &InputView<'_>,
settings: &TextInputSettings,
) -> InputResult {
let id: WidgetId = id.into();
let layer = layout.compute_layer_for(parent);
let sense = Sense::CLICK.with_focus().with_text();
layout.tree_mut().add_widget(parent, WidgetNode { id: id.clone(), kind: WidgetKind::Custom, rect, sense });
let now_ms = layout.frame_time_ms() as u64;
let result = register_context_manager_text_input(
layout.ctx_mut(), render, id.clone(), rect, &layer, widget_state, view, settings,
);
if view.focused
&& layout.ctx().input.text_fields().cursor_visible(now_ms)
{
draw_input_cursor(
render,
result.cursor_x,
result.cursor_y,
result.cursor_height,
1.5,
[220, 220, 220, 255],
);
}
result
}