/[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 2169 by persson, Sun Mar 6 07:51:04 2011 UTC
# Line 1  Line 1 
1  /*  /*
2   * Copyright (C) 2006, 2007 Andreas Persson   * Copyright (C) 2006-2011 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    #include "compat.h"
26    
27  namespace {  namespace {
28      const char* const controlChangeTexts[] = {      const char* const controlChangeTexts[] = {
29          "none", "channelaftertouch", "velocity",          _("none"), _("channelaftertouch"), _("velocity"),
30          0,          0,
31          "modwheel", // "Modulation Wheel or Lever",          _("modwheel"), // "Modulation Wheel or Lever",
32          "breath", // "Breath Controller",          _("breath"), // "Breath Controller",
33          0,          0,
34          "foot", // "Foot Controller",          _("foot"), // "Foot Controller",
35          "portamentotime", // "Portamento Time",          _("portamentotime"), // "Portamento Time",
36          0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0,
37          "effect1", // "Effect Control 1",          _("effect1"), // "Effect Control 1",
38          "effect2", // "Effect Control 2",          _("effect2"), // "Effect Control 2",
39          0, 0,          0, 0,
40          "genpurpose1", // "General Purpose Controller 1",          _("genpurpose1"), // "General Purpose Controller 1",
41          "genpurpose2", // "General Purpose Controller 2",          _("genpurpose2"), // "General Purpose Controller 2",
42          "genpurpose3", // "General Purpose Controller 3",          _("genpurpose3"), // "General Purpose Controller 3",
43          "genpurpose4", // "General Purpose Controller 4",          _("genpurpose4"), // "General Purpose Controller 4",
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, 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,
46          0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0,
47          "sustainpedal", // "Damper Pedal on/off (Sustain)",          _("sustainpedal"), // "Damper Pedal on/off (Sustain)",
48          "portamento", // "Portamento On/Off",          _("portamento"), // "Portamento On/Off",
49          "sostenuto", // "Sustenuto On/Off",          _("sostenuto"), // "Sustenuto On/Off",
50          "softpedal", // "Soft Pedal On/Off",          _("softpedal"), // "Soft Pedal On/Off",
51          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
52          "genpurpose5", // "General Purpose Controller 5",          _("genpurpose5"), // "General Purpose Controller 5",
53          "genpurpose6", // "General Purpose Controller 6",          _("genpurpose6"), // "General Purpose Controller 6",
54          "genpurpose7", // "General Purpose Controller 7",          _("genpurpose7"), // "General Purpose Controller 7",
55          "genpurpose8", // "General Purpose Controller 8",          _("genpurpose8"), // "General Purpose Controller 8",
56          0, 0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0, 0,
57          "effect1depth", // "Effects 1 Depth",          _("effect1depth"), // "Effects 1 Depth",
58          "effect2depth", // "Effects 2 Depth",          _("effect2depth"), // "Effects 2 Depth",
59          "effect3depth", // "Effects 3 Depth",          _("effect3depth"), // "Effects 3 Depth",
60          "effect4depth", // "Effects 4 Depth",          _("effect4depth"), // "Effects 4 Depth",
61          "effect5depth", // "Effects 5 Depth"          _("effect5depth"), // "Effects 5 Depth"
62      };      };
63  }  }
64    
# Line 61  LabelWidget::LabelWidget(const char* lab Line 66  LabelWidget::LabelWidget(const char* lab
66      label(Glib::ustring(labelText) + ":"),      label(Glib::ustring(labelText) + ":"),
67      widget(widget)      widget(widget)
68  {  {
69      label.set_alignment(Gtk::ALIGN_LEFT);      label.set_alignment(Gtk::ALIGN_START);
70  }  }
71    
72  void LabelWidget::set_sensitive(bool sensitive)  void LabelWidget::set_sensitive(bool sensitive)
# Line 72  void LabelWidget::set_sensitive(bool sen Line 77  void LabelWidget::set_sensitive(bool sen
77    
78  NumEntry::NumEntry(const char* labelText, double lower, double upper,  NumEntry::NumEntry(const char* labelText, double lower, double upper,
79                     int decimals) :                     int decimals) :
80        LabelWidget(labelText, box),
81    #if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2
82      adjust(lower, lower, upper, 1, 10),      adjust(lower, lower, upper, 1, 10),
83    #else
84        adjust(Gtk::Adjustment::create(lower, lower, upper, 1, 10)),
85    #endif
86      scale(adjust),      scale(adjust),
87      spinbutton(adjust),      spinbutton(adjust)
     LabelWidget(labelText, box)  
88  {  {
89      spinbutton.set_digits(decimals);      spinbutton.set_digits(decimals);
90        spinbutton.set_value(0);
91      scale.set_draw_value(false);      scale.set_draw_value(false);
92      box.pack_start(spinbutton, Gtk::PACK_SHRINK);      box.pack_start(spinbutton, Gtk::PACK_SHRINK);
93      box.add(scale);      box.add(scale);
# Line 87  NumEntryGain::NumEntryGain(const char* l Line 97  NumEntryGain::NumEntryGain(const char* l
97                             double lower, double upper,                             double lower, double upper,
98                             int decimals, double coeff) :                             int decimals, double coeff) :
99      NumEntry(labelText, lower, upper, decimals),      NumEntry(labelText, lower, upper, decimals),
100      coeff(coeff)      value(0),
101        coeff(coeff),
102        connected(true)
103  {  {
104      spinbutton.signal_value_changed().connect(      spinbutton.signal_value_changed().connect(
105          sigc::mem_fun(*this, &NumEntryGain::value_changed));          sigc::mem_fun(*this, &NumEntryGain::value_changed));
# Line 95  NumEntryGain::NumEntryGain(const char* l Line 107  NumEntryGain::NumEntryGain(const char* l
107    
108  void NumEntryGain::value_changed()  void NumEntryGain::value_changed()
109  {  {
110        if (!connected) return;
111    
112      const double f = pow(10, spinbutton.get_digits());      const double f = pow(10, spinbutton.get_digits());
113      int new_value = round_to_int(spinbutton.get_value() * f);      int new_value = round_to_int(spinbutton.get_value() * f);
114      if (ptr) {      if (new_value != round_to_int(value / coeff * f)) {
115          if (new_value != round_to_int(*ptr / coeff * f))          value = round_to_int(new_value / f * coeff);
116          {          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();  
117      }      }
118  }  }
119    
120  void NumEntryGain::set_ptr(int32_t* ptr)  void NumEntryGain::set_value(int32_t value)
121  {  {
122      this->ptr = 0;      if (value != this->value) {
123      bool plus6 = *ptr < 0;          this->value = value;
124      set_value(plus6 ? 0 : *ptr / coeff);  
125      set_sensitive(!plus6);          connected = false;
126      this->ptr = ptr;          bool plus6 = value < 0;
127            spinbutton.set_value(plus6 ? 0 : value / coeff);
128            set_sensitive(!plus6);
129            connected = true;
130    
131            sig_changed();
132        }
133  }  }
134    
135    
# Line 134  BoolEntryPlus6::BoolEntryPlus6(const cha Line 145  BoolEntryPlus6::BoolEntryPlus6(const cha
145    
146  void BoolEntryPlus6::value_changed()  void BoolEntryPlus6::value_changed()
147  {  {
148      if (ptr) {      if (checkbutton.get_active()) eGain.set_value(plus6value);
149          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);  
     }  
150  }  }
151    
152  void BoolEntryPlus6::set_ptr(int32_t* ptr)  int32_t BoolEntryPlus6::get_value() const
153  {  {
154      this->ptr = 0;      return eGain.get_value();
155      checkbutton.set_active(*ptr < 0);  }
156      this->ptr = ptr;  
157    void BoolEntryPlus6::set_value(int32_t value)
158    {
159        checkbutton.set_active(value < 0);
160  }  }
161    
162  NumEntryPermille::NumEntryPermille(const char* labelText,  NumEntryPermille::NumEntryPermille(const char* labelText,
163                                     double lower, double upper, int decimals) :                                     double lower, double upper, int decimals) :
164      NumEntry(labelText, lower, upper, decimals)      NumEntry(labelText, lower, upper, decimals),
165        value(0)
166  {  {
167      spinbutton.signal_value_changed().connect(      spinbutton.signal_value_changed().connect(
168          sigc::mem_fun(*this, &NumEntryPermille::value_changed));          sigc::mem_fun(*this, &NumEntryPermille::value_changed));
# Line 167  NumEntryPermille::NumEntryPermille(const Line 170  NumEntryPermille::NumEntryPermille(const
170    
171  void NumEntryPermille::value_changed()  void NumEntryPermille::value_changed()
172  {  {
173      if (ptr) {      uint16_t new_value = uint16_t(spinbutton.get_value() * 10 + 0.5);
174          uint16_t new_value = uint16_t(spinbutton.get_value() * 10 + 0.5);      if (new_value != value) {
175          if (new_value != *ptr) {          value = uint16_t(spinbutton.get_value() * 10 + 0.5);
176              *ptr = uint16_t(spinbutton.get_value() * 10 + 0.5);          sig_changed();
             sig_changed();  
         }  
177      }      }
178  }  }
179    
180  void NumEntryPermille::set_ptr(uint16_t* ptr)  void NumEntryPermille::set_value(uint16_t value)
181  {  {
182      this->ptr = 0;      if (value != this->value) {
183      set_value(*ptr / 10.0);          spinbutton.set_value(value / 10.0);
184      this->ptr = ptr;      }
185  }  }
186    
187    
# Line 194  NoteEntry::NoteEntry(const char* labelTe Line 195  NoteEntry::NoteEntry(const char* labelTe
195  }  }
196    
197  const char* notes[] = {  const char* notes[] = {
198      "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"      _("C"), _("C#"), _("D"), _("D#"), _("E"), _("F"),_("F#"),
199        _("G"), _("G#"), _("A"), _("A#"), _("B")
200  };  };
201    
202    
# Line 229  bool NoteEntry::on_output() Line 231  bool NoteEntry::on_output()
231  }  }
232    
233  ChoiceEntryLeverageCtrl::ChoiceEntryLeverageCtrl(const char* labelText) :  ChoiceEntryLeverageCtrl::ChoiceEntryLeverageCtrl(const char* labelText) :
234      align(0, 0, 0, 0),      LabelWidget(labelText, align),
235      LabelWidget(labelText, align)      align(0, 0, 0, 0)
236  {  {
237      for (int i = 0 ; i < 99 ; i++) {      for (int i = 0 ; i < 99 ; i++) {
238          if (controlChangeTexts[i]) {          if (controlChangeTexts[i]) {
239    #if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2
240              combobox.append_text(controlChangeTexts[i]);              combobox.append_text(controlChangeTexts[i]);
241    #else
242                combobox.append(controlChangeTexts[i]);
243    #endif
244          }          }
245      }      }
246      combobox.signal_changed().connect(      combobox.signal_changed().connect(
247          sigc::mem_fun(*this, &ChoiceEntryLeverageCtrl::value_changed));          sigc::mem_fun(*this, &ChoiceEntryLeverageCtrl::value_changed));
248      align.add(combobox);      align.add(combobox);
249        value.type = gig::leverage_ctrl_t::type_none;
250        value.controller_number = 0;
251  }  }
252    
253  void ChoiceEntryLeverageCtrl::value_changed()  void ChoiceEntryLeverageCtrl::value_changed()
254  {  {
255      if (ptr) {      int rowno = combobox.get_active_row_number();
256          int rowno = combobox.get_active_row_number();      switch (rowno)
257          switch (rowno)      {
258          {      case -1:
259          case -1:          break;
260              break;      case 0:
261          case 0:          value.type = gig::leverage_ctrl_t::type_none;
262              ptr->type = gig::leverage_ctrl_t::type_none;          break;
263              break;      case 1:
264          case 1:          value.type = gig::leverage_ctrl_t::type_channelaftertouch;
265              ptr->type = gig::leverage_ctrl_t::type_channelaftertouch;          break;
266              break;      case 2:
267          case 2:          value.type = gig::leverage_ctrl_t::type_velocity;
268              ptr->type = gig::leverage_ctrl_t::type_velocity;          break;
269              break;      default:
270          default:          value.type = gig::leverage_ctrl_t::type_controlchange;
271              ptr->type = gig::leverage_ctrl_t::type_controlchange;          int x = 3;
272              int x = 3;          for (uint cc = 0 ; cc < 96 ; cc++) {
273              for (int cc = 0 ; cc < 96 ; cc++) {              if (controlChangeTexts[cc + 3]) {
274                  if (controlChangeTexts[cc + 3]) {                  if (rowno == x) {
275                      if (rowno == x) {                      value.controller_number = cc;
276                          ptr->controller_number = cc;                      break;
                         break;  
                     }  
                     x++;  
277                  }                  }
278                    x++;
279              }              }
             break;  
280          }          }
281          if (rowno >= 0) sig_changed();          break;
282      }      }
283        if (rowno >= 0) sig_changed();
284  }  }
285    
286  void ChoiceEntryLeverageCtrl::set_ptr(gig::leverage_ctrl_t* ptr)  void ChoiceEntryLeverageCtrl::set_value(gig::leverage_ctrl_t value)
287  {  {
     this->ptr = 0;  
288      int x;      int x;
289      switch (ptr->type)      switch (value.type)
290      {      {
291      case gig::leverage_ctrl_t::type_none:      case gig::leverage_ctrl_t::type_none:
292          x = 0;          x = 0;
# Line 294  void ChoiceEntryLeverageCtrl::set_ptr(gi Line 299  void ChoiceEntryLeverageCtrl::set_ptr(gi
299          break;          break;
300      case gig::leverage_ctrl_t::type_controlchange:      case gig::leverage_ctrl_t::type_controlchange:
301          x = -1;          x = -1;
302          for (int cc = 0 ; cc < 96 ; cc++) {          for (uint cc = 0 ; cc < 96 ; cc++) {
303              if (controlChangeTexts[cc + 3]) {              if (controlChangeTexts[cc + 3]) {
304                  x++;                  x++;
305                  if (ptr->controller_number == cc) {                  if (value.controller_number == cc) {
306                      x += 3;                      x += 3;
307                      break;                      break;
308                  }                  }
# Line 309  void ChoiceEntryLeverageCtrl::set_ptr(gi Line 314  void ChoiceEntryLeverageCtrl::set_ptr(gi
314          break;          break;
315      }      }
316      combobox.set_active(x);      combobox.set_active(x);
     this->ptr = ptr;  
317  }  }
318    
319    
320  BoolEntry::BoolEntry(const char* labelText) :  BoolEntry::BoolEntry(const char* labelText) :
321      LabelWidget(labelText, checkbutton),      LabelWidget(labelText, checkbutton),
322      checkbutton(labelText),      checkbutton(labelText)
     ptr(0)  
323  {  {
324      checkbutton.signal_toggled().connect(      checkbutton.signal_toggled().connect(sig_changed.make_slot());
         sigc::mem_fun(*this, &BoolEntry::value_changed));  
325  }  }
326    
 void BoolEntry::value_changed()  
 {  
     if (ptr) {  
         *ptr = checkbutton.get_active();  
         sig_changed();  
     }  
 }  
327    
328  void BoolEntry::set_ptr(bool* ptr)  StringEntry::StringEntry(const char* labelText) :
329        LabelWidget(labelText, entry)
330  {  {
331      this->ptr = 0;      entry.signal_changed().connect(sig_changed.make_slot());
     checkbutton.set_active(*ptr);  
     this->ptr = ptr;  
332  }  }
333    
334    StringEntryMultiLine::StringEntryMultiLine(const char* labelText) :
335  StringEntry::StringEntry(const char* labelText) :      LabelWidget(labelText, frame)
     LabelWidget(labelText, entry)  
336  {  {
337      entry.signal_changed().connect(      text_buffer = text_view.get_buffer();
338          sigc::mem_fun(*this, &StringEntry::value_changed));      frame.set_shadow_type(Gtk::SHADOW_IN);
339        frame.add(text_view);
340        text_buffer->signal_changed().connect(sig_changed.make_slot());
341  }  }
342    
343  void StringEntry::value_changed()  gig::String StringEntryMultiLine::get_value() const
344  {  {
345      if (ptr) {      Glib::ustring value = text_buffer->get_text();
346          *ptr = entry.get_text();      for (int i = 0 ; (i = value.find("\x0a", i)) >= 0 ; i += 2)
347          sig_changed();          value.replace(i, 1, "\x0d\x0a");
348      }      return value;
349  }  }
350    
351  void StringEntry::set_ptr(gig::String* ptr)  void StringEntryMultiLine::set_value(gig::String value)
352  {  {
353      this->ptr = 0;      for (int i = 0 ; (i = value.find("\x0d\x0a", i, 2)) >= 0 ; i++)
354      entry.set_text(*ptr);          value.replace(i, 2, "\x0a");
355      this->ptr = ptr;      text_buffer->set_text(value);
356  }  }

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

  ViewVC Help
Powered by ViewVC