use derive_more::{AsRef, Deref, Display};
use derive_new::new;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deref, AsRef, Display, Serialize, Deserialize)]
#[display("{}", _0)]
pub struct Label(String);
impl Label {
pub fn new(s: impl Into<String>) -> Option<Self> {
let s = s.into();
if s.is_empty() { None } else { Some(Self(s)) }
}
pub fn as_str(&self) -> &str {
&self.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, new, Serialize, Deserialize)]
pub struct Size {
pub width: u32,
pub height: u32,
}
impl Size {
pub fn meets_min_target_size(&self) -> bool {
self.width >= 44 && self.height >= 44
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, new, Serialize, Deserialize)]
pub struct Viewport {
pub width: u32,
pub height: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deref, Serialize, Deserialize)]
pub struct ElementId(accesskit::NodeId);
impl ElementId {
pub fn new(id: u64) -> Self {
Self(accesskit::NodeId(id))
}
pub fn node_id(&self) -> accesskit::NodeId {
self.0
}
}
impl From<ElementId> for accesskit::NodeId {
fn from(id: ElementId) -> Self {
id.0
}
}
impl From<accesskit::NodeId> for ElementId {
fn from(node_id: accesskit::NodeId) -> Self {
Self(node_id)
}
}
impl std::fmt::Display for ElementId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "ElementId({})", self.0.0)
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct RenderStats {
pub nodes_visited: usize,
pub widgets_rendered: usize,
pub containers_rendered: usize,
pub nodes_skipped: usize,
}