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

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

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

revision 1261 by persson, Thu Jul 5 17:12:20 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 20  Line 20 
20  #include "dimregionchooser.h"  #include "dimregionchooser.h"
21  #include <gdkmm/cursor.h>  #include <gdkmm/cursor.h>
22    
23    #include "global.h"
24    
25  DimRegionChooser::DimRegionChooser()  DimRegionChooser::DimRegionChooser()
26  {  {
27      // get_window() would return 0 because the Gdk::Window has not yet been realized      // get_window() would return 0 because the Gdk::Window has not yet been realized
# Line 44  DimRegionChooser::DimRegionChooser() Line 46  DimRegionChooser::DimRegionChooser()
46      resize.active = false;      resize.active = false;
47      cursor_is_resize = false;      cursor_is_resize = false;
48      h = 20;      h = 20;
     w = 800;  
49      set_flags(Gtk::CAN_FOCUS);      set_flags(Gtk::CAN_FOCUS);
50      add_events(Gdk::BUTTON_PRESS_MASK | Gdk::POINTER_MOTION_MASK |      add_events(Gdk::BUTTON_PRESS_MASK | Gdk::POINTER_MOTION_MASK |
51                 Gdk::POINTER_MOTION_HINT_MASK);                 Gdk::POINTER_MOTION_HINT_MASK);
52    
53      for (int i = 0 ; i < 256 ; i++) {      for (int i = 0 ; i < 256 ; i++) dimvalue[i] = 0;
         dimvalue_from[i] = 0;  
         dimvalue_to[i] = 1;  
     }  
54  }  }
55    
56  DimRegionChooser::~DimRegionChooser()  DimRegionChooser::~DimRegionChooser()
# Line 74  bool DimRegionChooser::on_expose_event(G Line 72  bool DimRegionChooser::on_expose_event(G
72      if (!region) return true;      if (!region) return true;
73    
74      // This is where we draw on the window      // This is where we draw on the window
75        int w = get_width();
76      Glib::RefPtr<Gdk::Window> window = get_window();      Glib::RefPtr<Gdk::Window> window = get_window();
77      Glib::RefPtr<Pango::Context> context = get_pango_context();      Glib::RefPtr<Pango::Context> context = get_pango_context();
78    
# Line 90  bool DimRegionChooser::on_expose_event(G Line 89  bool DimRegionChooser::on_expose_event(G
89              const char* dstr;              const char* dstr;
90              char dstrbuf[10];              char dstrbuf[10];
91              switch (region->pDimensionDefinitions[i].dimension) {              switch (region->pDimensionDefinitions[i].dimension) {
92              case gig::dimension_none: dstr="none"; break;              case gig::dimension_none: dstr=_("none"); break;
93              case gig::dimension_samplechannel: dstr="samplechannel"; break;              case gig::dimension_samplechannel: dstr=_("samplechannel"); break;
94              case gig::dimension_layer: dstr="layer"; break;              case gig::dimension_layer: dstr=_("layer"); break;
95              case gig::dimension_velocity: dstr="velocity"; break;              case gig::dimension_velocity: dstr=_("velocity"); break;
96              case gig::dimension_channelaftertouch: dstr="channelaftertouch"; break;              case gig::dimension_channelaftertouch: dstr=_("channelaftertouch"); break;
97              case gig::dimension_releasetrigger: dstr="releasetrigger"; break;              case gig::dimension_releasetrigger: dstr=_("releasetrigger"); break;
98              case gig::dimension_keyboard: dstr="keyboard"; break;              case gig::dimension_keyboard: dstr=_("keyswitching"); break;
99              case gig::dimension_roundrobin: dstr="roundrobin"; break;              case gig::dimension_roundrobin: dstr=_("roundrobin"); break;
100              case gig::dimension_random: dstr="random"; break;              case gig::dimension_random: dstr=_("random"); break;
101              case gig::dimension_smartmidi: dstr="smartmidi"; break;              case gig::dimension_smartmidi: dstr=_("smartmidi"); break;
102              case gig::dimension_roundrobinkeyboard: dstr="roundrobinkeyboard"; break;              case gig::dimension_roundrobinkeyboard: dstr=_("roundrobinkeyboard"); break;
103              case gig::dimension_modwheel: dstr="modwheel"; break;              case gig::dimension_modwheel: dstr=_("modwheel"); break;
104              case gig::dimension_breath: dstr="breath"; break;              case gig::dimension_breath: dstr=_("breath"); break;
105              case gig::dimension_foot: dstr="foot"; break;              case gig::dimension_foot: dstr=_("foot"); break;
106              case gig::dimension_portamentotime: dstr="portamentotime"; break;              case gig::dimension_portamentotime: dstr=_("portamentotime"); break;
107              case gig::dimension_effect1: dstr="effect1"; break;              case gig::dimension_effect1: dstr=_("effect1"); break;
108              case gig::dimension_effect2: dstr="effect2"; break;              case gig::dimension_effect2: dstr=_("effect2"); break;
109              case gig::dimension_genpurpose1: dstr="genpurpose1"; break;              case gig::dimension_genpurpose1: dstr=_("genpurpose1"); break;
110              case gig::dimension_genpurpose2: dstr="genpurpose2"; break;              case gig::dimension_genpurpose2: dstr=_("genpurpose2"); break;
111              case gig::dimension_genpurpose3: dstr="genpurpose3"; break;              case gig::dimension_genpurpose3: dstr=_("genpurpose3"); break;
112              case gig::dimension_genpurpose4: dstr="genpurpose4"; break;              case gig::dimension_genpurpose4: dstr=_("genpurpose4"); break;
113              case gig::dimension_sustainpedal: dstr="sustainpedal"; break;              case gig::dimension_sustainpedal: dstr=_("sustainpedal"); break;
114              case gig::dimension_portamento: dstr="portamento"; break;              case gig::dimension_portamento: dstr=_("portamento"); break;
115              case gig::dimension_sostenutopedal: dstr="sostenutopedal"; break;              case gig::dimension_sostenutopedal: dstr=_("sostenutopedal"); break;
116              case gig::dimension_softpedal: dstr="softpedal"; break;              case gig::dimension_softpedal: dstr=_("softpedal"); break;
117              case gig::dimension_genpurpose5: dstr="genpurpose5"; break;              case gig::dimension_genpurpose5: dstr=_("genpurpose5"); break;
118              case gig::dimension_genpurpose6: dstr="genpurpose6"; break;              case gig::dimension_genpurpose6: dstr=_("genpurpose6"); break;
119              case gig::dimension_genpurpose7: dstr="genpurpose7"; break;              case gig::dimension_genpurpose7: dstr=_("genpurpose7"); break;
120              case gig::dimension_genpurpose8: dstr="genpurpose8"; break;              case gig::dimension_genpurpose8: dstr=_("genpurpose8"); break;
121              case gig::dimension_effect1depth: dstr="effect1depth"; break;              case gig::dimension_effect1depth: dstr=_("effect1depth"); break;
122              case gig::dimension_effect2depth: dstr="effect2depth"; break;              case gig::dimension_effect2depth: dstr=_("effect2depth"); break;
123              case gig::dimension_effect3depth: dstr="effect3depth"; break;              case gig::dimension_effect3depth: dstr=_("effect3depth"); break;
124              case gig::dimension_effect4depth: dstr="effect4depth"; break;              case gig::dimension_effect4depth: dstr=_("effect4depth"); break;
125              case gig::dimension_effect5depth: dstr="effect5depth"; break;              case gig::dimension_effect5depth: dstr=_("effect5depth"); break;
126              default:              default:
127                  sprintf(dstrbuf, "%d",                  sprintf(dstrbuf, "%d",
128                          region->pDimensionDefinitions[i].dimension);                          region->pDimensionDefinitions[i].dimension);
# Line 233  bool DimRegionChooser::on_expose_event(G Line 232  bool DimRegionChooser::on_expose_event(G
232    
233  void DimRegionChooser::on_size_request(GtkRequisition* requisition)  void DimRegionChooser::on_size_request(GtkRequisition* requisition)
234  {  {
     printf("DimRegionChooser::on_size_request\n");  
235      *requisition = GtkRequisition();      *requisition = GtkRequisition();
236      requisition->height = region ? nbDimensions * 20 : 0;      requisition->height = region ? nbDimensions * 20 : 0;
237      requisition->width = 800;      requisition->width = 800;
# Line 250  void DimRegionChooser::set_region(gig::R Line 248  void DimRegionChooser::set_region(gig::R
248              if (region->pDimensionDefinitions[dim].bits == 0) continue;              if (region->pDimensionDefinitions[dim].bits == 0) continue;
249              nbDimensions++;              nbDimensions++;
250    
251              int from = dimvalue_from[region->pDimensionDefinitions[dim].dimension];              int z = std::min(dimvalue[region->pDimensionDefinitions[dim].dimension],
252              int to = dimvalue_to[region->pDimensionDefinitions[dim].dimension];                               region->pDimensionDefinitions[dim].zones - 1);
             int z;  
             switch (region->pDimensionDefinitions[dim].split_type) {  
             case gig::split_type_normal:  
                 z = int((to + from) / 2.0 / region->pDimensionDefinitions[dim].zone_size);  
                 break;  
             case gig::split_type_bit:  
                 z = std::min(from, region->pDimensionDefinitions[dim].zones - 1);  
                 break;  
             }  
             int mask =  
                 ~(((1 << region->pDimensionDefinitions[dim].bits) - 1) <<  
                   bitcount);  
             dimregno &= mask;  
253              dimregno |= (z << bitcount);              dimregno |= (z << bitcount);
254              bitcount += region->pDimensionDefinitions[dim].bits;              bitcount += region->pDimensionDefinitions[dim].bits;
255          }          }
# Line 276  void DimRegionChooser::set_region(gig::R Line 261  void DimRegionChooser::set_region(gig::R
261      queue_resize();      queue_resize();
262  }  }
263    
264    
265    void DimRegionChooser::get_dimregions(const gig::Region* region, bool stereo,
266                                          std::set<gig::DimensionRegion*>& dimregs) const
267    {
268        int dimregno = 0;
269        int bitcount = 0;
270        int stereo_bit = 0;
271        for (int dim = 0 ; dim < region->Dimensions ; dim++) {
272            if (region->pDimensionDefinitions[dim].bits == 0) continue;
273            if (stereo &&
274                region->pDimensionDefinitions[dim].dimension == gig::dimension_samplechannel) {
275                stereo_bit = (1 << bitcount);
276            } else {
277                int z = std::min(dimvalue[region->pDimensionDefinitions[dim].dimension],
278                                 region->pDimensionDefinitions[dim].zones - 1);
279                dimregno |= (z << bitcount);
280            }
281            bitcount += region->pDimensionDefinitions[dim].bits;
282        }
283        dimregs.insert(region->pDimensionRegions[dimregno]);
284        if (stereo_bit) dimregs.insert(region->pDimensionRegions[dimregno | stereo_bit]);
285    }
286    
287    
288  bool DimRegionChooser::on_button_release_event(GdkEventButton* event)  bool DimRegionChooser::on_button_release_event(GdkEventButton* event)
289  {  {
290      if (resize.active) {      if (resize.active) {
# Line 365  bool DimRegionChooser::on_button_release Line 374  bool DimRegionChooser::on_button_release
374    
375  bool DimRegionChooser::on_button_press_event(GdkEventButton* event)  bool DimRegionChooser::on_button_press_event(GdkEventButton* event)
376  {  {
377        int w = get_width();
378      if (region && event->y < nbDimensions * h &&      if (region && event->y < nbDimensions * h &&
379          event->x >= label_width && event->x < w) {          event->x >= label_width && event->x < w) {
380    
# Line 425  bool DimRegionChooser::on_button_press_e Line 435  bool DimRegionChooser::on_button_press_e
435                     region->pDimensionDefinitions[dim].split_type,                     region->pDimensionDefinitions[dim].split_type,
436                     region->pDimensionDefinitions[dim].zones,                     region->pDimensionDefinitions[dim].zones,
437                     region->pDimensionDefinitions[dim].zone_size);                     region->pDimensionDefinitions[dim].zone_size);
438  #if 0              dimvalue[region->pDimensionDefinitions[dim].dimension] = z;
             switch (region->pDimensionDefinitions[dim].split_type) {  
             case gig::split_type_normal:  
                 dimvalue_from[region->pDimensionDefinitions[dim].dimension] =  
                     int(z * region->pDimensionDefinitions[dim].zone_size);  
                 dimvalue_to[region->pDimensionDefinitions[dim].dimension] =  
                     int((z + 1) * region->pDimensionDefinitions[dim].zone_size) - 1;  
                 break;  
             case gig::split_type_bit:  
                 dimvalue_from[region->pDimensionDefinitions[dim].dimension] = z;  
                 dimvalue_to[region->pDimensionDefinitions[dim].dimension] = z + 1;  
                 break;  
             }  
 #endif  
439    
440              dimregno = c | (z << bitpos);              dimregno = c | (z << bitpos);
441    
# Line 460  bool DimRegionChooser::on_motion_notify_ Line 457  bool DimRegionChooser::on_motion_notify_
457      window->get_pointer(x, y, state);      window->get_pointer(x, y, state);
458    
459      if (resize.active) {      if (resize.active) {
460            int w = get_width();
461          int k = int((x - label_width) * 128.0 / (w - label_width - 1) + 0.5);          int k = int((x - label_width) * 128.0 / (w - label_width - 1) + 0.5);
462    
463          if (k < resize.min) k = resize.min;          if (k < resize.min) k = resize.min;
# Line 522  bool DimRegionChooser::on_motion_notify_ Line 520  bool DimRegionChooser::on_motion_notify_
520    
521  bool DimRegionChooser::is_in_resize_zone(double x, double y)  bool DimRegionChooser::is_in_resize_zone(double x, double y)
522  {  {
523        int w = get_width();
524      if (region && y < nbDimensions * h && x >= label_width && x < w) {      if (region && y < nbDimensions * h && x >= label_width && x < w) {
525          int ydim = int(y / h);          int ydim = int(y / h);
526          int dim;          int dim;
# Line 589  bool DimRegionChooser::is_in_resize_zone Line 588  bool DimRegionChooser::is_in_resize_zone
588      return false;      return false;
589  }  }
590    
591  sigc::signal<void> DimRegionChooser::signal_dimregion_selected()  sigc::signal<void>& DimRegionChooser::signal_dimregion_selected()
592  {  {
593      return dimregion_selected;      return dimregion_selected;
594  }  }
595    
596  sigc::signal<void> DimRegionChooser::signal_region_changed()  sigc::signal<void>& DimRegionChooser::signal_region_changed()
597  {  {
598      return region_changed;      return region_changed;
599  }  }

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

  ViewVC Help
Powered by ViewVC