48736592c953901c183015465cccd0c2ad1b4ab6
[spectmorph.git] / glui / sminsteditparams.hh
1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html
2
3 #ifndef SPECTMORPH_INST_EDIT_PARAMS_HH
4 #define SPECTMORPH_INST_EDIT_PARAMS_HH
5
6 #include "smcheckbox.hh"
7 #include "smparamlabel.hh"
8 #include "smbutton.hh"
9
10 namespace SpectMorph
11 {
12
13 class InstEditParams : public Window
14 {
15   Instrument *instrument = nullptr;
16
17   CheckBox   *auto_volume_checkbox = nullptr;
18   ComboBox   *auto_volume_method_combobox = nullptr;
19   Label      *auto_volume_gain_label = nullptr;
20   ParamLabel *auto_volume_gain_param_label = nullptr;
21
22   CheckBox   *auto_tune_checkbox = nullptr;
23
24   CheckBox   *enc_cfg_checkbox = nullptr;
25 public:
26   InstEditParams (Window *window, Instrument *instrument) :
27     Window ("Instrument Params", 320, 400, 0, false, window->native_window()),
28     instrument (instrument)
29   {
30     window->add_child_window (this);
31     set_close_callback ([this,window]() { window->remove_child_window (this); });
32
33     FixedGrid grid;
34     auto_volume_checkbox = new CheckBox (this, "Auto Volume");
35     connect (auto_volume_checkbox->signal_toggled, this, &InstEditParams::on_auto_volume_changed);
36     grid.add_widget (auto_volume_checkbox, 2, 2, 20, 2);
37
38     /*--- auto volume method ---*/
39     auto_volume_method_combobox = new ComboBox (this);
40     connect (auto_volume_method_combobox->signal_item_changed, this, &InstEditParams::on_auto_volume_method_changed);
41     grid.add_widget (new Label (this, "Method"), 4, 4, 10, 3);
42     grid.add_widget (auto_volume_method_combobox, 13, 4, 24, 3);
43     auto_volume_method_combobox->add_item ("From Loop"); // default
44     auto_volume_method_combobox->add_item ("Global");
45
46     /*--- auto volume gain ---*/
47     auto_volume_gain_label = new Label (this, "Gain");
48     grid.add_widget (auto_volume_gain_label, 4, 7, 10, 3);
49
50     auto_volume_gain_param_label = new ParamLabel (this, "");
51     grid.add_widget (auto_volume_gain_param_label, 13, 7, 10, 3);
52
53     connect (auto_volume_gain_param_label->signal_value_changed, this, &InstEditParams::on_auto_volume_gain_changed);
54
55     connect (instrument->signal_global_changed, this, &InstEditParams::on_global_changed);
56
57     auto_tune_checkbox = new CheckBox (this, "Auto Tune");
58     connect (auto_tune_checkbox->signal_toggled, this, &InstEditParams::on_auto_tune_changed);
59     grid.add_widget (auto_tune_checkbox, 2, 10, 20, 2);
60
61     enc_cfg_checkbox = new CheckBox (this, "Custom Analysis Parameters");
62     grid.add_widget (enc_cfg_checkbox, 2, 13, 30, 2);
63     connect (enc_cfg_checkbox->signal_toggled, this, &InstEditParams::on_enc_cfg_changed);
64
65     auto encoder_config = instrument->encoder_config();
66     for (int i = 0; i < encoder_config.entries.size(); i++)
67       {
68         grid.add_widget (new ParamLabel (this, encoder_config.entries[i].param), 4, 15 + i * 3, 20, 3);
69         grid.add_widget (new ParamLabel (this, encoder_config.entries[i].value), 24, 15 + i * 3, 15, 3);
70         grid.add_widget (new ToolButton (this, 'x'), 34.5, 15.5 + i * 3, 2, 2);
71       }
72
73     on_global_changed();
74
75     show();
76   }
77   void
78   on_global_changed()
79   {
80     auto_volume_checkbox->set_checked (instrument->auto_volume().enabled);
81     auto_tune_checkbox->set_checked (instrument->auto_tune().enabled);
82     enc_cfg_checkbox->set_checked (instrument->encoder_config().enabled);
83     auto_volume_gain_param_label->set_text (string_printf ("%.2f dB", instrument->auto_volume().gain));
84
85     if (instrument->auto_volume().method == Instrument::AutoVolume::GLOBAL)
86       auto_volume_method_combobox->set_text ("Global");
87     else
88       auto_volume_method_combobox->set_text ("From Loop");
89   }
90   void
91   on_auto_volume_changed (bool new_value)
92   {
93     Instrument::AutoVolume av = instrument->auto_volume();
94     av.enabled = new_value;
95
96     instrument->set_auto_volume (av);
97   }
98   void
99   on_auto_volume_method_changed()
100   {
101     Instrument::AutoVolume av = this->instrument->auto_volume();
102
103     int idx = auto_volume_method_combobox->current_index();
104     if (idx == 0)
105       av.method = Instrument::AutoVolume::FROM_LOOP;
106     else
107       av.method = Instrument::AutoVolume::GLOBAL;
108
109     this->instrument->set_auto_volume (av);
110   }
111   void
112   on_auto_volume_gain_changed (double gain)
113   {
114     Instrument::AutoVolume av = instrument->auto_volume();
115     av.gain = gain;
116
117     instrument->set_auto_volume (av);
118   }
119   void
120   on_auto_tune_changed (bool new_value)
121   {
122     auto at = instrument->auto_tune();
123     at.enabled = new_value;
124
125     instrument->set_auto_tune (at);
126   }
127   void
128   on_enc_cfg_changed (bool new_value)
129   {
130     auto enc_cfg = instrument->encoder_config();
131     enc_cfg.enabled = new_value;
132
133     instrument->set_encoder_config (enc_cfg);
134   }
135 };
136
137 }
138
139 #endif