From ec210d50fdf3ee7a5359fff7d22f1be820eb04f4 Mon Sep 17 00:00:00 2001 From: YPozdnyakov Date: Wed, 10 Dec 2014 12:39:07 +0200 Subject: [PATCH] [Summary]: Context menus rework --- gtk2_ardour/editor.cc | 261 +++++++++++----------------- gtk2_ardour/editor.h | 8 +- gtk2_ardour/editor_actions.cc | 2 +- gtk2_ardour/mnemonic-us.bindings.in | 22 +-- 4 files changed, 116 insertions(+), 177 deletions(-) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 919608af6a..3ca2190e35 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -1738,31 +1738,6 @@ Editor::popup_track_context_menu (int button, int32_t time, ItemType item_type, return; } - if (item_type != SelectionItem && clicked_routeview && clicked_routeview->audio_track()) { - - /* Bounce to disk */ - - using namespace Menu_Helpers; - MenuList& edit_items = menu->items(); - - edit_items.push_back (SeparatorElem()); - - switch (clicked_routeview->audio_track()->freeze_state()) { - case AudioTrack::NoFreeze: - edit_items.push_back (MenuElem (_("Freeze"), sigc::mem_fun(*this, &Editor::freeze_route))); - break; - - case AudioTrack::Frozen: - edit_items.push_back (MenuElem (_("Unfreeze"), sigc::mem_fun(*this, &Editor::unfreeze_route))); - break; - - case AudioTrack::UnFrozen: - edit_items.push_back (MenuElem (_("Freeze"), sigc::mem_fun(*this, &Editor::freeze_route))); - break; - } - - } - if (item_type == StreamItem && clicked_routeview) { clicked_routeview->build_underlay_menu(menu); } @@ -1785,7 +1760,7 @@ Editor::build_track_context_menu () MenuList& edit_items = track_context_menu.items(); edit_items.clear(); - add_dstream_context_items (edit_items); + add_track_context_items (edit_items); return &track_context_menu; } @@ -1808,25 +1783,7 @@ Editor::build_track_region_context_menu () MenuList& edit_items = track_region_context_menu.items(); edit_items.clear(); - /* we've just cleared the track region context menu, so the menu that these - two items were on will have disappeared; stop them dangling. - */ - region_edit_menu_split_item = 0; - region_edit_menu_split_multichannel_item = 0; - - RouteTimeAxisView* rtv = dynamic_cast (clicked_axisview); - - if (rtv) { - boost::shared_ptr tr; - boost::shared_ptr pl; - - if ((tr = rtv->track())) { - add_region_context_items (edit_items, tr); - } - } - - add_dstream_context_items (edit_items); - + add_region_context_items (edit_items); return &track_region_context_menu; } @@ -1880,45 +1837,6 @@ Editor::build_track_selection_context_menu () return &track_selection_context_menu; } -void -Editor::add_region_context_items (Menu_Helpers::MenuList& edit_items, boost::shared_ptr track) -{ - using namespace Menu_Helpers; - - /* OK, stick the region submenu at the top of the list, and then add - the standard items. - */ - - RegionSelection rs = get_regions_from_selection_and_entered (); - - string::size_type pos = 0; - string menu_item_name = (rs.size() == 1) ? rs.front()->region()->name() : _("Selected Regions"); - - /* we have to hack up the region name because "_" has a special - meaning for menu titles. - */ - - while ((pos = menu_item_name.find ("_", pos)) != string::npos) { - menu_item_name.replace (pos, 1, "__"); - pos += 2; - } - - if (_popup_region_menu_item == 0) { - _popup_region_menu_item = new MenuItem (menu_item_name); - _popup_region_menu_item->set_submenu (*dynamic_cast (ActionManager::get_widget (X_("/PopupRegionMenu")))); - _popup_region_menu_item->show (); - } else { - _popup_region_menu_item->set_label (menu_item_name); - } - - const framepos_t position = get_preferred_edit_position (false, true); - - edit_items.push_back (*_popup_region_menu_item); - if (track->playlist()->count_regions_at (position) > 1 && (layering_order_editor == 0 || !layering_order_editor->is_visible ())) { - edit_items.push_back (*manage (_region_actions->get_action ("choose-top-region-context-menu")->create_menu_item ())); - } - edit_items.push_back (SeparatorElem()); -} /** Add context menu items relevant to selection ranges. * @param edit_items List to add the items to. @@ -1997,86 +1915,109 @@ Editor::add_selection_context_items (Menu_Helpers::MenuList& edit_items) } } +void +Editor::add_region_context_items (Gtk::Menu_Helpers::MenuList& edit_items) +{ + using namespace Menu_Helpers; + + // Region + + Menu *region_menu = manage (new Menu); + MenuList& region_items = region_menu->items(); + //region_menu->set_name ("ArdourContextMenu"); + region_items.push_back (*manage (ActionManager::get_action_from_name ("rename-region")->create_menu_item ())); + region_items.push_back (*manage (ActionManager::get_action_from_name ("set-loop-from-region")->create_menu_item ())); + region_items.back().set_label ("Set as loop range"); + + // Region -> Position + Menu *position_menu = manage (new Menu); + MenuList& position_items = position_menu->items(); + //position_menu->set_name ("ArdourContextMenu"); + position_items.push_back (*manage (ActionManager::get_action_from_name ("toggle-region-lock")->create_menu_item ())); + position_items.push_back (*manage (ActionManager::get_action_from_name ("naturalize-region")->create_menu_item ())); + region_items.push_back (MenuElem (_("Position"), *position_menu)); + + region_items.push_back (*manage (ActionManager::get_action_from_name ("export-region")->create_menu_item ())); + region_items.back().set_label ("Export region..."); + region_items.push_back (*manage (ActionManager::get_action_from_name ("analyze-region")->create_menu_item ())); + edit_items.push_back (MenuElem (_("Region"), *region_menu)); + + edit_items.push_back (SeparatorElem()); + + // Cut, copy, paste, delete + + edit_items.push_back (*manage (ActionManager::get_action_from_name ("editor-cut")->create_menu_item ())); + edit_items.push_back (*manage (ActionManager::get_action_from_name ("editor-copy")->create_menu_item ())); + edit_items.push_back (*manage (ActionManager::get_action_from_name ("editor-paste")->create_menu_item ())); + edit_items.push_back (*manage (ActionManager::get_action_from_name ("editor-delete")->create_menu_item ())); // or 'remove-region' + + edit_items.push_back (SeparatorElem()); + + // Align Selected Regions + + Menu *align_menu = manage (new Menu); + MenuList& align_items = align_menu->items(); + align_items.push_back (MenuElem (_("Session Start"), sigc::bind (sigc::mem_fun (*this, &Editor::align_regions), ARDOUR::SyncPoint))); + //align_items.back().set_label ("Session Start"); + align_items.push_back (MenuElem (_("Relative"), sigc::bind (sigc::mem_fun (*this, &Editor::align_regions_relative), ARDOUR::SyncPoint))); + edit_items.push_back (MenuElem (_("Align Selected Region"), *align_menu)); + + edit_items.push_back (SeparatorElem()); + + edit_items.push_back (MenuElem (_("Import Audio File"), sigc::bind (sigc::mem_fun(*this, &Editor::add_external_audio_action), ImportToTrack))); + edit_items.push_back (*manage (ActionManager::get_action_from_name ("toggle-region-mute")->create_menu_item ())); + edit_items.push_back (*manage (ActionManager::get_action_from_name ("reverse-region")->create_menu_item ())); + edit_items.push_back (*manage (ActionManager::get_action_from_name ("strip-region-silence")->create_menu_item ())); + edit_items.back().set_label ("Strip Silence"); + edit_items.push_back (*manage (ActionManager::get_action_from_name ("pitch-shift-region")->create_menu_item ())); + edit_items.back().set_label ("Pitch Shift"); + + // Gain + + Menu *gain_menu = manage (new Menu); + MenuList& gain_items = gain_menu->items(); + gain_items.push_back (*manage (ActionManager::get_action_from_name ("boost-region-gain")->create_menu_item ())); + gain_items.push_back (*manage (ActionManager::get_action_from_name ("cut-region-gain")->create_menu_item ())); + edit_items.push_back (MenuElem (_("Gain"), *gain_menu)); +} + void -Editor::add_dstream_context_items (Menu_Helpers::MenuList& edit_items) +Editor::add_track_context_items (Menu_Helpers::MenuList& edit_items) { - using namespace Menu_Helpers; + using namespace Menu_Helpers; + + // Tools menu + Glib::RefPtr act = ActionManager::get_action_from_name ("set-mouse-mode-range"); + assert (act); + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); + Image* icon; + icon = manage (new Gtk::Image (tact->get_active() ? get_icon_path (X_ ("tool_marker_active")) : get_icon_path (X_ ("tool_marker")))); + edit_items.push_back (ImageMenuElem ( ("Range Select Tool \t 1"), *icon, sigc::bind (sigc::mem_fun (*this, &Editor::activate_track_context_menu_action), act))); + + act = ActionManager::get_action_from_name ("set-mouse-mode-object"); + assert (act); + tact = Glib::RefPtr::cast_dynamic (act); + icon = manage (new Gtk::Image (tact->get_active () ? get_icon_path (X_ ("tool_arrow_active")) : get_icon_path (X_ ("tool_arrow")))); + edit_items.push_back (ImageMenuElem ( ("Pointer Tool \t\t 2"), *icon, sigc::bind (sigc::mem_fun (*this, &Editor::activate_track_context_menu_action), act))); + + act = ActionManager::get_action_from_name ("set-mouse-mode-cut"); + assert (act); + tact = Glib::RefPtr::cast_dynamic (act); + icon = manage (new Gtk::Image (tact->get_active () ? get_icon_path (X_ ("tool_cut_active")) : get_icon_path (X_ ("tool_cut")))); + edit_items.push_back (ImageMenuElem ( ("Split Tool \t\t 3"), *icon, sigc::bind (sigc::mem_fun (*this, &Editor::activate_track_context_menu_action), act))); + + act = ActionManager::get_action_from_name ("set-mouse-mode-zoom"); + assert (act); + tact = Glib::RefPtr::cast_dynamic (act); + icon = manage (new Gtk::Image (tact->get_active () ? get_icon_path (X_ ("tool_zoom_active")) : get_icon_path (X_ ("tool_zoom")))); + edit_items.push_back (ImageMenuElem ( ("Zoom Tool \t\t 4"), *icon, sigc::bind (sigc::mem_fun (*this, &Editor::activate_track_context_menu_action), act))); +} - /* Playback */ - - Menu *play_menu = manage (new Menu); - MenuList& play_items = play_menu->items(); - play_menu->set_name ("ArdourContextMenu"); - - play_items.push_back (MenuElem (_("Play From Edit Point"), sigc::mem_fun(*this, &Editor::play_from_edit_point))); - play_items.push_back (MenuElem (_("Play From Start"), sigc::mem_fun(*this, &Editor::play_from_start))); - play_items.push_back (MenuElem (_("Play Region"), sigc::mem_fun(*this, &Editor::play_selected_region))); - play_items.push_back (SeparatorElem()); - play_items.push_back (MenuElem (_("Loop Region"), sigc::bind (sigc::mem_fun (*this, &Editor::set_loop_from_region), true))); - - edit_items.push_back (MenuElem (_("Play"), *play_menu)); - - /* Selection */ - - Menu *select_menu = manage (new Menu); - MenuList& select_items = select_menu->items(); - select_menu->set_name ("ArdourContextMenu"); - - select_items.push_back (MenuElem (_("Select All in Track"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_in_track), Selection::Set))); - select_items.push_back (MenuElem (_("Select All Objects"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_objects), Selection::Set))); - select_items.push_back (MenuElem (_("Invert Selection in Track"), sigc::mem_fun(*this, &Editor::invert_selection_in_track))); - select_items.push_back (MenuElem (_("Invert Selection"), sigc::mem_fun(*this, &Editor::invert_selection))); - select_items.push_back (SeparatorElem()); - select_items.push_back (MenuElem (_("Set Range to Loop Range"), sigc::mem_fun(*this, &Editor::set_selection_from_loop))); - select_items.push_back (MenuElem (_("Set Range to Punch Range"), sigc::mem_fun(*this, &Editor::set_selection_from_punch))); - select_items.push_back (SeparatorElem()); - select_items.push_back (MenuElem (_("Select All After Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), true))); - select_items.push_back (MenuElem (_("Select All Before Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), false))); - select_items.push_back (MenuElem (_("Select All After Playhead"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_cursor), playhead_cursor, true))); - select_items.push_back (MenuElem (_("Select All Before Playhead"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_cursor), playhead_cursor, false))); - select_items.push_back (MenuElem (_("Select All Between Playhead and Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_between), false))); - select_items.push_back (MenuElem (_("Select All Within Playhead and Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_between), true))); - select_items.push_back (MenuElem (_("Select Range Between Playhead and Edit Point"), sigc::mem_fun(*this, &Editor::select_range_between))); - - edit_items.push_back (MenuElem (_("Select"), *select_menu)); - - /* Cut-n-Paste */ - - Menu *cutnpaste_menu = manage (new Menu); - MenuList& cutnpaste_items = cutnpaste_menu->items(); - cutnpaste_menu->set_name ("ArdourContextMenu"); - - cutnpaste_items.push_back (MenuElem (_("Cut"), sigc::mem_fun(*this, &Editor::cut))); - cutnpaste_items.push_back (MenuElem (_("Copy"), sigc::mem_fun(*this, &Editor::copy))); - cutnpaste_items.push_back (MenuElem (_("Paste"), sigc::bind (sigc::mem_fun(*this, &Editor::paste), 1.0f, true))); - - cutnpaste_items.push_back (SeparatorElem()); - - cutnpaste_items.push_back (MenuElem (_("Align"), sigc::bind (sigc::mem_fun (*this, &Editor::align_regions), ARDOUR::SyncPoint))); - cutnpaste_items.push_back (MenuElem (_("Align Relative"), sigc::bind (sigc::mem_fun (*this, &Editor::align_regions_relative), ARDOUR::SyncPoint))); - - edit_items.push_back (MenuElem (_("Edit"), *cutnpaste_menu)); - - /* Adding new material */ - - edit_items.push_back (SeparatorElem()); - edit_items.push_back (MenuElem (_("Insert Selected Region"), sigc::bind (sigc::mem_fun(*this, &Editor::insert_region_list_selection), 1.0f))); - edit_items.push_back (MenuElem (_("Insert Existing Media"), sigc::bind (sigc::mem_fun(*this, &Editor::add_external_audio_action), ImportToTrack))); - - /* Nudge track */ - - Menu *nudge_menu = manage (new Menu()); - MenuList& nudge_items = nudge_menu->items(); - nudge_menu->set_name ("ArdourContextMenu"); - - edit_items.push_back (SeparatorElem()); - nudge_items.push_back (MenuElem (_("Nudge Entire Track Later"), (sigc::bind (sigc::mem_fun(*this, &Editor::nudge_track), false, true)))); - nudge_items.push_back (MenuElem (_("Nudge Track After Edit Point Later"), (sigc::bind (sigc::mem_fun(*this, &Editor::nudge_track), true, true)))); - nudge_items.push_back (MenuElem (_("Nudge Entire Track Earlier"), (sigc::bind (sigc::mem_fun(*this, &Editor::nudge_track), false, false)))); - nudge_items.push_back (MenuElem (_("Nudge Track After Edit Point Earlier"), (sigc::bind (sigc::mem_fun(*this, &Editor::nudge_track), true, false)))); - - edit_items.push_back (MenuElem (_("Nudge"), *nudge_menu)); +void +Editor::activate_track_context_menu_action (Glib::RefPtr& act) +{ + act->activate (); } void diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index f8a403dc2e..ea46c61ac1 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -684,11 +684,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::Menu* build_track_bus_context_menu (); Gtk::Menu* build_track_region_context_menu (); Gtk::Menu* build_track_selection_context_menu (); - void add_dstream_context_items (Gtk::Menu_Helpers::MenuList&); void add_bus_context_items (Gtk::Menu_Helpers::MenuList&); - void add_region_context_items (Gtk::Menu_Helpers::MenuList&, boost::shared_ptr); void add_selection_context_items (Gtk::Menu_Helpers::MenuList&); - Gtk::MenuItem* _popup_region_menu_item; + void add_region_context_items (Gtk::Menu_Helpers::MenuList&); + void add_track_context_items (Gtk::Menu_Helpers::MenuList&); + void activate_track_context_menu_action (Glib::RefPtr& ); + + Gtk::MenuItem* _popup_region_menu_item; void popup_control_point_context_menu (ArdourCanvas::Item *, GdkEvent *); Gtk::Menu _control_point_context_menu; diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index 625d7d97a4..0e1f1dbdb9 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -1818,7 +1818,7 @@ Editor::register_region_actions () reg_sens (_region_actions, "remove-region", _("Remove"), sigc::mem_fun (*this, &Editor::remove_selected_regions)); /* Offer dialogue box to rename the first selected region */ - reg_sens (_region_actions, "rename-region", _("Rename..."), sigc::mem_fun (*this, &Editor::rename_region)); + reg_sens (_region_actions, "rename-region", _("Rename"), sigc::mem_fun (*this, &Editor::rename_region)); /* Raise all selected regions by 1 layer */ reg_sens (_region_actions, "raise-region", _("Raise"), sigc::mem_fun (*this, &Editor::raise_region)); diff --git a/gtk2_ardour/mnemonic-us.bindings.in b/gtk2_ardour/mnemonic-us.bindings.in index 4d43b18db6..53727a446e 100644 --- a/gtk2_ardour/mnemonic-us.bindings.in +++ b/gtk2_ardour/mnemonic-us.bindings.in @@ -121,7 +121,7 @@ This mode provides many different operations on both regions and control points, @eep|Editor/trim-to-next-region|<@PRIMARY@>k|trim region to start of next region @ranges|Editor/set-loop-from-edit-range|bracketright|set loop range from edit range -@ranges|Region/set-loop-from-region|<@SECONDARY@>bracketright|set loop range from region(s) +@ranges|Region/set-loop-from-region|<@PRIMARY@>L|set loop range from region(s) @ranges|Editor/set-punch-from-edit-range|bracketleft|set punch range from edit range @ranges|Region/set-punch-from-region|<@SECONDARY@>bracketleft|set punch range from region(s) @@ -141,19 +141,19 @@ This mode provides many different operations on both regions and control points, @mmode|MouseMode/toggle-internal-edit|e|toggle MIDI note editing @select|Editor/select-all-before-edit-cursor|<@PRIMARY@>e|select all before EP -@rop|Region/export-region|<@PRIMARY@><@LEVEL4@>e|export selected region(s) + @sess|Main/ExportSession|<@LEVEL4@>e|export session @select|Editor/select-all-after-edit-cursor|<@PRIMARY@><@TERTIARY@>e|select all after EP @vis|Editor/show-editor-mixer|i|toggle editor window mixer @vis|Common/toggle-mixer|m|toggle mixer @vis|Common/toggle-meterbridge|b|toggle meterBridge @wvis|Common/goto-editor|<@WINDOW@>e|toggle editor window -@mmode|MouseMode/set-mouse-mode-range|r|range mode @edit|Editor/redo|<@PRIMARY@>r|redo -@rop|Region/reverse-region|<@SECONDARY@>r|reverse +;;@rop|Region/reverse-region|<@SECONDARY@>r|reverse @trans|Transport/Record|<@TERTIARY@>r|engage record @mmode|MouseMode/set-mouse-mode-timefx|t|timefx mode @rop|Region/pitch-shift-region|<@SECONDARY@>t|transpose +@rop|Region/strip-region-silence|<@SECONDARY@>l|transpose @eep|Editor/select-all-tracks|<@PRIMARY@>t|select all tracks @mmode|MouseMode/set-mouse-mode-object-range|y|link object/range tools @edit|Editor/alternate-redo|<@PRIMARY@>y|redo @@ -163,7 +163,6 @@ This mode provides many different operations on both regions and control points, @select|Editor/invert-selection|<@TERTIARY@>i|invert selection @sess|Editor/addExistingAudioFiles|<@PRIMARY@>i|import audio files @sess|Editor/toggle-midi-input-active|<@SECONDARY@>i|toggle sel. track MIDI input -@mmode|MouseMode/set-mouse-mode-object|o|object mode @sess|Main/Open|<@PRIMARY@>o|open an existing session @sess|Main/Recent|<@PRIMARY@><@TERTIARY@>o|open a recent session @sess|Window/toggle-tracks-control-panel|<@PRIMARY@>comma|open preferences dialog @@ -206,12 +205,10 @@ This mode provides many different operations on both regions and control points, @eep|Region/trim-back|k|trim back @wvis|Window/toggle-key-editor|<@WINDOW@>k|toggle key bindings editor @trans|Transport/Loop|l|loop play (the loop range) -@select|Editor/select-all-in-loop-range|<@PRIMARY@>l|select all in loop range @wvis|Window/toggle-locations|<@WINDOW@>l| toggle locations dialog ;; BOTTOM ROW -@mmode|MouseMode/set-mouse-mode-zoom|z|zoom mode @edit|Editor/undo|<@PRIMARY@>z|undo @edit|Editor/alternate-alternate-redo|<@PRIMARY@><@TERTIARY@>z|redo @vis|Editor/zoom-to-region|<@PRIMARY@><@SECONDARY@>z|zoom (x) to selected region(s) @@ -219,7 +216,6 @@ This mode provides many different operations on both regions and control points, @vis|Editor/toggle-zoom|<@TERTIARY@>z|toggle last 2 zoom states @edit|Editor/editor-cut|<@PRIMARY@>x|cut ;@-group|Editor/crop|c|some text -@mmode|MouseMode/set-mouse-mode-cut|c|cut mode @edit|Editor/editor-copy|<@PRIMARY@>c|copy @wvis|Window/toggle-theme-manager|<@WINDOW@>c|toggle color manager @rop|Region/set-region-sync-position|v|set region sync point @@ -267,6 +263,7 @@ This mode provides many different operations on both regions and control points, @movp|Transport/GotoStart|Home|to start marker @movp|Transport/GotoEnd|End|to end marker @edit|Editor/editor-delete|Delete|delete +@edit|Editor/remove-region|Delete|delete selected region @edit|Editor/alternate-editor-delete|BackSpace|backspace (delete) @select|Editor/escape|Escape|break drag or deselect all @@ -338,12 +335,11 @@ This mode provides many different operations on both regions and control points, ;; numbers - -@eep|Editor/cycle-zoom-focus|1|cycle to next zoom focus -@eep|Editor/cycle-snap-mode|2|cycle to next grid snap mode -@eep|Editor/prev-snap-choice|3|use next grid unit +@mmode|MouseMode/set-mouse-mode-range|1|range mode +@mmode|MouseMode/set-mouse-mode-object|2|link object/range tools +@mmode|MouseMode/set-mouse-mode-cut|3|cut mode +@mmode|MouseMode/set-mouse-mode-zoom|4|zoom mode @eep|Editor/prev-snap-choice-music-only|<@PRIMARY@>3|use previous grid unit -@eep|Editor/next-snap-choice|4|use next grid unit @eep|Editor/next-snap-choice-music-only|<@PRIMARY@>4|use next musical grid unit @trans|Transport/ToggleAutoPlay|5|toggle auto play @trans|Transport/ToggleAutoReturn|6|toggle auto return