diff --git a/nih_plug_vizia/assets/widgets.css b/nih_plug_vizia/assets/widgets.css index ab39a52d..692c9821 100644 --- a/nih_plug_vizia/assets/widgets.css +++ b/nih_plug_vizia/assets/widgets.css @@ -60,25 +60,6 @@ param-button.bypass:checked { transition: background-color 0.1 0; } -param-label { - /* These should be overridden when the widget is used */ - height: 20px; - width: 180px; -} - -/* This is a textbox, but we want it to appear just like the label */ -param-label .value-entry { - /* Vizia doesn't support the unset value */ - background-color: transparent; - border-width: 0px; -} -param-slider .value-entry .caret { - background-color: #0a0a0a; -} -param-slider .value-entry .selection { - background-color: #0a0a0a30; -} - param-slider { height: 30px; width: 180px; diff --git a/nih_plug_vizia/src/widgets.rs b/nih_plug_vizia/src/widgets.rs index 92f87766..16a8da12 100644 --- a/nih_plug_vizia/src/widgets.rs +++ b/nih_plug_vizia/src/widgets.rs @@ -14,7 +14,6 @@ use super::ViziaState; mod generic_ui; pub mod param_base; mod param_button; -mod param_label; mod param_slider; mod peak_meter; mod resize_handle; @@ -22,7 +21,6 @@ pub mod util; pub use generic_ui::GenericUi; pub use param_button::{ParamButton, ParamButtonExt}; -pub use param_label::ParamLabel; pub use param_slider::{ParamSlider, ParamSliderExt, ParamSliderStyle}; pub use peak_meter::PeakMeter; pub use resize_handle::ResizeHandle; diff --git a/nih_plug_vizia/src/widgets/param_label.rs b/nih_plug_vizia/src/widgets/param_label.rs deleted file mode 100644 index c62a6fe7..00000000 --- a/nih_plug_vizia/src/widgets/param_label.rs +++ /dev/null @@ -1,183 +0,0 @@ -//! A special label that integrates with NIH-plug's [`Param`] types. - -use nih_plug::prelude::Param; -use vizia::prelude::*; - -use super::param_base::ParamWidgetBase; -use super::util::ModifiersExt; - -/// A special label that integrates with NIH-plug's [`Param`] types. This should only be used to -/// allow text entry for parameters with no dedicated control, like the two parameters bound to an -/// X-Y pad. Use regular [`Label`]s instead when the label accompanies a parameter widget. -#[derive(Lens)] -pub struct ParamLabel { - param_base: ParamWidgetBase, - - /// Will be set to `true` when the field gets Alt+Click'ed which will replace the label with a - /// text box. - text_input_active: bool, - - /// The label's orientation. Automatically deduced from the widget's width and height. - orientation: Orientation, - // HACK: These two fields are needed because vizia doesn't support rotating in layouts, so you - // need to hack around this using explicit sizes. - /// This element's width in pixels, used to explicitly set the size of the contained label or textbox. - width: Units, - /// This element's height in pixels, used to explicitly set the size of the contained label or textbox. - height: Units, -} - -enum ParamLabelEvent { - /// Text input has been cancelled without submitting a new value. - CancelTextInput, - /// A new value has been sent by the text input dialog after pressing Enter. - TextInput(String), -} - -impl ParamLabel { - /// Creates a new [`ParamLabel`] for the given parameter. See - /// [`ParamSlider`][super::ParamSlider] for more information on this function's arguments. - /// - /// To make this work, you'll need to set a fixed (non-auto) width and height on the - /// `ParamLabel`. If the label is taller than it is wide, then the widget will be drawn - /// vertically. - pub fn new( - cx: &mut Context, - params: L, - params_to_param: FMap, - ) -> Handle - where - L: Lens + Clone, - Params: 'static, - P: Param + 'static, - FMap: Fn(&Params) -> &P + Copy + 'static, - { - // This is in essence a super stripped down version of `ParamSlider` - Self { - param_base: ParamWidgetBase::new(cx, params.clone(), params_to_param), - - text_input_active: false, - - // Automatically overridden in the `WindowEvent::GeometryChanged` handler - orientation: Orientation::Horizontal, - width: Pixels(0.0), - height: Pixels(0.0), - } - .build( - cx, - ParamWidgetBase::view(params, params_to_param, move |cx, param_data| { - let param_name = param_data.param().name().to_owned(); - - // Can't use `.to_string()` here as that would include modulation - let display_value_lens = param_data.make_lens(|param| { - param.normalized_value_to_string(param.unmodulated_normalized_value(), true) - }); - - Binding::new( - cx, - ParamLabel::text_input_active, - move |cx, text_input_active| { - if text_input_active.get(cx) { - Textbox::new(cx, display_value_lens.clone()) - .class("value-entry") - .on_submit(|cx, string, success| { - if success { - cx.emit(ParamLabelEvent::TextInput(string)) - } else { - cx.emit(ParamLabelEvent::CancelTextInput); - } - }) - .on_build(|cx| { - cx.emit(TextEvent::StartEdit); - cx.emit(TextEvent::SelectAll); - }) - .class("align_center") - .child_space(Stretch(1.0)) - .rotate(ParamLabel::orientation.map(orientation_to_rotation)) - // HACK: Work around for vizia not supporting rotations - .height(ParamLabel::height) - .width(ParamLabel::width); - } else { - Label::new(cx, ¶m_name) - .class("param-name") - .child_space(Stretch(1.0)) - .rotate(ParamLabel::orientation.map(orientation_to_rotation)) - // Same as above - .height(ParamLabel::height) - .width(ParamLabel::width); - } - }, - ); - }), - ) - } -} - -impl View for ParamLabel { - fn element(&self) -> Option<&'static str> { - Some("param-label") - } - - fn event(&mut self, cx: &mut EventContext, event: &mut Event) { - event.map(|param_slider_event, meta| match param_slider_event { - ParamLabelEvent::CancelTextInput => { - self.text_input_active = false; - cx.set_active(false); - - meta.consume(); - } - ParamLabelEvent::TextInput(string) => { - if let Some(normalized_value) = self.param_base.string_to_normalized_value(string) { - self.param_base.begin_set_parameter(cx); - self.param_base.set_normalized_value(cx, normalized_value); - self.param_base.end_set_parameter(cx); - } - - self.text_input_active = false; - - meta.consume(); - } - }); - - event.map(|window_event, meta| match window_event { - WindowEvent::GeometryChanged(_) => { - let width = cx.cache.get_width(cx.current()); - let height = cx.cache.get_height(cx.current()); - - self.width = Pixels(width); - self.height = Pixels(height); - - // The orientiation is automatically set based on the widget's aspect ratio - if width >= height { - self.orientation = Orientation::Horizontal; - } else { - self.orientation = Orientation::Vertical; - } - } - - // We don't handle Ctrl+click/double click for reset right now, only value entry is - // supported here - WindowEvent::MouseDown(MouseButton::Left) - | WindowEvent::MouseDoubleClick(MouseButton::Left) - | WindowEvent::MouseTripleClick(MouseButton::Left) => { - if cx.modifiers.alt() { - // ALt+Click brings up a text entry dialog - self.text_input_active = true; - cx.set_active(true); - - meta.consume(); - } - } - _ => {} - }); - } -} - -/// Convert an [`Orientation`] to the desired rotation in degrees. -fn orientation_to_rotation(orientation: &Orientation) -> f32 { - match orientation { - Orientation::Horizontal => 0.0, - // 90 degrees counterclickwise, so the text goes from bottom to top - Orientation::Vertical => 270.0, - } -} diff --git a/plugins/diopser/src/editor.rs b/plugins/diopser/src/editor.rs index 053bacd2..9f1fbab1 100644 --- a/plugins/diopser/src/editor.rs +++ b/plugins/diopser/src/editor.rs @@ -105,11 +105,6 @@ fn top_bar(cx: &mut Context) { /// frequency and resonance parameters. fn spectrum_analyzer(cx: &mut Context) { Label::new(cx, "When I grow up, I want to be a spectrum analyzer!"); - ParamLabel::new(cx, Data::params, |params| ¶ms.filter_frequency); - // This is automatically rotated vertically - ParamLabel::new(cx, Data::params, |params| ¶ms.filter_resonance) - .width(Pixels(20.0)) - .height(Pixels(180.0)); } /// The area below the spectrum analyzer that contains all of the other parameters.