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