/[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 1071 by persson, Mon Mar 5 17:58:24 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 126  bool DimRegionChooser::on_expose_event(G Line 118  bool DimRegionChooser::on_expose_event(G
118              case gig::dimension_effect3depth: dstr="effect3depth"; break;              case gig::dimension_effect3depth: dstr="effect3depth"; break;
119              case gig::dimension_effect4depth: dstr="effect4depth"; break;              case gig::dimension_effect4depth: dstr="effect4depth"; break;
120              case gig::dimension_effect5depth: dstr="effect5depth"; break;              case gig::dimension_effect5depth: dstr="effect5depth"; break;
121                default:
122                    sprintf(dstrbuf, "%d",
123                            region->pDimensionDefinitions[i].dimension);
124                    dstr = dstrbuf;
125                    break;
126              }              }
127              layout->set_text(dstr);              layout->set_text(dstr);
128    
# Line 144  bool DimRegionChooser::on_expose_event(G Line 141  bool DimRegionChooser::on_expose_event(G
141              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);
142              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);
143    
144              if (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity &&              int c = 0;
145                  region->pDimensionRegions[c]->VelocityUpperLimit) {              if (dimregno >= 0) {
146                    int mask = ~(((1 << region->pDimensionDefinitions[i].bits) - 1) << bitpos);
147                    c = dimregno & mask; // mask away this dimension
148                }
149                bool customsplits =
150                    ((region->pDimensionDefinitions[i].split_type == gig::split_type_normal &&
151                     region->pDimensionRegions[c]->DimensionUpperLimits[i]) ||
152                    (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity &&
153                     region->pDimensionRegions[c]->VelocityUpperLimit));
154    
155                if (customsplits) {
156                  window->draw_line(black, w1, y + 1, w1, y + h - 2);                  window->draw_line(black, w1, y + 1, w1, y + h - 2);
157                  for (int k = c ; k < b ; k += a) {                  for (int j = 0 ; j < nbZones ; j++) {
158                      gig::DimensionRegion *d = region->pDimensionRegions[k];                      gig::DimensionRegion *d = region->pDimensionRegions[c + (j << bitpos)];
159                      int v = d->VelocityUpperLimit + 1;                      int upperLimit = d->DimensionUpperLimits[i];
160                        if (!upperLimit) upperLimit = d->VelocityUpperLimit;
161                        int v = upperLimit + 1;
162                      int x = int((w - w1 - 1) * v / 128.0 + 0.5);                      int x = int((w - w1 - 1) * v / 128.0 + 0.5);
163                      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);
164                  }                  }
165              } else {              } else {
166                  for (int j = 0 ; j <= nb ; j++) {                  for (int j = 0 ; j <= nbZones ; j++) {
167                      int x = int((w - w1 - 1) * j / double(nb) + 0.5);                      int x = int((w - w1 - 1) * j / double(nbZones) + 0.5);
168                      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);
169                  }                  }
170              }              }
171    
172              if (dimregno >= 0) {              if (dimregno >= 0) {
173                  gc->set_foreground(red);                  gc->set_foreground(red);
174                  int dr = (dimregno >> bitcount) & ((1 << region->pDimensionDefinitions[i].bits) - 1);                  int dr = (dimregno >> bitpos) & ((1 << region->pDimensionDefinitions[i].bits) - 1);
175                  if (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity &&                  if (customsplits) {
176                      region->pDimensionRegions[c]->VelocityUpperLimit) {                      int x1 = 0;
177                      int x1 = 0, dr2 = 0;                      for (int j = 0 ; j < nbZones ; j++) {
178                      for (int k = c ; k < b ; k += a) {                          gig::DimensionRegion *d = region->pDimensionRegions[c + (j << bitpos)];
179                          gig::DimensionRegion *d = region->pDimensionRegions[k];                          int upperLimit = d->DimensionUpperLimits[i];
180                          int v = d->VelocityUpperLimit + 1;                          if (!upperLimit) upperLimit = d->VelocityUpperLimit;
181                            int v = upperLimit + 1;
182                          int x2 = int((w - w1 - 1) * v / 128.0 + 0.5);                          int x2 = int((w - w1 - 1) * v / 128.0 + 0.5);
183                          if (dr2 == dr) {                          if (j == dr && x1 < x2) {
184                              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);
185                              break;                              break;
186                          }                          }
                         dr2++;  
187                          x1 = x2;                          x1 = x2;
188                      }                      }
189                  } else {                  } else {
190                      if (dr < nb) {                      if (dr < nbZones) {
191                          int x1 = int((w - w1 - 1) * dr / double(nb) + 0.5);                          int x1 = int((w - w1 - 1) * dr / double(nbZones) + 0.5);
192                          int x2 = int((w - w1 - 1) * (dr + 1) / double(nb) + 0.5);                          int x2 = int((w - w1 - 1) * (dr + 1) / double(nbZones) + 0.5);
193                          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);
194                      }                      }
195                  }                  }
# Line 188  bool DimRegionChooser::on_expose_event(G Line 197  bool DimRegionChooser::on_expose_event(G
197    
198              y += h;              y += h;
199          }          }
200          bitcount += region->pDimensionDefinitions[i].bits;          bitpos += region->pDimensionDefinitions[i].bits;
201      }      }
202    
203      return true;      return true;
# Line 258  bool DimRegionChooser::on_button_press_e Line 267  bool DimRegionChooser::on_button_press_e
267              event->x >= w1 && event->x < w) {              event->x >= w1 && event->x < w) {
268    
269              int dim = int(event->y / h);              int dim = int(event->y / h);
270              const int nb = region->pDimensionDefinitions[dim].zones;              int nbZones = region->pDimensionDefinitions[dim].zones;
271    
272              int z = -1;              int z = -1;
273              if (region->pDimensionDefinitions[dim].dimension == gig::dimension_velocity) {              int bitpos = 0;
274                  int a = 1, b, c;              for (int i = 0 ; i < dim ; i++) {
275                  for (int i = 0 ; i < region->Dimensions ; i++) {                  bitpos += region->pDimensionDefinitions[i].bits;
276                      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;  
                 }  
277    
278                  if (region->pDimensionRegions[c]->VelocityUpperLimit) {              int i = dim;
279                      int vel = int((event->x - w1) * 128 / (w - w1 - 1));              if (dimregno < 0) dimregno = 0;
280                int mask = ~(((1 << region->pDimensionDefinitions[i].bits) - 1) << bitpos);
281                int c = dimregno & mask; // mask away this dimension
282    
283                      z = 0;              bool customsplits =
284                      for (int k = c ; k < b ; k += a) {                  ((region->pDimensionDefinitions[i].split_type == gig::split_type_normal &&
285                          gig::DimensionRegion *d = region->pDimensionRegions[k];                    region->pDimensionRegions[c]->DimensionUpperLimits[i]) ||
286                          if (vel <= d->VelocityUpperLimit) break;                   (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity &&
287                          z++;                    region->pDimensionRegions[c]->VelocityUpperLimit));
288                if (customsplits) {
289                    int val = int((event->x - w1) * 128 / (w - w1 - 1));
290    
291                    if (region->pDimensionRegions[c]->DimensionUpperLimits[i]) {
292                        for (z = 0 ; z < nbZones ; z++) {
293                            gig::DimensionRegion *d = region->pDimensionRegions[c + (z << bitpos)];
294                            if (val <= d->DimensionUpperLimits[i]) break;
295                        }
296                    } else {
297                        for (z = 0 ; z < nbZones ; z++) {
298                            gig::DimensionRegion *d = region->pDimensionRegions[c + (z << bitpos)];
299                            if (val <= d->VelocityUpperLimit) break;
300                      }                      }
301                  }                  }
302              }              } else {
303                    z = int((event->x - w1) * nbZones / (w - w1 - 1));
             if (z == -1) {  
                 z = int((event->x - w1) * nb / (w - w1 - 1));  
304              }              }
305    
306              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 308  bool DimRegionChooser::on_button_press_e
308                     region->pDimensionDefinitions[dim].split_type,                     region->pDimensionDefinitions[dim].split_type,
309                     region->pDimensionDefinitions[dim].zones,                     region->pDimensionDefinitions[dim].zones,
310                     region->pDimensionDefinitions[dim].zone_size);                     region->pDimensionDefinitions[dim].zone_size);
311    #if 0
312              switch (region->pDimensionDefinitions[dim].split_type) {              switch (region->pDimensionDefinitions[dim].split_type) {
313              case gig::split_type_normal:              case gig::split_type_normal:
314                  dimvalue_from[region->pDimensionDefinitions[dim].dimension] =                  dimvalue_from[region->pDimensionDefinitions[dim].dimension] =
# Line 305  bool DimRegionChooser::on_button_press_e Line 321  bool DimRegionChooser::on_button_press_e
321                  dimvalue_to[region->pDimensionDefinitions[dim].dimension] = z + 1;                  dimvalue_to[region->pDimensionDefinitions[dim].dimension] = z + 1;
322                  break;                  break;
323              }              }
324              if (dimregno < 0) dimregno = 0;  #endif
             int bitcount = 0;  
             for (int i = 0 ; i < dim ; i++) {  
                 bitcount += region->pDimensionDefinitions[i].bits;  
             }  
325    
326              int mask =              dimregno = c | (z << bitpos);
                 ~(((1 << region->pDimensionDefinitions[dim].bits) - 1) <<  
                   bitcount);  
             dimregno &= mask;  
             dimregno |= (z << bitcount);  
327    
328              focus_line = dim;              focus_line = dim;
329              if (has_focus()) queue_draw();              if (has_focus()) queue_draw();

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

  ViewVC Help
Powered by ViewVC