/[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 1261 by persson, Thu Jul 5 17:12:20 2007 UTC revision 1831 by persson, Tue Feb 3 19:38:19 2009 UTC
# Line 1  Line 1 
1  /*  /*
2   * Copyright (C) 2006, 2007 Andreas Persson   * Copyright (C) 2006-2009 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 78  NumEntry::NumEntry(const char* labelText Line 82  NumEntry::NumEntry(const char* labelText
82      LabelWidget(labelText, box)      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)      coeff(coeff),
96        value(0),
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 (ptr) {      if (!connected) return;
106          const double f = pow(10, spinbutton.get_digits());  
107          int new_value = round_to_int(spinbutton.get_value() * f);      const double f = pow(10, spinbutton.get_digits());
108        int new_value = round_to_int(spinbutton.get_value() * f);
109          if (new_value != round_to_int(*ptr / coeff * f))      if (new_value != round_to_int(value / coeff * f)) {
110          {          value = round_to_int(new_value / f * coeff);
111              *ptr = round_to_int(new_value / f * coeff);          sig_changed();
             sig_changed();  
         }  
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    
131  BoolEntryPlus6::BoolEntryPlus6(const char* labelText, NumEntryGain& eGain, int32_t plus6value) :  BoolEntryPlus6::BoolEntryPlus6(const char* labelText, NumEntryGain& eGain, int32_t plus6value) :
132      LabelWidget(labelText, checkbutton),      LabelWidget(labelText, checkbutton),
133        checkbutton(labelText),
134      eGain(eGain),      eGain(eGain),
135      plus6value(plus6value)      plus6value(plus6value)
136  {  {
# Line 128  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);
145          if (plus6) {  }
146              eGain.set_value(0);  
147              *ptr = plus6value;  int32_t BoolEntryPlus6::get_value() const
148              sig_changed();  {
149          } else {      return eGain.get_value();
             if (*ptr < 0) {  
                 *ptr = 0;  
                 sig_changed();  
             }  
         }  
         eGain.set_sensitive(!plus6);  
     }  
150  }  }
151    
152  void BoolEntryPlus6::set_ptr(int32_t* ptr)  void BoolEntryPlus6::set_value(int32_t value)
153  {  {
154      this->ptr = 0;      checkbutton.set_active(value < 0);
     checkbutton.set_active(*ptr < 0);  
     this->ptr = ptr;  
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 161  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 188  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 234  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 (int 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 291  void ChoiceEntryLeverageCtrl::set_ptr(gi Line 293  void ChoiceEntryLeverageCtrl::set_ptr(gi
293          for (int cc = 0 ; cc < 96 ; cc++) {          for (int 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 303  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.1261  
changed lines
  Added in v.1831

  ViewVC Help
Powered by ViewVC