ConstructEssentials

i'm really out of ideas how to name another struct name with function parameters. Well, here we go - essentials.
This commit is contained in:
Aleksander
2025-10-11 11:26:25 +02:00
parent ce8cd3bce7
commit 200d5223d3
11 changed files with 90 additions and 78 deletions

View File

@@ -194,7 +194,7 @@ impl TestbedGeneric {
layout: &mut Layout, layout: &mut Layout,
data: &mut Data, data: &mut Data,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
data.popup_window.open(WguiWindowParams { data.popup_window.open(&mut WguiWindowParams {
globals: self.globals.clone(), globals: self.globals.clone(),
position: Vec2::new(128.0, 128.0), position: Vec2::new(128.0, 128.0),
layout, layout,

View File

@@ -17,9 +17,8 @@
</rectangle> </rectangle>
<!-- content itself --> <!-- content itself -->
<div width="100%" height="100%" padding="8" gap="4" flex_direction="column"> <div id="content" width="100%" height="100%" padding="8" gap="4" flex_direction="column">
<label text="Window content" />
<Button id="button" color="#9911AA" text="I'm clickable." width="128" height="24" />
</div> </div>
</rectangle> </rectangle>
</elements> </elements>

View File

@@ -3,15 +3,14 @@ use crate::{
components::{Component, ComponentBase, ComponentTrait, InitData}, components::{Component, ComponentBase, ComponentTrait, InitData},
drawing::{self, Boundary, Color}, drawing::{self, Boundary, Color},
event::{CallbackDataCommon, EventListenerCollection, EventListenerKind, ListenerHandleVec}, event::{CallbackDataCommon, EventListenerCollection, EventListenerKind, ListenerHandleVec},
globals::Globals,
i18n::Translation, i18n::Translation,
layout::{Layout, WidgetID, WidgetPair}, layout::{WidgetID, WidgetPair},
renderer_vk::{ renderer_vk::{
text::{FontWeight, TextStyle}, text::{FontWeight, TextStyle},
util::centered_matrix, util::centered_matrix,
}, },
widget::{ widget::{
EventResult, WidgetData, ConstructEssentials, EventResult, WidgetData,
label::{WidgetLabel, WidgetLabelParams}, label::{WidgetLabel, WidgetLabelParams},
rectangle::{WidgetRectangle, WidgetRectangleParams}, rectangle::{WidgetRectangle, WidgetRectangleParams},
util::WLength, util::WLength,
@@ -267,12 +266,10 @@ fn register_event_mouse_release<U1, U2>(
} }
pub fn construct<U1, U2>( pub fn construct<U1, U2>(
globals: &mut Globals, ess: ConstructEssentials<U1, U2>,
layout: &mut Layout,
listeners: &mut EventListenerCollection<U1, U2>,
parent: WidgetID,
params: Params, params: Params,
) -> anyhow::Result<(WidgetPair, Rc<ComponentButton>)> { ) -> anyhow::Result<(WidgetPair, Rc<ComponentButton>)> {
let globals = ess.layout.state.globals.clone();
let mut style = params.style; let mut style = params.style;
// force-override style // force-override style
@@ -285,7 +282,7 @@ pub fn construct<U1, U2>(
let color = if let Some(color) = params.color { let color = if let Some(color) = params.color {
color color
} else { } else {
globals.defaults.button_color globals.get().defaults.button_color
}; };
let border_color = if let Some(border_color) = params.border_color { let border_color = if let Some(border_color) = params.border_color {
@@ -306,8 +303,8 @@ pub fn construct<U1, U2>(
Color::new(color.r + 0.5, color.g + 0.5, color.g + 0.5, color.a + 0.5) Color::new(color.r + 0.5, color.g + 0.5, color.g + 0.5, color.a + 0.5)
}; };
let (root, _) = layout.add_child( let (root, _) = ess.layout.add_child(
parent, ess.parent,
WidgetRectangle::create(WidgetRectangleParams { WidgetRectangle::create(WidgetRectangleParams {
color, color,
color2: get_color2(&color), color2: get_color2(&color),
@@ -324,10 +321,10 @@ pub fn construct<U1, U2>(
let light_text = (color.r + color.g + color.b) < 1.5; let light_text = (color.r + color.g + color.b) < 1.5;
let id_label = if let Some(content) = params.text { let id_label = if let Some(content) = params.text {
let (label, _node_label) = layout.add_child( let (label, _node_label) = ess.layout.add_child(
id_rect, id_rect,
WidgetLabel::create( WidgetLabel::create(
globals, &mut globals.get(),
WidgetLabelParams { WidgetLabelParams {
content, content,
style: TextStyle { style: TextStyle {
@@ -365,13 +362,13 @@ pub fn construct<U1, U2>(
let mut base = ComponentBase::default(); let mut base = ComponentBase::default();
register_event_mouse_enter(data.clone(), state.clone(), listeners, &mut base.lhandles); register_event_mouse_enter(data.clone(), state.clone(), ess.listeners, &mut base.lhandles);
register_event_mouse_leave(data.clone(), state.clone(), listeners, &mut base.lhandles); register_event_mouse_leave(data.clone(), state.clone(), ess.listeners, &mut base.lhandles);
register_event_mouse_press(data.clone(), state.clone(), listeners, &mut base.lhandles); register_event_mouse_press(data.clone(), state.clone(), ess.listeners, &mut base.lhandles);
register_event_mouse_release(data.clone(), state.clone(), listeners, &mut base.lhandles); register_event_mouse_release(data.clone(), state.clone(), ess.listeners, &mut base.lhandles);
let button = Rc::new(ComponentButton { base, data, state }); let button = Rc::new(ComponentButton { base, data, state });
layout.defer_component_init(Component(button.clone())); ess.layout.defer_component_init(Component(button.clone()));
Ok((root, button)) Ok((root, button))
} }

View File

@@ -10,10 +10,10 @@ use crate::{
drawing::Color, drawing::Color,
event::{CallbackDataCommon, EventAlterables, EventListenerCollection, EventListenerKind, ListenerHandleVec}, event::{CallbackDataCommon, EventAlterables, EventListenerCollection, EventListenerKind, ListenerHandleVec},
i18n::Translation, i18n::Translation,
layout::{self, Layout, LayoutState, WidgetID, WidgetPair}, layout::{self, LayoutState, WidgetID, WidgetPair},
renderer_vk::text::{FontWeight, TextStyle}, renderer_vk::text::{FontWeight, TextStyle},
widget::{ widget::{
EventResult, ConstructEssentials, EventResult,
label::{WidgetLabel, WidgetLabelParams}, label::{WidgetLabel, WidgetLabelParams},
rectangle::{WidgetRectangle, WidgetRectangleParams}, rectangle::{WidgetRectangle, WidgetRectangleParams},
util::WLength, util::WLength,
@@ -248,9 +248,7 @@ fn register_event_mouse_release<U1, U2>(
} }
pub fn construct<U1, U2>( pub fn construct<U1, U2>(
layout: &mut Layout, ess: ConstructEssentials<U1, U2>,
listeners: &mut EventListenerCollection<U1, U2>,
parent: WidgetID,
params: Params, params: Params,
) -> anyhow::Result<(WidgetPair, Rc<ComponentCheckbox>)> { ) -> anyhow::Result<(WidgetPair, Rc<ComponentCheckbox>)> {
let mut style = params.style; let mut style = params.style;
@@ -268,10 +266,10 @@ pub fn construct<U1, U2>(
//style.align_self = Some(taffy::AlignSelf::Start); // do not stretch self to the parent //style.align_self = Some(taffy::AlignSelf::Start); // do not stretch self to the parent
style.gap = length(4.0); style.gap = length(4.0);
let globals = layout.state.globals.clone(); let globals = ess.layout.state.globals.clone();
let (root, _) = layout.add_child( let (root, _) = ess.layout.add_child(
parent, ess.parent,
WidgetRectangle::create(WidgetRectangleParams { WidgetRectangle::create(WidgetRectangleParams {
color: Color::new(1.0, 1.0, 1.0, 0.0), color: Color::new(1.0, 1.0, 1.0, 0.0),
border_color: Color::new(1.0, 1.0, 1.0, 0.0), border_color: Color::new(1.0, 1.0, 1.0, 0.0),
@@ -288,7 +286,7 @@ pub fn construct<U1, U2>(
height: length(params.box_size), height: length(params.box_size),
}; };
let (outer_box, _) = layout.add_child( let (outer_box, _) = ess.layout.add_child(
id_container, id_container,
WidgetRectangle::create(WidgetRectangleParams { WidgetRectangle::create(WidgetRectangleParams {
border: 2.0, border: 2.0,
@@ -306,7 +304,7 @@ pub fn construct<U1, U2>(
}, },
)?; )?;
let (inner_box, _) = layout.add_child( let (inner_box, _) = ess.layout.add_child(
outer_box.id, outer_box.id,
WidgetRectangle::create(WidgetRectangleParams { WidgetRectangle::create(WidgetRectangleParams {
round: WLength::Units(5.0), round: WLength::Units(5.0),
@@ -322,7 +320,7 @@ pub fn construct<U1, U2>(
}, },
)?; )?;
let (label, _node_label) = layout.add_child( let (label, _node_label) = ess.layout.add_child(
id_container, id_container,
WidgetLabel::create( WidgetLabel::create(
&mut globals.get(), &mut globals.get(),
@@ -352,13 +350,13 @@ pub fn construct<U1, U2>(
let mut base = ComponentBase::default(); let mut base = ComponentBase::default();
register_event_mouse_enter(&data, state.clone(), listeners, &mut base.lhandles); register_event_mouse_enter(&data, state.clone(), ess.listeners, &mut base.lhandles);
register_event_mouse_leave(&data, state.clone(), listeners, &mut base.lhandles); register_event_mouse_leave(&data, state.clone(), ess.listeners, &mut base.lhandles);
register_event_mouse_press(&data, state.clone(), listeners, &mut base.lhandles); register_event_mouse_press(&data, state.clone(), ess.listeners, &mut base.lhandles);
register_event_mouse_release(data.clone(), state.clone(), listeners, &mut base.lhandles); register_event_mouse_release(data.clone(), state.clone(), ess.listeners, &mut base.lhandles);
let checkbox = Rc::new(ComponentCheckbox { base, data, state }); let checkbox = Rc::new(ComponentCheckbox { base, data, state });
layout.defer_component_init(Component(checkbox.clone())); ess.layout.defer_component_init(Component(checkbox.clone()));
Ok((root, checkbox)) Ok((root, checkbox))
} }

View File

@@ -9,13 +9,13 @@ use crate::{
drawing::{self}, drawing::{self},
event::{self, CallbackDataCommon, EventListenerCollection, EventListenerKind, ListenerHandleVec}, event::{self, CallbackDataCommon, EventListenerCollection, EventListenerKind, ListenerHandleVec},
i18n::Translation, i18n::Translation,
layout::{Layout, WidgetID, WidgetPair}, layout::{WidgetID, WidgetPair},
renderer_vk::{ renderer_vk::{
text::{FontWeight, HorizontalAlign, TextStyle}, text::{FontWeight, HorizontalAlign, TextStyle},
util, util,
}, },
widget::{ widget::{
EventResult, ConstructEssentials, EventResult,
div::WidgetDiv, div::WidgetDiv,
label::{WidgetLabel, WidgetLabelParams}, label::{WidgetLabel, WidgetLabelParams},
rectangle::{WidgetRectangle, WidgetRectangleParams}, rectangle::{WidgetRectangle, WidgetRectangleParams},
@@ -308,9 +308,7 @@ fn register_event_mouse_release<U1, U2>(
} }
pub fn construct<U1, U2>( pub fn construct<U1, U2>(
layout: &mut Layout, ess: ConstructEssentials<U1, U2>,
listeners: &mut EventListenerCollection<U1, U2>,
parent: WidgetID,
params: Params, params: Params,
) -> anyhow::Result<(WidgetPair, Rc<ComponentSlider>)> { ) -> anyhow::Result<(WidgetPair, Rc<ComponentSlider>)> {
let mut style = params.style; let mut style = params.style;
@@ -318,10 +316,10 @@ pub fn construct<U1, U2>(
style.min_size = style.size; style.min_size = style.size;
style.max_size = style.size; style.max_size = style.size;
let (root, slider_body_node) = layout.add_child(parent, WidgetDiv::create(), style)?; let (root, slider_body_node) = ess.layout.add_child(ess.parent, WidgetDiv::create(), style)?;
let body_id = root.id; let body_id = root.id;
let (_background_id, _) = layout.add_child( let (_background_id, _) = ess.layout.add_child(
body_id, body_id,
WidgetRectangle::create(WidgetRectangleParams { WidgetRectangle::create(WidgetRectangleParams {
color: BODY_COLOR, color: BODY_COLOR,
@@ -354,9 +352,11 @@ pub fn construct<U1, U2>(
}; };
// invisible outer handle body // invisible outer handle body
let (slider_handle, slider_handle_node) = layout.add_child(body_id, WidgetDiv::create(), slider_handle_style)?; let (slider_handle, slider_handle_node) = ess
.layout
.add_child(body_id, WidgetDiv::create(), slider_handle_style)?;
let (slider_handle_rect, _) = layout.add_child( let (slider_handle_rect, _) = ess.layout.add_child(
slider_handle.id, slider_handle.id,
WidgetRectangle::create(WidgetRectangleParams { WidgetRectangle::create(WidgetRectangleParams {
color: HANDLE_COLOR, color: HANDLE_COLOR,
@@ -381,9 +381,9 @@ pub fn construct<U1, U2>(
values: params.values, values: params.values,
}; };
let globals = layout.state.globals.clone(); let globals = ess.layout.state.globals.clone();
let (slider_text, _) = layout.add_child( let (slider_text, _) = ess.layout.add_child(
slider_handle.id, slider_handle.id,
WidgetLabel::create( WidgetLabel::create(
&mut globals.get(), &mut globals.get(),
@@ -412,15 +412,15 @@ pub fn construct<U1, U2>(
let mut base = ComponentBase::default(); let mut base = ComponentBase::default();
register_event_mouse_enter(data.clone(), state.clone(), listeners, &mut base.lhandles); register_event_mouse_enter(data.clone(), state.clone(), ess.listeners, &mut base.lhandles);
register_event_mouse_leave(data.clone(), state.clone(), listeners, &mut base.lhandles); register_event_mouse_leave(data.clone(), state.clone(), ess.listeners, &mut base.lhandles);
register_event_mouse_motion(data.clone(), state.clone(), listeners, &mut base.lhandles); register_event_mouse_motion(data.clone(), state.clone(), ess.listeners, &mut base.lhandles);
register_event_mouse_press(data.clone(), state.clone(), listeners, &mut base.lhandles); register_event_mouse_press(data.clone(), state.clone(), ess.listeners, &mut base.lhandles);
register_event_mouse_leave(data.clone(), state.clone(), listeners, &mut base.lhandles); register_event_mouse_leave(data.clone(), state.clone(), ess.listeners, &mut base.lhandles);
register_event_mouse_release(&data, state.clone(), listeners, &mut base.lhandles); register_event_mouse_release(&data, state.clone(), ess.listeners, &mut base.lhandles);
let slider = Rc::new(ComponentSlider { base, data, state }); let slider = Rc::new(ComponentSlider { base, data, state });
layout.defer_component_init(Component(slider.clone())); ess.layout.defer_component_init(Component(slider.clone()));
Ok((root, slider)) Ok((root, slider))
} }

View File

@@ -53,6 +53,7 @@ impl WeakWidget {
pub struct WidgetMap(HopSlotMap<WidgetID, Widget>); pub struct WidgetMap(HopSlotMap<WidgetID, Widget>);
pub type WidgetNodeMap = SecondaryMap<WidgetID, taffy::NodeId>; pub type WidgetNodeMap = SecondaryMap<WidgetID, taffy::NodeId>;
#[derive(Clone)]
pub struct WidgetPair { pub struct WidgetPair {
pub id: WidgetID, pub id: WidgetID,
pub widget: Widget, pub widget: Widget,

View File

@@ -7,7 +7,7 @@ use crate::{
AttribPair, ParserContext, ParserFile, parse_check_f32, parse_children, process_component, AttribPair, ParserContext, ParserFile, parse_check_f32, parse_children, process_component,
style::{parse_color_opt, parse_round, parse_style, parse_text_style}, style::{parse_color_opt, parse_round, parse_style, parse_text_style},
}, },
widget::util::WLength, widget::{ConstructEssentials, util::WLength},
}; };
pub fn parse_component_button<'a, U1, U2>( pub fn parse_component_button<'a, U1, U2>(
@@ -60,13 +60,12 @@ pub fn parse_component_button<'a, U1, U2>(
} }
} }
let globals = ctx.layout.state.globals.clone();
let (widget, component) = button::construct( let (widget, component) = button::construct(
&mut globals.get(), ConstructEssentials {
ctx.layout, layout: ctx.layout,
ctx.listeners, listeners: ctx.listeners,
parent_id, parent: parent_id,
},
button::Params { button::Params {
color, color,
border, border,

View File

@@ -3,6 +3,7 @@ use crate::{
i18n::Translation, i18n::Translation,
layout::WidgetID, layout::WidgetID,
parser::{AttribPair, ParserContext, parse_check_f32, parse_check_i32, process_component, style::parse_style}, parser::{AttribPair, ParserContext, parse_check_f32, parse_check_i32, process_component, style::parse_style},
widget::ConstructEssentials,
}; };
pub fn parse_component_checkbox<U1, U2>( pub fn parse_component_checkbox<U1, U2>(
@@ -36,9 +37,11 @@ pub fn parse_component_checkbox<U1, U2>(
} }
let (widget, component) = checkbox::construct( let (widget, component) = checkbox::construct(
ctx.layout, ConstructEssentials {
ctx.listeners, layout: ctx.layout,
parent_id, listeners: ctx.listeners,
parent: parent_id,
},
checkbox::Params { checkbox::Params {
box_size, box_size,
text: translation, text: translation,

View File

@@ -2,6 +2,7 @@ use crate::{
components::{Component, slider}, components::{Component, slider},
layout::WidgetID, layout::WidgetID,
parser::{AttribPair, ParserContext, parse_check_f32, process_component, style::parse_style}, parser::{AttribPair, ParserContext, parse_check_f32, process_component, style::parse_style},
widget::ConstructEssentials,
}; };
pub fn parse_component_slider<U1, U2>( pub fn parse_component_slider<U1, U2>(
@@ -32,9 +33,11 @@ pub fn parse_component_slider<U1, U2>(
} }
let (widget, component) = slider::construct( let (widget, component) = slider::construct(
ctx.layout, ConstructEssentials {
ctx.listeners, layout: ctx.layout,
parent_id, listeners: ctx.listeners,
parent: parent_id,
},
slider::Params { slider::Params {
style, style,
values: slider::ValuesMinMax { values: slider::ValuesMinMax {

View File

@@ -6,8 +6,8 @@ use crate::{
any::AnyTrait, any::AnyTrait,
drawing::{self, PrimitiveExtent}, drawing::{self, PrimitiveExtent},
event::{ event::{
self, CallbackData, CallbackDataCommon, CallbackMetadata, Event, EventAlterables, EventListenerKind, self, CallbackData, CallbackDataCommon, CallbackMetadata, Event, EventAlterables, EventListenerCollection,
EventListenerVec, MouseWheelEvent, EventListenerKind, EventListenerVec, MouseWheelEvent,
}, },
layout::{Layout, LayoutState, WidgetID}, layout::{Layout, LayoutState, WidgetID},
stack::{ScissorStack, TransformStack}, stack::{ScissorStack, TransformStack},
@@ -516,3 +516,9 @@ impl WidgetState {
Ok(EventResult::Pass) Ok(EventResult::Pass)
} }
} }
pub struct ConstructEssentials<'a, U1, U2> {
pub layout: &'a mut Layout,
pub listeners: &'a mut EventListenerCollection<U1, U2>,
pub parent: WidgetID,
}

View File

@@ -16,6 +16,7 @@ use crate::{
struct OpenedWindow { struct OpenedWindow {
layout_tasks: LayoutTasks, layout_tasks: LayoutTasks,
widget: WidgetPair, widget: WidgetPair,
content: WidgetPair,
#[allow(dead_code)] #[allow(dead_code)]
state: ParserState, state: ParserState,
@@ -34,6 +35,10 @@ struct State {
#[derive(Clone)] #[derive(Clone)]
pub struct WguiWindow(Rc<RefCell<State>>); pub struct WguiWindow(Rc<RefCell<State>>);
pub struct OnContentData {
pub widget: WidgetPair,
}
pub struct WguiWindowParams<'a> { pub struct WguiWindowParams<'a> {
pub position: Vec2, pub position: Vec2,
pub globals: WguiGlobals, pub globals: WguiGlobals,
@@ -52,7 +57,7 @@ impl WguiWindow {
self.0.borrow_mut().opened_window = None; self.0.borrow_mut().opened_window = None;
} }
pub fn open(&mut self, params: WguiWindowParams) -> anyhow::Result<()> { pub fn open(&mut self, params: &mut WguiWindowParams) -> anyhow::Result<()> {
// close previous one if it's already open // close previous one if it's already open
self.close(); self.close();
@@ -74,7 +79,7 @@ impl WguiWindow {
let state = parser::parse_from_assets( let state = parser::parse_from_assets(
&parser::ParseDocumentParams { &parser::ParseDocumentParams {
globals: params.globals, globals: params.globals.clone(),
path: XML_PATH, path: XML_PATH,
extra: Default::default(), extra: Default::default(),
}, },
@@ -92,19 +97,20 @@ impl WguiWindow {
}) })
}); });
let button = state.fetch_component_as::<ComponentButton>("button").unwrap(); let content = state.fetch_widget(&params.layout.state, "content")?;
button.on_click(Box::new(move |_common, _e| {
log::info!("click");
Ok(())
}));
self.0.borrow_mut().opened_window = Some(OpenedWindow { self.0.borrow_mut().opened_window = Some(OpenedWindow {
widget, widget,
state, state,
layout_tasks: params.layout.tasks.clone(), layout_tasks: params.layout.tasks.clone(),
content,
}); });
Ok(()) Ok(())
} }
pub fn get_content(&self) -> WidgetPair {
let state = self.0.borrow_mut();
state.opened_window.as_ref().unwrap().content.clone()
}
} }