88f9aed5c52f755da787718e7385780a47f182bc
[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
9 namespace SpectMorph
10 {
11
12 class InstEditParams : public Window
13 {
14   Instrument *instrument = nullptr;
15
16   CheckBox   *auto_volume_checkbox = nullptr;
17   ComboBox   *auto_volume_method_combobox = nullptr;
18   Label      *auto_volume_gain_label = nullptr;
19   ParamLabel *auto_volume_gain_param_label = nullptr;
20
21   CheckBox   *auto_tune_checkbox = nullptr;
22 public:
23   InstEditParams (Window *window, Instrument *instrument) :
24     Window ("Instrument Params", 320, 400, 0, false, window->native_window()),
25     instrument (instrument)
26   {
27     window->add_child_window (this);
28     set_close_callback ([this,window]() { window->remove_child_window (this); });
29
30     FixedGrid grid;
31     auto_volume_checkbox = new CheckBox (this, "Auto Volume");
32     connect (auto_volume_checkbox->signal_toggled, this, &InstEditParams::on_auto_volume_changed);
33     grid.add_widget (auto_volume_checkbox, 2, 2, 20, 2);
34
35     /*--- auto volume method ---*/
36     auto_volume_method_combobox = new ComboBox (this);
37     connect (auto_volume_method_combobox->signal_item_changed, this, &InstEditParams::on_auto_volume_method_changed);
38     grid.add_widget (new Label (this, "Method"), 4, 4, 10, 3);
39     grid.add_widget (auto_volume_method_combobox, 13, 4, 24, 3);
40     auto_volume_method_combobox->add_item ("From Loop"); // default
41     auto_volume_method_combobox->add_item ("Global");
42
43     /*--- auto volume gain ---*/
44     auto_volume_gain_label = new Label (this, "Gain");
45     grid.add_widget (auto_volume_gain_label, 4, 7, 10, 3);
46
47     auto_volume_gain_param_label = new ParamLabel (this, "");
48     grid.add_widget (auto_volume_gain_param_label, 13, 7, 10, 3);
49
50     connect (auto_volume_gain_param_label->signal_value_changed, this, &InstEditParams::on_auto_volume_gain_changed);
51
52     connect (instrument->signal_global_changed, this, &InstEditParams::on_global_changed);
53
54     auto_tune_checkbox = new CheckBox (this, "Auto Tune");
55     connect (auto_tune_checkbox->signal_toggled, this, &InstEditParams::on_auto_tune_changed);
56     grid.add_widget (auto_tune_checkbox, 2, 10, 20, 2);
57
58     on_global_changed();
59
60     show();
61   }
62   void
63   on_global_changed()
64   {
65     auto_volume_checkbox->set_checked (instrument->auto_volume().enabled);
66     auto_tune_checkbox->set_checked (instrument->auto_tune().enabled);
67     auto_volume_gain_param_label->set_text (string_printf ("%.2f dB", instrument->auto_volume().gain));
68
69     if (instrument->auto_volume().method == Instrument::AutoVolume::GLOBAL)
70       auto_volume_method_combobox->set_text ("Global");
71     else
72       auto_volume_method_combobox->set_text ("From Loop");
73   }
74   void
75   on_auto_volume_changed (bool new_value)
76   {
77     Instrument::AutoVolume av = instrument->auto_volume();
78     av.enabled = new_value;
79
80     instrument->set_auto_volume (av);
81   }
82   void
83   on_auto_volume_method_changed()
84   {
85     Instrument::AutoVolume av = this->instrument->auto_volume();
86
87     int idx = auto_volume_method_combobox->current_index();
88     if (idx == 0)
89       av.method = Instrument::AutoVolume::FROM_LOOP;
90     else
91       av.method = Instrument::AutoVolume::GLOBAL;
92
93     this->instrument->set_auto_volume (av);
94   }
95   void
96   on_auto_volume_gain_changed (double gain)
97   {
98     Instrument::AutoVolume av = instrument->auto_volume();
99     av.gain = gain;
100
101     instrument->set_auto_volume (av);
102   }
103   void
104   on_auto_tune_changed (bool new_value)
105   {
106     auto at = instrument->auto_tune();
107     at.enabled = new_value;
108
109     instrument->set_auto_tune (at);
110   }
111 };
112
113 }
114
115 #endif