GLUI: make instrument param widgets scrollable
[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_method_label = nullptr;
20   Label      *auto_volume_gain_label = nullptr;
21   ParamLabel *auto_volume_gain_param_label = nullptr;
22
23   CheckBox   *auto_tune_checkbox = nullptr;
24
25   CheckBox   *enc_cfg_checkbox = nullptr;
26   std::vector<Widget *> enc_widgets;
27
28   ScrollView *scroll_view = nullptr;
29   Widget     *scroll_widget = nullptr;
30 public:
31   InstEditParams (Window *window, Instrument *instrument) :
32     Window ("Instrument Params", 320, 400, 0, false, window->native_window()),
33     instrument (instrument)
34   {
35     window->add_child_window (this);
36     set_close_callback ([this,window]() { window->remove_child_window (this); });
37
38     FixedGrid grid;
39     grid.add_widget (scroll_view = new ScrollView (this), 1, 1, width / 8 - 2, height / 8 - 2);
40     scroll_widget = new Widget (scroll_view);
41     scroll_view->set_scroll_widget (scroll_widget, false, true);
42
43     auto_volume_checkbox = new CheckBox (scroll_widget, "Auto Volume");
44     connect (auto_volume_checkbox->signal_toggled, this, &InstEditParams::on_auto_volume_changed);
45
46     /*--- auto volume method ---*/
47     auto_volume_method_combobox = new ComboBox (scroll_widget);
48     auto_volume_method_label = new Label (scroll_widget, "Method");
49
50     connect (auto_volume_method_combobox->signal_item_changed, this, &InstEditParams::on_auto_volume_method_changed);
51     auto_volume_method_combobox->add_item ("From Loop"); // default
52     auto_volume_method_combobox->add_item ("Global");
53
54     /*--- auto volume gain ---*/
55     auto_volume_gain_label = new Label (scroll_widget, "Gain");
56
57     auto_volume_gain_param_label = new ParamLabel (scroll_widget, "");
58
59     connect (auto_volume_gain_param_label->signal_value_changed, this, &InstEditParams::on_auto_volume_gain_changed);
60
61     auto_tune_checkbox = new CheckBox (scroll_widget, "Auto Tune");
62     connect (auto_tune_checkbox->signal_toggled, this, &InstEditParams::on_auto_tune_changed);
63
64     enc_cfg_checkbox = new CheckBox (scroll_widget, "Custom Analysis Parameters");
65     connect (enc_cfg_checkbox->signal_toggled, this, &InstEditParams::on_enc_cfg_changed);
66
67
68     connect (instrument->signal_global_changed, this, &InstEditParams::on_global_changed);
69     on_global_changed();
70     show();
71   }
72   void
73   on_global_changed()
74   {
75     FixedGrid grid;
76
77     const auto auto_volume = instrument->auto_volume();
78     auto_volume_checkbox->set_checked (auto_volume.enabled);
79     auto_volume_method_label->set_visible (auto_volume.enabled);
80     auto_volume_method_combobox->set_visible (auto_volume.enabled);
81     auto_volume_gain_label->set_visible (auto_volume.enabled && auto_volume.method == Instrument::AutoVolume::GLOBAL);
82     auto_volume_gain_param_label->set_visible (auto_volume.enabled && auto_volume.method == Instrument::AutoVolume::GLOBAL);
83
84     double y = 0;
85     grid.add_widget (auto_volume_checkbox, 0, y, 20, 2);
86     y += 2;
87     if (auto_volume.enabled)
88       {
89         grid.add_widget (auto_volume_method_label, 2, y, 10, 3);
90         grid.add_widget (auto_volume_method_combobox, 11, y, 23, 3);
91         y += 3;
92         if (auto_volume.method == Instrument::AutoVolume::GLOBAL)
93           {
94             grid.add_widget (auto_volume_gain_label, 2, y, 10, 3);
95             grid.add_widget (auto_volume_gain_param_label, 11, y, 10, 3);
96             y += 3;
97           }
98       }
99     grid.add_widget (auto_tune_checkbox, 0, y, 20, 2);
100     y += 2;
101     grid.add_widget (enc_cfg_checkbox, 0, y, 30, 2);
102     y += 2;
103
104     auto_tune_checkbox->set_checked (instrument->auto_tune().enabled);
105     enc_cfg_checkbox->set_checked (instrument->encoder_config().enabled);
106     auto_volume_gain_param_label->set_text (string_printf ("%.2f dB", instrument->auto_volume().gain));
107
108     if (instrument->auto_volume().method == Instrument::AutoVolume::GLOBAL)
109       auto_volume_method_combobox->set_text ("Global");
110     else
111       auto_volume_method_combobox->set_text ("From Loop");
112
113     auto encoder_config = instrument->encoder_config();
114
115     for (auto w : enc_widgets) /* delete old enc widgets */
116       delete w;
117     enc_widgets.clear();
118
119     if (encoder_config.enabled)
120       {
121         for (int i = 0; i < encoder_config.entries.size(); i++)
122           {
123             ParamLabel *plabel = new ParamLabel (scroll_widget, encoder_config.entries[i].param);
124             ParamLabel *vlabel = new ParamLabel (scroll_widget, encoder_config.entries[i].value);
125             ToolButton *tbutton = new ToolButton (scroll_widget, 'x');
126
127             grid.add_widget (plabel, 2, y, 20, 3);
128             grid.add_widget (vlabel, 21, y, 11, 3);
129             grid.add_widget (tbutton, 32.5, y + 0.5, 2, 2);
130             y += 3;
131             enc_widgets.push_back (plabel);
132             enc_widgets.push_back (vlabel);
133             enc_widgets.push_back (tbutton);
134           }
135       }
136
137     scroll_widget->height = y * 8;
138     scroll_widget->width = 32 * 8;
139     scroll_view->on_widget_size_changed();
140   }
141   void
142   on_auto_volume_changed (bool new_value)
143   {
144     Instrument::AutoVolume av = instrument->auto_volume();
145     av.enabled = new_value;
146
147     instrument->set_auto_volume (av);
148   }
149   void
150   on_auto_volume_method_changed()
151   {
152     Instrument::AutoVolume av = this->instrument->auto_volume();
153
154     int idx = auto_volume_method_combobox->current_index();
155     if (idx == 0)
156       av.method = Instrument::AutoVolume::FROM_LOOP;
157     else
158       av.method = Instrument::AutoVolume::GLOBAL;
159
160     this->instrument->set_auto_volume (av);
161   }
162   void
163   on_auto_volume_gain_changed (double gain)
164   {
165     Instrument::AutoVolume av = instrument->auto_volume();
166     av.gain = gain;
167
168     instrument->set_auto_volume (av);
169   }
170   void
171   on_auto_tune_changed (bool new_value)
172   {
173     auto at = instrument->auto_tune();
174     at.enabled = new_value;
175
176     instrument->set_auto_tune (at);
177   }
178   void
179   on_enc_cfg_changed (bool new_value)
180   {
181     auto enc_cfg = instrument->encoder_config();
182     enc_cfg.enabled = new_value;
183
184     instrument->set_encoder_config (enc_cfg);
185   }
186 };
187
188 }
189
190 #endif