wgui: StyleSetRequest
This commit is contained in:
@@ -7,7 +7,7 @@ use crate::{
|
||||
animation::{Animation, AnimationEasing},
|
||||
components::{Component, ComponentBase, ComponentTrait, RefreshData},
|
||||
drawing::{self},
|
||||
event::{self, CallbackDataCommon, EventListenerCollection, EventListenerKind},
|
||||
event::{self, CallbackDataCommon, EventAlterables, EventListenerCollection, EventListenerKind, StyleSetRequest},
|
||||
i18n::Translation,
|
||||
layout::{WidgetID, WidgetPair},
|
||||
renderer_vk::{
|
||||
@@ -76,13 +76,11 @@ struct State {
|
||||
}
|
||||
|
||||
struct Data {
|
||||
#[allow(dead_code)]
|
||||
body: WidgetID, // Div
|
||||
body_node: taffy::NodeId,
|
||||
slider_handle_rect_id: WidgetID, // Rectangle
|
||||
slider_text_id: WidgetID, // Text
|
||||
slider_handle: WidgetPair,
|
||||
slider_handle_id: WidgetID,
|
||||
slider_handle_node_id: taffy::NodeId,
|
||||
slider_body_node: taffy::NodeId,
|
||||
}
|
||||
|
||||
pub struct SliderValueChangedEvent {
|
||||
@@ -140,26 +138,31 @@ fn get_width(slider_body_node: taffy::NodeId, tree: &taffy::tree::TaffyTree<Widg
|
||||
}
|
||||
|
||||
fn conf_handle_style(
|
||||
alterables: &mut EventAlterables,
|
||||
values: &ValuesMinMax,
|
||||
slider_body_node: taffy::NodeId,
|
||||
slider_handle_id: WidgetID,
|
||||
body_node: taffy::NodeId,
|
||||
slider_handle_style: &taffy::Style,
|
||||
tree: &taffy::tree::TaffyTree<WidgetID>,
|
||||
) -> Option<taffy::Style> {
|
||||
) -> bool {
|
||||
/* returns false if nothing changed */
|
||||
let norm = values.to_normalized();
|
||||
|
||||
// convert normalized value to taffy percentage margin in percent
|
||||
let width = get_width(slider_body_node, tree);
|
||||
let width = get_width(body_node, tree);
|
||||
let percent_margin = (HANDLE_WIDTH / width) / 2.0;
|
||||
|
||||
let new_percent = percent(percent_margin + norm * (1.0 - percent_margin * 2.0));
|
||||
|
||||
if slider_handle_style.margin.left == new_percent {
|
||||
None // nothing changed
|
||||
} else {
|
||||
let mut new_style = slider_handle_style.clone();
|
||||
new_style.margin.left = new_percent;
|
||||
Some(new_style)
|
||||
return false; // nothing changed
|
||||
}
|
||||
|
||||
let mut margin = slider_handle_style.margin;
|
||||
margin.left = new_percent;
|
||||
alterables.set_style(slider_handle_id, StyleSetRequest::Margin(margin));
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
const PAD_PERCENT: f32 = 0.75;
|
||||
@@ -180,7 +183,7 @@ impl State {
|
||||
|
||||
let norm = map_mouse_x_to_normalized(
|
||||
mouse_pos.x - HANDLE_WIDTH / 2.0,
|
||||
get_width(data.slider_body_node, &common.state.tree) - HANDLE_WIDTH,
|
||||
get_width(data.body_node, &common.state.tree) - HANDLE_WIDTH,
|
||||
);
|
||||
|
||||
let target_value = self.values.get_from_normalized(norm);
|
||||
@@ -206,13 +209,19 @@ impl State {
|
||||
|
||||
let changed = self.values.value != before;
|
||||
let style = common.state.tree.style(data.slider_handle_node_id).unwrap();
|
||||
let Some(new_style) = conf_handle_style(&self.values, data.slider_body_node, style, &common.state.tree) else {
|
||||
return; //nothing changed visually
|
||||
};
|
||||
if !conf_handle_style(
|
||||
common.alterables,
|
||||
&self.values,
|
||||
data.slider_handle_id,
|
||||
data.body_node,
|
||||
style,
|
||||
&common.state.tree,
|
||||
) {
|
||||
return; // nothing changed visually
|
||||
}
|
||||
|
||||
common.alterables.mark_dirty(data.slider_handle_node_id);
|
||||
common.alterables.mark_redraw();
|
||||
common.alterables.set_style(data.slider_handle.id, new_style);
|
||||
|
||||
if let Some(mut label) = common.state.widgets.get_as::<WidgetLabel>(data.slider_text_id) {
|
||||
Self::update_text(common, &mut label, self.values.value);
|
||||
@@ -467,10 +476,9 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul
|
||||
)?;
|
||||
|
||||
let data = Rc::new(Data {
|
||||
body: body_id,
|
||||
slider_handle,
|
||||
slider_handle_rect_id: slider_handle_rect.id,
|
||||
slider_body_node,
|
||||
body_node: slider_body_node,
|
||||
slider_handle_id: slider_handle.id,
|
||||
slider_handle_node_id,
|
||||
slider_text_id: slider_text.id,
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user