From 1ddc305be5bd441225578c4f78ac76694ed624e9 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Wed, 16 Mar 2022 01:20:02 +0100 Subject: [PATCH] Use the new iced generic UI for Diopser This handles a bit nicer than the egui UI. --- Cargo.lock | 2 +- nih_plug_iced/src/widgets/generic_ui.rs | 2 +- plugins/diopser/Cargo.toml | 2 +- plugins/diopser/src/editor.rs | 88 +++++++++++++++++++++---- plugins/diopser/src/lib.rs | 4 +- 5 files changed, 81 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a6e182c2..0b6fa85e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -747,7 +747,7 @@ version = "0.1.0" dependencies = [ "fftw", "nih_plug", - "nih_plug_egui", + "nih_plug_iced", "triple_buffer", ] diff --git a/nih_plug_iced/src/widgets/generic_ui.rs b/nih_plug_iced/src/widgets/generic_ui.rs index 1a5add77..3e6d83f2 100644 --- a/nih_plug_iced/src/widgets/generic_ui.rs +++ b/nih_plug_iced/src/widgets/generic_ui.rs @@ -2,7 +2,7 @@ //! list of sliders and labels. use atomic_refcell::AtomicRefCell; -use iced_baseview::{Column, Row}; +use iced_baseview::Row; use std::borrow::Borrow; use std::collections::HashMap; use std::marker::PhantomData; diff --git a/plugins/diopser/Cargo.toml b/plugins/diopser/Cargo.toml index 9f0f3668..76d64bf6 100644 --- a/plugins/diopser/Cargo.toml +++ b/plugins/diopser/Cargo.toml @@ -16,7 +16,7 @@ simd = ["nih_plug/simd"] [dependencies] nih_plug = { path = "../../", features = ["assert_process_allocs"] } -nih_plug_egui = { path = "../../nih_plug_egui" } +nih_plug_iced = { path = "../../nih_plug_iced" } # For the GUI fftw = "0.7" diff --git a/plugins/diopser/src/editor.rs b/plugins/diopser/src/editor.rs index e51500a6..16d138ff 100644 --- a/plugins/diopser/src/editor.rs +++ b/plugins/diopser/src/editor.rs @@ -14,26 +14,90 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use nih_plug::prelude::Editor; -use nih_plug_egui::widgets::generic_ui; -use nih_plug_egui::{create_egui_editor, egui, EguiState}; +use nih_plug::prelude::{Editor, GuiContext}; +use nih_plug_iced::widgets as nih_widgets; +use nih_plug_iced::widgets::generic_ui::GenericUi; +use nih_plug_iced::*; use std::pin::Pin; use std::sync::Arc; use crate::DiopserParams; // Makes sense to also define this here, makes it a bit easier to keep track of -pub fn default_state() -> Arc { - EguiState::from_size(220, 330) +pub(crate) fn default_state() -> Arc { + IcedState::from_size(360, 300) } -pub fn create( +pub(crate) fn create( params: Pin>, - editor_state: Arc, + editor_state: Arc, ) -> Option> { - create_egui_editor(editor_state, (), move |egui_ctx, setter, _state| { - egui::CentralPanel::default().show(egui_ctx, |ui| { - generic_ui::create(ui, params.as_ref(), setter, generic_ui::GenericSlider); - }); - }) + create_iced_editor::(editor_state, params) +} + +struct DiopserEditor { + params: Pin>, + context: Arc, + + generic_ui_state: nih_widgets::generic_ui::State, +} + +#[derive(Debug, Clone, Copy)] +enum Message { + /// Update a parameter's value. + ParamUpdate(nih_widgets::ParamMessage), +} + +impl IcedEditor for DiopserEditor { + type Executor = executor::Default; + type Message = Message; + type InitializationFlags = Pin>; + + fn new( + params: Self::InitializationFlags, + context: Arc, + ) -> (Self, Command) { + let editor = DiopserEditor { + params, + context, + + generic_ui_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> { + GenericUi::new( + &mut self.generic_ui_state, + self.params.as_ref(), + self.context.as_ref(), + ) + .map(Message::ParamUpdate) + } + + fn background_color(&self) -> nih_plug_iced::Color { + nih_plug_iced::Color { + r: 0.98, + g: 0.98, + b: 0.98, + a: 1.0, + } + } } diff --git a/plugins/diopser/src/lib.rs b/plugins/diopser/src/lib.rs index a85f5eac..1f699890 100644 --- a/plugins/diopser/src/lib.rs +++ b/plugins/diopser/src/lib.rs @@ -23,7 +23,7 @@ compile_error!("Compiling without SIMD support is currently not supported"); extern crate nih_plug; use nih_plug::prelude::*; -use nih_plug_egui::EguiState; +use nih_plug_iced::IcedState; use std::pin::Pin; use std::simd::f32x2; use std::sync::atomic::{AtomicBool, Ordering}; @@ -50,7 +50,7 @@ const MAX_AUTOMATION_STEP_SIZE: u32 = 512; // - A proper GUI struct Diopser { params: Pin>, - editor_state: Arc, + editor_state: Arc, /// Needed for computing the filter coefficients. sample_rate: f32,