summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2011-07-17 20:10:31 +0000
committerCarl Hetherington <carl@carlh.net>2011-07-17 20:10:31 +0000
commit982bfd08db00143df984fa168de3754f7f1e3e86 (patch)
tree42217b87d524ba1b9859b066f0563313619d47a4 /gtk2_ardour
parent8786d5c9c21322e0cd08488b31ee3b4bed2c68d6 (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.cc16
-rw-r--r--gtk2_ardour/editor.h7
-rw-r--r--gtk2_ardour/editor_mouse.cc32
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) {