Add context menu for control points.

git-svn-id: svn://localhost/ardour2/branches/3.0@9890 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2011-07-17 20:10:31 +00:00
parent 8786d5c9c2
commit 982bfd08db
3 changed files with 40 additions and 15 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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) {