/[svn]/gigedit/trunk/src/gigedit/dimensionmanager.cpp
ViewVC logotype

Diff of /gigedit/trunk/src/gigedit/dimensionmanager.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1623 by persson, Fri Jan 4 19:42:45 2008 UTC revision 1831 by persson, Tue Feb 3 19:38:19 2009 UTC
# Line 1  Line 1 
1  /*                                                         -*- c++ -*-  /*                                                         -*- c++ -*-
2   * Copyright (C) 2006-2008 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 23  Line 23 
23  #include <gtkmm/messagedialog.h>  #include <gtkmm/messagedialog.h>
24  #include <gtkmm/dialog.h>  #include <gtkmm/dialog.h>
25  #include <gtkmm/comboboxtext.h>  #include <gtkmm/comboboxtext.h>
26    #include <gtkmm/spinbutton.h>
27    #include <gtkmm/table.h>
28    
29    #include "global.h"
30    
31  // returns a human readable name of the given dimension type  // returns a human readable name of the given dimension type
32  static Glib::ustring __dimTypeAsString(gig::dimension_t d) {  static Glib::ustring __dimTypeAsString(gig::dimension_t d) {
33      char buf[32];      char buf[32];
34      switch (d) {      switch (d) {
35          case gig::dimension_none:          case gig::dimension_none:
36              return "None";              return _("None");
37          case gig::dimension_samplechannel:          case gig::dimension_samplechannel:
38              return "Sample Channel";              return _("Sample Channel");
39          case gig::dimension_layer:          case gig::dimension_layer:
40              return "Layer";              return _("Layer");
41          case gig::dimension_velocity:          case gig::dimension_velocity:
42              return "Velocity";              return _("Velocity");
43          case gig::dimension_channelaftertouch:          case gig::dimension_channelaftertouch:
44              return "Aftertouch";              return _("Aftertouch");
45          case gig::dimension_releasetrigger:          case gig::dimension_releasetrigger:
46              return "Release Trigger";              return _("Release Trigger");
47          case gig::dimension_keyboard:          case gig::dimension_keyboard:
48              return "Keyswitching";              return _("Keyswitching");
49          case gig::dimension_roundrobin:          case gig::dimension_roundrobin:
50              return "Round Robin";              return _("Round Robin");
51          case gig::dimension_random:          case gig::dimension_random:
52              return "Random Generator";              return _("Random Generator");
53          case gig::dimension_smartmidi:          case gig::dimension_smartmidi:
54              return "Smart MIDI";              return _("Smart MIDI");
55          case gig::dimension_roundrobinkeyboard:          case gig::dimension_roundrobinkeyboard:
56              return "Keyboard Round Robin";              return _("Keyboard Round Robin");
57          case gig::dimension_modwheel:          case gig::dimension_modwheel:
58              return "Modulation Wheel";              return _("Modulation Wheel");
59          case gig::dimension_breath:          case gig::dimension_breath:
60              return "Breath Ctrl.";              return _("Breath Ctrl.");
61          case gig::dimension_foot:          case gig::dimension_foot:
62              return "Foot Ctrl.";              return _("Foot Ctrl.");
63          case gig::dimension_portamentotime:          case gig::dimension_portamentotime:
64              return "Portamento Time Ctrl.";              return _("Portamento Time Ctrl.");
65          case gig::dimension_effect1:          case gig::dimension_effect1:
66              return "Effect Ctrl. 1";              return _("Effect Ctrl. 1");
67          case gig::dimension_effect2:          case gig::dimension_effect2:
68              return "Effect Ctrl. 2";              return _("Effect Ctrl. 2");
69          case gig::dimension_genpurpose1:          case gig::dimension_genpurpose1:
70              return "General Purpose Ctrl. 1";              return _("General Purpose Ctrl. 1");
71          case gig::dimension_genpurpose2:          case gig::dimension_genpurpose2:
72              return "General Purpose Ctrl. 2";              return _("General Purpose Ctrl. 2");
73          case gig::dimension_genpurpose3:          case gig::dimension_genpurpose3:
74              return "General Purpose Ctrl. 3";              return _("General Purpose Ctrl. 3");
75          case gig::dimension_genpurpose4:          case gig::dimension_genpurpose4:
76              return "General Purpose Ctrl. 4";              return _("General Purpose Ctrl. 4");
77          case gig::dimension_sustainpedal:          case gig::dimension_sustainpedal:
78              return "Sustain Pedal";              return _("Sustain Pedal");
79          case gig::dimension_portamento:          case gig::dimension_portamento:
80              return "Portamento Ctrl.";              return _("Portamento Ctrl.");
81          case gig::dimension_sostenutopedal:          case gig::dimension_sostenutopedal:
82              return "Sostenuto Pedal";              return _("Sostenuto Pedal");
83          case gig::dimension_softpedal:          case gig::dimension_softpedal:
84              return "Soft Pedal";              return _("Soft Pedal");
85          case gig::dimension_genpurpose5:          case gig::dimension_genpurpose5:
86              return "General Purpose Ctrl. 5";              return _("General Purpose Ctrl. 5");
87          case gig::dimension_genpurpose6:          case gig::dimension_genpurpose6:
88              return "General Purpose Ctrl. 6";              return _("General Purpose Ctrl. 6");
89          case gig::dimension_genpurpose7:          case gig::dimension_genpurpose7:
90              return "General Purpose Ctrl. 7";              return _("General Purpose Ctrl. 7");
91          case gig::dimension_genpurpose8:          case gig::dimension_genpurpose8:
92              return "General Purpose Ctrl. 8";              return _("General Purpose Ctrl. 8");
93          case gig::dimension_effect1depth:          case gig::dimension_effect1depth:
94              return "Effect 1 Depth";              return _("Effect 1 Depth");
95          case gig::dimension_effect2depth:          case gig::dimension_effect2depth:
96              return "Effect 2 Depth";              return _("Effect 2 Depth");
97          case gig::dimension_effect3depth:          case gig::dimension_effect3depth:
98              return "Effect 3 Depth";              return _("Effect 3 Depth");
99          case gig::dimension_effect4depth:          case gig::dimension_effect4depth:
100              return "Effect 4 Depth";              return _("Effect 4 Depth");
101          case gig::dimension_effect5depth:          case gig::dimension_effect5depth:
102              return "Effect 5 Depth";              return _("Effect 5 Depth");
103          default:          default:
104              sprintf(buf, "Unknown Type (0x%x) !!!", d);              sprintf(buf, "Unknown Type (0x%x) !!!", d);
105              return buf;              return buf;
# Line 106  static Glib::ustring __dimTypeAsString(g Line 110  static Glib::ustring __dimTypeAsString(g
110  static Glib::ustring __dimDescriptionAsString(gig::dimension_t d) {  static Glib::ustring __dimDescriptionAsString(gig::dimension_t d) {
111      switch (d) {      switch (d) {
112          case gig::dimension_none:          case gig::dimension_none:
113              return "Dimension not in use";              return _("Dimension not in use");
114          case gig::dimension_samplechannel:          case gig::dimension_samplechannel:
115              return "If used sample has more than one channel (thus is not mono)";              return _("If used sample has more than one channel (thus is not mono)");
116          case gig::dimension_layer:          case gig::dimension_layer:
117              return "For layering of up to 8 instruments (and eventually crossfading of 2 or 4 layers";              return _("For layering of up to 8 instruments (and eventually crossfading of 2 or 4 layers");
118          case gig::dimension_velocity:          case gig::dimension_velocity:
119              return "Key Velocity (this is the only dimension in gig2 where the ranges can exactly be defined)";              return _("Key Velocity (this is the only dimension in gig2 where the ranges can exactly be defined)");
120          case gig::dimension_channelaftertouch:          case gig::dimension_channelaftertouch:
121              return "Channel Key Pressure";              return _("Channel Key Pressure");
122          case gig::dimension_releasetrigger:          case gig::dimension_releasetrigger:
123              return "Special dimension for triggering samples on releasing a key";              return _("Special dimension for triggering samples on releasing a key");
124          case gig::dimension_keyboard:          case gig::dimension_keyboard:
125              return "Dimension for keyswitching (keyboard)";              return _("Dimension for keyswitching (keyboard)");
126          case gig::dimension_roundrobin:          case gig::dimension_roundrobin:
127              return "Different samples triggered each time a note is played, dimension regions selected in sequence";              return _("Different samples triggered each time a note is played, dimension regions selected in sequence");
128          case gig::dimension_random:          case gig::dimension_random:
129              return "Different samples triggered each time a note is played, random order";              return _("Different samples triggered each time a note is played, random order");
130          case gig::dimension_smartmidi:          case gig::dimension_smartmidi:
131              return "For MIDI tools like legato and repetition mode";              return _("For MIDI tools like legato and repetition mode");
132          case gig::dimension_roundrobinkeyboard:          case gig::dimension_roundrobinkeyboard:
133              return "Different samples triggered each time a note is played, any key advances the counter";              return _("Different samples triggered each time a note is played, any key advances the counter");
134          case gig::dimension_modwheel:          case gig::dimension_modwheel:
135              return "MIDI Controller 1";              return _("MIDI Controller 1");
136          case gig::dimension_breath:          case gig::dimension_breath:
137              return "MIDI Controller 2";              return _("MIDI Controller 2");
138          case gig::dimension_foot:          case gig::dimension_foot:
139              return "MIDI Controller 4";              return _("MIDI Controller 4");
140          case gig::dimension_portamentotime:          case gig::dimension_portamentotime:
141              return "MIDI Controller 5";              return _("MIDI Controller 5");
142          case gig::dimension_effect1:          case gig::dimension_effect1:
143              return "MIDI Controller 12";              return _("MIDI Controller 12");
144          case gig::dimension_effect2:          case gig::dimension_effect2:
145              return "MIDI Controller 13";              return _("MIDI Controller 13");
146          case gig::dimension_genpurpose1:          case gig::dimension_genpurpose1:
147              return "Slider, MIDI Controller 16";              return _("Slider, MIDI Controller 16");
148          case gig::dimension_genpurpose2:          case gig::dimension_genpurpose2:
149              return "Slider, MIDI Controller 17";              return _("Slider, MIDI Controller 17");
150          case gig::dimension_genpurpose3:          case gig::dimension_genpurpose3:
151              return "Slider, MIDI Controller 18";              return _("Slider, MIDI Controller 18");
152          case gig::dimension_genpurpose4:          case gig::dimension_genpurpose4:
153              return "Slider, MIDI Controller 19";              return _("Slider, MIDI Controller 19");
154          case gig::dimension_sustainpedal:          case gig::dimension_sustainpedal:
155              return "MIDI Controller 64";              return _("MIDI Controller 64");
156          case gig::dimension_portamento:          case gig::dimension_portamento:
157              return "MIDI Controller 65";              return _("MIDI Controller 65");
158          case gig::dimension_sostenutopedal:          case gig::dimension_sostenutopedal:
159              return "MIDI Controller 66";              return _("MIDI Controller 66");
160          case gig::dimension_softpedal:          case gig::dimension_softpedal:
161              return "MIDI Controller 67";              return _("MIDI Controller 67");
162          case gig::dimension_genpurpose5:          case gig::dimension_genpurpose5:
163              return "Button, MIDI Controller 80";              return _("Button, MIDI Controller 80");
164          case gig::dimension_genpurpose6:          case gig::dimension_genpurpose6:
165              return "Button, MIDI Controller 81";              return _("Button, MIDI Controller 81");
166          case gig::dimension_genpurpose7:          case gig::dimension_genpurpose7:
167              return "Button, MIDI Controller 82";              return _("Button, MIDI Controller 82");
168          case gig::dimension_genpurpose8:          case gig::dimension_genpurpose8:
169              return "Button, MIDI Controller 83";              return _("Button, MIDI Controller 83");
170          case gig::dimension_effect1depth:          case gig::dimension_effect1depth:
171              return "MIDI Controller 91";              return _("MIDI Controller 91");
172          case gig::dimension_effect2depth:          case gig::dimension_effect2depth:
173              return "MIDI Controller 92";              return _("MIDI Controller 92");
174          case gig::dimension_effect3depth:          case gig::dimension_effect3depth:
175              return "MIDI Controller 93";              return _("MIDI Controller 93");
176          case gig::dimension_effect4depth:          case gig::dimension_effect4depth:
177              return "MIDI Controller 94";              return _("MIDI Controller 94");
178          case gig::dimension_effect5depth:          case gig::dimension_effect5depth:
179              return "MIDI Controller 95";              return _("MIDI Controller 95");
180          default:          default:
181              return "Please report this !!!";              return _("Please report this !!!");
182      }      }
183  }  }
184    
185  DimensionManager::DimensionManager() :  DimensionManager::DimensionManager() :
186  addButton(Gtk::Stock::ADD), removeButton(Gtk::Stock::REMOVE)  addButton(Gtk::Stock::ADD), removeButton(Gtk::Stock::REMOVE)
187  {  {
188      set_title("Dimensions of selected Region");      set_title(_("Dimensions of selected Region"));
189      add(vbox);      add(vbox);
190      scrolledWindow.add(treeView);      scrolledWindow.add(treeView);
191      vbox.pack_start(scrolledWindow);      vbox.pack_start(scrolledWindow);
# Line 198  addButton(Gtk::Stock::ADD), removeButton Line 202  addButton(Gtk::Stock::ADD), removeButton
202      // setup the table      // setup the table
203      refTableModel = Gtk::ListStore::create(tableModel);      refTableModel = Gtk::ListStore::create(tableModel);
204      treeView.set_model(refTableModel);      treeView.set_model(refTableModel);
205      treeView.append_column("Dimension Type", tableModel.m_dim_type);      treeView.append_column(_("Dimension Type"), tableModel.m_dim_type);
206      treeView.append_column("Bits", tableModel.m_bits);      treeView.append_column(_("Bits"), tableModel.m_bits);
207      treeView.append_column("Zones", tableModel.m_zones);      treeView.append_column(_("Zones"), tableModel.m_zones);
208      treeView.append_column("Description", tableModel.m_description);      treeView.append_column(_("Description"), tableModel.m_description);
209      treeView.show();      treeView.show();
210    
211      addButton.signal_clicked().connect(      addButton.signal_clicked().connect(
# Line 218  addButton(Gtk::Stock::ADD), removeButton Line 222  addButton(Gtk::Stock::ADD), removeButton
222  // update all GUI elements according to current gig::Region informations  // update all GUI elements according to current gig::Region informations
223  void DimensionManager::refreshManager() {  void DimensionManager::refreshManager() {
224      refTableModel->clear();      refTableModel->clear();
225      for (int i = 0; i < region->Dimensions; i++) {      if (region) {
226          gig::dimension_def_t* dim = &region->pDimensionDefinitions[i];          for (int i = 0; i < region->Dimensions; i++) {
227          Gtk::TreeModel::Row row = *(refTableModel->append());              gig::dimension_def_t* dim = &region->pDimensionDefinitions[i];
228          row[tableModel.m_dim_type] = __dimTypeAsString(dim->dimension);              Gtk::TreeModel::Row row = *(refTableModel->append());
229          row[tableModel.m_bits] = dim->bits;              row[tableModel.m_dim_type] = __dimTypeAsString(dim->dimension);
230          row[tableModel.m_zones] = 1 << dim->bits; //TODO: for now we calculate it here until libgig always ensures 'zones' to be correct              row[tableModel.m_bits] = dim->bits;
231          row[tableModel.m_description] = __dimDescriptionAsString(dim->dimension);              row[tableModel.m_zones] = dim->zones;
232          row[tableModel.m_definition] = dim;              row[tableModel.m_description] = __dimDescriptionAsString(dim->dimension);
233                row[tableModel.m_definition] = dim;
234            }
235      }      }
236        set_sensitive(region);
237  }  }
238    
239  void DimensionManager::show(gig::Region* region) {  void DimensionManager::show(gig::Region* region) {
# Line 236  void DimensionManager::show(gig::Region* Line 243  void DimensionManager::show(gig::Region*
243      deiconify();      deiconify();
244  }  }
245    
246    void DimensionManager::set_region(gig::Region* region) {
247        this->region = region;
248        refreshManager();
249    }
250    
251  void DimensionManager::addDimension() {  void DimensionManager::addDimension() {
252      try {      try {
253          Gtk::Dialog dialog("New Dimension", true /*modal*/);          Gtk::Dialog dialog(_("New Dimension"), true /*modal*/);
254          // add dimension type combo box to the dialog          // add dimension type combo box to the dialog
255          Glib::RefPtr<Gtk::ListStore> refComboModel = Gtk::ListStore::create(comboModel);          Glib::RefPtr<Gtk::ListStore> refComboModel = Gtk::ListStore::create(comboModel);
256          for (int i = 0x01; i < 0xff; i++) {          for (int i = 0x01; i < 0xff; i++) {
# Line 250  void DimensionManager::addDimension() { Line 262  void DimensionManager::addDimension() {
262                  row[comboModel.m_type_name] = sType;                  row[comboModel.m_type_name] = sType;
263              }              }
264          }          }
265            Gtk::Table table(2, 2);
266            Gtk::Label labelDimType(_("Dimension:"), Gtk::ALIGN_LEFT);
267          Gtk::ComboBox comboDimType;          Gtk::ComboBox comboDimType;
268          comboDimType.set_model(refComboModel);          comboDimType.set_model(refComboModel);
269          comboDimType.pack_start(comboModel.m_type_id);          comboDimType.pack_start(comboModel.m_type_id);
270          comboDimType.pack_start(comboModel.m_type_name);          comboDimType.pack_start(comboModel.m_type_name);
271          dialog.get_vbox()->pack_start(comboDimType);          Gtk::Label labelZones(_("Zones:"), Gtk::ALIGN_LEFT);
272          comboDimType.show();          table.attach(labelDimType, 0, 1, 0, 1);
273          // add zones combo box to the dialog          table.attach(comboDimType, 1, 2, 0, 1);
274            table.attach(labelZones, 0, 1, 1, 2);
275            dialog.get_vbox()->pack_start(table);
276    
277            // number of zones: use a combo box with fix values for gig
278            // v2 and a spin button for v3
279          Gtk::ComboBoxText comboZones;          Gtk::ComboBoxText comboZones;
280          for (int i = 1; i <= 7; i++) { //FIXME: is 7 the correct amount of max. bits ???          Gtk::SpinButton spinZones;
281              char buf[64];          bool version2 = false;
282              sprintf(buf, "%d Zones (%d Bits)", 1 << i, i);          if (region) {
283              comboZones.append_text(buf);              gig::File* file = (gig::File*)region->GetParent()->GetParent();
284                version2 = file->pVersion && file->pVersion->major == 2;
285          }          }
286          dialog.get_vbox()->pack_start(comboZones);          if (version2) {
287          comboZones.show();              for (int i = 1; i <= 5; i++) {
288          // add OK and CANCEL buttons to the dialog                  char buf[3];
289                    sprintf(buf, "%d", 1 << i);
290                    comboZones.append_text(buf);
291                }
292                table.attach(comboZones, 1, 2, 1, 2);
293            } else {
294                spinZones.set_increments(1, 8);
295                spinZones.set_numeric(true);
296                spinZones.set_range(2, 128);
297                spinZones.set_value(2);
298                table.attach(spinZones, 1, 2, 1, 2);
299            }
300    
301          dialog.add_button(Gtk::Stock::OK, 0);          dialog.add_button(Gtk::Stock::OK, 0);
302          dialog.add_button(Gtk::Stock::CANCEL, 1);          dialog.add_button(Gtk::Stock::CANCEL, 1);
303          dialog.show_all_children();          dialog.show_all_children();
304    
305          if (!dialog.run()) { // OK selected ...          if (!dialog.run()) { // OK selected ...
306              Gtk::TreeModel::iterator iterType = comboDimType.get_active();              Gtk::TreeModel::iterator iterType = comboDimType.get_active();
307              if (!iterType) return;              if (!iterType) return;
# Line 277  void DimensionManager::addDimension() { Line 310  void DimensionManager::addDimension() {
310              gig::dimension_def_t dim;              gig::dimension_def_t dim;
311              int iTypeID = rowType[comboModel.m_type_id];              int iTypeID = rowType[comboModel.m_type_id];
312              dim.dimension = static_cast<gig::dimension_t>(iTypeID);              dim.dimension = static_cast<gig::dimension_t>(iTypeID);
313              if (comboZones.get_active_row_number() < 0) return;  
314              dim.bits = comboZones.get_active_row_number() + 1;              if (version2) {
315              dim.zones = 1 << dim.bits; //TODO: support zones != pow(2,bits) - feature of gig v3                  if (comboZones.get_active_row_number() < 0) return;
316                    dim.bits = comboZones.get_active_row_number() + 1;
317                    dim.zones = 1 << dim.bits;
318                } else {
319                    dim.zones = spinZones.get_value_as_int();
320                    // Find the number of bits required to hold the
321                    // specified amount of zones.
322                    int zoneBits = dim.zones - 1;
323                    for (dim.bits = 0; zoneBits > 1; dim.bits += 2, zoneBits >>= 2);
324                    dim.bits += zoneBits;
325                }
326              printf(              printf(
327                  "Adding dimension (type=0x%x, bits=%d, zones=%d)\n",                  "Adding dimension (type=0x%x, bits=%d, zones=%d)\n",
328                  dim.dimension, dim.bits, dim.zones                  dim.dimension, dim.bits, dim.zones
# Line 298  void DimensionManager::addDimension() { Line 341  void DimensionManager::addDimension() {
341          // notify that the changes are over (i.e. to avoid dead locks)          // notify that the changes are over (i.e. to avoid dead locks)
342          region_changed_signal.emit(region);          region_changed_signal.emit(region);
343          // show error message          // show error message
344          Glib::ustring txt = "Could not add dimension: " + e.Message;          Glib::ustring txt = _("Could not add dimension: ") + e.Message;
345          Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);          Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);
346          msg.run();          msg.run();
347      }      }
# Line 323  void DimensionManager::removeDimension() Line 366  void DimensionManager::removeDimension()
366              // notify that the changes are over (i.e. to avoid dead locks)              // notify that the changes are over (i.e. to avoid dead locks)
367              region_changed_signal.emit(region);              region_changed_signal.emit(region);
368              // show error message              // show error message
369              Glib::ustring txt = "Could not remove dimension: " + e.Message;              Glib::ustring txt = _("Could not remove dimension: ") + e.Message;
370              Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);              Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR);
371              msg.run();              msg.run();
372          }          }

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

  ViewVC Help
Powered by ViewVC