PC Music Generator - a Virtual Modular Synthesizer
1use std::collections::BTreeMap;
2
3use serde::{
4 Deserialize,
5 Serialize,
6};
7use uuid::Uuid;
8
9use crate::{
10 container::sizing::ModuleSize,
11 devices::description::DeviceKind,
12 visuals::{
13 templates::WidgetTemplate,
14 VisualTheme,
15 },
16 widgets::KnobRange,
17 Uuidentified,
18};
19
20#[derive(Debug, Serialize, Deserialize, Clone)]
21pub struct ModuleDescription {
22 pub uuid: Uuid,
23 pub name: String,
24 pub theme: VisualTheme,
25 pub size: ModuleSize,
26 pub visuals: BTreeMap<usize, WidgetTemplate>,
27 pub devices: BTreeMap<usize, DeviceKind>,
28 pub connections: BTreeMap<usize, (usize, usize)>,
29}
30
31impl Uuidentified for ModuleDescription {
32 fn uuid(&self) -> Uuid {
33 self.uuid
34 }
35}
36
37#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
38pub struct KnobKind {
39 pub angle_range: KnobRange,
40 pub value_range: KnobRange,
41 pub speed: f32,
42}
43
44impl Default for KnobKind {
45 fn default() -> Self {
46 Self {
47 angle_range: (0., 360.).into(),
48 value_range: (0., 1.).into(),
49 speed: 0.1,
50 }
51 }
52}
53#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
54pub struct ToggleKind {
55 pub on: f32,
56 pub off: f32,
57}
58
59impl Default for ToggleKind {
60 fn default() -> Self {
61 Self { on: 1., off: 0. }
62 }
63}
64
65#[derive(Clone, Copy, PartialEq, Debug, Default, Serialize, Deserialize)]
66pub enum WidgetKind {
67 Knob(KnobKind),
68 Toggle(ToggleKind),
69 #[default]
70 Port,
71}
72
73impl std::fmt::Display for WidgetKind {
74 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
75 match self {
76 WidgetKind::Knob(_) => f.write_str("Knob"),
77 WidgetKind::Toggle(_) => f.write_str("Toggle"),
78 _ => std::fmt::Debug::fmt(self, f),
79 }
80 }
81}
82
83impl WidgetKind {
84 pub fn all() -> [Self; 3] {
85 use WidgetKind::*;
86 [Knob(Default::default()), Toggle(Default::default()), Port]
87 }
88}