use malloc_size_of_derive::MallocSizeOf;
use serde::{Deserialize, Serialize};
use crate::types::{Point, SourceNodeId, SourceRange};
pub trait InteractionQuery {
fn focus_target(&self) -> Option<SourceNodeId>;
fn selection(&self) -> Option<Selection>;
fn affordances_at(&self, point: Point) -> Vec<Affordance>;
fn activation_target(&self, point: Point) -> Option<SourceNodeId>;
}
#[derive(Clone, Copy, Debug, Default, Deserialize, MallocSizeOf, PartialEq, Serialize)]
pub struct InteractionState {
pub hovered: Option<SourceNodeId>,
pub active: Option<SourceNodeId>,
pub focused: Option<SourceNodeId>,
pub selection: Option<Selection>,
}
#[derive(Clone, Copy, Debug, Default, Deserialize, MallocSizeOf, PartialEq, Serialize)]
pub struct Selection {
pub anchor: SourceNodeId,
pub focus: SourceNodeId,
pub range: SourceRange,
}
#[derive(Clone, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)]
pub struct Affordance {
pub kind: AffordanceKind,
pub source_node: SourceNodeId,
pub label: Option<String>,
}
#[derive(
Clone, Copy, Debug, Default, Deserialize, Eq, Hash, MallocSizeOf, PartialEq, Serialize,
)]
pub enum AffordanceKind {
Link,
Button,
Editable,
Scrollable,
#[default]
Hoverable,
FormControl,
}