Simplify widgets
This commit is contained in:
parent
93990d604b
commit
eb9e7d81a9
|
@ -1,9 +1,12 @@
|
||||||
//! A slider that integrates with NIH-plug's [`Param`] types.
|
//! A slider that integrates with NIH-plug's [`Param`] types.
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
alignment, backend, event, keyboard, layout, mouse, renderer, text, touch, Clipboard, Color,
|
alignment, event, keyboard, layout, mouse, renderer, text, touch, Clipboard, Color, Element,
|
||||||
Element, Event, Layout, Length, Point, Rectangle, Shell, Size, Widget,
|
Event, Font, Layout, Length, Point, Rectangle, Shell, Size, Widget,
|
||||||
};
|
};
|
||||||
|
use iced_baseview::backend::Renderer;
|
||||||
|
use iced_baseview::renderer::Renderer as GraphicsRenderer;
|
||||||
|
use iced_baseview::text::Renderer as TextRenderer;
|
||||||
use nih_plug::prelude::{GuiContext, Param, ParamSetter};
|
use nih_plug::prelude::{GuiContext, Param, ParamSetter};
|
||||||
|
|
||||||
use super::util;
|
use super::util;
|
||||||
|
@ -17,7 +20,7 @@ const GRANULAR_DRAG_MULTIPLIER: f32 = 0.1;
|
||||||
///
|
///
|
||||||
/// TODO: There are currently no styling options at all
|
/// TODO: There are currently no styling options at all
|
||||||
/// TODO: Handle Alt+click for text entry
|
/// TODO: Handle Alt+click for text entry
|
||||||
pub struct ParamSlider<'a, P: Param, Renderer: text::Renderer> {
|
pub struct ParamSlider<'a, P: Param> {
|
||||||
state: &'a mut State,
|
state: &'a mut State,
|
||||||
|
|
||||||
param: &'a P,
|
param: &'a P,
|
||||||
|
@ -28,7 +31,7 @@ pub struct ParamSlider<'a, P: Param, Renderer: text::Renderer> {
|
||||||
height: Length,
|
height: Length,
|
||||||
width: Length,
|
width: Length,
|
||||||
text_size: Option<u16>,
|
text_size: Option<u16>,
|
||||||
font: Renderer::Font,
|
font: Font,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// State for a [`ParamSlider`].
|
/// State for a [`ParamSlider`].
|
||||||
|
@ -46,7 +49,7 @@ pub struct State {
|
||||||
ignore_changes: bool,
|
ignore_changes: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, P: Param, Renderer: text::Renderer> ParamSlider<'a, P, Renderer> {
|
impl<'a, P: Param> ParamSlider<'a, P> {
|
||||||
/// Creates a new [`ParamSlider`] for the given parameter.
|
/// Creates a new [`ParamSlider`] for the given parameter.
|
||||||
pub fn new(state: &'a mut State, param: &'a P, context: &'a dyn GuiContext) -> Self {
|
pub fn new(state: &'a mut State, param: &'a P, context: &'a dyn GuiContext) -> Self {
|
||||||
let setter = ParamSetter::new(context);
|
let setter = ParamSetter::new(context);
|
||||||
|
@ -60,7 +63,7 @@ impl<'a, P: Param, Renderer: text::Renderer> ParamSlider<'a, P, Renderer> {
|
||||||
width: Length::Units(180),
|
width: Length::Units(180),
|
||||||
height: Length::Units(30),
|
height: Length::Units(30),
|
||||||
text_size: None,
|
text_size: None,
|
||||||
font: Renderer::Font::default(),
|
font: <Renderer as TextRenderer>::Font::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,15 +86,13 @@ impl<'a, P: Param, Renderer: text::Renderer> ParamSlider<'a, P, Renderer> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the font of the [`ParamSlider`].
|
/// Sets the font of the [`ParamSlider`].
|
||||||
pub fn font(mut self, font: Renderer::Font) -> Self {
|
pub fn font(mut self, font: Font) -> Self {
|
||||||
self.font = font;
|
self.font = font;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, P: Param, Renderer: text::Renderer> Widget<ParamMessage, Renderer>
|
impl<'a, P: Param> Widget<ParamMessage, Renderer> for ParamSlider<'a, P> {
|
||||||
for ParamSlider<'a, P, Renderer>
|
|
||||||
{
|
|
||||||
fn width(&self) -> Length {
|
fn width(&self) -> Length {
|
||||||
self.width
|
self.width
|
||||||
}
|
}
|
||||||
|
@ -296,7 +297,7 @@ impl<'a, P: Param, Renderer: text::Renderer> Widget<ParamMessage, Renderer>
|
||||||
};
|
};
|
||||||
renderer.fill_text(text::Text {
|
renderer.fill_text(text::Text {
|
||||||
content: &display_value,
|
content: &display_value,
|
||||||
font: self.font.clone(),
|
font: self.font,
|
||||||
size: text_size,
|
size: text_size,
|
||||||
bounds: text_bounds,
|
bounds: text_bounds,
|
||||||
color: style.text_color,
|
color: style.text_color,
|
||||||
|
@ -309,7 +310,7 @@ impl<'a, P: Param, Renderer: text::Renderer> Widget<ParamMessage, Renderer>
|
||||||
let filled_text_color = Color::from_rgb8(80, 80, 80);
|
let filled_text_color = Color::from_rgb8(80, 80, 80);
|
||||||
renderer.fill_text(text::Text {
|
renderer.fill_text(text::Text {
|
||||||
content: &display_value,
|
content: &display_value,
|
||||||
font: self.font.clone(),
|
font: self.font,
|
||||||
size: text_size,
|
size: text_size,
|
||||||
bounds: text_bounds,
|
bounds: text_bounds,
|
||||||
color: filled_text_color,
|
color: filled_text_color,
|
||||||
|
@ -320,7 +321,19 @@ impl<'a, P: Param, Renderer: text::Renderer> Widget<ParamMessage, Renderer>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, P: Param, Renderer: text::Renderer> ParamSlider<'a, P, Renderer> {
|
impl<'a, P: Param> ParamSlider<'a, P> {
|
||||||
|
/// Convert this [`ParamSlider`] into an [`Element`] with the correct message. You should have a
|
||||||
|
/// variant on your own message type that wraps around [`ParamMessage`] so you can forward those
|
||||||
|
/// messages to
|
||||||
|
/// [`IcedEditor::handle_param_message()`][crate::IcedEditor::handle_param_message()].
|
||||||
|
pub fn map<Message, F>(self, f: F) -> Element<'a, Message>
|
||||||
|
where
|
||||||
|
Message: 'static,
|
||||||
|
F: Fn(ParamMessage) -> Message + 'static,
|
||||||
|
{
|
||||||
|
Element::from(self).map(f)
|
||||||
|
}
|
||||||
|
|
||||||
/// Set the normalized value for a parameter if that would change the parameter's plain value
|
/// Set the normalized value for a parameter if that would change the parameter's plain value
|
||||||
/// (to avoid unnecessary duplicate parameter changes). The begin- and end set parameter
|
/// (to avoid unnecessary duplicate parameter changes). The begin- and end set parameter
|
||||||
/// messages need to be sent before calling this function.
|
/// messages need to be sent before calling this function.
|
||||||
|
@ -340,22 +353,8 @@ impl<'a, P: Param, Renderer: text::Renderer> ParamSlider<'a, P, Renderer> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, P: Param> ParamSlider<'a, P, backend::Renderer> {
|
impl<'a, P: Param> From<ParamSlider<'a, P>> for Element<'a, ParamMessage> {
|
||||||
/// Convert this [`ParamSlider`] into an [`Element`] with the correct message. You should have a
|
fn from(widget: ParamSlider<'a, P>) -> Self {
|
||||||
/// variant on your own message type that wraps around [`ParamMessage`] so you can forward those
|
|
||||||
/// messages to
|
|
||||||
/// [`IcedEditor::handle_param_message()`][crate::IcedEditor::handle_param_message()].
|
|
||||||
pub fn map<Message, F>(self, f: F) -> Element<'a, Message>
|
|
||||||
where
|
|
||||||
Message: 'static,
|
|
||||||
F: Fn(ParamMessage) -> Message + 'static,
|
|
||||||
{
|
|
||||||
Element::from(self).map(f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, P: Param> From<ParamSlider<'a, P, backend::Renderer>> for Element<'a, ParamMessage> {
|
|
||||||
fn from(widget: ParamSlider<'a, P, backend::Renderer>) -> Self {
|
|
||||||
Element::new(widget)
|
Element::new(widget)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue