/[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 1262 by persson, Sun Jul 22 15:07:08 2007 UTC revision 2446 by persson, Sun Apr 28 15:40:43 2013 UTC
# Line 1  Line 1 
1  /*  /*
2   * Copyright (C) 2006, 2007 Andreas Persson   * Copyright (C) 2006-2013 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    std::string gig_encoding("CP1252");
28    
29    Glib::ustring gig_to_utf8(const gig::String& gig_string) {
30        return Glib::convert_with_fallback(gig_string, "UTF-8", gig_encoding, "?");
31    }
32    
33    gig::String gig_from_utf8(const Glib::ustring& utf8_string) {
34        return Glib::convert_with_fallback(utf8_string, gig_encoding, "UTF-8", "?");
35    }
36    
37    
38  namespace {  namespace {
39      const char* const controlChangeTexts[] = {      const char* const controlChangeTexts[] = {
40          "none", "channelaftertouch", "velocity",          _("none"), _("channelaftertouch"), _("velocity"),
41          0,          0,
42          "modwheel", // "Modulation Wheel or Lever",          _("modwheel"), // "Modulation Wheel or Lever",
43          "breath", // "Breath Controller",          _("breath"), // "Breath Controller",
44          0,          0,
45          "foot", // "Foot Controller",          _("foot"), // "Foot Controller",
46          "portamentotime", // "Portamento Time",          _("portamentotime"), // "Portamento Time",
47          0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0,
48          "effect1", // "Effect Control 1",          _("effect1"), // "Effect Control 1",
49          "effect2", // "Effect Control 2",          _("effect2"), // "Effect Control 2",
50          0, 0,          0, 0,
51          "genpurpose1", // "General Purpose Controller 1",          _("genpurpose1"), // "General Purpose Controller 1",
52          "genpurpose2", // "General Purpose Controller 2",          _("genpurpose2"), // "General Purpose Controller 2",
53          "genpurpose3", // "General Purpose Controller 3",          _("genpurpose3"), // "General Purpose Controller 3",
54          "genpurpose4", // "General Purpose Controller 4",          _("genpurpose4"), // "General Purpose Controller 4",
55          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,
56          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,
57          0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0,
58          "sustainpedal", // "Damper Pedal on/off (Sustain)",          _("sustainpedal"), // "Damper Pedal on/off (Sustain)",
59          "portamento", // "Portamento On/Off",          _("portamento"), // "Portamento On/Off",
60          "sostenuto", // "Sustenuto On/Off",          _("sostenuto"), // "Sustenuto On/Off",
61          "softpedal", // "Soft Pedal On/Off",          _("softpedal"), // "Soft Pedal On/Off",
62          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63          "genpurpose5", // "General Purpose Controller 5",          _("genpurpose5"), // "General Purpose Controller 5",
64          "genpurpose6", // "General Purpose Controller 6",          _("genpurpose6"), // "General Purpose Controller 6",
65          "genpurpose7", // "General Purpose Controller 7",          _("genpurpose7"), // "General Purpose Controller 7",
66          "genpurpose8", // "General Purpose Controller 8",          _("genpurpose8"), // "General Purpose Controller 8",
67          0, 0, 0, 0, 0, 0, 0,          0, 0, 0, 0, 0, 0, 0,
68          "effect1depth", // "Effects 1 Depth",          _("effect1depth"), // "Effects 1 Depth",
69          "effect2depth", // "Effects 2 Depth",          _("effect2depth"), // "Effects 2 Depth",
70          "effect3depth", // "Effects 3 Depth",          _("effect3depth"), // "Effects 3 Depth",
71          "effect4depth", // "Effects 4 Depth",          _("effect4depth"), // "Effects 4 Depth",
72          "effect5depth", // "Effects 5 Depth"          _("effect5depth"), // "Effects 5 Depth"
73      };      };
74  }  }
75    
# Line 61  LabelWidget::LabelWidget(const char* lab Line 77  LabelWidget::LabelWidget(const char* lab
77      label(Glib::ustring(labelText) + ":"),      label(Glib::ustring(labelText) + ":"),
78      widget(widget)      widget(widget)
79  {  {
80      label.set_alignment(Gtk::ALIGN_LEFT);      label.set_alignment(Gtk::ALIGN_START);
81  }  }
82    
83  void LabelWidget::set_sensitive(bool sensitive)  void LabelWidget::set_sensitive(bool sensitive)
# Line 72  void LabelWidget::set_sensitive(bool sen Line 88  void LabelWidget::set_sensitive(bool sen
88    
89  NumEntry::NumEntry(const char* labelText, double lower, double upper,  NumEntry::NumEntry(const char* labelText, double lower, double upper,
90                     int decimals) :                     int decimals) :
91        LabelWidget(labelText, box),
92    #if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2
93      adjust(lower, lower, upper, 1, 10),      adjust(lower, lower, upper, 1, 10),
94    #else
95        adjust(Gtk::Adjustment::create(lower, lower, upper, 1, 10)),
96    #endif
97      scale(adjust),      scale(adjust),
98      spinbutton(adjust),      spinbutton(adjust)
     LabelWidget(labelText, box)  
99  {  {
100        scale.set_size_request(70);
101      spinbutton.set_digits(decimals);      spinbutton.set_digits(decimals);
102        spinbutton.set_value(0);
103      scale.set_draw_value(false);      scale.set_draw_value(false);
104      box.pack_start(spinbutton, Gtk::PACK_SHRINK);      box.pack_start(spinbutton, Gtk::PACK_SHRINK);
105      box.add(scale);      box.add(scale);
# Line 87  NumEntryGain::NumEntryGain(const char* l Line 109  NumEntryGain::NumEntryGain(const char* l
109                             double lower, double upper,                             double lower, double upper,
110                             int decimals, double coeff) :                             int decimals, double coeff) :
111      NumEntry(labelText, lower, upper, decimals),      NumEntry(labelText, lower, upper, decimals),
112      coeff(coeff)      value(0),
113        coeff(coeff),
114        connected(true)
115  {  {
116      spinbutton.signal_value_changed().connect(      spinbutton.signal_value_changed().connect(
117          sigc::mem_fun(*this, &NumEntryGain::value_changed));          sigc::mem_fun(*this, &NumEntryGain::value_changed));
# Line 95  NumEntryGain::NumEntryGain(const char* l Line 119  NumEntryGain::NumEntryGain(const char* l
119    
120  void NumEntryGain::value_changed()  void NumEntryGain::value_changed()
121  {  {
122      if (ptr) {      if (!connected) return;
123          const double f = pow(10, spinbutton.get_digits());  
124          int new_value = round_to_int(spinbutton.get_value() * f);      const double f = pow(10, spinbutton.get_digits());
125        int new_value = round_to_int(spinbutton.get_value() * f);
126          if (new_value != round_to_int(*ptr / coeff * f))      if (new_value != round_to_int(value / coeff * f)) {
127          {          value = round_to_int(new_value / f * coeff);
128              *ptr = round_to_int(new_value / f * coeff);          sig_changed();
             sig_changed();  
         }  
129      }      }
130  }  }
131    
132  void NumEntryGain::set_ptr(int32_t* ptr)  void NumEntryGain::set_value(int32_t value)
133  {  {
134      this->ptr = 0;      if (value != this->value) {
135      bool plus6 = *ptr < 0;          this->value = value;
136      set_value(plus6 ? 0 : *ptr / coeff);  
137      set_sensitive(!plus6);          connected = false;
138      this->ptr = ptr;          bool plus6 = value < 0;
139            spinbutton.set_value(plus6 ? 0 : value / coeff);
140            set_sensitive(!plus6);
141            connected = true;
142    
143            sig_changed();
144        }
145  }  }
146    
147    
# Line 129  BoolEntryPlus6::BoolEntryPlus6(const cha Line 157  BoolEntryPlus6::BoolEntryPlus6(const cha
157    
158  void BoolEntryPlus6::value_changed()  void BoolEntryPlus6::value_changed()
159  {  {
160      if (ptr) {      if (checkbutton.get_active()) eGain.set_value(plus6value);
161          bool plus6 = checkbutton.get_active();      else if (eGain.get_value() < 0) eGain.set_value(0);
162          if (plus6) {  }
163              eGain.set_value(0);  
164              *ptr = plus6value;  int32_t BoolEntryPlus6::get_value() const
165              sig_changed();  {
166          } else {      return eGain.get_value();
             if (*ptr < 0) {  
                 *ptr = 0;  
                 sig_changed();  
             }  
         }  
         eGain.set_sensitive(!plus6);  
     }  
167  }  }
168    
169  void BoolEntryPlus6::set_ptr(int32_t* ptr)  void BoolEntryPlus6::set_value(int32_t value)
170  {  {
171      this->ptr = 0;      checkbutton.set_active(value < 0);
     checkbutton.set_active(*ptr < 0);  
     this->ptr = ptr;  
172  }  }
173    
174  NumEntryPermille::NumEntryPermille(const char* labelText,  NumEntryPermille::NumEntryPermille(const char* labelText,
175                                     double lower, double upper, int decimals) :                                     double lower, double upper, int decimals) :
176      NumEntry(labelText, lower, upper, decimals)      NumEntry(labelText, lower, upper, decimals),
177        value(0)
178  {  {
179      spinbutton.signal_value_changed().connect(      spinbutton.signal_value_changed().connect(
180          sigc::mem_fun(*this, &NumEntryPermille::value_changed));          sigc::mem_fun(*this, &NumEntryPermille::value_changed));
# Line 162  NumEntryPermille::NumEntryPermille(const Line 182  NumEntryPermille::NumEntryPermille(const
182    
183  void NumEntryPermille::value_changed()  void NumEntryPermille::value_changed()
184  {  {
185      if (ptr) {      uint16_t new_value = uint16_t(spinbutton.get_value() * 10 + 0.5);
186          uint16_t new_value = uint16_t(spinbutton.get_value() * 10 + 0.5);      if (new_value != value) {
187          if (new_value != *ptr) {          value = uint16_t(spinbutton.get_value() * 10 + 0.5);
188              *ptr = uint16_t(spinbutton.get_value() * 10 + 0.5);          sig_changed();
             sig_changed();  
         }  
189      }      }
190  }  }
191    
192  void NumEntryPermille::set_ptr(uint16_t* ptr)  void NumEntryPermille::set_value(uint16_t value)
193  {  {
194      this->ptr = 0;      if (value != this->value) {
195      set_value(*ptr / 10.0);          spinbutton.set_value(value / 10.0);
196      this->ptr = ptr;      }
197  }  }
198    
199    
200  NoteEntry::NoteEntry(const char* labelText) :  NoteEntry::NoteEntry(const char* labelText) :
201      NumEntryTemp<uint8_t>(labelText)      NumEntryTemp<uint8_t>(labelText)
202  {  {
203        spinbutton.set_width_chars(4);
204      spinbutton.signal_input().connect(      spinbutton.signal_input().connect(
205          sigc::mem_fun(*this, &NoteEntry::on_input));          sigc::mem_fun(*this, &NoteEntry::on_input));
206      spinbutton.signal_output().connect(      spinbutton.signal_output().connect(
# Line 189  NoteEntry::NoteEntry(const char* labelTe Line 208  NoteEntry::NoteEntry(const char* labelTe
208  }  }
209    
210  const char* notes[] = {  const char* notes[] = {
211      "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"      _("C"), _("C#"), _("D"), _("D#"), _("E"), _("F"),_("F#"),
212        _("G"), _("G#"), _("A"), _("A#"), _("B")
213  };  };
214    
215    
# Line 224  bool NoteEntry::on_output() Line 244  bool NoteEntry::on_output()
244  }  }
245    
246  ChoiceEntryLeverageCtrl::ChoiceEntryLeverageCtrl(const char* labelText) :  ChoiceEntryLeverageCtrl::ChoiceEntryLeverageCtrl(const char* labelText) :
247      align(0, 0, 0, 0),      LabelWidget(labelText, align),
248      LabelWidget(labelText, align)      align(0, 0, 0, 0)
249  {  {
250      for (int i = 0 ; i < 99 ; i++) {      for (int i = 0 ; i < 99 ; i++) {
251          if (controlChangeTexts[i]) {          if (controlChangeTexts[i]) {
252    #if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2
253              combobox.append_text(controlChangeTexts[i]);              combobox.append_text(controlChangeTexts[i]);
254    #else
255                combobox.append(controlChangeTexts[i]);
256    #endif
257          }          }
258      }      }
259      combobox.signal_changed().connect(      combobox.signal_changed().connect(
260          sigc::mem_fun(*this, &ChoiceEntryLeverageCtrl::value_changed));          sigc::mem_fun(*this, &ChoiceEntryLeverageCtrl::value_changed));
261      align.add(combobox);      align.add(combobox);
262        value.type = gig::leverage_ctrl_t::type_none;
263        value.controller_number = 0;
264  }  }
265    
266  void ChoiceEntryLeverageCtrl::value_changed()  void ChoiceEntryLeverageCtrl::value_changed()
267  {  {
268      if (ptr) {      int rowno = combobox.get_active_row_number();
269          int rowno = combobox.get_active_row_number();      switch (rowno)
270          switch (rowno)      {
271          {      case -1:
272          case -1:          break;
273              break;      case 0:
274          case 0:          value.type = gig::leverage_ctrl_t::type_none;
275              ptr->type = gig::leverage_ctrl_t::type_none;          break;
276              break;      case 1:
277          case 1:          value.type = gig::leverage_ctrl_t::type_channelaftertouch;
278              ptr->type = gig::leverage_ctrl_t::type_channelaftertouch;          break;
279              break;      case 2:
280          case 2:          value.type = gig::leverage_ctrl_t::type_velocity;
281              ptr->type = gig::leverage_ctrl_t::type_velocity;          break;
282              break;      default:
283          default:          value.type = gig::leverage_ctrl_t::type_controlchange;
284              ptr->type = gig::leverage_ctrl_t::type_controlchange;          int x = 3;
285              int x = 3;          for (uint cc = 0 ; cc < 96 ; cc++) {
286              for (int cc = 0 ; cc < 96 ; cc++) {              if (controlChangeTexts[cc + 3]) {
287                  if (controlChangeTexts[cc + 3]) {                  if (rowno == x) {
288                      if (rowno == x) {                      value.controller_number = cc;
289                          ptr->controller_number = cc;                      break;
                         break;  
                     }  
                     x++;  
290                  }                  }
291                    x++;
292              }              }
             break;  
293          }          }
294          if (rowno >= 0) sig_changed();          break;
295      }      }
296        if (rowno >= 0) sig_changed();
297  }  }
298    
299  void ChoiceEntryLeverageCtrl::set_ptr(gig::leverage_ctrl_t* ptr)  void ChoiceEntryLeverageCtrl::set_value(gig::leverage_ctrl_t value)
300  {  {
     this->ptr = 0;  
301      int x;      int x;
302      switch (ptr->type)      switch (value.type)
303      {      {
304      case gig::leverage_ctrl_t::type_none:      case gig::leverage_ctrl_t::type_none:
305          x = 0;          x = 0;
# Line 289  void ChoiceEntryLeverageCtrl::set_ptr(gi Line 312  void ChoiceEntryLeverageCtrl::set_ptr(gi
312          break;          break;
313      case gig::leverage_ctrl_t::type_controlchange:      case gig::leverage_ctrl_t::type_controlchange:
314          x = -1;          x = -1;
315          for (int cc = 0 ; cc < 96 ; cc++) {          for (uint cc = 0 ; cc < 96 ; cc++) {
316              if (controlChangeTexts[cc + 3]) {              if (controlChangeTexts[cc + 3]) {
317                  x++;                  x++;
318                  if (ptr->controller_number == cc) {                  if (value.controller_number == cc) {
319                      x += 3;                      x += 3;
320                      break;                      break;
321                  }                  }
# Line 304  void ChoiceEntryLeverageCtrl::set_ptr(gi Line 327  void ChoiceEntryLeverageCtrl::set_ptr(gi
327          break;          break;
328      }      }
329      combobox.set_active(x);      combobox.set_active(x);
     this->ptr = ptr;  
330  }  }
331    
332    
333  BoolEntry::BoolEntry(const char* labelText) :  BoolEntry::BoolEntry(const char* labelText) :
334      LabelWidget(labelText, checkbutton),      LabelWidget(labelText, checkbutton),
335      checkbutton(labelText),      checkbutton(labelText)
     ptr(0)  
336  {  {
337      checkbutton.signal_toggled().connect(      checkbutton.signal_toggled().connect(sig_changed.make_slot());
         sigc::mem_fun(*this, &BoolEntry::value_changed));  
338  }  }
339    
340  void BoolEntry::value_changed()  
341    StringEntry::StringEntry(const char* labelText) :
342        LabelWidget(labelText, entry)
343  {  {
344      if (ptr) {      entry.signal_changed().connect(sig_changed.make_slot());
         *ptr = checkbutton.get_active();  
         sig_changed();  
     }  
345  }  }
346    
347  void BoolEntry::set_ptr(bool* ptr)  gig::String StringEntry::get_value() const
348  {  {
349      this->ptr = 0;      return gig_from_utf8(entry.get_text());
     checkbutton.set_active(*ptr);  
     this->ptr = ptr;  
350  }  }
351    
352    void StringEntry::set_value(const gig::String& value) {
353        entry.set_text(gig_to_utf8(value));
354    }
355    
356  StringEntry::StringEntry(const char* labelText) :  
357      LabelWidget(labelText, entry)  StringEntryMultiLine::StringEntryMultiLine(const char* labelText) :
358        LabelWidget(labelText, frame)
359  {  {
360      entry.signal_changed().connect(      text_buffer = text_view.get_buffer();
361          sigc::mem_fun(*this, &StringEntry::value_changed));      frame.set_shadow_type(Gtk::SHADOW_IN);
362        frame.add(text_view);
363        text_buffer->signal_changed().connect(sig_changed.make_slot());
364  }  }
365    
366  void StringEntry::value_changed()  gig::String StringEntryMultiLine::get_value() const
367  {  {
368      if (ptr) {      Glib::ustring value = text_buffer->get_text();
369          *ptr = entry.get_text();      for (int i = 0 ; (i = value.find("\x0a", i)) >= 0 ; i += 2)
370          sig_changed();          value.replace(i, 1, "\x0d\x0a");
371      }      return gig_from_utf8(value);
372    }
373    
374    void StringEntryMultiLine::set_value(const gig::String& value)
375    {
376        Glib::ustring text = gig_to_utf8(value);
377        for (int i = 0 ; (i = text.find("\x0d\x0a", i, 2)) >= 0 ; i++)
378            text.replace(i, 2, "\x0a");
379        text_buffer->set_text(text);
380    }
381    
382    
383    Table::Table(int x, int y) : Gtk::Table(x, y), rowno(0) {  }
384    
385    void Table::add(BoolEntry& boolentry)
386    {
387        attach(boolentry.widget, 0, 2, rowno, rowno + 1,
388               Gtk::FILL, Gtk::SHRINK);
389        rowno++;
390    }
391    
392    void Table::add(BoolEntryPlus6& boolentry)
393    {
394        attach(boolentry.widget, 0, 2, rowno, rowno + 1,
395               Gtk::FILL, Gtk::SHRINK);
396        rowno++;
397  }  }
398    
399  void StringEntry::set_ptr(gig::String* ptr)  void Table::add(LabelWidget& prop)
400  {  {
401      this->ptr = 0;      attach(prop.label, 1, 2, rowno, rowno + 1,
402      entry.set_text(*ptr);             Gtk::FILL, Gtk::SHRINK);
403      this->ptr = ptr;      attach(prop.widget, 2, 3, rowno, rowno + 1,
404               Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK);
405        rowno++;
406  }  }

Legend:
Removed from v.1262  
changed lines
  Added in v.2446

  ViewVC Help
Powered by ViewVC