Notify nih_plug_vizia GUIs when parameters change
This could be useful in some cases when dealing with computed properties.
This commit is contained in:
parent
1448388353
commit
98bd3add19
|
@ -3,10 +3,11 @@
|
||||||
use baseview::{WindowHandle, WindowScalePolicy};
|
use baseview::{WindowHandle, WindowScalePolicy};
|
||||||
use crossbeam::atomic::AtomicCell;
|
use crossbeam::atomic::AtomicCell;
|
||||||
use nih_plug::prelude::{Editor, GuiContext, ParentWindowHandle};
|
use nih_plug::prelude::{Editor, GuiContext, ParentWindowHandle};
|
||||||
use std::sync::atomic::Ordering;
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use vizia::prelude::*;
|
use vizia::prelude::*;
|
||||||
|
|
||||||
|
use crate::widgets::RawParamEvent;
|
||||||
use crate::{assets, widgets, ViziaState, ViziaTheming};
|
use crate::{assets, widgets, ViziaState, ViziaTheming};
|
||||||
|
|
||||||
/// An [`Editor`] implementation that calls an vizia draw loop.
|
/// An [`Editor`] implementation that calls an vizia draw loop.
|
||||||
|
@ -20,6 +21,13 @@ pub(crate) struct ViziaEditor {
|
||||||
/// The scaling factor reported by the host, if any. On macOS this will never be set and we
|
/// The scaling factor reported by the host, if any. On macOS this will never be set and we
|
||||||
/// should use the system scaling factor instead.
|
/// should use the system scaling factor instead.
|
||||||
pub(crate) scaling_factor: AtomicCell<Option<f32>>,
|
pub(crate) scaling_factor: AtomicCell<Option<f32>>,
|
||||||
|
|
||||||
|
/// Whether to emit a parameters changed event during the next idle callback. This is set in the
|
||||||
|
/// `parameter_values_changed()` implementation and it can be used by widgets to explicitly
|
||||||
|
/// check for new parameter values. This is useful when the parameter value is (indirectly) used
|
||||||
|
/// to compute a property in an event handler. Like when positioning an element based on the
|
||||||
|
/// display value's width.
|
||||||
|
pub(crate) emit_parameters_changed_event: Arc<AtomicBool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Editor for ViziaEditor {
|
impl Editor for ViziaEditor {
|
||||||
|
@ -72,7 +80,18 @@ impl Editor for ViziaEditor {
|
||||||
.unwrap_or(WindowScalePolicy::SystemScaleFactor),
|
.unwrap_or(WindowScalePolicy::SystemScaleFactor),
|
||||||
)
|
)
|
||||||
.inner_size((unscaled_width, unscaled_height))
|
.inner_size((unscaled_width, unscaled_height))
|
||||||
.user_scale_factor(user_scale_factor);
|
.user_scale_factor(user_scale_factor)
|
||||||
|
.on_idle({
|
||||||
|
let emit_parameters_changed_event = self.emit_parameters_changed_event.clone();
|
||||||
|
move |cx| {
|
||||||
|
if emit_parameters_changed_event
|
||||||
|
.compare_exchange(true, false, Ordering::AcqRel, Ordering::Relaxed)
|
||||||
|
.is_ok()
|
||||||
|
{
|
||||||
|
cx.emit(RawParamEvent::ParametersChanged);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// This way the plugin can decide to use none of the built in theming
|
// This way the plugin can decide to use none of the built in theming
|
||||||
if theming == ViziaTheming::None {
|
if theming == ViziaTheming::None {
|
||||||
|
@ -102,8 +121,9 @@ impl Editor for ViziaEditor {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn param_values_changed(&self) {
|
fn param_values_changed(&self) {
|
||||||
// TODO: Update the GUI when this happens, right now this happens automatically as a result
|
// This will cause a future idle callback to send a parameters changed event.
|
||||||
// of of the reactivity
|
self.emit_parameters_changed_event
|
||||||
|
.store(true, Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,8 @@ where
|
||||||
scaling_factor: AtomicCell::new(None),
|
scaling_factor: AtomicCell::new(None),
|
||||||
#[cfg(not(target_os = "macos"))]
|
#[cfg(not(target_os = "macos"))]
|
||||||
scaling_factor: AtomicCell::new(Some(1.0)),
|
scaling_factor: AtomicCell::new(Some(1.0)),
|
||||||
|
|
||||||
|
emit_parameters_changed_event: Arc::new(AtomicBool::new(false)),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,9 @@ pub enum RawParamEvent {
|
||||||
SetParameterNormalized(ParamPtr, f32),
|
SetParameterNormalized(ParamPtr, f32),
|
||||||
/// End an automation gesture for a parameter.
|
/// End an automation gesture for a parameter.
|
||||||
EndSetParameter(ParamPtr),
|
EndSetParameter(ParamPtr),
|
||||||
|
/// Sent by the wrapper to indicate that one or more parameter values have changed. Useful when
|
||||||
|
/// using properties based on a parameter's value that are computed inside of an event handler.
|
||||||
|
ParametersChanged,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Handles parameter updates for VIZIA GUIs. Registered in
|
/// Handles parameter updates for VIZIA GUIs. Registered in
|
||||||
|
@ -89,6 +92,8 @@ impl Model for ParamModel {
|
||||||
self.context.raw_set_parameter_normalized(p, v)
|
self.context.raw_set_parameter_normalized(p, v)
|
||||||
},
|
},
|
||||||
RawParamEvent::EndSetParameter(p) => unsafe { self.context.raw_end_set_parameter(p) },
|
RawParamEvent::EndSetParameter(p) => unsafe { self.context.raw_end_set_parameter(p) },
|
||||||
|
// This can be used by widgets to be notified when parameter values have changed
|
||||||
|
RawParamEvent::ParametersChanged => (),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue