diff --git a/src/elements/div.rs b/src/elements/div.rs index b554ecb..13a341a 100644 --- a/src/elements/div.rs +++ b/src/elements/div.rs @@ -27,7 +27,7 @@ impl Element for Div { fn render( &mut self, scope: &mut crate::render_scope::RenderScope, - _: &crate::extensions::Context, + _: &crate::render_scope::RenderContext, ) { let (width, height) = scope.get_size_or(self.size.0, self.size.1); scope.use_area(width, height); @@ -36,7 +36,7 @@ impl Element for Div { fn after_render( &mut self, scope: &mut crate::render_scope::RenderScope, - ctx: &crate::extensions::Context, + ctx: &crate::render_scope::RenderContext, ) { let mut transform = scope.get_transform().clone(); let mut renderer = DivRenderer(&mut transform); @@ -45,7 +45,7 @@ impl Element for Div { scope.set_parent_size(renderer.0.width, renderer.0.height); for widget in &self.children { - scope.render_widget(&mut renderer, ctx, widget); + scope.render_widget(&mut renderer, ctx.get_context(), widget); } scope.set_parent_size(w, h); diff --git a/src/elements/flex.rs b/src/elements/flex.rs index 80b8a4c..6c74bb3 100644 --- a/src/elements/flex.rs +++ b/src/elements/flex.rs @@ -46,7 +46,7 @@ impl Element for FlexRow { fn render( &mut self, scope: &mut crate::render_scope::RenderScope, - _: &crate::extensions::Context, + _: &crate::render_scope::RenderContext, ) { let (width, height) = scope.get_size_or(self.size.0, self.size.1); scope.use_area(width, height); @@ -55,7 +55,7 @@ impl Element for FlexRow { fn after_render( &mut self, scope: &mut crate::render_scope::RenderScope, - ctx: &crate::extensions::Context, + ctx: &crate::render_scope::RenderContext, ) { let mut transform = scope.get_transform().clone(); let transform_before = transform.clone(); @@ -66,7 +66,7 @@ impl Element for FlexRow { let mut renderer = RowRenderer(&mut transform, self.gap, &mut v); for widget in &self.children { - scope.render_widget(&mut renderer, ctx, widget); + scope.render_widget(&mut renderer, ctx.get_context(), widget); } scope.set_parent_size(w, h); scope.set_transform_raw(transform_before); @@ -91,7 +91,7 @@ impl Element for FlexCol { fn render( &mut self, scope: &mut crate::render_scope::RenderScope, - _: &crate::extensions::Context, + _: &crate::render_scope::RenderContext, ) { let (width, height) = scope.get_size_or(self.size.0, self.size.1); scope.use_area(width, height); @@ -100,7 +100,7 @@ impl Element for FlexCol { fn after_render( &mut self, scope: &mut crate::render_scope::RenderScope, - ctx: &crate::extensions::Context, + ctx: &crate::render_scope::RenderContext, ) { let mut transform = scope.get_transform().clone(); let transform_before = transform.clone(); @@ -111,7 +111,7 @@ impl Element for FlexCol { let mut renderer = ColumnRenderer(&mut transform, self.gap, &mut v); for widget in &self.children { - scope.render_widget(&mut renderer, ctx, widget); + scope.render_widget(&mut renderer, ctx.get_context(), widget); } scope.set_parent_size(w, h); scope.set_transform_raw(transform_before); diff --git a/src/elements/heading.rs b/src/elements/heading.rs index d4dd1e8..78ccb88 100644 --- a/src/elements/heading.rs +++ b/src/elements/heading.rs @@ -27,7 +27,7 @@ impl Element for Heading { fn render( &mut self, scope: &mut crate::prelude::RenderScope, - _: &crate::extensions::Context, + _: &crate::render_scope::RenderContext, ) { let mut s = String::new(); for element in &self.children { diff --git a/src/elements/input.rs b/src/elements/input.rs index 5c5eb4d..768337c 100644 --- a/src/elements/input.rs +++ b/src/elements/input.rs @@ -14,7 +14,7 @@ impl Element for Input { fn render( &mut self, scope: &mut crate::prelude::RenderScope, - _: &crate::extensions::Context, + _: &crate::render_scope::RenderContext, ) { let s = self.state.get(); scope.draw_text(0, 0, &s); diff --git a/src/elements/mod.rs b/src/elements/mod.rs index 58ee1fc..6e1d045 100644 --- a/src/elements/mod.rs +++ b/src/elements/mod.rs @@ -16,7 +16,7 @@ impl Element for String { fn render( &mut self, scope: &mut crate::render_scope::RenderScope, - _: &crate::extensions::Context, + _: &crate::render_scope::RenderContext, ) { scope.draw_text(0, 0, self); } diff --git a/src/elements/paginator.rs b/src/elements/paginator.rs index ae2890d..aeab8d2 100644 --- a/src/elements/paginator.rs +++ b/src/elements/paginator.rs @@ -28,7 +28,7 @@ impl Element for Paginator { fn render( &mut self, scope: &mut crate::render_scope::RenderScope, - _: &crate::extensions::Context, + _: &crate::render_scope::RenderContext, ) { let (width, height) = scope.get_size_or(self.size.0, self.size.1); scope.use_area(width, height); @@ -37,7 +37,7 @@ impl Element for Paginator { fn after_render( &mut self, scope: &mut crate::render_scope::RenderScope, - ctx: &crate::extensions::Context, + ctx: &crate::render_scope::RenderContext, ) { if let Some(widget) = self.children.get(self.index) { let mut transform = scope.get_transform().clone(); @@ -45,7 +45,7 @@ impl Element for Paginator { let (w, h) = scope.get_parent_size(); scope.set_parent_size(renderer.0.width, renderer.0.height); - scope.render_widget(&mut renderer, ctx, widget); + scope.render_widget(&mut renderer, ctx.get_context(), widget); scope.set_parent_size(w, h); self.size = (renderer.0.width, renderer.0.height); diff --git a/src/render_scope.rs b/src/render_scope.rs index 38e52cb..6e10914 100644 --- a/src/render_scope.rs +++ b/src/render_scope.rs @@ -50,6 +50,30 @@ pub struct RenderScope { style: Style, } +pub struct RenderContext(Context, bool); + +impl RenderContext { + pub fn new(c: &Context, focused: bool) -> Self { + Self(c.clone(), focused) + } + + pub fn is_focused(&self) -> bool { + self.1 + } + + pub fn render(&self, w: &Arc, scope: &mut RenderScope) { + self.0.render(w, scope); + } + + pub fn after_render(&self, w: &Arc, scope: &mut RenderScope) { + self.0.after_render(w, scope); + } + + pub fn get_context(&self) -> &Context { + &self.0 + } +} + impl RenderScope { /// Creates a new, empty `RenderScope`. pub fn new() -> RenderScope { @@ -304,7 +328,7 @@ impl RenderScope { pub fn render_widget( &mut self, renderer: &mut dyn ElementRenderer, - ctx: &Context, + ctx: &crate::extensions::Context, widget: &std::sync::Arc, ) -> bool { if widget.get::().is_some() { @@ -317,6 +341,8 @@ impl RenderScope { } else { self.clear(); + let render_context = RenderContext::new(ctx, widget.is_focused()); + if let Some(style) = widget.get() { self.set_style(style); } @@ -324,7 +350,7 @@ impl RenderScope { self.set_transform(&t); } - widget.get_elem().render(self, ctx); + widget.get_elem().render(self, &render_context); ctx.render(widget, self); if let Some(t) = widget.get() { @@ -335,7 +361,7 @@ impl RenderScope { self.draw(); - widget.get_elem().after_render(self, ctx); + widget.get_elem().after_render(self, &render_context); ctx.after_render(widget, self); } diff --git a/src/widget.rs b/src/widget.rs index b155ae3..cd53615 100644 --- a/src/widget.rs +++ b/src/widget.rs @@ -31,11 +31,11 @@ pub type BoxedComponent = Box; pub trait Element: Send + Sync { /// Called to perform rendering for the element. #[allow(unused)] - fn render(&mut self, scope: &mut RenderScope, ctx: &crate::extensions::Context) {} + fn render(&mut self, scope: &mut RenderScope, ctx: &crate::render_scope::RenderContext) {} /// Called after rendering, for follow-up logic or cleanup. #[allow(unused)] - fn after_render(&mut self, scope: &mut RenderScope, ctx: &crate::extensions::Context) {} + fn after_render(&mut self, scope: &mut RenderScope, ctx: &crate::render_scope::RenderContext) {} /// Called to draw child widgets, if any. #[allow(unused)]