redo event fn signature & add event_ctx macro

This commit is contained in:
2025-12-06 20:48:10 -05:00
parent f6b1143665
commit 62aa02847a
10 changed files with 270 additions and 274 deletions

View File

@@ -7,16 +7,17 @@ use len_fns::*;
use winit::event::WindowEvent;
fn main() {
UiApp::<Client>::run();
DefaultApp::<Client>::run();
}
pub struct Client {
ui: DefaultUi,
info: WidgetId<Text>,
}
impl DefaultUiState for Client {
fn new(mut ui: DefaultUi, _proxy: Proxy<Self::Event>) -> Self {
event_ctx!(Client);
impl DefaultAppState for Client {
fn new(ui: &mut Ui, _state: &UiState, _proxy: Proxy<Self::Event>) -> Self {
let rrect = rect(Color::WHITE).radius(20);
let pad_test = (
rrect.color(Color::BLUE),
@@ -39,7 +40,7 @@ impl DefaultUiState for Client {
.width(rest(3)),
)
.span(Dir::RIGHT)
.add(&mut ui);
.add(ui);
let span_test = (
rrect.color(Color::GREEN).width(100),
@@ -50,14 +51,14 @@ impl DefaultUiState for Client {
rrect.color(Color::RED).width(100),
)
.span(Dir::LEFT)
.add(&mut ui);
.add(ui);
let span_add = Span::empty(Dir::RIGHT).add(&mut ui);
let span_add = Span::empty(Dir::RIGHT).add(ui);
let span_add_ = span_add.clone();
let add_button = rect(Color::LIME)
.radius(30)
.on(CursorSense::click(), move |ctx: &mut Client, _| {
.on(CursorSense::click(), move |ctx| {
let child = ctx
.ui
.add(image(include_bytes!("assets/sungals.png")).center())
@@ -70,13 +71,13 @@ impl DefaultUiState for Client {
let span_add_ = span_add.clone();
let del_button = rect(Color::RED)
.radius(30)
.on(CursorSense::click(), move |ctx: &mut Client, _| {
.on(CursorSense::click(), move |ctx| {
ctx.ui[&span_add_].children.pop();
})
.sized((150, 150))
.align(Align::BOT_LEFT);
let span_add_test = (span_add, add_button, del_button).stack().add(&mut ui);
let span_add_test = (span_add, add_button, del_button).stack().add(ui);
let btext = |content| wtext(content).size(30);
@@ -99,29 +100,27 @@ impl DefaultUiState for Client {
wtext("pretty cool right?").size(50),
)
.span(Dir::DOWN)
.add(&mut ui);
.add(ui);
let texts = Span::empty(Dir::DOWN).gap(10).add(&mut ui);
let texts = Span::empty(Dir::DOWN).gap(10).add(ui);
let msg_area = texts.clone().scroll().masked().background(rect(Color::SKY));
let add_text = wtext("add")
.editable(false)
.text_align(Align::LEFT)
.size(30)
.attr::<Selectable>(())
.id_on(Submit, move |id, client: &mut Client, _| {
let content = client.ui.text(id).take();
.on(Submit, move |ctx| {
let content = ctx.ui.text(ctx.id).take();
let text = wtext(content)
.editable(false)
.size(30)
.text_align(Align::LEFT)
.wrap(true)
.attr::<Selectable>(());
let msg_box = text
.background(rect(Color::WHITE.darker(0.5)))
.add(&mut client.ui);
client.ui[&texts].children.push(msg_box.any());
let msg_box = text.background(rect(Color::WHITE.darker(0.5))).add(ctx.ui);
ctx.ui[&texts].children.push(msg_box.any());
})
.add(&mut ui);
.add(ui);
let text_edit_scroll = (
msg_area.height(rest(1)),
(
@@ -129,8 +128,8 @@ impl DefaultUiState for Client {
(
add_text.clone().width(rest(1)),
Rect::new(Color::GREEN)
.on(CursorSense::click(), move |client: &mut Client, _| {
client.run_event(&add_text, Submit, ());
.on(CursorSense::click(), move |ctx| {
ctx.ui.run_event(ctx.state, &add_text, Submit, ());
})
.sized((40, 40)),
)
@@ -143,25 +142,25 @@ impl DefaultUiState for Client {
.align(Align::BOT),
)
.span(Dir::DOWN)
.add(&mut ui);
.add(ui);
let main = pad_test.clone().pad(10).add(&mut ui);
let main = pad_test.clone().pad(10).add(ui);
let switch_button = |color, to: WidgetId, label| {
let main_ = main.clone();
let rect = rect(color)
.id_on(CursorSense::click(), move |id, ui: &mut Ui, _| {
ui[&main_.clone()].inner = to.clone();
ui[id].color = color.darker(0.3);
.on(CursorSense::click(), move |ctx| {
ctx.ui[&main_.clone()].inner = to.clone();
ctx.ui[ctx.id].color = color.darker(0.3);
})
.edit_on(
.on(
CursorSense::HoverStart | CursorSense::unclick(),
move |r, _| {
r.color = color.brighter(0.2);
move |ctx| {
ctx.ui[ctx.id].color = color.brighter(0.2);
},
)
.edit_on(CursorSense::HoverEnd, move |r, _| {
r.color = color;
.on(CursorSense::HoverEnd, move |ctx| {
ctx.ui[ctx.id].color = color;
});
(rect, wtext(label).size(30).text_align(Align::CENTER)).stack()
};
@@ -179,33 +178,28 @@ impl DefaultUiState for Client {
)
.span(Dir::RIGHT);
let info = wtext("").add(&mut ui);
let info = wtext("").add(ui);
let info_sect = info.clone().pad(10).align(Align::RIGHT);
((tabs.height(40), main).span(Dir::DOWN), info_sect)
.stack()
.set_root(&mut ui);
.set_root(ui);
Self { ui, info }
Self { info }
}
fn ui(&mut self) -> &mut DefaultUi {
&mut self.ui
}
fn window_event(&mut self, _: WindowEvent) {
fn window_event(&mut self, _: WindowEvent, ui: &mut Ui, state: &UiState) {
let new = format!(
"widgets: {}\nactive:{}\nviews: {}",
self.ui.num_widgets(),
self.ui.active_widgets(),
self.ui.renderer.ui.view_count()
ui.num_widgets(),
ui.active_widgets(),
state.renderer.ui.view_count()
);
if new != *self.ui[&self.info].content {
*self.ui[&self.info].content = new;
if new != *ui[&self.info].content {
*ui[&self.info].content = new;
}
if self.ui.needs_redraw() {
self.ui.window.request_redraw();
if ui.needs_redraw() {
state.window.request_redraw();
}
self.ui.input.end_frame();
}
}