From d59c3d7911b4e102e0dff941dd69eb5e02a90680 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sun, 3 Aug 2025 09:20:25 -0500 Subject: [PATCH] Added a NoRenderRoot component for root only and NoRender doesn't render on child handlers --- src/elements/div.rs | 9 +++++++-- src/elements/flex.rs | 14 +++++++++++--- src/elements/heading.rs | 8 ++++++-- src/elements/paginator.rs | 8 ++++++-- src/lib.rs | 3 ++- 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/elements/div.rs b/src/elements/div.rs index 0779a92..02b9748 100644 --- a/src/elements/div.rs +++ b/src/elements/div.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use crate::{ widget::{Element, Widget}, - NoRender, + NoRender, NoRenderRoot, }; pub struct Div { @@ -31,7 +31,12 @@ impl Element for Div { scope.set_parent_size(transform.width, transform.height); for elem in &self.children { + if elem.get::().is_some() { + continue; + } + scope.clear(); + if let Some(style) = elem.get() { scope.set_style(style); } @@ -57,7 +62,7 @@ impl Element for Div { fn draw_child(&mut self, element: &Arc) { self.children.push(element.clone()); - element.inject(|w| w.component(NoRender)); + element.inject(|w| w.component(NoRenderRoot)); } fn as_any(&self) -> &dyn std::any::Any { diff --git a/src/elements/flex.rs b/src/elements/flex.rs index a34bc9d..06e3737 100644 --- a/src/elements/flex.rs +++ b/src/elements/flex.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use crate::{ widget::{Element, Widget}, - NoRender, + NoRender, NoRenderRoot, }; pub struct FlexRow { @@ -51,6 +51,10 @@ impl Element for FlexRow { let mut v = 0; for elem in &self.children { + if elem.get::().is_some() { + continue; + } + scope.clear(); if let Some(style) = elem.get() { scope.set_style(style); @@ -81,7 +85,7 @@ impl Element for FlexRow { fn draw_child(&mut self, element: &Arc) { self.children.push(element.clone()); - element.inject(|w| w.component(NoRender)); + element.inject(|w| w.component(NoRenderRoot)); } fn as_any(&self) -> &dyn std::any::Any { @@ -107,6 +111,10 @@ impl Element for FlexCol { let mut v = 0; for elem in &self.children { + if elem.get::().is_some() { + continue; + } + scope.clear(); if let Some(style) = elem.get() { scope.set_style(style); @@ -137,7 +145,7 @@ impl Element for FlexCol { fn draw_child(&mut self, element: &Arc) { self.children.push(element.clone()); - element.inject(|w| w.component(NoRender)); + element.inject(|w| w.component(NoRenderRoot)); } fn as_any(&self) -> &dyn std::any::Any { diff --git a/src/elements/heading.rs b/src/elements/heading.rs index 5a0166e..9e432f1 100644 --- a/src/elements/heading.rs +++ b/src/elements/heading.rs @@ -4,7 +4,7 @@ use figlet_rs::FIGfont; use crate::{ widget::{Element, Widget}, - NoRender, + NoRender, NoRenderRoot, }; pub struct Heading { @@ -27,6 +27,10 @@ impl Element for Heading { fn render(&mut self, scope: &mut crate::prelude::RenderScope) { let mut s = String::new(); for element in &self.children { + if element.get::().is_some() { + continue; + } + if let Some(e) = element.get_elem().as_any().downcast_ref::() { s += e; } @@ -45,7 +49,7 @@ impl Element for Heading { } fn draw_child(&mut self, element: &Arc) { - element.inject(|w| w.component(NoRender)); + element.inject(|w| w.component(NoRenderRoot)); self.children.push(element.clone()); } diff --git a/src/elements/paginator.rs b/src/elements/paginator.rs index 950857b..da7de57 100644 --- a/src/elements/paginator.rs +++ b/src/elements/paginator.rs @@ -4,7 +4,7 @@ use crossterm::event::{KeyCode, KeyEvent}; use crate::{ widget::{Element, Widget}, - NoRender, + NoRender, NoRenderRoot, }; pub struct Paginator { @@ -31,6 +31,10 @@ impl Element for Paginator { fn after_render(&mut self, scope: &mut crate::render_scope::RenderScope) { if let Some(elem) = self.children.get(self.index) { + if elem.get::().is_some() { + return; + } + let mut transform = scope.get_transform().clone(); let (w, h) = scope.get_parent_size(); scope.set_parent_size(transform.width, transform.height); @@ -85,7 +89,7 @@ impl Element for Paginator { fn draw_child(&mut self, element: &Arc) { self.children.push(element.clone()); - element.inject(|w| w.component(NoRender)); + element.inject(|w| w.component(NoRenderRoot)); } fn as_any(&self) -> &dyn std::any::Any { diff --git a/src/lib.rs b/src/lib.rs index 1d43782..2eab099 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -81,6 +81,7 @@ pub struct Screen { event!(RenderWrapperEvent(*mut RenderScope)); component!(NoRender); +component!(NoRenderRoot); impl RenderWrapperEvent { /// Returns a mutable reference to the underlying `RenderScope`. @@ -180,7 +181,7 @@ impl Screen { utils::clear()?; for elem in self.widgets.lock().unwrap().iter() { - if let Some(NoRender) = elem.get() { + if elem.get::().is_some() || elem.get::().is_some() { for ext in self.extensions.lock().unwrap().iter() { ext.lock().unwrap().render_widget(&mut scope, elem); }