From d8173b8ab35d5ed1be339915f47358a45dd82489 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sat, 31 Jan 2026 14:44:28 +0100 Subject: [PATCH] Scope children with AccessCell --- src/component/context.rs | 39 ++++++++++++++++++++++++--------------- src/component/scope.rs | 13 ++++++++----- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/component/context.rs b/src/component/context.rs index 41f0f77..e5ff55a 100644 --- a/src/component/context.rs +++ b/src/component/context.rs @@ -113,9 +113,12 @@ impl Context { self.scopes.access(move |scopes| { for scope in scopes { - for (child, _) in scope.children.lock().unwrap().iter() { - child.emit_event(event.clone()); - } + let event = event.clone(); + scope.children.access(move |children| { + for (child, _) in children { + child.emit_event(event.clone()); + } + }); } }); } @@ -139,9 +142,12 @@ impl Context { let event = event.clone(); self.scopes.access(move |scopes| { for scope in scopes { - for (child, _) in scope.children.lock().unwrap().iter() { - child.emit_event_threaded(&event); - } + let event = event.clone(); + scope.children.access(move |children| { + for (child, _) in children { + child.emit_event_threaded(&event); + } + }); } }); } @@ -189,23 +195,26 @@ impl Context { } pub fn draw_children(self: &Arc, ctx: &mut DrawContext) { - let mut c = ctx.clone(); + let c = ctx.clone(); let (tx, rx) = std::sync::mpsc::channel::(); self.scopes.access(move |scopes| { for scope in scopes { - for (child, view_wrapper) in scope.children.lock().unwrap().iter() { - let view = child.get_view(); + let mut c = c.clone(); + let tx = tx.clone(); + scope.children.access(move |children| { + for (child, view_wrapper) in children { + let view = child.get_view(); - if let Some(view_wrapper) = view_wrapper { - view_wrapper(&mut c, view) - } else { - c.draw_view(c.area.clone(), view); + if let Some(view_wrapper) = view_wrapper { + view_wrapper(&mut c, view) + } else { + c.draw_view(c.area.clone(), view); + } } - tx.send(c.clone()).expect("Failed transmitting DrawContext"); - } + }); } }); diff --git a/src/component/scope.rs b/src/component/scope.rs index 6cfe6e5..1a80575 100644 --- a/src/component/scope.rs +++ b/src/component/scope.rs @@ -1,18 +1,20 @@ -use std::sync::{Arc, Mutex}; +use std::sync::Arc; + +use access_cell::AccessCell; use crate::{engine::CommandExecutor, View, ViewWrapper}; use super::{context::Context, ComponentImpl}; pub struct Scope { - pub children: Mutex, Option)>>, + pub children: AccessCell, Option)>>, executor: Arc, } impl Scope { pub fn new(executor: Arc) -> Arc { Arc::new(Self { - children: Mutex::new(Vec::new()), + children: AccessCell::new(Vec::new()), executor, }) } @@ -26,7 +28,8 @@ impl Scope { ctx.refresh(); - self.children.lock().unwrap().push((ctx, view_wrapper)); + self.children + .access(|children| children.push((ctx, view_wrapper))); } pub fn view(self: &Arc, view: View) { @@ -34,6 +37,6 @@ impl Scope { ctx.refresh(); - self.children.lock().unwrap().push((ctx, None)); + self.children.access(|children| children.push((ctx, None))); } }