From f8f924ce2527245978c90c26057747513504e7a7 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sun, 3 Aug 2025 09:11:04 -0500 Subject: [PATCH 1/4] Fixed input still typing with modifiers like ctrl --- src/elements/input.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/elements/input.rs b/src/elements/input.rs index f89efc5..d06a21c 100644 --- a/src/elements/input.rs +++ b/src/elements/input.rs @@ -1,4 +1,4 @@ -use crossterm::event::{KeyCode, KeyEvent}; +use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; use crate::{ state::{use_state, State}, @@ -22,7 +22,14 @@ impl Element for Input { } fn event(&mut self, event: &dyn crate::prelude::Event) { - if let Some(crossterm::event::Event::Key(KeyEvent { code, .. })) = event.get() { + if let Some(crossterm::event::Event::Key(KeyEvent { + code, modifiers, .. + })) = event.get() + { + if !modifiers.is_empty() && modifiers.contains(KeyModifiers::SHIFT) { + return; + } + match code { KeyCode::Char(c) => { self.state.get().insert(self.cursor, *c); From 1aa78bc1a4df2ba47e601a557e9f0220eba82d59 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sun, 3 Aug 2025 09:11:50 -0500 Subject: [PATCH 2/4] Fixed input still typing with modifiers like ctrl --- src/elements/input.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elements/input.rs b/src/elements/input.rs index d06a21c..0561798 100644 --- a/src/elements/input.rs +++ b/src/elements/input.rs @@ -26,7 +26,7 @@ impl Element for Input { code, modifiers, .. })) = event.get() { - if !modifiers.is_empty() && modifiers.contains(KeyModifiers::SHIFT) { + if !modifiers.is_empty() && !modifiers.contains(KeyModifiers::SHIFT) { return; } From d59c3d7911b4e102e0dff941dd69eb5e02a90680 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sun, 3 Aug 2025 09:20:25 -0500 Subject: [PATCH 3/4] 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); } From 2c7d3cc80f0f2aef299742313c7f588e60406b24 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sun, 3 Aug 2025 13:24:21 -0500 Subject: [PATCH 4/4] added .sparkignore --- .sparkignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .sparkignore diff --git a/.sparkignore b/.sparkignore new file mode 100644 index 0000000..abed7cc --- /dev/null +++ b/.sparkignore @@ -0,0 +1,5 @@ +debug +target +github +Cargo.lock +.DS_Store \ No newline at end of file