/[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 1225 by schoenebeck, Sun Jun 10 10:56:11 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  bool update_gui;  #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 63  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 74  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 89  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 97  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 (ptr && update_gui) {      if (!connected) return;
111          *ptr = int32_t(spinbutton.get_value() * coeff);  
112        const double f = pow(10, spinbutton.get_digits());
113        int new_value = round_to_int(spinbutton.get_value() * f);
114        if (new_value != round_to_int(value / coeff * f)) {
115            value = round_to_int(new_value / f * coeff);
116            sig_changed();
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    
136  BoolEntryPlus6::BoolEntryPlus6(const char* labelText, NumEntryGain& eGain, int32_t plus6value) :  BoolEntryPlus6::BoolEntryPlus6(const char* labelText, NumEntryGain& eGain, int32_t plus6value) :
137      LabelWidget(labelText, checkbutton),      LabelWidget(labelText, checkbutton),
138        checkbutton(labelText),
139      eGain(eGain),      eGain(eGain),
140      plus6value(plus6value)      plus6value(plus6value)
141  {  {
# Line 123  BoolEntryPlus6::BoolEntryPlus6(const cha Line 145  BoolEntryPlus6::BoolEntryPlus6(const cha
145    
146  void BoolEntryPlus6::value_changed()  void BoolEntryPlus6::value_changed()
147  {  {
148      if (ptr && update_gui) {      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;  
         } else {  
             if (*ptr < 0) {  
                 *ptr = 0;  
             }  
         }  
         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 154  NumEntryPermille::NumEntryPermille(const Line 170  NumEntryPermille::NumEntryPermille(const
170    
171  void NumEntryPermille::value_changed()  void NumEntryPermille::value_changed()
172  {  {
173      if (ptr && update_gui) {      uint16_t new_value = uint16_t(spinbutton.get_value() * 10 + 0.5);
174          *ptr = uint16_t(spinbutton.get_value() * 10 + 0.5);      if (new_value != value) {
175            value = uint16_t(spinbutton.get_value() * 10 + 0.5);
176            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 177  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 204  int NoteEntry::on_input(double* new_valu Line 223  int NoteEntry::on_input(double* new_valu
223  // Convert the Adjustment position to text  // Convert the Adjustment position to text
224  bool NoteEntry::on_output()  bool NoteEntry::on_output()
225  {  {
226      int x = int(spinbutton.get_adjustment()->get_value());      int x = int(spinbutton.get_adjustment()->get_value() + 0.5);
227      char buf[10];      char buf[10];
228      sprintf(buf, "%s%d", notes[x % 12], x / 12 - 1);      sprintf(buf, "%s%d", notes[x % 12], x / 12 - 1);
229      spinbutton.set_text(buf);      spinbutton.set_text(buf);
# Line 212  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 && update_gui) {      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            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 276  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 291  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 && update_gui) {  
         *ptr = checkbutton.get_active();  
     }  
 }  
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 && update_gui) {      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      }          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.1225  
changed lines
  Added in v.2169

  ViewVC Help
Powered by ViewVC