diff options
author | Carl Hetherington <carl@carlh.net> | 2011-07-17 20:10:31 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2011-07-17 20:10:31 +0000 |
commit | 982bfd08db00143df984fa168de3754f7f1e3e86 (patch) | |
tree | 42217b87d524ba1b9859b066f0563313619d47a4 /gtk2_ardour | |
parent | 8786d5c9c21322e0cd08488b31ee3b4bed2c68d6 (diff) |
Add context menu for control points.
git-svn-id: svn://localhost/ardour2/branches/3.0@9890 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/editor.cc | 16 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 7 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 32 |
3 files changed, 40 insertions, 15 deletions
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index daeac13fba..d45d89a96e 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -5486,3 +5486,19 @@ Editor::notebook_tab_clicked (GdkEventButton* ev, Gtk::Widget* page) return true; } +void +Editor::popup_control_point_context_menu (ArdourCanvas::Item* item, GdkEvent* event) +{ + using namespace Menu_Helpers; + + MenuList& items = _control_point_context_menu.items (); + items.clear (); + + items.push_back (MenuElem (_("Edit..."), sigc::bind (sigc::mem_fun (*this, &Editor::edit_control_point), item))); + items.push_back (MenuElem (_("Delete"), sigc::bind (sigc::mem_fun (*this, &Editor::remove_control_point), item))); + if (!can_remove_control_point (item)) { + items.back().set_sensitive (false); + } + + _control_point_context_menu.popup (event->button.button, event->button.time); +} diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index fe3275611b..48aaee427e 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -686,6 +686,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void add_selection_context_items (Gtk::Menu_Helpers::MenuList&); Gtk::MenuItem* _popup_region_menu_item; + void popup_control_point_context_menu (ArdourCanvas::Item *, GdkEvent *); + Gtk::Menu _control_point_context_menu; + void handle_new_route (ARDOUR::RouteList&); void timeaxisview_deleted (TimeAxisView *); @@ -1333,8 +1336,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void region_view_item_click (AudioRegionView&, GdkEventButton*); - void remove_gain_control_point (ArdourCanvas::Item*, GdkEvent*); - void remove_control_point (ArdourCanvas::Item*, GdkEvent*); + bool can_remove_control_point (ArdourCanvas::Item *); + void remove_control_point (ArdourCanvas::Item *); void mouse_brush_insert_region (RegionView*, framepos_t pos); diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 30e117fb59..0e1278ab1f 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1340,6 +1340,10 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT popup_track_context_menu (1, event->button.time, item_type, false); break; + case ControlPointItem: + popup_control_point_context_menu (item, event); + break; + #ifdef WITH_CMT case ImageFrameItem: popup_imageframe_edit_menu(1, event->button.time, item, true) ; @@ -1389,11 +1393,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT break; case ControlPointItem: - if (eff == MouseGain) { - remove_gain_control_point (item, event); - } else { - remove_control_point (item, event); - } + remove_control_point (item); break; case NoteItem: @@ -2065,8 +2065,8 @@ Editor::motion_handler (ArdourCanvas::Item* /*item*/, GdkEvent* event, bool from return true; } -void -Editor::remove_gain_control_point (ArdourCanvas::Item*item, GdkEvent* /*event*/) +bool +Editor::can_remove_control_point (ArdourCanvas::Item* item) { ControlPoint* control_point; @@ -2075,18 +2075,24 @@ Editor::remove_gain_control_point (ArdourCanvas::Item*item, GdkEvent* /*event*/) /*NOTREACHED*/ } - // We shouldn't remove the first or last gain point - if (control_point->line().is_last_point(*control_point) || - control_point->line().is_first_point(*control_point)) { - return; + AutomationLine& line = control_point->line (); + if (dynamic_cast<AudioRegionGainLine*> (&line)) { + /* we shouldn't remove the first or last gain point in region gain lines */ + if (line.is_last_point(*control_point) || line.is_first_point(*control_point)) { + return false; + } } - control_point->line().remove_point (*control_point); + return true; } void -Editor::remove_control_point (ArdourCanvas::Item* item, GdkEvent* /*event*/) +Editor::remove_control_point (ArdourCanvas::Item* item) { + if (!can_remove_control_point (item)) { + return; + } + ControlPoint* control_point; if ((control_point = reinterpret_cast<ControlPoint *> (item->get_data ("control_point"))) == 0) { |