From 1ea993819864e147459866f6c2c859575f18468d Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Wed, 13 Dec 2023 12:51:43 -0800 Subject: [PATCH] Fixing style inheritance --- Cargo.lock | 10 +++++----- src/styles.rs | 21 +++++++++++++++++++-- src/tree.rs | 6 +++++- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0e20781..1121d68 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -498,9 +498,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f" dependencies = [ "cfg-if", ] @@ -1062,7 +1062,7 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" [[package]] name = "kludgine" version = "0.1.0" -source = "git+https://github.com/khonsulabs/kludgine#52f58c39b0ab4e1e280d27f7228e8ccd9a377f50" +source = "git+https://github.com/khonsulabs/kludgine#90d2035c22bd92ddc5e7edf6c933886c55749bd3" dependencies = [ "ahash", "alot", @@ -2135,9 +2135,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.40" +version = "2.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13fa70a4ee923979ffb522cacce59d34421ebdea5625e1073c4326ef9d2dd42e" +checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" dependencies = [ "proc-macro2", "quote", diff --git a/src/styles.rs b/src/styles.rs index ccac961..1955af3 100644 --- a/src/styles.rs +++ b/src/styles.rs @@ -89,7 +89,7 @@ impl Styles { name.name().into_owned(), StoredComponent { inherited: false, - inheritable: false, + inheritable: true, component: component.into_value().into_component_value(), }, ); @@ -195,7 +195,7 @@ impl Styles { .unwrap_or_else(|err| err.as_ref().clone()) .components { - if value.inherited || !value.inheritable { + if !value.inheritable || self.0.components.contains_key(&name) { continue; } @@ -203,6 +203,23 @@ impl Styles { self.insert_named(name, value); } } + + /// Returns this collection of styles without any local style definitions. + #[must_use] + pub fn into_inherited(self) -> Self { + if self.0.components.values().any(|stored| !stored.inheritable) { + Self(Arc::new(StyleData { + components: Arc::try_unwrap(self.0) + .unwrap_or_else(|err| err.as_ref().clone()) + .components + .into_iter() + .filter(|(_, stored)| stored.inheritable) + .collect(), + })) + } else { + self + } + } } impl Debug for Styles { diff --git a/src/tree.rs b/src/tree.rs index 6d98634..6de8f36 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -607,7 +607,11 @@ impl Node { fn child_styles(&self) -> Styles { let mut effective_styles = self.effective_styles.clone(); if let Some(associated) = &self.associated_styles { - effective_styles.inherit_from(associated.get()); + let mut merged = associated.get(); + merged.inherit_from(effective_styles); + effective_styles = merged; + } else { + effective_styles = effective_styles.into_inherited(); } effective_styles }