/[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

revision 1053 by persson, Sat Mar 3 12:20:01 2007 UTC revision 1077 by persson, Tue Mar 6 18:34:47 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 88  bool DimRegionChooser::on_expose_event(G Line 78  bool DimRegionChooser::on_expose_event(G
78      const int w = 800;      const int w = 800;
79      const int w1 = 100;      const int w1 = 100;
80      int y = 0;      int y = 0;
81      int bitcount = 0;      int bitpos = 0;
82      for (int i = 0 ; i < region->Dimensions ; i++) {      for (int i = 0 ; i < region->Dimensions ; i++) {
83          const int nb = region->pDimensionDefinitions[i].zones;  
84          if (nb) {          int nbZones = region->pDimensionDefinitions[i].zones;
85            if (nbZones) {
86              char* dstr;              char* dstr;
87                char dstrbuf[10];
88              switch (region->pDimensionDefinitions[i].dimension) {              switch (region->pDimensionDefinitions[i].dimension) {
89              case gig::dimension_none: dstr="none"; break;              case gig::dimension_none: dstr="none"; break;
90              case gig::dimension_samplechannel: dstr="samplechannel"; break;              case gig::dimension_samplechannel: dstr="samplechannel"; break;
# Line 103  bool DimRegionChooser::on_expose_event(G Line 95  bool DimRegionChooser::on_expose_event(G
95              case gig::dimension_keyboard: dstr="keyboard"; break;              case gig::dimension_keyboard: dstr="keyboard"; break;
96              case gig::dimension_roundrobin: dstr="roundrobin"; break;              case gig::dimension_roundrobin: dstr="roundrobin"; break;
97              case gig::dimension_random: dstr="random"; break;              case gig::dimension_random: dstr="random"; break;
98                case gig::dimension_smartmidi: dstr="smartmidi"; break;
99                case gig::dimension_roundrobinkeyboard: dstr="roundrobinkeyboard"; break;
100              case gig::dimension_modwheel: dstr="modwheel"; break;              case gig::dimension_modwheel: dstr="modwheel"; break;
101              case gig::dimension_breath: dstr="breath"; break;              case gig::dimension_breath: dstr="breath"; break;
102              case gig::dimension_foot: dstr="foot"; break;              case gig::dimension_foot: dstr="foot"; break;
# Line 126  bool DimRegionChooser::on_expose_event(G Line 120  bool DimRegionChooser::on_expose_event(G
120              case gig::dimension_effect3depth: dstr="effect3depth"; break;              case gig::dimension_effect3depth: dstr="effect3depth"; break;
121              case gig::dimension_effect4depth: dstr="effect4depth"; break;              case gig::dimension_effect4depth: dstr="effect4depth"; break;
122              case gig::dimension_effect5depth: dstr="effect5depth"; break;              case gig::dimension_effect5depth: dstr="effect5depth"; break;
123                default:
124                    sprintf(dstrbuf, "%d",
125                            region->pDimensionDefinitions[i].dimension);
126                    dstr = dstrbuf;
127                    break;
128              }              }
129              layout->set_text(dstr);              layout->set_text(dstr);
130    
# Line 144  bool DimRegionChooser::on_expose_event(G Line 143  bool DimRegionChooser::on_expose_event(G
143              window->draw_line(black, w - 1, y + h - 1, w1, y + h - 1);              window->draw_line(black, w - 1, y + h - 1, w1, y + h - 1);
144              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, w1 + 1, y + 1, (w - w1 - 2), h - 2);
145    
146              if (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity &&              int c = 0;
147                  region->pDimensionRegions[c]->VelocityUpperLimit) {              if (dimregno >= 0) {
148                    int mask = ~(((1 << region->pDimensionDefinitions[i].bits) - 1) << bitpos);
149                    c = dimregno & mask; // mask away this dimension
150                }
151                bool customsplits =
152                    ((region->pDimensionDefinitions[i].split_type == gig::split_type_normal &&
153                     region->pDimensionRegions[c]->DimensionUpperLimits[i]) ||
154                    (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity &&
155                     region->pDimensionRegions[c]->VelocityUpperLimit));
156    
157                if (customsplits) {
158                  window->draw_line(black, w1, y + 1, w1, y + h - 2);                  window->draw_line(black, w1, y + 1, w1, y + h - 2);
159                  for (int k = c ; k < b ; k += a) {                  for (int j = 0 ; j < nbZones ; j++) {
160                      gig::DimensionRegion *d = region->pDimensionRegions[k];                      gig::DimensionRegion *d = region->pDimensionRegions[c + (j << bitpos)];
161                      int v = d->VelocityUpperLimit + 1;                      int upperLimit = d->DimensionUpperLimits[i];
162                        if (!upperLimit) upperLimit = d->VelocityUpperLimit;
163                        int v = upperLimit + 1;
164                      int x = int((w - w1 - 1) * v / 128.0 + 0.5);                      int x = int((w - w1 - 1) * v / 128.0 + 0.5);
165                      window->draw_line(black, w1 + x, y + 1, w1 + x, y + h - 2);                      window->draw_line(black, w1 + x, y + 1, w1 + x, y + h - 2);
166                  }                  }
167              } else {              } else {
168                  for (int j = 0 ; j <= nb ; j++) {                  for (int j = 0 ; j <= nbZones ; j++) {
169                      int x = int((w - w1 - 1) * j / double(nb) + 0.5);                      int x = int((w - w1 - 1) * j / double(nbZones) + 0.5);
170                      window->draw_line(black, w1 + x, y + 1, w1 + x, y + h - 2);                      window->draw_line(black, w1 + x, y + 1, w1 + x, y + h - 2);
171                  }                  }
172              }              }
173    
174              if (dimregno >= 0) {              if (dimregno >= 0) {
175                  gc->set_foreground(red);                  gc->set_foreground(red);
176                  int dr = (dimregno >> bitcount) & ((1 << region->pDimensionDefinitions[i].bits) - 1);                  int dr = (dimregno >> bitpos) & ((1 << region->pDimensionDefinitions[i].bits) - 1);
177                  if (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity &&                  if (customsplits) {
178                      region->pDimensionRegions[c]->VelocityUpperLimit) {                      int x1 = 0;
179                      int x1 = 0, dr2 = 0;                      for (int j = 0 ; j < nbZones ; j++) {
180                      for (int k = c ; k < b ; k += a) {                          gig::DimensionRegion *d = region->pDimensionRegions[c + (j << bitpos)];
181                          gig::DimensionRegion *d = region->pDimensionRegions[k];                          int upperLimit = d->DimensionUpperLimits[i];
182                          int v = d->VelocityUpperLimit + 1;                          if (!upperLimit) upperLimit = d->VelocityUpperLimit;
183                            int v = upperLimit + 1;
184                          int x2 = int((w - w1 - 1) * v / 128.0 + 0.5);                          int x2 = int((w - w1 - 1) * v / 128.0 + 0.5);
185                          if (dr2 == dr) {                          if (j == dr && x1 < x2) {
186                              window->draw_rectangle(gc, true, w1 + x1 + 1, y + 1, (x2 - x1) - 1, h - 2);                              window->draw_rectangle(gc, true, w1 + x1 + 1, y + 1, (x2 - x1) - 1, h - 2);
187                              break;                              break;
188                          }                          }
                         dr2++;  
189                          x1 = x2;                          x1 = x2;
190                      }                      }
191                  } else {                  } else {
192                      if (dr < nb) {                      if (dr < nbZones) {
193                          int x1 = int((w - w1 - 1) * dr / double(nb) + 0.5);                          int x1 = int((w - w1 - 1) * dr / double(nbZones) + 0.5);
194                          int x2 = int((w - w1 - 1) * (dr + 1) / double(nb) + 0.5);                          int x2 = int((w - w1 - 1) * (dr + 1) / double(nbZones) + 0.5);
195                          window->draw_rectangle(gc, true, w1 + x1 + 1, y + 1, (x2 - x1) - 1, h - 2);                          window->draw_rectangle(gc, true, w1 + x1 + 1, y + 1, (x2 - x1) - 1, h - 2);
196                      }                      }
197                  }                  }
# Line 188  bool DimRegionChooser::on_expose_event(G Line 199  bool DimRegionChooser::on_expose_event(G
199    
200              y += h;              y += h;
201          }          }
202          bitcount += region->pDimensionDefinitions[i].bits;          bitpos += region->pDimensionDefinitions[i].bits;
203      }      }
204    
205      return true;      return true;
# Line 258  bool DimRegionChooser::on_button_press_e Line 269  bool DimRegionChooser::on_button_press_e
269              event->x >= w1 && event->x < w) {              event->x >= w1 && event->x < w) {
270    
271              int dim = int(event->y / h);              int dim = int(event->y / h);
272              const int nb = region->pDimensionDefinitions[dim].zones;              int nbZones = region->pDimensionDefinitions[dim].zones;
273    
274              int z = -1;              int z = -1;
275              if (region->pDimensionDefinitions[dim].dimension == gig::dimension_velocity) {              int bitpos = 0;
276                  int a = 1, b, c;              for (int i = 0 ; i < dim ; i++) {
277                  for (int i = 0 ; i < region->Dimensions ; i++) {                  bitpos += region->pDimensionDefinitions[i].bits;
278                      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;  
                 }  
279    
280                  if (region->pDimensionRegions[c]->VelocityUpperLimit) {              int i = dim;
281                      int vel = int((event->x - w1) * 128 / (w - w1 - 1));              if (dimregno < 0) dimregno = 0;
282                int mask = ~(((1 << region->pDimensionDefinitions[i].bits) - 1) << bitpos);
283                int c = dimregno & mask; // mask away this dimension
284    
285                      z = 0;              bool customsplits =
286                      for (int k = c ; k < b ; k += a) {                  ((region->pDimensionDefinitions[i].split_type == gig::split_type_normal &&
287                          gig::DimensionRegion *d = region->pDimensionRegions[k];                    region->pDimensionRegions[c]->DimensionUpperLimits[i]) ||
288                          if (vel <= d->VelocityUpperLimit) break;                   (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity &&
289                          z++;                    region->pDimensionRegions[c]->VelocityUpperLimit));
290                if (customsplits) {
291                    int val = int((event->x - w1) * 128 / (w - w1 - 1));
292    
293                    if (region->pDimensionRegions[c]->DimensionUpperLimits[i]) {
294                        for (z = 0 ; z < nbZones ; z++) {
295                            gig::DimensionRegion *d = region->pDimensionRegions[c + (z << bitpos)];
296                            if (val <= d->DimensionUpperLimits[i]) break;
297                        }
298                    } else {
299                        for (z = 0 ; z < nbZones ; z++) {
300                            gig::DimensionRegion *d = region->pDimensionRegions[c + (z << bitpos)];
301                            if (val <= d->VelocityUpperLimit) break;
302                      }                      }
303                  }                  }
304              }              } else {
305                    z = int((event->x - w1) * nbZones / (w - w1 - 1));
             if (z == -1) {  
                 z = int((event->x - w1) * nb / (w - w1 - 1));  
306              }              }
307    
308              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 310  bool DimRegionChooser::on_button_press_e
310                     region->pDimensionDefinitions[dim].split_type,                     region->pDimensionDefinitions[dim].split_type,
311                     region->pDimensionDefinitions[dim].zones,                     region->pDimensionDefinitions[dim].zones,
312                     region->pDimensionDefinitions[dim].zone_size);                     region->pDimensionDefinitions[dim].zone_size);
313    #if 0
314              switch (region->pDimensionDefinitions[dim].split_type) {              switch (region->pDimensionDefinitions[dim].split_type) {
315              case gig::split_type_normal:              case gig::split_type_normal:
316                  dimvalue_from[region->pDimensionDefinitions[dim].dimension] =                  dimvalue_from[region->pDimensionDefinitions[dim].dimension] =
# Line 305  bool DimRegionChooser::on_button_press_e Line 323  bool DimRegionChooser::on_button_press_e
323                  dimvalue_to[region->pDimensionDefinitions[dim].dimension] = z + 1;                  dimvalue_to[region->pDimensionDefinitions[dim].dimension] = z + 1;
324                  break;                  break;
325              }              }
326              if (dimregno < 0) dimregno = 0;  #endif
             int bitcount = 0;  
             for (int i = 0 ; i < dim ; i++) {  
                 bitcount += region->pDimensionDefinitions[i].bits;  
             }  
327    
328              int mask =              dimregno = c | (z << bitpos);
                 ~(((1 << region->pDimensionDefinitions[dim].bits) - 1) <<  
                   bitcount);  
             dimregno &= mask;  
             dimregno |= (z << bitcount);  
329    
330              focus_line = dim;              focus_line = dim;
331              if (has_focus()) queue_draw();              if (has_focus()) queue_draw();

Legend:
Removed from v.1053  
changed lines
  Added in v.1077

  ViewVC Help
Powered by ViewVC