diff --git a/wgui/src/components/checkbox.rs b/wgui/src/components/checkbox.rs index 0138ccc..3ef411d 100644 --- a/wgui/src/components/checkbox.rs +++ b/wgui/src/components/checkbox.rs @@ -1,7 +1,7 @@ use std::{cell::RefCell, rc::Rc}; use taffy::{ - AlignItems, JustifyContent, prelude::{length, percent}, + AlignItems, JustifyContent, }; use crate::{ @@ -13,10 +13,10 @@ use crate::{ layout::{self, WidgetID, WidgetPair}, renderer_vk::text::{FontWeight, TextStyle}, widget::{ - ConstructEssentials, EventResult, label::{WidgetLabel, WidgetLabelParams}, rectangle::{WidgetRectangle, WidgetRectangleParams}, util::WLength, + ConstructEssentials, EventResult, }, }; diff --git a/wgui/src/components/slider.rs b/wgui/src/components/slider.rs index 37e92f2..053299a 100644 --- a/wgui/src/components/slider.rs +++ b/wgui/src/components/slider.rs @@ -15,11 +15,11 @@ use crate::{ util, }, widget::{ - ConstructEssentials, EventResult, div::WidgetDiv, label::{WidgetLabel, WidgetLabelParams}, rectangle::{WidgetRectangle, WidgetRectangleParams}, util::WLength, + ConstructEssentials, EventResult, }, }; @@ -50,6 +50,7 @@ struct State { dragging: bool, hovered: bool, values: ValuesMinMax, + on_value_changed: Option, } struct Data { @@ -61,6 +62,13 @@ struct Data { slider_body_node: taffy::NodeId, } +pub struct SliderValueChangedEvent { + pub value: f32, +} + +pub type SliderValueChangedCallback = + Box anyhow::Result<()>>; + pub struct ComponentSlider { base: ComponentBase, data: Rc, @@ -79,6 +87,20 @@ impl ComponentTrait for ComponentSlider { } } +impl ComponentSlider { + pub fn get_value(&self) -> f32 { + self.state.borrow().values.value + } + pub fn set_value(&mut self, common: &mut CallbackDataCommon, value: f32) { + let mut state = self.state.borrow_mut(); + state.set_value(common, &self.data, value); + } + + pub fn on_value_changed(&self, func: SliderValueChangedCallback) { + self.state.borrow_mut().on_value_changed = Some(func); + } +} + // NOTICE: this can be re-used in the future fn map_mouse_x_to_normalized(mouse_x_rel: f32, widget_width: f32) -> f32 { (mouse_x_rel / widget_width).clamp(0.0, 1.0) @@ -137,6 +159,9 @@ impl State { fn set_value(&mut self, common: &mut CallbackDataCommon, data: &Data, value: f32) { //common.call_on_widget(data.slider_handle_id, |_div: &mut Div| {}); + + let changed = (self.values.value - value).abs() > f32::EPSILON; + self.values.value = value; let mut style = common.state.tree.style(data.slider_handle_node).unwrap().clone(); conf_handle_style(&self.values, data.slider_body_node, &mut style, &common.state.tree); @@ -147,6 +172,12 @@ impl State { if let Some(mut label) = common.state.widgets.get_as::(data.slider_text_id) { Self::update_text(common, &mut label, value); } + + if changed && let Some(on_value_changed) = &self.on_value_changed { + if let Err(e) = on_value_changed(common, SliderValueChangedEvent { value }) { + log::error!("{e:?}"); // FIXME: proper error handling + } + } } } @@ -362,6 +393,7 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul dragging: false, hovered: false, values: params.values, + on_value_changed: None, }; let globals = ess.layout.state.globals.clone(); diff --git a/wlx-overlay-s/src/assets/gui/edit.xml b/wlx-overlay-s/src/assets/gui/edit.xml index 2b8420b..0b2da88 100644 --- a/wlx-overlay-s/src/assets/gui/edit.xml +++ b/wlx-overlay-s/src/assets/gui/edit.xml @@ -4,40 +4,54 @@ - - + border="2" round="50%" padding="8" gradient="vertical" tooltip_side="bottom" /> + + + + + +
-
-
- - - - - - - - - - - - -
+ +
+
diff --git a/wlx-overlay-s/src/backend/input.rs b/wlx-overlay-s/src/backend/input.rs index bd7eb2d..8aadf8f 100644 --- a/wlx-overlay-s/src/backend/input.rs +++ b/wlx-overlay-s/src/backend/input.rs @@ -4,7 +4,7 @@ use std::{collections::VecDeque, time::Instant}; use glam::{Affine3A, Vec2, Vec3, Vec3A, Vec3Swizzles}; -use smallvec::{SmallVec, smallvec}; +use smallvec::{smallvec, SmallVec}; use crate::overlays::anchor::ANCHOR_NAME; use crate::state::{AppSession, AppState}; @@ -521,6 +521,7 @@ where let pointer = &mut app.input_state.pointers[pointer_idx]; let ray_origin = pointer.pose; let mode = pointer.interaction.mode; + let edit_mode = overlays.get_edit_mode(); let mut hits: SmallVec<[RayHit; 8]> = smallvec!(); @@ -528,7 +529,7 @@ where let Some(overlay_state) = overlay.config.active_state.as_ref() else { continue; }; - if !overlay_state.interactable { + if !overlay_state.interactable && !edit_mode { continue; } diff --git a/wlx-overlay-s/src/gui/panel/button.rs b/wlx-overlay-s/src/gui/panel/button.rs index 0411abf..46d473a 100644 --- a/wlx-overlay-s/src/gui/panel/button.rs +++ b/wlx-overlay-s/src/gui/panel/button.rs @@ -60,7 +60,6 @@ pub(super) fn setup_custom_button( "::WatchHide" => todo!(), "::WatchSwapHand" => todo!(), // TODO - #[allow(clippy::match_same_arms)] "::EditToggle" => Box::new(move |_common, _data, app, _| { app.tasks.enqueue(TaskType::ToggleEditMode); Ok(EventResult::Consumed)