use iced::{
Column, Container, Element, Length, Sandbox, Settings, Align
};
use iced_audio::{
Normal, FloatParam, LogDBParam, OctaveParam, h_slider, HSlider,
v_slider, VSlider, knob, Knob
};
#[derive(Debug, Copy, Clone)]
pub enum ParamID {
HSliderFloat,
VSliderDB,
KnobOctave,
}
#[derive(Debug, Clone)]
pub enum Message {
ParamChanged((ParamID, Normal)),
}
pub fn main() {
App::run(Settings::default())
}
pub struct App {
h_slider_float_param: FloatParam<ParamID>,
v_slider_db_param: LogDBParam<ParamID>,
knob_octave_param: OctaveParam<ParamID>,
h_slider_state: h_slider::State,
v_slider_state: v_slider::State,
knob_state: knob::State,
}
impl Sandbox for App {
type Message = Message;
fn new() -> App {
let h_slider_float_param = FloatParam::<ParamID>::new(
ParamID::HSliderFloat , -1.0, 1.0, 0.0, 0.0);
let v_slider_db_param = LogDBParam::<ParamID>::new(
ParamID::VSliderDB , -12.0, 12.0, 0.0, 0.0, 0.5.into());
let knob_octave_param = OctaveParam::<ParamID>::new(
ParamID::KnobOctave , 20.0, 20480.0, 1000.0, 1000.0);
App {
h_slider_float_param,
v_slider_db_param,
knob_octave_param,
h_slider_state: h_slider::State::new(&h_slider_float_param),
v_slider_state: v_slider::State::new(&v_slider_db_param),
knob_state: knob::State::new(&knob_octave_param),
}
}
fn title(&self) -> String {
format!("Simple Example - Iced Audio")
}
fn update(&mut self, event: Message) {
match event {
Message::ParamChanged((id, normal)) => {
match id {
ParamID::HSliderFloat => {
self.h_slider_float_param.set_from_normal(normal);
},
ParamID::VSliderDB => {
self.v_slider_db_param.set_from_normal(normal);
},
ParamID::KnobOctave => {
self.knob_octave_param.set_from_normal(normal);
},
}
}
}
}
fn view(&mut self) -> Element<Message> {
let h_slider_widget = HSlider::new(
&mut self.h_slider_state,
&self.h_slider_float_param,
Message::ParamChanged,
);
let v_slider_widget = VSlider::new(
&mut self.v_slider_state,
&self.v_slider_db_param,
Message::ParamChanged,
);
let knob_widget = Knob::new(
&mut self.knob_state,
&self.knob_octave_param,
Message::ParamChanged,
);
let content: Element<_> = Column::new()
.max_width(250)
.max_height(350)
.spacing(20)
.padding(20)
.align_items(Align::Center)
.push(h_slider_widget)
.push(v_slider_widget)
.push(knob_widget)
.into();
Container::new(content)
.width(Length::Fill)
.height(Length::Fill)
.center_x()
.center_y()
.into()
}
}