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

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

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

revision 1089 by persson, Sat Mar 3 12:20:01 2007 UTC revision 1090 by persson, Sat Mar 10 17:08:15 2007 UTC
# Line 39  RegionChooser::RegionChooser() Line 39  RegionChooser::RegionChooser()
39      colormap->alloc_color(grey1);      colormap->alloc_color(grey1);
40      instrument = 0;      instrument = 0;
41      region = 0;      region = 0;
42        resize.active = false;
43        cursor_is_resize = false;
44        h1 = 20;
45        width = 800;
46    
47      add_events(Gdk::BUTTON_PRESS_MASK | Gdk::POINTER_MOTION_MASK);      add_events(Gdk::BUTTON_PRESS_MASK | Gdk::POINTER_MOTION_MASK |
48                   Gdk::POINTER_MOTION_HINT_MASK);
49  }  }
50    
51  RegionChooser::~RegionChooser()  RegionChooser::~RegionChooser()
# Line 62  bool RegionChooser::on_expose_event(GdkE Line 67  bool RegionChooser::on_expose_event(GdkE
67  {  {
68      Glib::RefPtr<Gdk::Window> window = get_window();      Glib::RefPtr<Gdk::Window> window = get_window();
69      window->clear();      window->clear();
     const int h1 = 20;  
70      const int h = 40;      const int h = 40;
71      const int w = 800 - 1;      const int w = width - 1;
72      const int bh = int(h * 0.55);      const int bh = int(h * 0.55);
73    
74      Glib::RefPtr<const Gdk::GC> black = get_style()->get_black_gc();      Glib::RefPtr<const Gdk::GC> black = get_style()->get_black_gc();
# Line 105  bool RegionChooser::on_expose_event(GdkE Line 109  bool RegionChooser::on_expose_event(GdkE
109                  window->draw_rectangle(white, true, x3 + 1, 1, x2 - x3 - 1, h1 - 2);                  window->draw_rectangle(white, true, x3 + 1, 1, x2 - x3 - 1, h1 - 2);
110                  x3 = -1;                  x3 = -1;
111              }              }
 //          draw_region(r->KeyRange.low, r->KeyRange.high + 1, i % 3 == 0 ? blue : i % 3 == 1 ? red : green);  
112              i++;              i++;
113          }          }
114    
# Line 135  void RegionChooser::on_size_request(GtkR Line 138  void RegionChooser::on_size_request(GtkR
138  }  }
139    
140    
141    // not used
142  void RegionChooser::draw_region(int from, int to, const Gdk::Color& color)  void RegionChooser::draw_region(int from, int to, const Gdk::Color& color)
143  {  {
     const int h1 = 20;  
144      const int h = 40;      const int h = 40;
145      const int w = 800;      const int w = width;
146      const int bh = int(h * 0.55);      const int bh = int(h * 0.55);
147    
148      Glib::RefPtr<Gdk::Window> window = get_window();      Glib::RefPtr<Gdk::Window> window = get_window();
# Line 186  void RegionChooser::set_region(gig::Regi Line 189  void RegionChooser::set_region(gig::Regi
189      queue_draw();      queue_draw();
190  }  }
191    
192  bool RegionChooser::on_button_press_event(GdkEventButton* event)  bool RegionChooser::on_button_release_event(GdkEventButton* event)
193  {  {
194      const int w = 800 - 1;      if (resize.active) {
195            get_window()->pointer_ungrab(event->time);
196            resize.active = false;
197    
198            if (resize.mode == resize.moving_high_limit) {
199                resize.region->KeyRange.high = resize.pos - 1;
200            } else if (resize.mode == resize.moving_low_limit) {
201                resize.region->KeyRange.low = resize.pos;
202            }
203    
204            if (!is_in_resize_zone(event->x, event->y) && cursor_is_resize) {
205                get_window()->set_cursor();
206                cursor_is_resize = false;
207            }
208        }
209        return true;
210    }
211    
212    bool RegionChooser::on_button_press_event(GdkEventButton* event)
213    {
214      if (instrument) {      if (instrument) {
215          int i = 0;          if (is_in_resize_zone(event->x, event->y)) {
216          for (gig::Region *r = instrument->GetFirstRegion() ;              Gdk::Cursor double_arrow(Gdk::SB_H_DOUBLE_ARROW);
217               r ;              get_window()->pointer_grab(false,
218               r = instrument->GetNextRegion()) {                                         Gdk::BUTTON_RELEASE_MASK |
219              int x = int(w * (r->KeyRange.low) / 128.0 + 0.5);                                         Gdk::POINTER_MOTION_MASK |
220              int x2 = int(w * (r->KeyRange.high + 1) / 128.0 + 0.5);                                         Gdk::POINTER_MOTION_HINT_MASK,
221              if (event->x >= x && event->x < x2) {                                         double_arrow, event->time);
222                  region = r;              resize.active = true;
223                  break;          } else {
224                const int w = width - 1;
225                int i = 0;
226                for (gig::Region *r = instrument->GetFirstRegion() ; r ;
227                     r = instrument->GetNextRegion()) {
228    
229                    int x = int(w * (r->KeyRange.low) / 128.0 + 0.5);
230                    int x2 = int(w * (r->KeyRange.high + 1) / 128.0 + 0.5);
231                    if (event->x >= x && event->x < x2) {
232                        region = r;
233                        break;
234                    }
235                    i++;
236              }              }
237              i++;              queue_draw();
238                sel_changed_signal.emit();
239          }          }
         queue_draw();  
         sel_changed_signal.emit();  
240      }      }
241  }  }
242    
 // muspekarexperiment. Fel eventhantering - se example_drawingarea.cc  
 bool inside = false;  
