Added a ElementRenderer trait for element renderers

This commit is contained in:
2025-08-04 12:16:23 -05:00
parent 9868f02c33
commit b363c81a24
3 changed files with 69 additions and 40 deletions
+51 -1
View File
@@ -8,13 +8,22 @@
//!
//! Used internally by OSUI's layout and rendering system.
use std::fmt::Debug;
use std::{fmt::Debug, sync::Arc};
use crate::{
prelude::{Context, Handler},
style::{RawTransform, Style, Transform},
utils::{self, hex_ansi_bg},
widget::Widget,
NoRender, RenderWrapperEvent,
};
pub trait ElementRenderer {
/// Called right after the `after_render` function is called
#[allow(unused)]
fn on_after_render(&mut self, scope: &mut RenderScope, widget: &Arc<Widget>) {}
}
/// Represents a single render instruction.
#[derive(Clone)]
enum RenderMethod {
@@ -291,6 +300,47 @@ impl RenderScope {
pub fn get_style(&mut self) -> &mut Style {
&mut self.style
}
pub fn render_widget(
&mut self,
renderer: &mut dyn ElementRenderer,
ctx: &Context,
widget: &std::sync::Arc<crate::widget::Widget>,
) -> bool {
if widget.get::<NoRender>().is_some() {
widget.auto_refresh();
return false;
}
if let Some(wrapper) = widget.get::<Handler<RenderWrapperEvent>>() {
wrapper.call(widget, &RenderWrapperEvent(self));
} else {
self.clear();
if let Some(style) = widget.get() {
self.set_style(style);
}
if let Some(t) = widget.get() {
self.set_transform(&t);
}
widget.get_elem().render(self, ctx);
ctx.render(widget, self);
if let Some(t) = widget.get() {
self.set_transform(&t);
}
self.draw();
widget.get_elem().after_render(self, ctx);
ctx.after_render(widget, self);
renderer.on_after_render(self, widget);
}
widget.auto_refresh();
true
}
}
impl Debug for RenderScope {