Merge pull request #25 from osui-rs/more-elements

More elements
This commit is contained in:
Leo Codes
2025-08-03 13:25:54 -05:00
committed by GitHub
7 changed files with 46 additions and 12 deletions
+5
View File
@@ -0,0 +1,5 @@
debug
target
github
Cargo.lock
.DS_Store
+7 -2
View File
@@ -2,7 +2,7 @@ use std::sync::Arc;
use crate::{ use crate::{
widget::{Element, Widget}, widget::{Element, Widget},
NoRender, NoRender, NoRenderRoot,
}; };
pub struct Div { pub struct Div {
@@ -31,7 +31,12 @@ impl Element for Div {
scope.set_parent_size(transform.width, transform.height); scope.set_parent_size(transform.width, transform.height);
for elem in &self.children { for elem in &self.children {
if elem.get::<NoRender>().is_some() {
continue;
}
scope.clear(); scope.clear();
if let Some(style) = elem.get() { if let Some(style) = elem.get() {
scope.set_style(style); scope.set_style(style);
} }
@@ -57,7 +62,7 @@ impl Element for Div {
fn draw_child(&mut self, element: &Arc<Widget>) { fn draw_child(&mut self, element: &Arc<Widget>) {
self.children.push(element.clone()); 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 { fn as_any(&self) -> &dyn std::any::Any {
+11 -3
View File
@@ -2,7 +2,7 @@ use std::sync::Arc;
use crate::{ use crate::{
widget::{Element, Widget}, widget::{Element, Widget},
NoRender, NoRender, NoRenderRoot,
}; };
pub struct FlexRow { pub struct FlexRow {
@@ -51,6 +51,10 @@ impl Element for FlexRow {
let mut v = 0; let mut v = 0;
for elem in &self.children { for elem in &self.children {
if elem.get::<NoRender>().is_some() {
continue;
}
scope.clear(); scope.clear();
if let Some(style) = elem.get() { if let Some(style) = elem.get() {
scope.set_style(style); scope.set_style(style);
@@ -81,7 +85,7 @@ impl Element for FlexRow {
fn draw_child(&mut self, element: &Arc<Widget>) { fn draw_child(&mut self, element: &Arc<Widget>) {
self.children.push(element.clone()); 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 { fn as_any(&self) -> &dyn std::any::Any {
@@ -107,6 +111,10 @@ impl Element for FlexCol {
let mut v = 0; let mut v = 0;
for elem in &self.children { for elem in &self.children {
if elem.get::<NoRender>().is_some() {
continue;
}
scope.clear(); scope.clear();
if let Some(style) = elem.get() { if let Some(style) = elem.get() {
scope.set_style(style); scope.set_style(style);
@@ -137,7 +145,7 @@ impl Element for FlexCol {
fn draw_child(&mut self, element: &Arc<Widget>) { fn draw_child(&mut self, element: &Arc<Widget>) {
self.children.push(element.clone()); 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 { fn as_any(&self) -> &dyn std::any::Any {
+6 -2
View File
@@ -4,7 +4,7 @@ use figlet_rs::FIGfont;
use crate::{ use crate::{
widget::{Element, Widget}, widget::{Element, Widget},
NoRender, NoRender, NoRenderRoot,
}; };
pub struct Heading { pub struct Heading {
@@ -27,6 +27,10 @@ impl Element for Heading {
fn render(&mut self, scope: &mut crate::prelude::RenderScope) { fn render(&mut self, scope: &mut crate::prelude::RenderScope) {
let mut s = String::new(); let mut s = String::new();
for element in &self.children { for element in &self.children {
if element.get::<NoRender>().is_some() {
continue;
}
if let Some(e) = element.get_elem().as_any().downcast_ref::<String>() { if let Some(e) = element.get_elem().as_any().downcast_ref::<String>() {
s += e; s += e;
} }
@@ -45,7 +49,7 @@ impl Element for Heading {
} }
fn draw_child(&mut self, element: &Arc<Widget>) { fn draw_child(&mut self, element: &Arc<Widget>) {
element.inject(|w| w.component(NoRender)); element.inject(|w| w.component(NoRenderRoot));
self.children.push(element.clone()); self.children.push(element.clone());
} }
+9 -2
View File
@@ -1,4 +1,4 @@
use crossterm::event::{KeyCode, KeyEvent}; use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
use crate::{ use crate::{
state::{use_state, State}, state::{use_state, State},
@@ -22,7 +22,14 @@ impl Element for Input {
} }
fn event(&mut self, event: &dyn crate::prelude::Event) { 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 { match code {
KeyCode::Char(c) => { KeyCode::Char(c) => {
self.state.get().insert(self.cursor, *c); self.state.get().insert(self.cursor, *c);
+6 -2
View File
@@ -4,7 +4,7 @@ use crossterm::event::{KeyCode, KeyEvent};
use crate::{ use crate::{
widget::{Element, Widget}, widget::{Element, Widget},
NoRender, NoRender, NoRenderRoot,
}; };
pub struct Paginator { pub struct Paginator {
@@ -31,6 +31,10 @@ impl Element for Paginator {
fn after_render(&mut self, scope: &mut crate::render_scope::RenderScope) { fn after_render(&mut self, scope: &mut crate::render_scope::RenderScope) {
if let Some(elem) = self.children.get(self.index) { if let Some(elem) = self.children.get(self.index) {
if elem.get::<NoRender>().is_some() {
return;
}
let mut transform = scope.get_transform().clone(); let mut transform = scope.get_transform().clone();
let (w, h) = scope.get_parent_size(); let (w, h) = scope.get_parent_size();
scope.set_parent_size(transform.width, transform.height); scope.set_parent_size(transform.width, transform.height);
@@ -85,7 +89,7 @@ impl Element for Paginator {
fn draw_child(&mut self, element: &Arc<Widget>) { fn draw_child(&mut self, element: &Arc<Widget>) {
self.children.push(element.clone()); 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 { fn as_any(&self) -> &dyn std::any::Any {
+2 -1
View File
@@ -81,6 +81,7 @@ pub struct Screen {
event!(RenderWrapperEvent(*mut RenderScope)); event!(RenderWrapperEvent(*mut RenderScope));
component!(NoRender); component!(NoRender);
component!(NoRenderRoot);
impl RenderWrapperEvent { impl RenderWrapperEvent {
/// Returns a mutable reference to the underlying `RenderScope`. /// Returns a mutable reference to the underlying `RenderScope`.
@@ -180,7 +181,7 @@ impl Screen {
utils::clear()?; utils::clear()?;
for elem in self.widgets.lock().unwrap().iter() { for elem in self.widgets.lock().unwrap().iter() {
if let Some(NoRender) = elem.get() { if elem.get::<NoRender>().is_some() || elem.get::<NoRenderRoot>().is_some() {
for ext in self.extensions.lock().unwrap().iter() { for ext in self.extensions.lock().unwrap().iter() {
ext.lock().unwrap().render_widget(&mut scope, elem); ext.lock().unwrap().render_widget(&mut scope, elem);
} }