use serde::Deserialize;
use crate::canvas::DrawCmd;
use super::background_image::{AtlasSpec, ImageMode, SourceRect};
use super::style::{Style, StyleDirty};
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Props {
#[serde(default)]
pub style: Option<Style>,
#[serde(default)]
pub hover_style: Option<Style>,
#[serde(default)]
pub press_style: Option<Style>,
#[serde(default)]
pub focus_style: Option<Style>,
#[serde(default)]
pub on_click: bool,
#[serde(default)]
pub on_pointer_down: bool,
#[serde(default)]
pub on_pointer_move: bool,
#[serde(default)]
pub on_pointer_up: bool,
#[serde(default)]
pub on_pointer_enter: bool,
#[serde(default)]
pub on_pointer_leave: bool,
#[serde(default)]
pub scroll_top: Option<f32>,
#[serde(default)]
pub scroll_left: Option<f32>,
#[serde(default)]
pub scroll_step: Option<f32>,
#[serde(default)]
pub on_scroll: bool,
#[serde(default)]
pub on_wheel: bool,
#[serde(default)]
pub anchor: Option<crate::anchor::Anchor>,
#[serde(default)]
pub src: Option<String>,
#[serde(default)]
pub tint: Option<String>,
#[serde(default)]
pub flip_x: bool,
#[serde(default)]
pub flip_y: bool,
#[serde(default)]
pub image_mode: Option<ImageMode>,
#[serde(default)]
pub source_rect: Option<SourceRect>,
#[serde(default)]
pub atlas: Option<AtlasSpec>,
#[serde(default)]
pub visual_box: Option<String>,
#[serde(default)]
pub draw: Option<Vec<DrawCmd>>,
#[serde(default)]
pub on_resize: bool,
#[serde(default)]
pub target: Option<String>,
#[serde(default)]
pub shape: Option<crate::svg::ShapeAttrs>,
#[serde(default, deserialize_with = "crate::svg::de_view_box")]
pub view_box: Option<crate::svg::ViewBox>,
#[serde(default)]
pub value: Option<String>,
#[serde(default)]
pub max_length: Option<usize>,
#[serde(default)]
pub multiline: bool,
#[serde(default)]
pub on_change: bool,
#[serde(default)]
pub autofocus: bool,
#[serde(default)]
pub selection_start: Option<usize>,
#[serde(default)]
pub selection_end: Option<usize>,
#[serde(default)]
pub aria_label: Option<String>,
#[serde(default)]
pub on_select: bool,
#[serde(default)]
pub on_focus: bool,
#[serde(default)]
pub on_blur: bool,
}
#[derive(Debug, Clone, Copy, Default)]
pub struct PropsDirty {
pub style: StyleDirty,
pub hover_style: bool,
pub press_style: bool,
pub focus_style: bool,
pub pointer: bool,
pub scroll_listener: bool,
pub wheel: bool,
pub scroll_step: bool,
pub anchor: bool,
pub image: bool,
pub target: bool,
pub shape: bool,
pub view_box: bool,
pub editable_handlers: bool,
pub aria_label: bool,
}
impl PropsDirty {
pub fn any_style_variant(&self) -> bool {
self.style.any() || self.hover_style || self.press_style || self.focus_style
}
}
#[derive(Debug, Default)]
pub struct UpdateEvents {
pub value: Option<String>,
pub selection_start: Option<usize>,
pub selection_end: Option<usize>,
pub scroll_top: Option<f32>,
pub scroll_left: Option<f32>,
pub draw: Option<Vec<DrawCmd>>,
}
#[cfg(test)]
pub(crate) fn props_from_json(json: serde_json::Value) -> Props {
serde_json::from_value(json).expect("valid props")
}