/[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 1090 by persson, Sat Mar 10 17:08:15 2007 UTC revision 1107 by schoenebeck, Thu Mar 22 20:00:10 2007 UTC
# Line 19  Line 19 
19    
20  #include "regionchooser.h"  #include "regionchooser.h"
21  #include <gdkmm/cursor.h>  #include <gdkmm/cursor.h>
22    #include <gtkmm/stock.h>
23    #include <libintl.h>
24    
25    #define _(String) gettext(String)
26    
27  RegionChooser::RegionChooser()  RegionChooser::RegionChooser()
28  {  {
# Line 44  RegionChooser::RegionChooser() Line 48  RegionChooser::RegionChooser()
48      h1 = 20;      h1 = 20;
49      width = 800;      width = 800;
50    
51      add_events(Gdk::BUTTON_PRESS_MASK | Gdk::POINTER_MOTION_MASK |      actionGroup = Gtk::ActionGroup::create();
52                 Gdk::POINTER_MOTION_HINT_MASK);      actionGroup->add(Gtk::Action::create("Properties",
53                                             Gtk::Stock::PROPERTIES),
54                         sigc::mem_fun(*this,
55                                       &RegionChooser::show_region_properties));
56        actionGroup->add(Gtk::Action::create("Remove", Gtk::Stock::REMOVE),
57                         sigc::mem_fun(*this, &RegionChooser::delete_region));
58        actionGroup->add(Gtk::Action::create("Add", Gtk::Stock::ADD),
59                         sigc::mem_fun(*this, &RegionChooser::add_region));
60        actionGroup->add(Gtk::Action::create("Dimensions", _("Dimensions...")),
61                         sigc::mem_fun(*this, &RegionChooser::manage_dimensions));
62    
63        uiManager = Gtk::UIManager::create();
64        uiManager->insert_action_group(actionGroup);
65        Glib::ustring ui_info =
66            "<ui>"
67            "  <popup name='PopupMenuInsideRegion'>"
68            "    <menuitem action='Properties'/>"
69            "    <menuitem action='Dimensions'/>"
70            "    <menuitem action='Remove'/>"
71            "  </popup>"
72            "  <popup name='PopupMenuOutsideRegion'>"
73            "    <menuitem action='Add'/>"
74            "  </popup>"
75            "</ui>";
76        uiManager->add_ui_from_string(ui_info);
77    
78        popup_menu_inside_region = dynamic_cast<Gtk::Menu*>(
79            uiManager->get_widget("/PopupMenuInsideRegion"));
80        popup_menu_outside_region = dynamic_cast<Gtk::Menu*>(
81            uiManager->get_widget("/PopupMenuOutsideRegion"));
82    
83        add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK |
84                   Gdk::POINTER_MOTION_MASK | Gdk::POINTER_MOTION_HINT_MASK);
85  }  }
86    
87  RegionChooser::~RegionChooser()  RegionChooser::~RegionChooser()
# Line 178  void RegionChooser::draw_region(int from Line 214  void RegionChooser::draw_region(int from
214  void RegionChooser::set_instrument(gig::Instrument* instrument)  void RegionChooser::set_instrument(gig::Instrument* instrument)
215  {  {
216      this->instrument = instrument;      this->instrument = instrument;
217      region = instrument->GetFirstRegion();      region = instrument ? instrument->GetFirstRegion() : 0;
218      queue_draw();      queue_draw();
219      sel_changed_signal.emit();      sel_changed_signal.emit();
220  }  }
221    
 void RegionChooser::set_region(gig::Region* region)  
 {  
     this->region = region;  
     queue_draw();  
 }  
   
