/[svn]/gigedit/trunk/src/gigedit/paramedit.cpp
ViewVC logotype

Diff of /gigedit/trunk/src/gigedit/paramedit.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1359 by schoenebeck, Sun Sep 30 18:30:52 2007 UTC revision 2151 by persson, Sun Nov 21 12:38:41 2010 UTC
# Line 1  Line 1 
1  /*  /*
2   * Copyright (C) 2006, 2007 Andreas Persson   * Copyright (C) 2006-2010 Andreas Persson
3   *   *
4   * This program is free software; you can redistribute it and/or   * This program is free software; you can redistribute it and/or
5   * modify it under the terms of the GNU General Public License as   * modify it under the terms of the GNU General Public License as
# Line 17  Line 17 
17   * 02110-1301 USA.   * 02110-1301 USA.
18   */   */
19    
20    #include <cstring>
21    
22  #include "paramedit.h"  #include "paramedit.h"
23    
24    #include "global.h"
25    
26  namespace {  namespace {
27      const char* const controlChangeTexts[] = {      const char* const controlChangeTexts[] = {
28          "none", "channelaftertouch", "velocity",          _("none"), _("channelaftertouch"), _("velocity"),
29          0,          0,
30          "modwheel", // "Modulation Wheel or Lever",          _("modwheel"), // "Modulation Wheel or Lever",
31          "breath", // "Breath Controller",          _("breath"), // "Breath Controller",
32          0,          0,
33          "foot", // "Foot Controller",          _("foot"), // "Foot Controller",
34          "portamentotime", // "Portamento Time",          _("portamentotime"), // "Portamento Time",
35          0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0,
36          "effect1", // "Effect Control 1",          _("effect1"), // "Effect Control 1",
37          "effect2", // "Effect Control 2",          _("effect2"), // "Effect Control 2",
38          0, 0,          0, 0,
39          "genpurpose1", // "General Purpose Controller 1",          _("genpurpose1"), // "General Purpose Controller 1",
40          "genpurpose2", // "General Purpose Controller 2",          _("genpurpose2"), // "General Purpose Controller 2",
41          "genpurpose3", // "General Purpose Controller 3",          _("genpurpose3"), // "General Purpose Controller 3",
42          "genpurpose4", // "General Purpose Controller 4",          _("genpurpose4"), // "General Purpose Controller 4",
43          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
44          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
45          0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0,
46          "sustainpedal", // "Damper Pedal on/off (Sustain)",          _("sustainpedal"), // "Damper Pedal on/off (Sustain)",
47          "portamento", // "Portamento On/Off",          _("portamento"), // "Portamento On/Off",
48          "sostenuto", // "Sustenuto On/Off",          _("sostenuto"), // "Sustenuto On/Off",
49          "softpedal", // "Soft Pedal On/Off",          _("softpedal"), // "Soft Pedal On/Off",
50          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
51          "genpurpose5", // "General Purpose Controller 5",          _("genpurpose5"), // "General Purpose Controller 5",
52          "genpurpose6", // "General Purpose Controller 6",          _("genpurpose6"), // "General Purpose Controller 6",
53          "genpurpose7", // "General Purpose Controller 7",          _("genpurpose7"), // "General Purpose Controller 7",
54          "genpurpose8", // "General Purpose Controller 8",          _("genpurpose8"), // "General Purpose Controller 8",
55          0, 0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0, 0,
56          "effect1depth", // "Effects 1 Depth",          _("effect1depth"), // "Effects 1 Depth",
57          "effect2depth", // "Effects 2 Depth",          _("effect2depth"), // "Effects 2 Depth",
58          "effect3depth", // "Effects 3 Depth",          _("effect3depth"), // "Effects 3 Depth",
59          "effect4depth", // "Effects 4 Depth",          _("effect4depth"), // "Effects 4 Depth",
60          "effect5depth", // "Effects 5 Depth"          _("effect5depth"), // "Effects 5 Depth"
61      };      };
62  }  }
63    
# Line 72  void LabelWidget::set_sensitive(bool sen Line 76  void LabelWidget::set_sensitive(bool sen
76    
77  NumEntry::NumEntry(const char* labelText, double lower, double upper,  NumEntry::NumEntry(const char* labelText, double lower, double upper,
78                     int decimals) :                     int decimals) :
79        LabelWidget(labelText, box),
80      adjust(lower, lower, upper, 1, 10),      adjust(lower, lower, upper, 1, 10),
81      scale(adjust),      scale(adjust),
82      spinbutton(adjust),      spinbutton(adjust)
     LabelWidget(labelText, box)  
