wgui: components refactoring, id handles
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
use std::rc::Rc;
|
||||
use std::{cell::RefCell, rc::Rc};
|
||||
use taffy::{AlignItems, JustifyContent, prelude::length};
|
||||
|
||||
use crate::{
|
||||
animation::{Animation, AnimationEasing},
|
||||
components::{Component, InitData},
|
||||
drawing::{self, Color},
|
||||
event::{CallbackDataCommon, EventListenerCollection, EventListenerKind, ListenerHandleVec},
|
||||
event::{EventAlterables, EventListenerCollection, EventListenerKind, ListenerHandleVec},
|
||||
i18n::Translation,
|
||||
layout::{Layout, WidgetID},
|
||||
layout::{Layout, LayoutState, WidgetID},
|
||||
renderer_vk::text::{FontWeight, TextStyle},
|
||||
widget::{
|
||||
rectangle::{Rectangle, RectangleParams},
|
||||
@@ -38,35 +38,44 @@ impl Default for Params {
|
||||
}
|
||||
}
|
||||
|
||||
struct State {
|
||||
hovered: bool,
|
||||
down: bool,
|
||||
}
|
||||
|
||||
struct Data {
|
||||
initial_color: drawing::Color,
|
||||
initial_border_color: drawing::Color,
|
||||
text_id: WidgetID, // Text
|
||||
rect_id: WidgetID, // Rectangle
|
||||
text_node: taffy::NodeId,
|
||||
}
|
||||
|
||||
pub struct Button {
|
||||
pub struct ComponentButton {
|
||||
data: Rc<Data>,
|
||||
state: Rc<RefCell<State>>,
|
||||
|
||||
#[allow(dead_code)]
|
||||
listener_handles: ListenerHandleVec,
|
||||
}
|
||||
|
||||
impl Component for Button {
|
||||
impl Component for ComponentButton {
|
||||
fn init(&self, _data: &mut InitData) {}
|
||||
}
|
||||
|
||||
impl Button {
|
||||
pub fn set_text<C>(&self, common: &mut CallbackDataCommon, text: Translation) {
|
||||
let globals = common.state.globals.clone();
|
||||
impl ComponentButton {
|
||||
pub fn set_text(&self, state: &mut LayoutState, text: Translation) {
|
||||
let globals = state.globals.clone();
|
||||
|
||||
common
|
||||
.state
|
||||
state
|
||||
.widgets
|
||||
.call(self.data.text_id, |label: &mut TextLabel| {
|
||||
label.set_text(&mut globals.i18n(), text);
|
||||
});
|
||||
common.alterables.mark_redraw();
|
||||
common.alterables.mark_dirty(self.data.text_node);
|
||||
|
||||
let mut alterables = EventAlterables::default();
|
||||
alterables.mark_redraw();
|
||||
alterables.mark_dirty(self.data.text_node);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,12 +117,98 @@ fn anim_hover_out(data: Rc<Data>, widget_id: WidgetID) -> Animation {
|
||||
)
|
||||
}
|
||||
|
||||
fn register_event_mouse_enter<U1, U2>(
|
||||
data: Rc<Data>,
|
||||
state: Rc<RefCell<State>>,
|
||||
listeners: &mut EventListenerCollection<U1, U2>,
|
||||
listener_handles: &mut ListenerHandleVec,
|
||||
) {
|
||||
listeners.register(
|
||||
listener_handles,
|
||||
data.rect_id,
|
||||
EventListenerKind::MouseEnter,
|
||||
Box::new(move |common, event_data, _, _| {
|
||||
common.alterables.trigger_haptics();
|
||||
common
|
||||
.alterables
|
||||
.animate(anim_hover_in(data.clone(), event_data.widget_id));
|
||||
state.borrow_mut().hovered = true;
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
fn register_event_mouse_leave<U1, U2>(
|
||||
data: Rc<Data>,
|
||||
state: Rc<RefCell<State>>,
|
||||
listeners: &mut EventListenerCollection<U1, U2>,
|
||||
listener_handles: &mut ListenerHandleVec,
|
||||
) {
|
||||
listeners.register(
|
||||
listener_handles,
|
||||
data.rect_id,
|
||||
EventListenerKind::MouseLeave,
|
||||
Box::new(move |common, event_data, _, _| {
|
||||
common.alterables.trigger_haptics();
|
||||
common
|
||||
.alterables
|
||||
.animate(anim_hover_out(data.clone(), event_data.widget_id));
|
||||
state.borrow_mut().hovered = false;
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
fn register_event_mouse_press<U1, U2>(
|
||||
data: Rc<Data>,
|
||||
state: Rc<RefCell<State>>,
|
||||
listeners: &mut EventListenerCollection<U1, U2>,
|
||||
listener_handles: &mut ListenerHandleVec,
|
||||
) {
|
||||
listeners.register(
|
||||
listener_handles,
|
||||
data.rect_id,
|
||||
EventListenerKind::MousePress,
|
||||
Box::new(move |common, event_data, _, _| {
|
||||
common.alterables.trigger_haptics();
|
||||
let mut state = state.borrow_mut();
|
||||
|
||||
if state.hovered {
|
||||
state.down = true;
|
||||
}
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
fn register_event_mouse_release<U1, U2>(
|
||||
data: Rc<Data>,
|
||||
state: Rc<RefCell<State>>,
|
||||
listeners: &mut EventListenerCollection<U1, U2>,
|
||||
listener_handles: &mut ListenerHandleVec,
|
||||
) {
|
||||
listeners.register(
|
||||
listener_handles,
|
||||
data.rect_id,
|
||||
EventListenerKind::MouseRelease,
|
||||
Box::new(move |common, _data, _, _| {
|
||||
common.alterables.trigger_haptics();
|
||||
|
||||
let mut state = state.borrow_mut();
|
||||
if state.down {
|
||||
state.down = false;
|
||||
|
||||
if state.hovered {
|
||||
//TODO: click event
|
||||
}
|
||||
}
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
pub fn construct<U1, U2>(
|
||||
layout: &mut Layout,
|
||||
listeners: &mut EventListenerCollection<U1, U2>,
|
||||
parent: WidgetID,
|
||||
params: Params,
|
||||
) -> anyhow::Result<Rc<Button>> {
|
||||
) -> anyhow::Result<Rc<ComponentButton>> {
|
||||
let mut style = params.style;
|
||||
|
||||
// force-override style
|
||||
@@ -162,42 +257,30 @@ pub fn construct<U1, U2>(
|
||||
},
|
||||
)?;
|
||||
|
||||
let _data = Rc::new(Data {
|
||||
let data = Rc::new(Data {
|
||||
text_id,
|
||||
rect_id,
|
||||
text_node,
|
||||
initial_color: params.color,
|
||||
initial_border_color: params.border_color,
|
||||
});
|
||||
|
||||
let mut listener_handles = ListenerHandleVec::default();
|
||||
let state = Rc::new(RefCell::new(State {
|
||||
down: false,
|
||||
hovered: false,
|
||||
}));
|
||||
|
||||
let data = _data.clone();
|
||||
listeners.register(
|
||||
&mut listener_handles,
|
||||
rect_id,
|
||||
EventListenerKind::MouseEnter,
|
||||
Box::new(move |common, event_data, _, _| {
|
||||
common
|
||||
.alterables
|
||||
.animate(anim_hover_in(data.clone(), event_data.widget_id));
|
||||
}),
|
||||
);
|
||||
let mut lhandles = ListenerHandleVec::default();
|
||||
|
||||
let data = _data.clone();
|
||||
listeners.register(
|
||||
&mut listener_handles,
|
||||
rect_id,
|
||||
EventListenerKind::MouseLeave,
|
||||
Box::new(move |common, event_data, _, _| {
|
||||
common
|
||||
.alterables
|
||||
.animate(anim_hover_out(data.clone(), event_data.widget_id));
|
||||
}),
|
||||
);
|
||||
register_event_mouse_enter(data.clone(), state.clone(), listeners, &mut lhandles);
|
||||
register_event_mouse_leave(data.clone(), state.clone(), listeners, &mut lhandles);
|
||||
register_event_mouse_press(data.clone(), state.clone(), listeners, &mut lhandles);
|
||||
register_event_mouse_release(data.clone(), state.clone(), listeners, &mut lhandles);
|
||||
|
||||
let button = Rc::new(Button {
|
||||
data: _data.clone(),
|
||||
listener_handles,
|
||||
let button = Rc::new(ComponentButton {
|
||||
data,
|
||||
state,
|
||||
listener_handles: lhandles,
|
||||
});
|
||||
|
||||
layout.defer_component_init(button.clone());
|
||||
|
||||
@@ -48,7 +48,7 @@ pub struct Params {
|
||||
pub values: ValuesMinMax,
|
||||
}
|
||||
|
||||
pub struct SliderState {
|
||||
struct State {
|
||||
dragging: bool,
|
||||
hovered: bool,
|
||||
values: ValuesMinMax,
|
||||
@@ -62,15 +62,15 @@ struct Data {
|
||||
slider_body_node: taffy::NodeId,
|
||||
}
|
||||
|
||||
pub struct Slider {
|
||||
pub struct ComponentSlider {
|
||||
data: Rc<Data>,
|
||||
state: Rc<RefCell<SliderState>>,
|
||||
state: Rc<RefCell<State>>,
|
||||
|
||||
#[allow(dead_code)]
|
||||
listener_handles: ListenerHandleVec,
|
||||
}
|
||||
|
||||
impl Component for Slider {
|
||||
impl Component for ComponentSlider {
|
||||
fn init(&self, init_data: &mut InitData) {
|
||||
let mut state = self.state.borrow_mut();
|
||||
let value = state.values.value;
|
||||
@@ -106,7 +106,7 @@ const PAD_PERCENT: f32 = 0.75;
|
||||
const HANDLE_WIDTH: f32 = 32.0;
|
||||
const HANDLE_HEIGHT: f32 = 24.0;
|
||||
|
||||
impl SliderState {
|
||||
impl State {
|
||||
fn update_value_to_mouse(
|
||||
&mut self,
|
||||
event_data: &event::CallbackData<'_>,
|
||||
@@ -210,7 +210,7 @@ fn on_leave_anim(common: &mut event::CallbackDataCommon, handle_id: WidgetID) {
|
||||
|
||||
fn register_event_mouse_enter<U1, U2>(
|
||||
data: Rc<Data>,
|
||||
state: Rc<RefCell<SliderState>>,
|
||||
state: Rc<RefCell<State>>,
|
||||
listeners: &mut EventListenerCollection<U1, U2>,
|
||||
listener_handles: &mut ListenerHandleVec,
|
||||
) {
|
||||
@@ -228,7 +228,7 @@ fn register_event_mouse_enter<U1, U2>(
|
||||
|
||||
fn register_event_mouse_leave<U1, U2>(
|
||||
data: Rc<Data>,
|
||||
state: Rc<RefCell<SliderState>>,
|
||||
state: Rc<RefCell<State>>,
|
||||
listeners: &mut EventListenerCollection<U1, U2>,
|
||||
listener_handles: &mut ListenerHandleVec,
|
||||
) {
|
||||
@@ -246,7 +246,7 @@ fn register_event_mouse_leave<U1, U2>(
|
||||
|
||||
fn register_event_mouse_motion<U1, U2>(
|
||||
data: Rc<Data>,
|
||||
state: Rc<RefCell<SliderState>>,
|
||||
state: Rc<RefCell<State>>,
|
||||
listeners: &mut EventListenerCollection<U1, U2>,
|
||||
listener_handles: &mut ListenerHandleVec,
|
||||
) {
|
||||
@@ -266,7 +266,7 @@ fn register_event_mouse_motion<U1, U2>(
|
||||
|
||||
fn register_event_mouse_press<U1, U2>(
|
||||
data: Rc<Data>,
|
||||
state: Rc<RefCell<SliderState>>,
|
||||
state: Rc<RefCell<State>>,
|
||||
listeners: &mut EventListenerCollection<U1, U2>,
|
||||
listener_handles: &mut ListenerHandleVec,
|
||||
) {
|
||||
@@ -288,7 +288,7 @@ fn register_event_mouse_press<U1, U2>(
|
||||
|
||||
fn register_event_mouse_release<U1, U2>(
|
||||
data: Rc<Data>,
|
||||
state: Rc<RefCell<SliderState>>,
|
||||
state: Rc<RefCell<State>>,
|
||||
listeners: &mut EventListenerCollection<U1, U2>,
|
||||
listener_handles: &mut ListenerHandleVec,
|
||||
) {
|
||||
@@ -312,7 +312,7 @@ pub fn construct<U1, U2>(
|
||||
listeners: &mut EventListenerCollection<U1, U2>,
|
||||
parent: WidgetID,
|
||||
params: Params,
|
||||
) -> anyhow::Result<Rc<Slider>> {
|
||||
) -> anyhow::Result<Rc<ComponentSlider>> {
|
||||
let mut style = params.style;
|
||||
style.position = taffy::Position::Relative;
|
||||
style.min_size = style.size;
|
||||
@@ -382,7 +382,7 @@ pub fn construct<U1, U2>(
|
||||
},
|
||||
)?;
|
||||
|
||||
let state = SliderState {
|
||||
let state = State {
|
||||
dragging: false,
|
||||
hovered: false,
|
||||
values: params.values,
|
||||
@@ -426,7 +426,7 @@ pub fn construct<U1, U2>(
|
||||
register_event_mouse_leave(data.clone(), state.clone(), listeners, &mut lhandles);
|
||||
register_event_mouse_release(data.clone(), state.clone(), listeners, &mut lhandles);
|
||||
|
||||
let slider = Rc::new(Slider {
|
||||
let slider = Rc::new(ComponentSlider {
|
||||
data,
|
||||
state,
|
||||
listener_handles: lhandles,
|
||||
|
||||
@@ -65,6 +65,7 @@ pub struct LayoutState {
|
||||
pub widgets: WidgetMap,
|
||||
pub nodes: WidgetNodeMap,
|
||||
pub tree: taffy::tree::TaffyTree<WidgetID>,
|
||||
pub alterables: EventAlterables,
|
||||
}
|
||||
|
||||
pub struct Layout {
|
||||
@@ -282,6 +283,7 @@ impl Layout {
|
||||
widgets: WidgetMap::new(),
|
||||
nodes: WidgetNodeMap::default(),
|
||||
globals,
|
||||
alterables: EventAlterables::default(),
|
||||
};
|
||||
|
||||
let (root_widget, root_node) = add_child_internal(
|
||||
@@ -364,10 +366,11 @@ impl Layout {
|
||||
|
||||
pub fn tick(&mut self) -> anyhow::Result<()> {
|
||||
let mut alterables = EventAlterables::default();
|
||||
|
||||
self.animations.tick(&self.state, &mut alterables);
|
||||
self.process_alterables(alterables)?;
|
||||
self.process_pending_components()?;
|
||||
self.process_alterables(alterables)?;
|
||||
let state_alterables = std::mem::take(&mut self.state.alterables);
|
||||
self.process_alterables(state_alterables)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ use crate::{
|
||||
i18n::Translation,
|
||||
layout::WidgetID,
|
||||
parser::{
|
||||
ParserContext, ParserFile, iter_attribs,
|
||||
ParserContext, ParserFile, iter_attribs, process_component,
|
||||
style::{parse_color, parse_color_opt, parse_round, parse_style, parse_text_style},
|
||||
},
|
||||
widget::util::WLength,
|
||||
@@ -55,7 +55,7 @@ pub fn parse_component_button<'a, U1, U2>(
|
||||
));
|
||||
}
|
||||
|
||||
ctx.components.push(button::construct(
|
||||
let component = button::construct(
|
||||
ctx.layout,
|
||||
ctx.listeners,
|
||||
parent_id,
|
||||
@@ -67,7 +67,9 @@ pub fn parse_component_button<'a, U1, U2>(
|
||||
text_style,
|
||||
round,
|
||||
},
|
||||
)?);
|
||||
)?;
|
||||
|
||||
process_component(file, ctx, node, component)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
use crate::{
|
||||
components::slider,
|
||||
layout::WidgetID,
|
||||
parser::{ParserContext, ParserFile, iter_attribs, parse_check_f32, style::parse_style},
|
||||
parser::{
|
||||
ParserContext, ParserFile, iter_attribs, parse_check_f32, process_component, style::parse_style,
|
||||
},
|
||||
};
|
||||
|
||||
pub fn parse_component_slider<'a, U1, U2>(
|
||||
@@ -32,7 +34,7 @@ pub fn parse_component_slider<'a, U1, U2>(
|
||||
}
|
||||
}
|
||||
|
||||
ctx.components.push(slider::construct(
|
||||
let component = slider::construct(
|
||||
ctx.layout,
|
||||
ctx.listeners,
|
||||
parent_id,
|
||||
@@ -44,7 +46,9 @@ pub fn parse_component_slider<'a, U1, U2>(
|
||||
value: initial_value,
|
||||
},
|
||||
},
|
||||
)?);
|
||||
)?;
|
||||
|
||||
process_component(file, ctx, node, component)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ mod widget_rectangle;
|
||||
mod widget_sprite;
|
||||
|
||||
use crate::{
|
||||
any::AnyTrait,
|
||||
assets::AssetProvider,
|
||||
components::Component,
|
||||
drawing::{self},
|
||||
@@ -56,12 +57,36 @@ pub struct ParserState {
|
||||
macro_attribs: HashMap<Rc<str>, MacroAttribs>,
|
||||
pub var_map: HashMap<Rc<str>, Rc<str>>,
|
||||
pub components: Vec<Rc<dyn Component>>,
|
||||
pub components_id_map: HashMap<Rc<str>, std::rc::Weak<dyn Component>>,
|
||||
pub templates: HashMap<Rc<str>, Rc<Template>>,
|
||||
pub path: PathBuf,
|
||||
}
|
||||
|
||||
impl ParserState {
|
||||
pub fn require_by_id(&self, id: &str) -> anyhow::Result<WidgetID> {
|
||||
pub fn fetch_component(&self, id: &str) -> anyhow::Result<Rc<dyn Component>> {
|
||||
let Some(weak) = self.components_id_map.get(id) else {
|
||||
anyhow::bail!("Component by ID \"{}\" doesn't exist", id);
|
||||
};
|
||||
|
||||
let Some(component) = weak.upgrade() else {
|
||||
anyhow::bail!("Component by ID \"{}\" doesn't exist", id);
|
||||
};
|
||||
|
||||
Ok(component)
|
||||
}
|
||||
|
||||
pub fn fetch_component_as<T: 'static>(&self, id: &str) -> anyhow::Result<Rc<T>> {
|
||||
let component = self.fetch_component(id)?;
|
||||
|
||||
// FIXME: check T type id
|
||||
log::warn!("fetch_component_as WIP");
|
||||
unsafe {
|
||||
let raw = Rc::into_raw(component);
|
||||
Ok(Rc::from_raw(raw as _))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn fetch_widget(&self, id: &str) -> anyhow::Result<WidgetID> {
|
||||
match self.ids.get(id) {
|
||||
Some(id) => Ok(*id),
|
||||
None => anyhow::bail!("Widget by ID \"{}\" doesn't exist", id),
|
||||
@@ -88,6 +113,7 @@ impl ParserState {
|
||||
macro_attribs: self.macro_attribs.clone(), // FIXME: prevent copying
|
||||
var_map: self.var_map.clone(), // FIXME: prevent copying
|
||||
components: self.components.clone(), // FIXME: prevent copying
|
||||
components_id_map: self.components_id_map.clone(), // FIXME: prevent copying
|
||||
templates: Default::default(),
|
||||
dev_mode,
|
||||
};
|
||||
@@ -128,6 +154,7 @@ struct ParserContext<'a, U1, U2> {
|
||||
ids: HashMap<Rc<str>, WidgetID>,
|
||||
templates: HashMap<Rc<str>, Rc<Template>>,
|
||||
components: Vec<Rc<dyn Component>>,
|
||||
components_id_map: HashMap<Rc<str>, std::rc::Weak<dyn Component>>,
|
||||
dev_mode: bool,
|
||||
}
|
||||
|
||||
@@ -530,7 +557,35 @@ fn parse_tag_macro<U1, U2>(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn parse_universal<'a, U1, U2>(
|
||||
fn process_component<'a, U1, U2>(
|
||||
file: &'a ParserFile,
|
||||
ctx: &mut ParserContext<U1, U2>,
|
||||
node: roxmltree::Node<'a, 'a>,
|
||||
component: Rc<dyn Component>,
|
||||
) -> anyhow::Result<()> {
|
||||
let attribs: Vec<_> = iter_attribs(file, ctx, &node, false).collect();
|
||||
|
||||
for (key, value) in attribs {
|
||||
#[allow(clippy::single_match)]
|
||||
match key.as_ref() {
|
||||
"id" => {
|
||||
if ctx
|
||||
.components_id_map
|
||||
.insert(value.clone(), Rc::downgrade(&component))
|
||||
.is_some()
|
||||
{
|
||||
log::warn!("duplicate component ID \"{value}\" in the same layout file!");
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
ctx.components.push(component);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn parse_widget_universal<'a, U1, U2>(
|
||||
file: &'a ParserFile,
|
||||
ctx: &mut ParserContext<U1, U2>,
|
||||
node: roxmltree::Node<'a, 'a>,
|
||||
@@ -544,7 +599,7 @@ fn parse_universal<'a, U1, U2>(
|
||||
"id" => {
|
||||
// Attach a specific widget to name-ID map (just like getElementById)
|
||||
if ctx.ids.insert(value.clone(), widget_id).is_some() {
|
||||
log::warn!("duplicate ID \"{value}\" in the same layout file!");
|
||||
log::warn!("duplicate widget ID \"{value}\" in the same layout file!");
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
@@ -619,6 +674,7 @@ fn create_default_context<'a, U1, U2>(
|
||||
templates: Default::default(),
|
||||
macro_attribs: Default::default(),
|
||||
components: Default::default(),
|
||||
components_id_map: Default::default(),
|
||||
dev_mode,
|
||||
}
|
||||
}
|
||||
@@ -644,6 +700,7 @@ pub fn parse_from_assets<U1, U2>(
|
||||
macro_attribs: std::mem::take(&mut ctx.macro_attribs),
|
||||
var_map: std::mem::take(&mut ctx.var_map),
|
||||
components: std::mem::take(&mut ctx.components),
|
||||
components_id_map: std::mem::take(&mut ctx.components_id_map),
|
||||
path,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use crate::{
|
||||
layout::WidgetID,
|
||||
parser::{
|
||||
ParserContext, ParserFile, iter_attribs, parse_children, parse_universal, style::parse_style,
|
||||
ParserContext, ParserFile, iter_attribs, parse_children, parse_widget_universal, style::parse_style,
|
||||
},
|
||||
widget,
|
||||
};
|
||||
@@ -19,7 +19,7 @@ pub fn parse_widget_div<'a, U1, U2>(
|
||||
.layout
|
||||
.add_child(parent_id, widget::div::Div::create()?, style)?;
|
||||
|
||||
parse_universal(file, ctx, node, new_id)?;
|
||||
parse_widget_universal(file, ctx, node, new_id)?;
|
||||
parse_children(file, ctx, node, new_id)?;
|
||||
|
||||
Ok(())
|
||||
|
||||
@@ -2,7 +2,7 @@ use crate::{
|
||||
i18n::Translation,
|
||||
layout::WidgetID,
|
||||
parser::{
|
||||
ParserContext, ParserFile, iter_attribs, parse_children, parse_universal,
|
||||
ParserContext, ParserFile, iter_attribs, parse_children, parse_widget_universal,
|
||||
style::{parse_style, parse_text_style},
|
||||
},
|
||||
widget::text::{TextLabel, TextParams},
|
||||
@@ -38,7 +38,7 @@ pub fn parse_widget_label<'a, U1, U2>(
|
||||
.layout
|
||||
.add_child(parent_id, TextLabel::create(&mut i18n, params)?, style)?;
|
||||
|
||||
parse_universal(file, ctx, node, new_id)?;
|
||||
parse_widget_universal(file, ctx, node, new_id)?;
|
||||
parse_children(file, ctx, node, new_id)?;
|
||||
|
||||
Ok(())
|
||||
|
||||
@@ -2,7 +2,8 @@ use crate::{
|
||||
drawing::GradientMode,
|
||||
layout::WidgetID,
|
||||
parser::{
|
||||
ParserContext, ParserFile, iter_attribs, parse_children, parse_universal, print_invalid_attrib,
|
||||
ParserContext, ParserFile, iter_attribs, parse_children, parse_widget_universal,
|
||||
print_invalid_attrib,
|
||||
style::{parse_color, parse_round, parse_style},
|
||||
},
|
||||
widget::{self, rectangle::RectangleParams},
|
||||
@@ -60,7 +61,7 @@ pub fn parse_widget_rectangle<'a, U1, U2>(
|
||||
style,
|
||||
)?;
|
||||
|
||||
parse_universal(file, ctx, node, new_id)?;
|
||||
parse_widget_universal(file, ctx, node, new_id)?;
|
||||
parse_children(file, ctx, node, new_id)?;
|
||||
|
||||
Ok(())
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
use crate::{
|
||||
layout::WidgetID,
|
||||
parser::{
|
||||
ParserContext, ParserFile, iter_attribs, parse_children, parse_universal, style::parse_style,
|
||||
ParserContext, ParserFile, iter_attribs, parse_children, parse_widget_universal,
|
||||
style::parse_style,
|
||||
},
|
||||
renderer_vk::text::custom_glyph::{CustomGlyphContent, CustomGlyphData},
|
||||
widget::sprite::{SpriteBox, SpriteBoxParams},
|
||||
@@ -58,7 +59,7 @@ pub fn parse_widget_sprite<'a, U1, U2>(
|
||||
.layout
|
||||
.add_child(parent_id, SpriteBox::create(params)?, style)?;
|
||||
|
||||
parse_universal(file, ctx, node, new_id)?;
|
||||
parse_widget_universal(file, ctx, node, new_id)?;
|
||||
parse_children(file, ctx, node, new_id)?;
|
||||
|
||||
Ok(())
|
||||
|
||||
Reference in New Issue
Block a user