Add a super simple egui generic UI widget
This commit is contained in:
parent
79ab0cd7ed
commit
05d97bb71e
|
@ -5,6 +5,7 @@
|
|||
//! None of these widgets are finalized, and their sizes or looks can change at any point. Feel free
|
||||
//! to copy the widgets and modify them to your personal taste.
|
||||
|
||||
pub mod generic_ui;
|
||||
mod param_slider;
|
||||
pub mod util;
|
||||
|
||||
|
|
55
nih_plug_egui/src/widgets/generic_ui.rs
Normal file
55
nih_plug_egui/src/widgets/generic_ui.rs
Normal file
|
@ -0,0 +1,55 @@
|
|||
//! A simple generic UI widget that renders all parameters in a [`Params`] object as a scrollable
|
||||
//! list of sliders and labels.
|
||||
|
||||
use std::pin::Pin;
|
||||
|
||||
use egui::Ui;
|
||||
use nih_plug::context::ParamSetter;
|
||||
use nih_plug::param::internals::ParamPtr;
|
||||
use nih_plug::prelude::{Param, Params};
|
||||
|
||||
use super::ParamSlider;
|
||||
|
||||
/// A widget that can be used to create a generic UI with. This is used in conjuction with empty
|
||||
/// structs to emulate existential types.
|
||||
pub trait ParamWidget {
|
||||
fn add_widget<P: Param>(&self, ui: &mut Ui, param: &P, setter: &ParamSetter);
|
||||
|
||||
unsafe fn add_widget_raw(&self, ui: &mut Ui, param: &ParamPtr, setter: &ParamSetter) {
|
||||
match param {
|
||||
ParamPtr::FloatParam(p) => self.add_widget(ui, &**p, setter),
|
||||
ParamPtr::IntParam(p) => self.add_widget(ui, &**p, setter),
|
||||
ParamPtr::BoolParam(p) => self.add_widget(ui, &**p, setter),
|
||||
ParamPtr::EnumParam(p) => self.add_widget(ui, &**p, setter),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a generic UI using [`ParamSlider`]s.
|
||||
pub struct GenericSlider;
|
||||
|
||||
/// Create a scrollable generic UI using the specified widget. Takes up all the remaining vertical
|
||||
/// space.
|
||||
pub fn create(
|
||||
ui: &mut Ui,
|
||||
params: Pin<&dyn Params>,
|
||||
setter: &ParamSetter,
|
||||
widget: impl ParamWidget,
|
||||
) {
|
||||
let param_map = params.param_map();
|
||||
let param_ids = params.param_ids();
|
||||
|
||||
egui::containers::ScrollArea::vertical().show(ui, |ui| {
|
||||
for id in param_ids {
|
||||
let param = param_map[id];
|
||||
ui.label(unsafe { param.name() });
|
||||
unsafe { widget.add_widget_raw(ui, ¶m, setter) };
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
impl ParamWidget for GenericSlider {
|
||||
fn add_widget<P: Param>(&self, ui: &mut Ui, param: &P, setter: &ParamSetter) {
|
||||
ui.add(ParamSlider::for_param(param, setter));
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue