pub use super::render::register_input_coordinator_blackbox_panel;
use super::render::register_context_manager_blackbox_panel;
use super::settings::BlackboxPanelSettings;
use super::state::BlackboxState;
use super::types::{BlackboxEvent, BlackboxEventResult, BlackboxHandler, BlackboxRenderKind, BlackboxView};
use crate::layout::docking::DockPanel;
use crate::input::core::coordinator::LayerId;
use crate::input::{Sense, WidgetKind};
use crate::layout::{BlackboxPanelNode, LayoutManager, LayoutNodeId, WidgetNode};
use crate::render::RenderContext;
use crate::types::{Rect, WidgetId};
pub fn register_layout_manager_blackbox_panel<P: DockPanel>(
layout: &mut LayoutManager<P>,
render: &mut dyn RenderContext,
parent: LayoutNodeId,
slot_id: &str,
id: impl Into<WidgetId>,
state: &mut BlackboxState,
view: &mut BlackboxView<'_>,
settings: &BlackboxPanelSettings,
kind: &BlackboxRenderKind,
) -> Option<BlackboxPanelNode> {
let id: WidgetId = id.into();
let rect = layout.rect_for(slot_id)?;
let layer = layout.compute_layer_for(parent);
let sense = view.sense;
let node_id = layout.tree_mut().add_widget(parent, WidgetNode { id: id.clone(), kind: WidgetKind::BlackboxPanel, rect, sense, label: None });
{
use super::types::BlackboxEvent;
let coord = &layout.ctx_mut().input;
let is_top = coord.hovered_widget() == Some(&id);
let pos = coord.pointer_pos();
if is_top {
if let Some((mx, my)) = pos {
let _ = dispatch_blackbox_event(
view, rect, mx, my,
BlackboxEvent::PointerMove { local_x: 0.0, local_y: 0.0 },
);
}
}
}
register_context_manager_blackbox_panel(
layout.ctx_mut(), render, id, rect, state, view, settings, kind, &layer,
);
Some(BlackboxPanelNode(node_id))
}
pub fn dispatch_blackbox_event(
view: &mut BlackboxView<'_>,
body_rect: Rect,
screen_x: f64,
screen_y: f64,
event: BlackboxEvent,
) -> BlackboxEventResult {
let local_x = screen_x - body_rect.x;
let local_y = screen_y - body_rect.y;
let local_event = match event {
BlackboxEvent::PointerMove { .. } =>
BlackboxEvent::PointerMove { local_x, local_y },
BlackboxEvent::PointerDown { button, .. } =>
BlackboxEvent::PointerDown { local_x, local_y, button },
BlackboxEvent::PointerUp { button, .. } =>
BlackboxEvent::PointerUp { local_x, local_y, button },
other => other,
};
(view.handle_event)(local_event)
}
pub fn dispatch_to_handler(
handler: &mut dyn BlackboxHandler,
body_rect: Rect,
screen_x: f64,
screen_y: f64,
event: BlackboxEvent,
) -> BlackboxEventResult {
let local_x = screen_x - body_rect.x;
let local_y = screen_y - body_rect.y;
let local_event = match event {
BlackboxEvent::PointerMove { .. } =>
BlackboxEvent::PointerMove { local_x, local_y },
BlackboxEvent::PointerDown { button, .. } =>
BlackboxEvent::PointerDown { local_x, local_y, button },
BlackboxEvent::PointerUp { button, .. } =>
BlackboxEvent::PointerUp { local_x, local_y, button },
other => other,
};
handler.handle_event(local_event)
}
pub fn register_layout_manager_stub_panel<P: DockPanel>(
layout: &mut LayoutManager<P>,
id: impl Into<WidgetId>,
rect: Rect,
layer: &LayerId,
) -> WidgetId {
let id: WidgetId = id.into();
let coord = &mut layout.ctx_mut().input;
coord.register_composite(
id.clone(),
WidgetKind::BlackboxPanel,
rect,
Sense::CLICK | Sense::HOVER | Sense::DRAG | Sense::SCROLL,
layer,
);
id
}
pub fn route_blackbox_pointer_down<P, F>(
layout: &mut LayoutManager<P>,
screen_x: f64,
screen_y: f64,
event: BlackboxEvent,
dispatch: F,
) -> bool
where
P: DockPanel,
F: FnOnce(&WidgetId, f64, f64, BlackboxEvent) -> bool,
{
let top_id = layout.ctx_mut().input.hovered_widget().cloned();
let top_id = match top_id {
Some(id) => id,
None => return false,
};
if layout.ctx_mut().input.widget_kind(&top_id) != Some(WidgetKind::BlackboxPanel) {
return false;
}
dispatch(&top_id, screen_x, screen_y, event)
}
pub fn route_blackbox_wheel<P, F>(
layout: &mut LayoutManager<P>,
delta_x: f64,
delta_y: f64,
dispatch: F,
) -> bool
where
P: DockPanel,
F: FnOnce(&WidgetId, f64, f64) -> bool,
{
let top_id = layout.ctx_mut().input.hovered_widget().cloned();
let top_id = match top_id {
Some(id) => id,
None => return false,
};
if layout.ctx_mut().input.widget_kind(&top_id) != Some(WidgetKind::BlackboxPanel) {
return false;
}
dispatch(&top_id, delta_x, delta_y)
}