243  bool RegionChooser::on_motion_notify_event(GdkEventMotion* event)  bool RegionChooser::on_motion_notify_event(GdkEventMotion* event)
244  {  {
245      if (event->x > 100 && event->x < 120) {      const int w = width - 1;
246          if (!inside) {      Glib::RefPtr<Gdk::Window> window = get_window();
247              Gdk::Cursor oj(Gdk::CROSSHAIR);      int x, y;
248              get_window()->set_cursor(oj);      Gdk::ModifierType state = Gdk::ModifierType(0);
249              inside = true;      window->get_pointer(x, y, state);
250          }      if (resize.active) {
251      } else if (inside) {          int k = int(double(x) / w * 128.0 + 0.5);
252          get_window()->set_cursor();  
253          inside = false;          if (k < resize.min) k = resize.min;
254            else if (k > resize.max) k = resize.max;
255    
256            if (k != resize.pos) {
257                if (resize.mode == resize.undecided) {
258                    if (k < resize.pos) {
259                        // edit high limit of prev_region
260                        resize.max = resize.region->KeyRange.low;
261                        resize.region = resize.prev_region;
262                        resize.mode = resize.moving_high_limit;
263                    } else {
264                        // edit low limit of region
265                        resize.min = resize.prev_region->KeyRange.high + 1;
266                        resize.mode = resize.moving_low_limit;
267                    }
268                }
269                Glib::RefPtr<const Gdk::GC> black = get_style()->get_black_gc();
270                Glib::RefPtr<const Gdk::GC> white = get_style()->get_white_gc();
271                if (region == resize.region) {
272                    gc->set_foreground(red);
273                    white = gc;
274                }
275                Glib::RefPtr<const Gdk::GC> bg = get_style()->get_bg_gc(Gtk::STATE_NORMAL);
276                int prevx = int(w * resize.pos / 128.0 + 0.5);
277                x = int(w * k / 128.0 + 0.5);
278    
279                if (resize.mode == resize.moving_high_limit) {
280                    if (k > resize.pos) {
281                        window->draw_rectangle(white, true, prevx, 1, x - prevx, h1 - 2);
282                        window->draw_line(black, prevx, 0, x, 0);
283                        window->draw_line(black, prevx, h1 - 1, x, h1 - 1);
284                    } else {
285                        int xx = ((resize.pos == resize.max && resize.max != 128) ? 1 : 0);
286                        window->draw_rectangle(bg, true, x + 1, 0, prevx - x - xx, h1);
287                    }
288                } else {
289                    if (k < resize.pos) {
290                        window->draw_rectangle(white, true, x + 1, 1, prevx - x, h1 - 2);
291                        window->draw_line(black, x, 0, prevx, 0);
292                        window->draw_line(black, x, h1 - 1, prevx, h1 - 1);
293                    } else {
294                        int xx = ((resize.pos == resize.min && resize.min != 0) ? 1 : 0);
295                        window->draw_rectangle(bg, true, prevx + xx, 0, x - prevx - xx, h1);
296                    }
297                }
298                window->draw_line(black, x, 1, x, h1 - 2);
299                resize.pos = k;
300            }
301        } else {
302            if (is_in_resize_zone(x, y)) {
303                if (!cursor_is_resize) {
304                    Gdk::Cursor double_arrow(Gdk::SB_H_DOUBLE_ARROW);
305                    window->set_cursor(double_arrow);
306                    cursor_is_resize = true;
307                }
308            } else if (cursor_is_resize) {
309                window->set_cursor();
310                cursor_is_resize = false;
311            }
312        }
313    
314        return true;
315    }
316    
317    bool RegionChooser::is_in_resize_zone(double x, double y) {
318        const int w = width - 1;
319    
320        if (instrument && y >= 0 && y <= h1) {
321            gig::Region* prev_region = 0;
322            gig::Region* next_region;
323            for (gig::Region* r = instrument->GetFirstRegion() ; r ; r = next_region) {
324                next_region = instrument->GetNextRegion();
325    
326                int lo = int(w * (r->KeyRange.low) / 128.0 + 0.5);
327                if (x <= lo - 2) break;
328                if (x < lo + 2) {
329                    resize.region = r;
330                    resize.pos = r->KeyRange.low;
331                    resize.max = r->KeyRange.high;
332    
333                    if (prev_region && prev_region->KeyRange.high + 1 == r->KeyRange.low) {
334                        // we don't know yet if it's the high limit of
335                        // prev_region or the low limit of r that's going
336                        // to be edited
337                        resize.mode = resize.undecided;
338                        resize.min = prev_region->KeyRange.low + 1;
339                        resize.prev_region = prev_region;
340                        return true;
341                    }
342    
343                    // edit low limit
344                    resize.mode = resize.moving_low_limit;
345                    resize.min = prev_region ? prev_region->KeyRange.high + 1 : 0;
346                    return true;
347                }
348                if (!next_region || r->KeyRange.high + 1 != next_region->KeyRange.low) {
349                    int hi = int(w * (r->KeyRange.high + 1) / 128.0 + 0.5);
350                    if (x <= hi - 2) break;
351                    if (x < hi + 2) {
352                        // edit high limit
353                        resize.region = r;
354                        resize.pos = r->KeyRange.high + 1;
355                        resize.mode = resize.moving_high_limit;
356                        resize.min = r->KeyRange.low + 1;
357                        resize.max = next_region ? next_region->KeyRange.low : 128;
358                        return true;
359                    }
360                }
361                prev_region = r;
362            }
363      }      }
364        return false;
365  }  }
366    
367  sigc::signal<void> RegionChooser::signal_sel_changed()  sigc::signal<void> RegionChooser::signal_sel_changed()

Legend:
Removed from v.1089  
changed lines
  Added in v.1090

  ViewVC Help
Powered by ViewVC