Refactored the frontend to work with static widgets #11
This commit is contained in:
+12
-12
@@ -2,12 +2,12 @@ use std::sync::Arc;
|
||||
|
||||
use crate::{
|
||||
state::DependencyHandler,
|
||||
widget::{BoxedElement, Widget, WidgetLoad},
|
||||
widget::{StaticWidget, Widget, WidgetLoad},
|
||||
Screen,
|
||||
};
|
||||
|
||||
pub enum RsxElement {
|
||||
Element(BoxedElement, Vec<Box<dyn DependencyHandler>>, Rsx),
|
||||
Element(Arc<StaticWidget>, Rsx),
|
||||
|
||||
DynElement(
|
||||
Box<dyn FnMut() -> WidgetLoad + Send + Sync>,
|
||||
@@ -41,18 +41,14 @@ impl Rsx {
|
||||
child.draw_parent(screen, Some(w.clone()));
|
||||
}
|
||||
|
||||
RsxElement::Element(f, dep, child) => {
|
||||
let w = if let Some(parent) = &parent {
|
||||
let w = screen.draw_box(f);
|
||||
parent.get_elem().draw_child(&w);
|
||||
w
|
||||
} else {
|
||||
screen.draw_box(f)
|
||||
};
|
||||
RsxElement::Element(ws, child) => {
|
||||
let w = Arc::new(Widget::Static(ws));
|
||||
screen.draw_widget(w.clone());
|
||||
|
||||
for d in dep {
|
||||
w.dependency_box(d);
|
||||
if let Some(parent) = &parent {
|
||||
parent.get_elem().draw_child(&w);
|
||||
}
|
||||
|
||||
child.draw_parent(screen, Some(w.clone()));
|
||||
}
|
||||
}
|
||||
@@ -72,6 +68,10 @@ impl Rsx {
|
||||
));
|
||||
}
|
||||
|
||||
pub fn create_element_static(&mut self, element: Arc<StaticWidget>, children: Rsx) {
|
||||
self.0.push(RsxElement::Element(element, children));
|
||||
}
|
||||
|
||||
pub fn expand(&mut self, other: &mut Rsx) {
|
||||
self.0.append(&mut other.0);
|
||||
}
|
||||
|
||||
@@ -67,6 +67,10 @@ impl Screen {
|
||||
w
|
||||
}
|
||||
|
||||
pub fn draw_widget(self: &Arc<Self>, widget: Arc<Widget>) {
|
||||
self.widgets.lock().unwrap().push(widget);
|
||||
}
|
||||
|
||||
pub fn draw_dyn<F: FnMut() -> WidgetLoad + 'static + Send + Sync>(
|
||||
self: &Arc<Self>,
|
||||
element: F,
|
||||
|
||||
@@ -145,6 +145,12 @@ macro_rules! rsx {
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! rsx_inner {
|
||||
// static
|
||||
($r:expr, $(@$comp:expr;)* static $s:literal $($rest:tt)*) => {
|
||||
$r.create_element_static(std::sync::Arc::new($crate::widget::StaticWidget::new(Box::new(format!($s)))) $(.component($comp))* .clone(), $crate::frontend::Rsx(Vec::new()));
|
||||
$crate::rsx_inner! { $r, $($rest)* };
|
||||
};
|
||||
|
||||
($r:expr, $(%$dep:ident)* $(@$comp:expr;)* $s:literal $($rest:tt)*) => {
|
||||
$r.create_element({ $(let $dep = $dep.clone();)* move || {
|
||||
$crate::widget::WidgetLoad::new(format!($s)) $(.component($comp))*
|
||||
@@ -152,6 +158,18 @@ macro_rules! rsx_inner {
|
||||
$crate::rsx_inner! { $r, $($rest)* };
|
||||
};
|
||||
|
||||
// static
|
||||
($r:expr, $(%$dep:ident)* $(@$comp:expr;)* static $name:path { $($inner:tt)* } ($($e:expr),*) $($rest:tt)*) => {
|
||||
$r.create_element_static(std::sync::Arc::new($crate::widget::StaticWidget::new(Box::new(<$name>::new($($e),*)))) $(.component($comp))* .clone(), $crate::frontend::Rsx(Vec::new()));
|
||||
$crate::rsx_inner! { $r, $($rest)* };
|
||||
};
|
||||
|
||||
// static
|
||||
($r:expr, $(@$comp:expr;)* static $name:path { $($inner:tt)* } $($rest:tt)*) => {
|
||||
$r.create_element_static(std::sync::Arc::new($crate::widget::StaticWidget::new(Box::new(<$name>::new()))) $(.component($comp))* .clone(), $crate::frontend::Rsx(Vec::new()));
|
||||
$crate::rsx_inner! { $r, $($rest)* };
|
||||
};
|
||||
|
||||
($r:expr, $(%$dep:ident)* $(@$comp:expr;)* $name:path { $($inner:tt)* } ($($e:expr),*) $($rest:tt)*) => {
|
||||
$r.create_element({ $(let $dep = $dep.clone();)* move || {
|
||||
$crate::widget::WidgetLoad::new(<$name>::new($($e),*)) $(.component($comp))*
|
||||
|
||||
+5
-2
@@ -2,11 +2,14 @@ use osui::prelude::*;
|
||||
|
||||
fn main() -> std::io::Result<()> {
|
||||
let screen = Screen::new();
|
||||
screen.extension(VelocityExtension);
|
||||
|
||||
let count = use_state(0);
|
||||
|
||||
rsx! {
|
||||
%count // Dependency of count
|
||||
"Count: {count}"
|
||||
@Velocity(20, 0);
|
||||
@Transform::new();
|
||||
static "Count: {count}"
|
||||
}
|
||||
.draw(&screen);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user