/[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 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  bool update_gui;  #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 80  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 89  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 97  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 && update_gui) {      if (!connected) return;
106          *ptr = int32_t(spinbutton.get_value() * coeff);  
107        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(value / coeff * f)) {
110            value = round_to_int(new_value / f * coeff);
111            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 123  BoolEntryPlus6::BoolEntryPlus6(const cha Line 140  BoolEntryPlus6::BoolEntryPlus6(const cha
140    
141  void BoolEntryPlus6::value_changed()  void BoolEntryPlus6::value_changed()
142  {  {
143      if (ptr && update_gui) {      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;  
         } else {  
             if (*ptr < 0) {  
                 *ptr = 0;  
             }  
         }  
         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 154  NumEntryPermille::NumEntryPermille(const Line 165  NumEntryPermille::NumEntryPermille(const
165    
166  void NumEntryPermille::value_changed()  void NumEntryPermille::value_changed()
167  {  {
168      if (ptr && update_gui) {      uint16_t new_value = uint16_t(spinbutton.get_value() * 10 + 0.5);
169          *ptr = uint16_t(spinbutton.get_value() * 10 + 0.5);      if (new_value != value) {
170            value = uint16_t(spinbutton.get_value() * 10 + 0.5);
171            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 177  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 204  int NoteEntry::on_input(double* new_valu Line 218  int NoteEntry::on_input(double* new_valu
218  // Convert the Adjustment position to text  // Convert the Adjustment position to text
219  bool NoteEntry::on_output()  bool NoteEntry::on_output()
220  {  {
221      int x = int(spinbutton.get_adjustment()->get_value());      int x = int(spinbutton.get_adjustment()->get_value() + 0.5);
222      char buf[10];      char buf[10];
223      sprintf(buf, "%s%d", notes[x % 12], x / 12 - 1);      sprintf(buf, "%s%d", notes[x % 12], x / 12 - 1);
224      spinbutton.set_text(buf);      spinbutton.set_text(buf);
# Line 223  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 && update_gui) {      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            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 279  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 291  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 && update_gui) {  
         *ptr = checkbutton.get_active();  
     }  
 }  
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 && update_gui) {      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      }          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.1225  
changed lines
  Added in v.1831

  ViewVC Help
Powered by ViewVC