/[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 1831 by persson, Tue Feb 3 19:38:19 2009 UTC revision 2507 by persson, Sun Jan 12 19:37:55 2014 UTC
# Line 1  Line 1 
1  /*  /*
2   * Copyright (C) 2006-2009 Andreas Persson   * Copyright (C) 2006-2014 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 22  Line 22 
22  #include "paramedit.h"  #include "paramedit.h"
23    
24  #include "global.h"  #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[] = {
# Line 65  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 76  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);      spinbutton.set_value(0);
103        spinbutton.set_numeric();
104      scale.set_draw_value(false);      scale.set_draw_value(false);
105      box.pack_start(spinbutton, Gtk::PACK_SHRINK);      box.pack_start(spinbutton, Gtk::PACK_SHRINK);
106      box.add(scale);      box.add(scale);
# Line 92  NumEntryGain::NumEntryGain(const char* l Line 110  NumEntryGain::NumEntryGain(const char* l
110                             double lower, double upper,                             double lower, double upper,
111                             int decimals, double coeff) :                             int decimals, double coeff) :
112      NumEntry(labelText, lower, upper, decimals),      NumEntry(labelText, lower, upper, decimals),
     coeff(coeff),  
113      value(0),      value(0),
114        coeff(coeff),
115      connected(true)      connected(true)
116  {  {
117      spinbutton.signal_value_changed().connect(      spinbutton.signal_value_changed().connect(
# Line 183  void NumEntryPermille::set_value(uint16_ Line 201  void NumEntryPermille::set_value(uint16_
201  NoteEntry::NoteEntry(const char* labelText) :  NoteEntry::NoteEntry(const char* labelText) :
202      NumEntryTemp<uint8_t>(labelText)      NumEntryTemp<uint8_t>(labelText)
203  {  {
204      spinbutton.signal_input().connect(      spin_button_show_notes(spinbutton);
         sigc::mem_fun(*this, &NoteEntry::on_input));  
     spinbutton.signal_output().connect(  
         sigc::mem_fun(*this, &NoteEntry::on_output));  
205  }  }
206    
207  const char* notes[] = {  namespace {
208      _("C"), _("C#"), _("D"), _("D#"), _("E"), _("F"),_("F#"),      const char* notes[] = {
209      _("G"), _("G#"), _("A"), _("A#"), _("B")          _("C"), _("C#"), _("D"), _("D#"), _("E"), _("F"),_("F#"),
210  };          _("G"), _("G#"), _("A"), _("A#"), _("B")
211        };
212    
213        int note_value(const Glib::ustring& note, double* value)
214        {
215            const char* str = note.c_str();
216    
217  // Convert the Entry text to a number          int i;
218  int NoteEntry::on_input(double* new_value)          for (i = 11 ; i >= 0 ; i--) {
219                if (strncasecmp(str, notes[i], strlen(notes[i])) == 0) break;
220            }
221            if (i >= 0) {
222                char* endptr;
223                long x = strtol(str + strlen(notes[i]), &endptr, 10);
224                if (endptr != str + strlen(notes[i])) {
225                    *value = std::max(0L, std::min(i + (x + 1) * 12, 127L));
226                    return true;
227                }
228            } else {
229                char* endptr;
230                long x = strtol(str, &endptr, 10);
231                if (endptr != str) {
232                    *value = std::max(0L, std::min(x, 127L));
233                    return true;
234                }
235            }
236            return Gtk::INPUT_ERROR;
237        }
238    }
239    
240    int note_value(const Glib::ustring& note)
241  {  {
242      const char* str = spinbutton.get_text().c_str();      double value = 0;
243        note_value(note, &value);
244        return value;
245    }
246    
247    Glib::ustring note_str(int note)
248    {
249        char buf[10];
250        sprintf(buf, "%s%d", notes[note % 12], note / 12 - 1);
251        return buf;
252    }
253    
254      int i;  namespace {
255      for (i = 11 ; i >= 0 ; i--) {      // Convert the Entry text to a number
256          if (strncmp(str, notes[i], strlen(notes[i])) == 0) break;      int on_input(double* new_value, Gtk::SpinButton* spinbutton) {
257            return note_value(spinbutton->get_text(), new_value);
258      }      }
259      if (i >= 0) {  
260          char* endptr;      // Convert the Adjustment position to text
261          long x = strtol(str + strlen(notes[i]), &endptr, 10);      bool on_output(Gtk::SpinButton* spinbutton) {
262          if (endptr != str + strlen(notes[i])) {          spinbutton->set_text(
263              *new_value = i + (x + 1) * 12;              note_str(spinbutton->get_adjustment()->get_value() + 0.5));
264              return true;          return true;
         }  
265      }      }
     return Gtk::INPUT_ERROR;  
266  }  }
267    
268  // Convert the Adjustment position to text  // Make a SpinButton show notes instead of numbers
269  bool NoteEntry::on_output()  void spin_button_show_notes(Gtk::SpinButton& spin_button)
270  {  {
271      int x = int(spinbutton.get_adjustment()->get_value() + 0.5);      spin_button.set_numeric(false);
272      char buf[10];      spin_button.set_width_chars(4);
273      sprintf(buf, "%s%d", notes[x % 12], x / 12 - 1);      spin_button.signal_input().connect(
274      spinbutton.set_text(buf);          sigc::bind(sigc::ptr_fun(&on_input), &spin_button));
275      return true;      spin_button.signal_output().connect(
276            sigc::bind(sigc::ptr_fun(&on_output), &spin_button));
277  }  }
278    
279  ChoiceEntryLeverageCtrl::ChoiceEntryLeverageCtrl(const char* labelText) :  ChoiceEntryLeverageCtrl::ChoiceEntryLeverageCtrl(const char* labelText) :
280      align(0, 0, 0, 0),      LabelWidget(labelText, align),
281      LabelWidget(labelText, align)      align(0, 0, 0, 0)
282  {  {
283      for (int i = 0 ; i < 99 ; i++) {      for (int i = 0 ; i < 99 ; i++) {
284          if (controlChangeTexts[i]) {          if (controlChangeTexts[i]) {
285    #if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 24) || GTKMM_MAJOR_VERSION < 2
286              combobox.append_text(controlChangeTexts[i]);              combobox.append_text(controlChangeTexts[i]);
287    #else
288                combobox.append(controlChangeTexts[i]);
289    #endif
290          }          }
291      }      }
292      combobox.signal_changed().connect(      combobox.signal_changed().connect(
# Line 260  void ChoiceEntryLeverageCtrl::value_chan Line 315  void ChoiceEntryLeverageCtrl::value_chan
315      default:      default:
316          value.type = gig::leverage_ctrl_t::type_controlchange;          value.type = gig::leverage_ctrl_t::type_controlchange;
317          int x = 3;          int x = 3;
318          for (int cc = 0 ; cc < 96 ; cc++) {          for (uint cc = 0 ; cc < 96 ; cc++) {
319              if (controlChangeTexts[cc + 3]) {              if (controlChangeTexts[cc + 3]) {
320                  if (rowno == x) {                  if (rowno == x) {
321                      value.controller_number = cc;                      value.controller_number = cc;
# Line 290  void ChoiceEntryLeverageCtrl::set_value( Line 345  void ChoiceEntryLeverageCtrl::set_value(
345          break;          break;
346      case gig::leverage_ctrl_t::type_controlchange:      case gig::leverage_ctrl_t::type_controlchange:
347          x = -1;          x = -1;
348          for (int cc = 0 ; cc < 96 ; cc++) {          for (uint cc = 0 ; cc < 96 ; cc++) {
349              if (controlChangeTexts[cc + 3]) {              if (controlChangeTexts[cc + 3]) {
350                  x++;                  x++;
351                  if (value.controller_number == cc) {                  if (value.controller_number == cc) {
# Line 322  StringEntry::StringEntry(const char* lab Line 377  StringEntry::StringEntry(const char* lab
377      entry.signal_changed().connect(sig_changed.make_slot());      entry.signal_changed().connect(sig_changed.make_slot());
378  }  }
379    
380    gig::String StringEntry::get_value() const
381    {
382        return gig_from_utf8(entry.get_text());
383    }
384    
385    void StringEntry::set_value(const gig::String& value) {
386        entry.set_text(gig_to_utf8(value));
387    }
388    
389    
390  StringEntryMultiLine::StringEntryMultiLine(const char* labelText) :  StringEntryMultiLine::StringEntryMultiLine(const char* labelText) :
391      LabelWidget(labelText, frame)      LabelWidget(labelText, frame)
392  {  {
# Line 336  gig::String StringEntryMultiLine::get_va Line 401  gig::String StringEntryMultiLine::get_va
401      Glib::ustring value = text_buffer->get_text();      Glib::ustring value = text_buffer->get_text();
402      for (int i = 0 ; (i = value.find("\x0a", i)) >= 0 ; i += 2)      for (int i = 0 ; (i = value.find("\x0a", i)) >= 0 ; i += 2)
403          value.replace(i, 1, "\x0d\x0a");          value.replace(i, 1, "\x0d\x0a");
404      return value;      return gig_from_utf8(value);
405    }
406    
407    void StringEntryMultiLine::set_value(const gig::String& value)
408    {
409        Glib::ustring text = gig_to_utf8(value);
410        for (int i = 0 ; (i = text.find("\x0d\x0a", i, 2)) >= 0 ; i++)
411            text.replace(i, 2, "\x0a");
412        text_buffer->set_text(text);
413    }
414    
415    
416    Table::Table(int x, int y) : Gtk::Table(x, y), rowno(0) {  }
417    
418    void Table::add(BoolEntry& boolentry)
419    {
420        attach(boolentry.widget, 0, 2, rowno, rowno + 1,
421               Gtk::FILL, Gtk::SHRINK);
422        rowno++;
423    }
424    
425    void Table::add(BoolEntryPlus6& boolentry)
426    {
427        attach(boolentry.widget, 0, 2, rowno, rowno + 1,
428               Gtk::FILL, Gtk::SHRINK);
429        rowno++;
430  }  }
431    
432  void StringEntryMultiLine::set_value(gig::String value)  void Table::add(LabelWidget& prop)
433  {  {
434      for (int i = 0 ; (i = value.find("\x0d\x0a", i, 2)) >= 0 ; i++)      attach(prop.label, 1, 2, rowno, rowno + 1,
435          value.replace(i, 2, "\x0a");             Gtk::FILL, Gtk::SHRINK);
436      text_buffer->set_text(value);      attach(prop.widget, 2, 3, rowno, rowno + 1,
437               Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK);
438        rowno++;
439  }  }

Legend:
Removed from v.1831  
changed lines
  Added in v.2507

  ViewVC Help
Powered by ViewVC