use std::any::Any;
use densa_core::Size;
use densa_draw::Canvas;
use crate::{AccessNode, AccessRequest, Event, EventCx, LayoutCx, PaintCx, WidgetId};
pub trait Widget: Any {
fn measure(&mut self, cx: &mut LayoutCx<'_>, constraints: Constraints) -> Size {
let _ = (cx, constraints);
Size::ZERO
}
fn layout(&mut self, cx: &mut LayoutCx<'_>, size: Size) {
let _ = (cx, size);
}
fn paint(&mut self, cx: &PaintCx<'_>, canvas: &mut Canvas<'_>) {
let _ = (cx, canvas);
}
fn paint_over(&mut self, cx: &PaintCx<'_>, canvas: &mut Canvas<'_>) {
let _ = (cx, canvas);
}
fn event(&mut self, cx: &mut EventCx<'_>, event: &Event<'_>) -> Handled {
let _ = (cx, event);
Handled::No
}
fn accepts_focus(&self) -> bool {
false
}
fn focus_on_press(&self) -> bool {
self.accepts_focus()
}
fn accessibility(&self, cx: &PaintCx<'_>, node: &mut AccessNode) {
let _ = (cx, node);
}
fn access_action(&mut self, cx: &mut EventCx<'_>, request: &AccessRequest<'_>) -> Handled {
let _ = (cx, request);
Handled::No
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[non_exhaustive]
pub struct Constraints {
pub width: Option<f32>,
pub height: Option<f32>,
pub available_width: Available,
pub available_height: Available,
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[non_exhaustive]
pub enum Available {
Definite(f32),
MinContent,
MaxContent,
}
impl Available {
pub fn limit(self) -> Option<f32> {
match self {
Self::Definite(room) => Some(room),
Self::MinContent | Self::MaxContent => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Handled {
Yes,
No,
}
impl From<bool> for Handled {
fn from(handled: bool) -> Self {
if handled {
Self::Yes
} else {
Self::No
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Action {
pub source: WidgetId,
pub kind: ActionKind,
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[non_exhaustive]
pub enum ActionKind {
Clicked,
Toggled(bool),
Changed,
Submitted,
Selected(usize),
}