83  {  {
84      spinbutton.set_digits(decimals);      spinbutton.set_digits(decimals);
85        spinbutton.set_value(0);
86      scale.set_draw_value(false);      scale.set_draw_value(false);
87      box.pack_start(spinbutton, Gtk::PACK_SHRINK);      box.pack_start(spinbutton, Gtk::PACK_SHRINK);
88      box.add(scale);      box.add(scale);
# Line 87  NumEntryGain::NumEntryGain(const char* l Line 92  NumEntryGain::NumEntryGain(const char* l
92                             double lower, double upper,                             double lower, double upper,
93                             int decimals, double coeff) :                             int decimals, double coeff) :
94      NumEntry(labelText, lower, upper, decimals),      NumEntry(labelText, lower, upper, decimals),
95      coeff(coeff)      value(0),
96        coeff(coeff),
97        connected(true)
98  {  {
99      spinbutton.signal_value_changed().connect(      spinbutton.signal_value_changed().connect(
100          sigc::mem_fun(*this, &NumEntryGain::value_changed));          sigc::mem_fun(*this, &NumEntryGain::value_changed));
# Line 95  NumEntryGain::NumEntryGain(const char* l Line 102  NumEntryGain::NumEntryGain(const char* l
102    
103  void NumEntryGain::value_changed()  void NumEntryGain::value_changed()
104  {  {
105        if (!connected) return;
106    
107      const double f = pow(10, spinbutton.get_digits());      const double f = pow(10, spinbutton.get_digits());
108      int new_value = round_to_int(spinbutton.get_value() * f);      int new_value = round_to_int(spinbutton.get_value() * f);
109      if (ptr) {      if (new_value != round_to_int(value / coeff * f)) {
110          if (new_value != round_to_int(*ptr / coeff * f))          value = round_to_int(new_value / f * coeff);
111          {          sig_changed();
             sig_to_be_changed.emit();  
             *ptr = round_to_int(new_value / f * coeff);  
             sig_val_changed.emit(new_value);  
             sig_changed.emit();  
         }  
     } else {  
         sig_to_be_changed.emit();  
         sig_val_changed.emit(new_value);  
         sig_changed.emit();  
112      }      }
113  }  }
114    
115  void NumEntryGain::set_ptr(int32_t* ptr)  void NumEntryGain::set_value(int32_t value)
116  {  {
117      this->ptr = 0;      if (value != this->value) {
118      bool plus6 = *ptr < 0;          this->value = value;
119      set_value(plus6 ? 0 : *ptr / coeff);  
120      set_sensitive(!plus6);          connected = false;
121      this->ptr = ptr;          bool plus6 = value < 0;
122            spinbutton.set_value(plus6 ? 0 : value / coeff);
123            set_sensitive(!plus6);
124            connected = true;
125    
126            sig_changed();
127        }
128  }  }
129    
130    
# Line 134  BoolEntryPlus6::BoolEntryPlus6(const cha Line 140  BoolEntryPlus6::BoolEntryPlus6(const cha
140    
141  void BoolEntryPlus6::value_changed()  void BoolEntryPlus6::value_changed()
142  {  {
143      if (ptr) {      if (checkbutton.get_active()) eGain.set_value(plus6value);
144          bool plus6 = checkbutton.get_active();      else if (eGain.get_value() < 0) eGain.set_value(0);
         if (plus6) {  
             eGain.set_value(0);  
             *ptr = plus6value;  
             sig_changed();  
         } else {  
             if (*ptr < 0) {  
                 *ptr = 0;  
                 sig_changed();  
             }  
         }  
         eGain.set_sensitive(!plus6);  
     }  
145  }  }
146    
147  void BoolEntryPlus6::set_ptr(int32_t* ptr)  int32_t BoolEntryPlus6::get_value() const
148  {  {
149      this->ptr = 0;      return eGain.get_value();
150      checkbutton.set_active(*ptr < 0);  }
151      this->ptr = ptr;  
152    void BoolEntryPlus6::set_value(int32_t value)
153    {
154        checkbutton.set_active(value < 0);
155  }  }
156    
157  NumEntryPermille::NumEntryPermille(const char* labelText,  NumEntryPermille::NumEntryPermille(const char* labelText,
158                                     double lower, double upper, int decimals) :                                     double lower, double upper, int decimals) :
159      NumEntry(labelText, lower, upper, decimals)      NumEntry(labelText, lower, upper, decimals),
160        value(0)
161  {  {
162      spinbutton.signal_value_changed().connect(      spinbutton.signal_value_changed().connect(
163          sigc::mem_fun(*this, &NumEntryPermille::value_changed));          sigc::mem_fun(*this, &NumEntryPermille::value_changed));
# Line 167  NumEntryPermille::NumEntryPermille(const Line 165  NumEntryPermille::NumEntryPermille(const
165    
166  void NumEntryPermille::value_changed()  void NumEntryPermille::value_changed()
167  {  {
168      if (ptr) {      uint16_t new_value = uint16_t(spinbutton.get_value() * 10 + 0.5);
169          uint16_t new_value = uint16_t(spinbutton.get_value() * 10 + 0.5);      if (new_value != value) {
170          if (new_value != *ptr) {          value = uint16_t(spinbutton.get_value() * 10 + 0.5);
171              *ptr = uint16_t(spinbutton.get_value() * 10 + 0.5);          sig_changed();
             sig_changed();  
         }  
172      }      }
173  }  }
174    
175  void NumEntryPermille::set_ptr(uint16_t* ptr)  void NumEntryPermille::set_value(uint16_t value)
176  {  {
177      this->ptr = 0;      if (value != this->value) {
178      set_value(*ptr / 10.0);          spinbutton.set_value(value / 10.0);
179      this->ptr = ptr;      }
180  }  }
181    
182    
# Line 194  NoteEntry::NoteEntry(const char* labelTe Line 190  NoteEntry::NoteEntry(const char* labelTe
190  }  }
191    
192  const char* notes[] = {  const char* notes[] = {
193      "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"      _("C"), _("C#"), _("D"), _("D#"), _("E"), _("F"),_("F#"),
194        _("G"), _("G#"), _("A"), _("A#"), _("B")
195  };  };
196    
197    
# Line 229  bool NoteEntry::on_output() Line 226  bool NoteEntry::on_output()
226  }  }
227    
228  ChoiceEntryLeverageCtrl::ChoiceEntryLeverageCtrl(const char* labelText) :  ChoiceEntryLeverageCtrl::ChoiceEntryLeverageCtrl(const char* labelText) :
229      align(0, 0, 0, 0),      LabelWidget(labelText, align),
230      LabelWidget(labelText, align)      align(0, 0, 0, 0)
231  {  {
232      for (int i = 0 ; i < 99 ; i++) {      for (int i = 0 ; i < 99 ; i++) {
233          if (controlChangeTexts[i]) {          if (controlChangeTexts[i]) {
# Line 240  ChoiceEntryLeverageCtrl::ChoiceEntryLeve Line 237  ChoiceEntryLeverageCtrl::ChoiceEntryLeve
237      combobox.signal_changed().connect(      combobox.signal_changed().connect(
238          sigc::mem_fun(*this, &ChoiceEntryLeverageCtrl::value_changed));          sigc::mem_fun(*this, &ChoiceEntryLeverageCtrl::value_changed));
239      align.add(combobox);      align.add(combobox);
240        value.type = gig::leverage_ctrl_t::type_none;
241        value.controller_number = 0;
242  }  }
243    
244  void ChoiceEntryLeverageCtrl::value_changed()  void ChoiceEntryLeverageCtrl::value_changed()
245  {  {
246      if (ptr) {      int rowno = combobox.get_active_row_number();
247          int rowno = combobox.get_active_row_number();      switch (rowno)
248          switch (rowno)      {
249          {      case -1:
250          case -1:          break;
251              break;      case 0:
252          case 0:          value.type = gig::leverage_ctrl_t::type_none;
253              ptr->type = gig::leverage_ctrl_t::type_none;          break;
254              break;      case 1:
255          case 1:          value.type = gig::leverage_ctrl_t::type_channelaftertouch;
256              ptr->type = gig::leverage_ctrl_t::type_channelaftertouch;          break;
257              break;      case 2:
258          case 2:          value.type = gig::leverage_ctrl_t::type_velocity;
259              ptr->type = gig::leverage_ctrl_t::type_velocity;          break;
260              break;      default:
261          default:          value.type = gig::leverage_ctrl_t::type_controlchange;
262              ptr->type = gig::leverage_ctrl_t::type_controlchange;          int x = 3;
263              int x = 3;          for (uint cc = 0 ; cc < 96 ; cc++) {
264              for (int cc = 0 ; cc < 96 ; cc++) {              if (controlChangeTexts[cc + 3]) {
265                  if (controlChangeTexts[cc + 3]) {                  if (rowno == x) {
266                      if (rowno == x) {                      value.controller_number = cc;
267                          ptr->controller_number = cc;                      break;
                         break;  
                     }  
                     x++;  
268                  }                  }
269                    x++;
270              }              }
             break;  
271          }          }
272          if (rowno >= 0) sig_changed();          break;
273      }      }
274        if (rowno >= 0) sig_changed();
275  }  }
276    
277  void ChoiceEntryLeverageCtrl::set_ptr(gig::leverage_ctrl_t* ptr)  void ChoiceEntryLeverageCtrl::set_value(gig::leverage_ctrl_t value)
278  {  {
     this->ptr = 0;  
279      int x;      int x;
280      switch (ptr->type)      switch (value.type)
281      {      {
282      case gig::leverage_ctrl_t::type_none:      case gig::leverage_ctrl_t::type_none:
283          x = 0;          x = 0;
# Line 294  void ChoiceEntryLeverageCtrl::set_ptr(gi Line 290  void ChoiceEntryLeverageCtrl::set_ptr(gi
290          break;          break;
291      case gig::leverage_ctrl_t::type_controlchange:      case gig::leverage_ctrl_t::type_controlchange:
292          x = -1;          x = -1;
293          for (int cc = 0 ; cc < 96 ; cc++) {          for (uint cc = 0 ; cc < 96 ; cc++) {
294              if (controlChangeTexts[cc + 3]) {              if (controlChangeTexts[cc + 3]) {
295                  x++;                  x++;
296                  if (ptr->controller_number == cc) {                  if (value.controller_number == cc) {
297                      x += 3;                      x += 3;
298                      break;                      break;
299                  }                  }
# Line 309  void ChoiceEntryLeverageCtrl::set_ptr(gi Line 305  void ChoiceEntryLeverageCtrl::set_ptr(gi
305          break;          break;
306      }      }
307      combobox.set_active(x);      combobox.set_active(x);
     this->ptr = ptr;  
308  }  }
309    
310    
311  BoolEntry::BoolEntry(const char* labelText) :  BoolEntry::BoolEntry(const char* labelText) :
312      LabelWidget(labelText, checkbutton),      LabelWidget(labelText, checkbutton),
313      checkbutton(labelText),      checkbutton(labelText)
     ptr(0)  
314  {  {
315      checkbutton.signal_toggled().connect(      checkbutton.signal_toggled().connect(sig_changed.make_slot());
         sigc::mem_fun(*this, &BoolEntry::value_changed));  
316  }  }
317    
 void BoolEntry::value_changed()  
 {  
     if (ptr) {  
         *ptr = checkbutton.get_active();  
         sig_changed();  
     }  
 }  
318    
319  void BoolEntry::set_ptr(bool* ptr)  StringEntry::StringEntry(const char* labelText) :
320        LabelWidget(labelText, entry)
321  {  {
322      this->ptr = 0;      entry.signal_changed().connect(sig_changed.make_slot());
     checkbutton.set_active(*ptr);  
     this->ptr = ptr;  
323  }  }
324    
325    StringEntryMultiLine::StringEntryMultiLine(const char* labelText) :
326  StringEntry::StringEntry(const char* labelText) :      LabelWidget(labelText, frame)
     LabelWidget(labelText, entry)  
327  {  {
328      entry.signal_changed().connect(      text_buffer = text_view.get_buffer();
329          sigc::mem_fun(*this, &StringEntry::value_changed));      frame.set_shadow_type(Gtk::SHADOW_IN);
330        frame.add(text_view);
331        text_buffer->signal_changed().connect(sig_changed.make_slot());
332  }  }
333    
334  void StringEntry::value_changed()  gig::String StringEntryMultiLine::get_value() const
335  {  {
336      if (ptr) {      Glib::ustring value = text_buffer->get_text();
337          *ptr = entry.get_text();      for (int i = 0 ; (i = value.find("\x0a", i)) >= 0 ; i += 2)
338          sig_changed();          value.replace(i, 1, "\x0d\x0a");
339      }      return value;
340  }  }
341    
342  void StringEntry::set_ptr(gig::String* ptr)  void StringEntryMultiLine::set_value(gig::String value)
343  {  {
344      this->ptr = 0;      for (int i = 0 ; (i = value.find("\x0d\x0a", i, 2)) >= 0 ; i++)
345      entry.set_text(*ptr);          value.replace(i, 2, "\x0a");
346      this->ptr = ptr;      text_buffer->set_text(value);
347  }  }

Legend:
Removed from v.1359  
changed lines
  Added in v.2151

  ViewVC Help
Powered by ViewVC