use atomic_float::AtomicF32; use nih_plug::prelude::{util, Editor, GuiContext}; use nih_plug_iced::widgets as nih_widgets; use nih_plug_iced::*; use std::pin::Pin; use std::sync::Arc; use std::time::Duration; use crate::GainParams; // Makes sense to also define this here, makes it a bit easier to keep track of pub(crate) fn default_state() -> Arc { IcedState::from_size(200, 150) } pub(crate) fn create( params: Pin>, peak_meter: Arc, editor_state: Arc, ) -> Option> { create_iced_editor::(editor_state, (params, peak_meter)) } struct GainEditor { params: Pin>, context: Arc, peak_meter: Arc, gain_slider_state: nih_widgets::param_slider::State, peak_meter_state: nih_widgets::peak_meter::State, } #[derive(Debug, Clone, Copy)] enum Message { /// Update a parameter's value. ParamUpdate(nih_widgets::ParamMessage), } impl IcedEditor for GainEditor { type Executor = executor::Default; type Message = Message; type InitializationFlags = (Pin>, Arc); fn new( (params, peak_meter): Self::InitializationFlags, context: Arc, ) -> (Self, Command) { let editor = GainEditor { params, context, peak_meter, gain_slider_state: Default::default(), peak_meter_state: Default::default(), }; (editor, Command::none()) } fn context(&self) -> &dyn GuiContext { self.context.as_ref() } fn update( &mut self, _window: &mut WindowQueue, message: Self::Message, ) -> Command { match message { Message::ParamUpdate(message) => self.handle_param_message(message), } Command::none() } fn view(&mut self) -> Element<'_, Self::Message> { Column::new() .align_items(Alignment::Center) .push( Text::new("Gain GUI") .font(assets::NOTO_SANS_LIGHT) .size(40) .height(50.into()) .width(Length::Fill) .horizontal_alignment(alignment::Horizontal::Center) .vertical_alignment(alignment::Vertical::Bottom), ) .push( Text::new("Gain") .height(20.into()) .width(Length::Fill) .horizontal_alignment(alignment::Horizontal::Center) .vertical_alignment(alignment::Vertical::Center), ) .push( nih_widgets::ParamSlider::new(&mut self.gain_slider_state, &self.params.gain) .map(Message::ParamUpdate), ) .push(Space::with_height(10.into())) .push( nih_widgets::PeakMeter::new( &mut self.peak_meter_state, util::gain_to_db(self.peak_meter.load(std::sync::atomic::Ordering::Relaxed)), ) .hold_time(Duration::from_millis(600)), ) .into() } fn background_color(&self) -> nih_plug_iced::Color { nih_plug_iced::Color { r: 0.98, g: 0.98, b: 0.98, a: 1.0, } } }