diff --git a/src/component/context.rs b/src/component/context.rs index e5ff55a..de08664 100644 --- a/src/component/context.rs +++ b/src/component/context.rs @@ -114,7 +114,7 @@ impl Context { self.scopes.access(move |scopes| { for scope in scopes { let event = event.clone(); - scope.children.access(move |children| { + scope.access_children(move |children| { for (child, _) in children { child.emit_event(event.clone()); } @@ -143,7 +143,7 @@ impl Context { self.scopes.access(move |scopes| { for scope in scopes { let event = event.clone(); - scope.children.access(move |children| { + scope.access_children(move |children| { for (child, _) in children { child.emit_event_threaded(&event); } @@ -203,7 +203,7 @@ impl Context { for scope in scopes { let mut c = c.clone(); let tx = tx.clone(); - scope.children.access(move |children| { + scope.access_children(move |children| { for (child, view_wrapper) in children { let view = child.get_view(); diff --git a/src/component/scope.rs b/src/component/scope.rs index 1a80575..83201ce 100644 --- a/src/component/scope.rs +++ b/src/component/scope.rs @@ -1,13 +1,12 @@ +use super::{context::Context, ComponentImpl}; +use crate::{engine::CommandExecutor, View, ViewWrapper}; +use access_cell::AccessCell; use std::sync::Arc; -use access_cell::AccessCell; - -use crate::{engine::CommandExecutor, View, ViewWrapper}; - -use super::{context::Context, ComponentImpl}; +pub type ScopeChildren = Vec<(Arc, Option)>; pub struct Scope { - pub children: AccessCell, Option)>>, + children: AccessCell, executor: Arc, } @@ -39,4 +38,17 @@ impl Scope { self.children.access(|children| children.push((ctx, None))); } + + pub fn view_wrapper(self: &Arc, view: View, view_wrapper: Option) { + let ctx = Context::new(view, self.executor.clone()); + + ctx.refresh(); + + self.children + .access(|children| children.push((ctx, view_wrapper))); + } + + pub fn access_children(self: &Arc, f: impl FnOnce(&mut ScopeChildren) + Send + 'static) { + self.children.access(f); + } }