diff --git a/Cargo.lock b/Cargo.lock index 8d65c3b..75c8e49 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,6 +80,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + [[package]] name = "async-trait" version = "0.1.77" @@ -454,6 +460,12 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "grid" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d196ffc1627db18a531359249b2bf8416178d84b729f3cebeb278f285fb9b58c" + [[package]] name = "h2" version = "0.4.2" @@ -1027,6 +1039,7 @@ dependencies = [ "anyhow", "image", "palette", + "taffy", ] [[package]] @@ -1073,6 +1086,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + [[package]] name = "smallvec" version = "1.13.1" @@ -1121,6 +1143,19 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "taffy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fddbee94e20bc4612dcb789953324236eebd4fc6a08c650ccbf7f615e59a0d6a" +dependencies = [ + "arrayvec", + "grid", + "num-traits", + "serde", + "slotmap", +] + [[package]] name = "tiff" version = "0.9.1" @@ -1236,6 +1271,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/showbits-common/Cargo.toml b/showbits-common/Cargo.toml index 1f3e630..d51cb43 100644 --- a/showbits-common/Cargo.toml +++ b/showbits-common/Cargo.toml @@ -8,5 +8,10 @@ anyhow.workspace = true image.workspace = true palette.workspace = true +[dependencies.taffy] +version = "0.4.0" +default-features = false +features = ["std", "taffy_tree", "flexbox", "grid", "block_layout"] + [lints] workspace = true diff --git a/showbits-common/src/lib.rs b/showbits-common/src/lib.rs index fde4c1a..fefc724 100644 --- a/showbits-common/src/lib.rs +++ b/showbits-common/src/lib.rs @@ -1,5 +1,7 @@ -pub use crate::{rect::*, vec2::*, view::*}; +pub use crate::{node::*, rect::*, vec2::*, view::*, widget::*}; +mod node; mod rect; mod vec2; mod view; +mod widget; diff --git a/showbits-common/src/node.rs b/showbits-common/src/node.rs new file mode 100644 index 0000000..bc4133a --- /dev/null +++ b/showbits-common/src/node.rs @@ -0,0 +1,30 @@ +use taffy::{NodeId, Style, TaffyResult, TaffyTree}; + +use crate::Widget; + +pub struct Node { + layout: Style, + children: Vec, + widget: Option>, +} + +impl Node { + pub fn empty() -> Self { + Self { + layout: Style::default(), + children: vec![], + widget: None, + } + } + + pub fn widget(mut self, widget: W) -> Self { + self.widget = Some(Box::new(widget)); + self + } + + pub fn register(self, tree: &mut TaffyTree>) -> TaffyResult { + let id = tree.new_with_children(self.layout, &self.children)?; + tree.set_node_context(id, self.widget)?; + Ok(id) + } +} diff --git a/showbits-common/src/widget.rs b/showbits-common/src/widget.rs new file mode 100644 index 0000000..c5684f0 --- /dev/null +++ b/showbits-common/src/widget.rs @@ -0,0 +1,23 @@ +use taffy::{AvailableSpace, Size}; + +use crate::{Node, View}; + +pub trait Widget { + #[allow(unused_variables)] + fn size(&mut self, known: Size>, available: Size) -> Size { + Size::ZERO + } + + fn draw_below(&mut self, view: &mut View<'_>) -> anyhow::Result<()>; + fn draw_above(&mut self, view: &mut View<'_>) -> anyhow::Result<()>; +} + +pub trait WidgetExt { + fn node(self) -> Node; +} + +impl WidgetExt for W { + fn node(self) -> Node { + Node::empty().widget(self) + } +}