/[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 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  bool update_gui;  #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 63  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 74  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 89  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 97  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 && update_gui) {      if (!connected) return;
123          *ptr = int32_t(spinbutton.get_value() * coeff);  
124        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(value / coeff * f)) {
127            value = round_to_int(new_value / f * coeff);
128            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    
148  BoolEntryPlus6::BoolEntryPlus6(const char* labelText, NumEntryGain& eGain, int32_t plus6value) :  BoolEntryPlus6::BoolEntryPlus6(const char* labelText, NumEntryGain& eGain, int32_t plus6value) :
149      LabelWidget(labelText, checkbutton),      LabelWidget(labelText, checkbutton),
150        checkbutton(labelText),
151      eGain(eGain),      eGain(eGain),
152      plus6value(plus6value)      plus6value(plus6value)
153  {  {
# Line 123  BoolEntryPlus6::BoolEntryPlus6(const cha Line 157  BoolEntryPlus6::BoolEntryPlus6(const cha
157    
158  void BoolEntryPlus6::value_changed()  void BoolEntryPlus6::value_changed()
159  {  {
160      if (ptr && update_gui) {      if (checkbutton.get_active()) eGain.set_value(plus6value);
161          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);  
     }  
162  }  }
163    
164  void BoolEntryPlus6::set_ptr(int32_t* ptr)  int32_t BoolEntryPlus6::get_value() const
165  {  {
166      this->ptr = 0;      return eGain.get_value();
167      checkbutton.set_active(*ptr < 0);  }
168      this->ptr = ptr;  
169    void BoolEntryPlus6::set_value(int32_t value)
170    {
171        checkbutton.set_active(value < 0);
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 154  NumEntryPermille::NumEntryPermille(const Line 182  NumEntryPermille::NumEntryPermille(const
182    
183  void NumEntryPermille::value_changed()  void NumEntryPermille::value_changed()
184  {  {
185      if (ptr && update_gui) {      uint16_t new_value = uint16_t(spinbutton.get_value() * 10 + 0.5);
186          *ptr = uint16_t(spinbutton.get_value() * 10 + 0.5);      if (new_value != value) {
187            value = uint16_t(spinbutton.get_value() * 10 + 0.5);
188            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 177  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 204  int NoteEntry::on_input(double* new_valu Line 236  int NoteEntry::on_input(double* new_valu
236  // Convert the Adjustment position to text  // Convert the Adjustment position to text
237  bool NoteEntry::on_output()  bool NoteEntry::on_output()
238  {  {
239      int x = int(spinbutton.get_adjustment()->get_value());      int x = int(spinbutton.get_adjustment()->get_value() + 0.5);
240      char buf[10];      char buf[10];
241      sprintf(buf, "%s%d", notes[x % 12], x / 12 - 1);      sprintf(buf, "%s%d", notes[x % 12], x / 12 - 1);
242      spinbutton.set_text(buf);      spinbutton.set_text(buf);
# Line 212  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 && update_gui) {      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            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 276  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 291  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 && update_gui) {      entry.signal_changed().connect(sig_changed.make_slot());
         *ptr = checkbutton.get_active();  
     }  
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 && update_gui) {      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      }          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.1225  
changed lines
  Added in v.2446

  ViewVC Help
Powered by ViewVC