diff --git a/src/context.rs b/src/context.rs index d3df25ccab481f24a318cf8e4ff355e6c299ebc1..b6ce293a61735c46c507f19160de920ceb87abd8 100644 --- a/src/context.rs +++ b/src/context.rs @@ -227,10 +227,8 @@ impl KayakRootContext { parent_id: Option<Entity>, context_entity: Entity, ) { - if let Some(parent_id) = parent_id { - self.context_entities - .add_context_entity::<T>(parent_id, context_entity); - } + self.context_entities + .add_context_entity::<T>(parent_id, context_entity); } /// Returns a new/existing widget entity. diff --git a/src/context_entities.rs b/src/context_entities.rs index 5037f39f96be6f600e0e5ad59d0f51c5f9b2ae13..e1707a12e9ffbc86d3f15dce077b1376cc045e1a 100644 --- a/src/context_entities.rs +++ b/src/context_entities.rs @@ -8,7 +8,7 @@ use dashmap::DashMap; #[derive(Debug, Clone)] pub struct ContextEntities { - ce: Arc<DashMap<Entity, DashMap<TypeId, Entity>>>, + ce: Arc<DashMap<Option<Entity>, DashMap<TypeId, Entity>>>, } impl ContextEntities { @@ -20,7 +20,7 @@ impl ContextEntities { pub fn add_context_entity<T: Default + 'static>( &self, - parent_id: Entity, + parent_id: Option<Entity>, context_entity: Entity, ) { if !self.ce.contains_key(&parent_id) { @@ -30,7 +30,7 @@ impl ContextEntities { inner.insert(T::default().type_id(), context_entity); } - pub fn get_context_entity<T: Default + 'static>(&self, parent_id: Entity) -> Option<Entity> { + pub fn get_context_entity<T: Default + 'static>(&self, parent_id: Option<Entity>) -> Option<Entity> { if !self.ce.contains_key(&parent_id) { return None; } diff --git a/src/widget_context.rs b/src/widget_context.rs index aabbdfc4104ae005f2fd7314a951779987502d1a..1dd68d7b8afef22a10733fdf61ee2092263ecc13 100644 --- a/src/widget_context.rs +++ b/src/widget_context.rs @@ -72,10 +72,8 @@ impl KayakWidgetContext { parent_id: Option<Entity>, context_entity: Entity, ) { - if let Some(parent_id) = parent_id { - self.context_entities - .add_context_entity::<T>(parent_id, context_entity); - } + self.context_entities + .add_context_entity::<T>(parent_id, context_entity); } /// Finds the closest matching context entity by traversing up the tree. @@ -86,7 +84,7 @@ impl KayakWidgetContext { // Check self first.. if let Some(entity) = self .context_entities - .get_context_entity::<T>(current_entity) + .get_context_entity::<T>(Some(current_entity)) { return Some(entity); } @@ -97,12 +95,20 @@ impl KayakWidgetContext { while parent.is_some() { if let Some(entity) = self .context_entities - .get_context_entity::<T>(parent.unwrap().0) + .get_context_entity::<T>(Some(parent.unwrap().0)) { return Some(entity); } parent = tree.get_parent(parent.unwrap()); } + + // Finally check root AKA no parent. + if let Some(entity) = self + .context_entities + .get_context_entity::<T>(None) + { + return Some(entity); + } } None