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

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

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

gigedit/branches/linuxsampler_org/src/dimregionchooser.cpp revision 1052 by persson, Sat Mar 3 12:20:01 2007 UTC gigedit/trunk/src/dimregionchooser.cpp revision 1078 by persson, Tue Mar 6 20:15:23 2007 UTC
# Line 67  bool DimRegionChooser::on_expose_event(G Line 67  bool DimRegionChooser::on_expose_event(G
67  {  {
68      if (!region) return true;      if (!region) return true;
69    
     int a = 1, b, c;  
     for (int i = 0 ; i < region->Dimensions ; i++) {  
         b = a * region->pDimensionDefinitions[i].zones;  
         if (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity) {  
             c = dimregno >= 0 ? (dimregno & ((a - 1) | ~(b - 1))) : 0;  
             break;  
         }  
         a = b;  
     }  
   
70      // This is where we draw on the window      // This is where we draw on the window
71      Glib::RefPtr<Gdk::Window> window = get_window();      Glib::RefPtr<Gdk::Window> window = get_window();
72      Glib::RefPtr<Pango::Context> context = get_pango_context();      Glib::RefPtr<Pango::Context> context = get_pango_context();
# Line 86  bool DimRegionChooser::on_expose_event(G Line 76  bool DimRegionChooser::on_expose_event(G
76      window->clear();      window->clear();
77      const int h = 20;      const int h = 20;
78      const int w = 800;      const int w = 800;
     const int w1 = 100;  
79      int y = 0;      int y = 0;
80      int bitcount = 0;      double maxwidth = 0;
81      for (int i = 0 ; i < region->Dimensions ; i++) {      for (int i = 0 ; i < region->Dimensions ; i++) {
82          const int nb = region->pDimensionDefinitions[i].zones;  
83          if (nb) {          int nbZones = region->pDimensionDefinitions[i].zones;
84            if (nbZones) {
85              char* dstr;              char* dstr;
86                char dstrbuf[10];
87              switch (region->pDimensionDefinitions[i].dimension) {              switch (region->pDimensionDefinitions[i].dimension) {
88              case gig::dimension_none: dstr="none"; break;              case gig::dimension_none: dstr="none"; break;
89              case gig::dimension_samplechannel: dstr="samplechannel"; break;              case gig::dimension_samplechannel: dstr="samplechannel"; break;
# Line 103  bool DimRegionChooser::on_expose_event(G Line 94  bool DimRegionChooser::on_expose_event(G
94              case gig::dimension_keyboard: dstr="keyboard"; break;              case gig::dimension_keyboard: dstr="keyboard"; break;
95              case gig::dimension_roundrobin: dstr="roundrobin"; break;              case gig::dimension_roundrobin: dstr="roundrobin"; break;
96              case gig::dimension_random: dstr="random"; break;              case gig::dimension_random: dstr="random"; break;
97                case gig::dimension_smartmidi: dstr="smartmidi"; break;
98                case gig::dimension_roundrobinkeyboard: dstr="roundrobinkeyboard"; break;
99              case gig::dimension_modwheel: dstr="modwheel"; break;              case gig::dimension_modwheel: dstr="modwheel"; break;
100              case gig::dimension_breath: dstr="breath"; break;              case gig::dimension_breath: dstr="breath"; break;
101              case gig::dimension_foot: dstr="foot"; break;              case gig::dimension_foot: dstr="foot"; break;
# Line 126  bool DimRegionChooser::on_expose_event(G Line 119  bool DimRegionChooser::on_expose_event(G
119              case gig::dimension_effect3depth: dstr="effect3depth"; break;              case gig::dimension_effect3depth: dstr="effect3depth"; break;
120              case gig::dimension_effect4depth: dstr="effect4depth"; break;              case gig::dimension_effect4depth: dstr="effect4depth"; break;
121              case gig::dimension_effect5depth: dstr="effect5depth"; break;              case gig::dimension_effect5depth: dstr="effect5depth"; break;
122                default:
123                    sprintf(dstrbuf, "%d",
124                            region->pDimensionDefinitions[i].dimension);
125                    dstr = dstrbuf;
126                    break;
127              }              }
128              layout->set_text(dstr);              layout->set_text(dstr);
129    
130              Pango::Rectangle rectangle = layout->get_logical_extents();              Pango::Rectangle rectangle = layout->get_logical_extents();
131                double text_w = double(rectangle.get_width()) / Pango::SCALE;
132                if (text_w > maxwidth) maxwidth = text_w;
133              double text_h = double(rectangle.get_height()) / Pango::SCALE;              double text_h = double(rectangle.get_height()) / Pango::SCALE;
134              Glib::RefPtr<const Gdk::GC> fg = get_style()->get_fg_gc(get_state());              Glib::RefPtr<const Gdk::GC> fg = get_style()->get_fg_gc(get_state());
135              window->draw_layout(fg, 4, int(y + (h - text_h) / 2 + 0.5), layout);              window->draw_layout(fg, 4, int(y + (h - text_h) / 2 + 0.5), layout);
136    
137            }
138            y += h;
139        }
140        y = 0;
141        int bitpos = 0;
142        label_width = int(maxwidth + 10);
143        for (int i = 0 ; i < region->Dimensions ; i++) {
144            int nbZones = region->pDimensionDefinitions[i].zones;
145            if (nbZones) {
146    
147              if (has_focus() && focus_line == i) {              if (has_focus() && focus_line == i) {
148                  Gdk::Rectangle farea(0, y, 50, 20);                  Gdk::Rectangle farea(0, y, 150, 20);
149                  get_style()->paint_focus(window, get_state(), farea, *this, "hejsan", 0, y, 50, 20);                  get_style()->paint_focus(window, get_state(), farea, *this, "", 0, y, label_width, 20);
150              }              }
151    
152              Glib::RefPtr<const Gdk::GC> black = get_style()->get_black_gc();              Glib::RefPtr<const Gdk::GC> black = get_style()->get_black_gc();
153              window->draw_line(black, w1, y, w - 1, y);              window->draw_line(black, label_width, y, w - 1, y);
154              window->draw_line(black, w - 1, y + h - 1, w1, y + h - 1);              window->draw_line(black, w - 1, y + h - 1, label_width, y + h - 1);
155              window->draw_rectangle(get_style()->get_white_gc(), true, w1 + 1, y + 1, (w - w1 - 2), h - 2);              window->draw_rectangle(get_style()->get_white_gc(), true, label_width + 1, y + 1, (w - label_width - 2), h - 2);
156    
157              if (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity &&              int c = 0;
158                  region->pDimensionRegions[c]->VelocityUpperLimit) {              if (dimregno >= 0) {
159                  window->draw_line(black, w1, y + 1, w1, y + h - 2);                  int mask = ~(((1 << region->pDimensionDefinitions[i].bits) - 1) << bitpos);
160                  for (int k = c ; k < b ; k += a) {                  c = dimregno & mask; // mask away this dimension
161                      gig::DimensionRegion *d = region->pDimensionRegions[k];              }
162                      int v = d->VelocityUpperLimit + 1;              bool customsplits =
163                      int x = int((w - w1 - 1) * v / 128.0 + 0.5);                  ((region->pDimensionDefinitions[i].split_type == gig::split_type_normal &&
164                      window->draw_line(black, w1 + x, y + 1, w1 + x, y + h - 2);                   region->pDimensionRegions[c]->DimensionUpperLimits[i]) ||
165                    (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity &&
166                     region->pDimensionRegions[c]->VelocityUpperLimit));
167    
168                if (customsplits) {
169                    window->draw_line(black, label_width, y + 1, label_width, y + h - 2);
170                    for (int j = 0 ; j < nbZones ; j++) {
171                        gig::DimensionRegion *d = region->pDimensionRegions[c + (j << bitpos)];
172                        int upperLimit = d->DimensionUpperLimits[i];
173                        if (!upperLimit) upperLimit = d->VelocityUpperLimit;
174                        int v = upperLimit + 1;
175                        int x = int((w - label_width - 1) * v / 128.0 + 0.5);
176                        window->draw_line(black, label_width + x, y + 1, label_width + x, y + h - 2);
177                  }                  }
178              } else {              } else {
179                  for (int j = 0 ; j <= nb ; j++) {                  for (int j = 0 ; j <= nbZones ; j++) {
180                      int x = int((w - w1 - 1) * j / double(nb) + 0.5);                      int x = int((w - label_width - 1) * j / double(nbZones) + 0.5);
181                      window->draw_line(black, w1 + x, y + 1, w1 + x, y + h - 2);                      window->draw_line(black, label_width + x, y + 1, label_width + x, y + h - 2);
182                  }                  }
183              }              }
184    
185              if (dimregno >= 0) {              if (dimregno >= 0) {
186                  gc->set_foreground(red);                  gc->set_foreground(red);
187                  int dr = (dimregno >> bitcount) & ((1 << region->pDimensionDefinitions[i].bits) - 1);                  int dr = (dimregno >> bitpos) & ((1 << region->pDimensionDefinitions[i].bits) - 1);
188                  if (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity &&                  if (customsplits) {
189                      region->pDimensionRegions[c]->VelocityUpperLimit) {                      int x1 = 0;
190                      int x1 = 0, dr2 = 0;                      for (int j = 0 ; j < nbZones ; j++) {
191                      for (int k = c ; k < b ; k += a) {                          gig::DimensionRegion *d = region->pDimensionRegions[c + (j << bitpos)];
192                          gig::DimensionRegion *d = region->pDimensionRegions[k];                          int upperLimit = d->DimensionUpperLimits[i];
193                          int v = d->VelocityUpperLimit + 1;                          if (!upperLimit) upperLimit = d->VelocityUpperLimit;
194                          int x2 = int((w - w1 - 1) * v / 128.0 + 0.5);                          int v = upperLimit + 1;
195                          if (dr2 == dr) {                          int x2 = int((w - label_width - 1) * v / 128.0 + 0.5);
196                              window->draw_rectangle(gc, true, w1 + x1 + 1, y + 1, (x2 - x1) - 1, h - 2);                          if (j == dr && x1 < x2) {
197                                window->draw_rectangle(gc, true, label_width + x1 + 1, y + 1, (x2 - x1) - 1, h - 2);
198                              break;                              break;
199                          }                          }
                         dr2++;  
200                          x1 = x2;                          x1 = x2;
201                      }                      }
202                  } else {                  } else {
203                      if (dr < nb) {                      if (dr < nbZones) {
204                          int x1 = int((w - w1 - 1) * dr / double(nb) + 0.5);                          int x1 = int((w - label_width - 1) * dr / double(nbZones) + 0.5);
205                          int x2 = int((w - w1 - 1) * (dr + 1) / double(nb) + 0.5);                          int x2 = int((w - label_width - 1) * (dr + 1) / double(nbZones) + 0.5);
206                          window->draw_rectangle(gc, true, w1 + x1 + 1, y + 1, (x2 - x1) - 1, h - 2);                          window->draw_rectangle(gc, true, label_width + x1 + 1, y + 1, (x2 - x1) - 1, h - 2);
207                      }                      }
208                  }                  }
209              }              }
210    
211              y += h;              y += h;
212          }          }
213          bitcount += region->pDimensionDefinitions[i].bits;          bitpos += region->pDimensionDefinitions[i].bits;
214      }      }
215    
216      return true;      return true;
# Line 251  bool DimRegionChooser::on_button_press_e Line 273  bool DimRegionChooser::on_button_press_e
273  {  {
274      const int h = 20;      const int h = 20;
275      const int w = 800;      const int w = 800;
     const int w1 = 100;  
276    
277      if (region) {      if (region) {
278          if (event->y < region->Dimensions * h &&          if (event->y < region->Dimensions * h &&
279              event->x >= w1 && event->x < w) {              event->x >= label_width && event->x < w) {
280    
281              int dim = int(event->y / h);              int dim = int(event->y / h);
282              const int nb = region->pDimensionDefinitions[dim].zones;              int nbZones = region->pDimensionDefinitions[dim].zones;
283    
284              int z = -1;              int z = -1;
285              if (region->pDimensionDefinitions[dim].dimension == gig::dimension_velocity) {              int bitpos = 0;
286                  int a = 1, b, c;              for (int i = 0 ; i < dim ; i++) {
287                  for (int i = 0 ; i < region->Dimensions ; i++) {                  bitpos += region->pDimensionDefinitions[i].bits;
288                      b = a * region->pDimensionDefinitions[i].zones;              }
                     if (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity) {  
                         c = dimregno >= 0 ? (dimregno & ((a - 1) | ~(b - 1))) : 0;  
                         break;  
                     }  
                     a = b;  
                 }  
289    
290                  if (region->pDimensionRegions[c]->VelocityUpperLimit) {              int i = dim;
291                      int vel = int((event->x - w1) * 128 / (w - w1 - 1));              if (dimregno < 0) dimregno = 0;
292                int mask = ~(((1 << region->pDimensionDefinitions[i].bits) - 1) << bitpos);
293                int c = dimregno & mask; // mask away this dimension
294    
295                      z = 0;              bool customsplits =
296                      for (int k = c ; k < b ; k += a) {                  ((region->pDimensionDefinitions[i].split_type == gig::split_type_normal &&
297                          gig::DimensionRegion *d = region->pDimensionRegions[k];                    region->pDimensionRegions[c]->DimensionUpperLimits[i]) ||
298                          if (vel <= d->VelocityUpperLimit) break;                   (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity &&
299                          z++;                    region->pDimensionRegions[c]->VelocityUpperLimit));
300                if (customsplits) {
301                    int val = int((event->x - label_width) * 128 / (w - label_width - 1));
302    
303                    if (region->pDimensionRegions[c]->DimensionUpperLimits[i]) {
304                        for (z = 0 ; z < nbZones ; z++) {
305                            gig::DimensionRegion *d = region->pDimensionRegions[c + (z << bitpos)];
306                            if (val <= d->DimensionUpperLimits[i]) break;
307                        }
308                    } else {
309                        for (z = 0 ; z < nbZones ; z++) {
310                            gig::DimensionRegion *d = region->pDimensionRegions[c + (z << bitpos)];
311                            if (val <= d->VelocityUpperLimit) break;
312                      }                      }
313                  }                  }
314              }              } else {
315                    z = int((event->x - label_width) * nbZones / (w - label_width - 1));
             if (z == -1) {  
                 z = int((event->x - w1) * nb / (w - w1 - 1));  
316              }              }
317    
318              printf("dim=%d z=%d dimensionsource=%d split_type=%d zones=%d zone_size=%f\n", dim, z,              printf("dim=%d z=%d dimensionsource=%d split_type=%d zones=%d zone_size=%f\n", dim, z,
# Line 293  bool DimRegionChooser::on_button_press_e Line 320  bool DimRegionChooser::on_button_press_e
320                     region->pDimensionDefinitions[dim].split_type,                     region->pDimensionDefinitions[dim].split_type,
321                     region->pDimensionDefinitions[dim].zones,                     region->pDimensionDefinitions[dim].zones,
322                     region->pDimensionDefinitions[dim].zone_size);                     region->pDimensionDefinitions[dim].zone_size);
323    #if 0
324              switch (region->pDimensionDefinitions[dim].split_type) {              switch (region->pDimensionDefinitions[dim].split_type) {
325              case gig::split_type_normal:              case gig::split_type_normal:
326                  dimvalue_from[region->pDimensionDefinitions[dim].dimension] =                  dimvalue_from[region->pDimensionDefinitions[dim].dimension] =
# Line 305  bool DimRegionChooser::on_button_press_e Line 333  bool DimRegionChooser::on_button_press_e
333                  dimvalue_to[region->pDimensionDefinitions[dim].dimension] = z + 1;                  dimvalue_to[region->pDimensionDefinitions[dim].dimension] = z + 1;
334                  break;                  break;
335              }              }
336              if (dimregno < 0) dimregno = 0;  #endif
             int bitcount = 0;  
             for (int i = 0 ; i < dim ; i++) {  
                 bitcount += region->pDimensionDefinitions[i].bits;  
             }  
337    
338              int mask =              dimregno = c | (z << bitpos);
                 ~(((1 << region->pDimensionDefinitions[dim].bits) - 1) <<  
                   bitcount);  
             dimregno &= mask;  
             dimregno |= (z << bitcount);  
339    
340              focus_line = dim;              focus_line = dim;
341              if (has_focus()) queue_draw();              if (has_focus()) queue_draw();

Legend:
Removed from v.1052  
changed lines
  Added in v.1078

  ViewVC Help
Powered by ViewVC