222  bool RegionChooser::on_button_release_event(GdkEventButton* event)  bool RegionChooser::on_button_release_event(GdkEventButton* event)
223  {  {
224      if (resize.active) {      if (resize.active) {
# Line 211  bool RegionChooser::on_button_release_ev Line 241  bool RegionChooser::on_button_release_ev
241    
242  bool RegionChooser::on_button_press_event(GdkEventButton* event)  bool RegionChooser::on_button_press_event(GdkEventButton* event)
243  {  {
244      if (instrument) {      if (!instrument) return true;
245    
246        int k = int(event->x / (width - 1) * 128.0);
247    
248        if (event->type == GDK_BUTTON_PRESS && event->button == 3) {
249            gig::Region* r = get_region(k);
250            if (r) {
251                region = r;
252                queue_draw();
253                sel_changed_signal.emit();
254                popup_menu_inside_region->popup(event->button, event->time);
255            } else {
256                new_region_pos = k;
257                popup_menu_outside_region->popup(event->button, event->time);
258            }
259        } else {
260          if (is_in_resize_zone(event->x, event->y)) {          if (is_in_resize_zone(event->x, event->y)) {
261              Gdk::Cursor double_arrow(Gdk::SB_H_DOUBLE_ARROW);              Gdk::Cursor double_arrow(Gdk::SB_H_DOUBLE_ARROW);
262              get_window()->pointer_grab(false,              get_window()->pointer_grab(false,
# Line 221  bool RegionChooser::on_button_press_even Line 266  bool RegionChooser::on_button_press_even
266                                         double_arrow, event->time);                                         double_arrow, event->time);
267              resize.active = true;              resize.active = true;
268          } else {          } else {
269              const int w = width - 1;              gig::Region* r = get_region(k);
270              int i = 0;              if (r) {
271              for (gig::Region *r = instrument->GetFirstRegion() ; r ;                  region = r;
272                   r = instrument->GetNextRegion()) {                  queue_draw();
273                    sel_changed_signal.emit();
                 int x = int(w * (r->KeyRange.low) / 128.0 + 0.5);  
                 int x2 = int(w * (r->KeyRange.high + 1) / 128.0 + 0.5);  
                 if (event->x >= x && event->x < x2) {  
                     region = r;  
                     break;  
                 }  
                 i++;  
274              }              }
             queue_draw();  
             sel_changed_signal.emit();  
275          }          }
276      }      }
277        return true;
278    }
279    
280    gig::Region* RegionChooser::get_region(int key)
281    {
282        for (gig::Region *r = instrument->GetFirstRegion() ; r ;
283             r = instrument->GetNextRegion()) {
284            if (key < r->KeyRange.low) return 0;
285            if (key <= r->KeyRange.high) return r;
286        }
287        return 0;
288  }  }
289    
290  bool RegionChooser::on_motion_notify_event(GdkEventMotion* event)  bool RegionChooser::on_motion_notify_event(GdkEventMotion* event)
# Line 368  sigc::signal<void> RegionChooser::signal Line 415  sigc::signal<void> RegionChooser::signal
415  {  {
416      return sel_changed_signal;      return sel_changed_signal;
417  }  }
418    
419    void RegionChooser::show_region_properties()
420    {
421    }
422    
423    void RegionChooser::add_region()
424    {
425        gig::Region* r;
426        for (r = instrument->GetFirstRegion() ; r ; r = instrument->GetNextRegion()) {
427            if (r->KeyRange.low > new_region_pos) break;
428        }
429    
430        region = instrument->AddRegion();
431        region->KeyRange.low = region->KeyRange.high = new_region_pos;
432    
433        instrument->MoveRegion(region, r);
434        queue_draw();
435        sel_changed_signal.emit();
436    }
437    
438    void RegionChooser::delete_region()
439    {
440        instrument->DeleteRegion(region);
441        region = 0;
442        queue_draw();
443        sel_changed_signal.emit();
444    }
445    
446    void RegionChooser::manage_dimensions()
447    {
448        gig::Region* region = get_region();
449        if (!region) return;
450        dimensionManager.show(region);
451    }

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

  ViewVC Help
Powered by ViewVC