diff --git a/doc/region_ops.txt b/doc/region_ops.txt new file mode 100644 index 0000000000..69851bf3eb --- /dev/null +++ b/doc/region_ops.txt @@ -0,0 +1,36 @@ +How to choose what regions to perform operations on +--------------------------------------------------- + +Divide region actions into 3 groups: + +1. Actions that operate on the selection, and for which the edit point type and location is irrelevant. +e.g. remove-region, rename-region, boost-region-gain + +2. Actions that are not related to the selection, but for which the edit point location is important +e.g. insert-region-from-region-list + +3. Actions that operate on the selection, and for which the edit point location is important +e.g. set-region-sync-position, place-transient + + +For group 1, Editor::get_regions_from_selection_and_entered() is used to decide which regions to operate +on. This method returns the selected regions, unless there are none, in which case it returns the last +region that the mouse entered. + +For group 3, Editor::get_regions_from_selection_and_edit_point() is used to decide which regions to operate +on. + +If the edit point is `mouse': + if the mouse is over a selected region, or no region, this method returns all selected regions. + if the mouse is over an unselected region, just that region is returned. + +For other edit points the method returns the selected regions AND those that are both under the edit position +AND on a selected track, or on a track which is in the same active edit-enabled route group as a selected +region. + +The action handlers call the appropriate method to decide which regions to operate on. + +In addition, Editor::sensitize_the_right_region_actions() is called when a Region menu is about to be displayed, +and it sensitizes the actions that are appropriate given the current situation. When selecting things from +a menu, group 3 operations are disabled if the edit point is `mouse', as the mouse will be positioned over +the menu and its position is hence meaningless. diff --git a/gtk2_ardour/SAE-de-keypad.bindings.in b/gtk2_ardour/SAE-de-keypad.bindings.in index 329e416c6d..b142c58a96 100644 --- a/gtk2_ardour/SAE-de-keypad.bindings.in +++ b/gtk2_ardour/SAE-de-keypad.bindings.in @@ -39,7 +39,7 @@ (gtk_accel_path "/Editor/set-fade-in-length" "q") (gtk_accel_path "/Common/Quit" "<@PRIMARY@>q") -(gtk_accel_path "/Editor/toggle-fade-in-active" "<@SECONDARY@>q") +(gtk_accel_path "/Editor/toggle-region-fade-in" "<@SECONDARY@>q") (gtk_accel_path "/Editor/set-playhead" "w") ;; note that ctrl-w is special and consumed by the keyboard snooper @@ -47,7 +47,7 @@ (gtk_accel_path "/Main/Close" "<@PRIMARY@>w") (gtk_accel_path "/Editor/set-fade-out-length" "e") (gtk_accel_path "/Main/ExportSession" "<@PRIMARY@>e") -(gtk_accel_path "/Editor/toggle-fade-out-active" "<@SECONDARY@>e") +(gtk_accel_path "/Editor/toggle-region-fade-out" "<@SECONDARY@>e") (gtk_accel_path "/Editor/export-region" "<@PRIMARY@><@TERTIARY@>e") (gtk_accel_path "/Editor/show-editor-mixer" "<@TERTIARY@>e") ; (gtk_accel_path "/Common/goto-editor" "<@SECONDARY@>e") @@ -61,7 +61,7 @@ (gtk_accel_path "/Editor/pitch-shift-region" "<@LEVEL4@>t") (gtk_accel_path "/Editor/split-region" "y") (gtk_accel_path "/Editor/set-region-sync-position" "u") -(gtk_accel_path "/Editor/insert-region" "i") +(gtk_accel_path "/Editor/insert-region-from-region-list" "i") (gtk_accel_path "/Editor/addExistingAudioFiles" "<@PRIMARY@>i") (gtk_accel_path "/Editor/invert-selection" "<@TERTIARY@>i") (gtk_accel_path "/Main/Open" "<@PRIMARY@>o") @@ -83,7 +83,7 @@ (gtk_accel_path "/Editor/duplicate-region" "<@PRIMARY@>d") (gtk_accel_path "/Editor/multi-duplicate-region" "<@PRIMARY@><@TERTIARY@>d") (gtk_accel_path "/Editor/toggle-follow-playhead" "f") -(gtk_accel_path "/Editor/toggle-rhythm-ferret" "<@WINDOW@>f") +(gtk_accel_path "/Editor/show-rhythm-ferret" "<@WINDOW@>f") ; (gtk_accel_path "/Editor/set-edit-point" "g") ; (gtk_accel_path "/MouseMode/set-mouse-mode-gain" "g") (gtk_accel_path "/Editor/nudge-backward" "g") @@ -91,7 +91,7 @@ (gtk_accel_path "/Common/ToggleKeyEditor" "<@SECONDARY@>k") (gtk_accel_path "/Common/ToggleLocations" "<@SECONDARY@>l") (gtk_accel_path "/Transport/Loop" "l") -(gtk_accel_path "/Editor/lock-region" "<@LEVEL4@>l") +(gtk_accel_path "/Editor/toggle-region-lock" "<@LEVEL4@>l") (gtk_accel_path "/Editor/select-all-in-loop-range" "<@TERTIARY@>l") ;; UNTERE ZEILE @@ -113,7 +113,7 @@ (gtk_accel_path "/Main/AddTrackBus" "<@PRIMARY@><@TERTIARY@>n") (gtk_accel_path "/Common/toggle-editor-mixer-on-top" "<@SECONDARY@>m") (gtk_accel_path "/Editor/add-location-from-playhead" "KP_Enter") -(gtk_accel_path "/Editor/mute-unmute-region" "m") +(gtk_accel_path "/Editor/toggle-region-mute" "m") ;; arrow keys, navigation etc. diff --git a/gtk2_ardour/SAE-de-nokeypad.bindings.in b/gtk2_ardour/SAE-de-nokeypad.bindings.in index 7a70663d2d..d91eed041e 100644 --- a/gtk2_ardour/SAE-de-nokeypad.bindings.in +++ b/gtk2_ardour/SAE-de-nokeypad.bindings.in @@ -39,7 +39,7 @@ (gtk_accel_path "/Editor/set-fade-in-length" "q") (gtk_accel_path "/Common/Quit" "<@PRIMARY@>q") -(gtk_accel_path "/Editor/toggle-fade-in-active" "<@SECONDARY@>q") +(gtk_accel_path "/Editor/toggle-region-fade-in" "<@SECONDARY@>q") (gtk_accel_path "/Editor/set-playhead" "w") ;; note that ctrl-w is special and consumed by the keyboard snooper @@ -47,7 +47,7 @@ (gtk_accel_path "/Main/Close" "<@PRIMARY@>w") (gtk_accel_path "/Editor/set-fade-out-length" "e") (gtk_accel_path "/Main/ExportSession" "<@PRIMARY@>e") -(gtk_accel_path "/Editor/toggle-fade-out-active" "<@SECONDARY@>e") +(gtk_accel_path "/Editor/toggle-region-fade-out" "<@SECONDARY@>e") (gtk_accel_path "/Editor/export-region" "<@PRIMARY@><@TERTIARY@>e") (gtk_accel_path "/Editor/show-editor-mixer" "<@TERTIARY@>e") ; (gtk_accel_path "/Common/goto-editor" "<@SECONDARY@>e") @@ -61,7 +61,7 @@ (gtk_accel_path "/Editor/pitch-shift-region" "<@LEVEL4@>t") (gtk_accel_path "/Editor/split-region" "y") (gtk_accel_path "/Editor/set-region-sync-position" "u") -(gtk_accel_path "/Editor/insert-region" "i") +(gtk_accel_path "/Editor/insert-region-from-region-list" "i") (gtk_accel_path "/Editor/addExistingAudioFiles" "<@PRIMARY@>i") (gtk_accel_path "/Editor/invert-selection" "<@TERTIARY@>i") (gtk_accel_path "/Main/Open" "<@PRIMARY@>o") @@ -83,7 +83,7 @@ (gtk_accel_path "/Editor/duplicate-region" "<@PRIMARY@>d") (gtk_accel_path "/Editor/multi-duplicate-region" "<@PRIMARY@><@TERTIARY@>d") (gtk_accel_path "/Editor/toggle-follow-playhead" "f") -(gtk_accel_path "/Editor/toggle-rhythm-ferret" "<@SECONDARY@>f") +(gtk_accel_path "/Editor/show-rhythm-ferret" "<@SECONDARY@>f") ; (gtk_accel_path "/Editor/set-edit-point" "g") ; (gtk_accel_path "/MouseMode/set-mouse-mode-gain" "g") (gtk_accel_path "/Editor/nudge-backward" "g") @@ -91,7 +91,7 @@ (gtk_accel_path "/Common/ToggleKeyEditor" "<@SECONDARY@>k") (gtk_accel_path "/Common/ToggleLocations" "<@SECONDARY@>l") (gtk_accel_path "/Transport/Loop" "l") -(gtk_accel_path "/Editor/lock-region" "<@LEVEL4@>l") +(gtk_accel_path "/Editor/toggle-region-lock" "<@LEVEL4@>l") (gtk_accel_path "/Editor/select-all-in-loop-range" "<@TERTIARY@>l") ;; UNTERE ZEILE @@ -112,7 +112,7 @@ (gtk_accel_path "/Main/New" "<@PRIMARY@>n") (gtk_accel_path "/Main/AddTrackBus" "<@PRIMARY@><@TERTIARY@>n") (gtk_accel_path "/Common/toggle-editor-mixer-on-top" "<@SECONDARY@>m") -(gtk_accel_path "/Editor/mute-unmute-region" "m") +(gtk_accel_path "/Editor/toggle-region-mute" "m") ;; arrow keys, navigation etc. diff --git a/gtk2_ardour/SAE-us-keypad.bindings.in b/gtk2_ardour/SAE-us-keypad.bindings.in index b2524ff4cd..c10a8cc062 100644 --- a/gtk2_ardour/SAE-us-keypad.bindings.in +++ b/gtk2_ardour/SAE-us-keypad.bindings.in @@ -37,7 +37,7 @@ (gtk_accel_path "/Editor/set-fade-in-length" "q") (gtk_accel_path "/Common/Quit" "<@PRIMARY@>q") -(gtk_accel_path "/Editor/toggle-fade-in-active" "<@SECONDARY@>q") +(gtk_accel_path "/Editor/toggle-region-fade-in" "<@SECONDARY@>q") (gtk_accel_path "/Editor/set-playhead" "w") ;; note that ctrl-w is special and consumed by the keyboard snooper @@ -45,7 +45,7 @@ (gtk_accel_path "/Main/Close" "<@PRIMARY@>w") (gtk_accel_path "/Editor/set-fade-out-length" "e") (gtk_accel_path "/Main/ExportSession" "<@PRIMARY@>e") -(gtk_accel_path "/Editor/toggle-fade-out-active" "<@SECONDARY@>e") +(gtk_accel_path "/Editor/toggle-region-fade-out" "<@SECONDARY@>e") (gtk_accel_path "/Editor/export-region" "<@PRIMARY@><@TERTIARY@>e") (gtk_accel_path "/Editor/show-editor-mixer" "<@TERTIARY@>e") ; (gtk_accel_path "/Common/goto-editor" "<@SECONDARY@>e") @@ -59,7 +59,7 @@ (gtk_accel_path "/Editor/pitch-shift-region" "<@LEVEL4@>t") (gtk_accel_path "/Editor/split-region" "z") (gtk_accel_path "/Editor/set-region-sync-position" "u") -(gtk_accel_path "/Editor/insert-region" "i") +(gtk_accel_path "/Editor/insert-region-from-region-list" "i") (gtk_accel_path "/Editor/addExistingAudioFiles" "<@PRIMARY@>i") (gtk_accel_path "/Editor/invert-selection" "<@TERTIARY@>i") (gtk_accel_path "/Main/Open" "<@PRIMARY@>o") @@ -81,7 +81,7 @@ (gtk_accel_path "/Editor/duplicate-region" "<@PRIMARY@>d") (gtk_accel_path "/Editor/multi-duplicate-region" "<@PRIMARY@><@TERTIARY@>d") (gtk_accel_path "/Editor/toggle-follow-playhead" "f") -(gtk_accel_path "/Editor/toggle-rhythm-ferret" "<@WINDOW@>f") +(gtk_accel_path "/Editor/show-rhythm-ferret" "<@WINDOW@>f") ; (gtk_accel_path "/Editor/set-edit-point" "g") ; (gtk_accel_path "/MouseMode/set-mouse-mode-gain" "g") (gtk_accel_path "/Editor/nudge-backward" "g") @@ -89,7 +89,7 @@ (gtk_accel_path "/Common/ToggleKeyEditor" "<@SECONDARY@>k") (gtk_accel_path "/Common/ToggleLocations" "<@SECONDARY@>l") (gtk_accel_path "/Transport/Loop" "l") -(gtk_accel_path "/Editor/lock-region" "<@LEVEL4@>l") +(gtk_accel_path "/Editor/toggle-region-lock" "<@LEVEL4@>l") (gtk_accel_path "/Editor/select-all-in-loop-range" "<@TERTIARY@>l") ;; UNTERE ZEILE @@ -111,7 +111,7 @@ (gtk_accel_path "/Main/AddTrackBus" "<@PRIMARY@><@TERTIARY@>n") (gtk_accel_path "/Common/toggle-editor-mixer-on-top" "<@SECONDARY@>m") (gtk_accel_path "/Editor/add-location-from-playhead" "KP_Enter") -(gtk_accel_path "/Editor/mute-unmute-region" "m") +(gtk_accel_path "/Editor/toggle-region-mute" "m") ;; arrow keys, navigation etc. diff --git a/gtk2_ardour/SAE-us-nokeypad.bindings.in b/gtk2_ardour/SAE-us-nokeypad.bindings.in index 94329409ac..2494b31259 100644 --- a/gtk2_ardour/SAE-us-nokeypad.bindings.in +++ b/gtk2_ardour/SAE-us-nokeypad.bindings.in @@ -37,7 +37,7 @@ (gtk_accel_path "/Editor/set-fade-in-length" "q") (gtk_accel_path "/Common/Quit" "<@PRIMARY@>q") -(gtk_accel_path "/Editor/toggle-fade-in-active" "<@SECONDARY@>q") +(gtk_accel_path "/Editor/toggle-region-fade-in" "<@SECONDARY@>q") (gtk_accel_path "/Editor/set-playhead" "w") ;; note that ctrl-w is special and consumed by the keyboard snooper @@ -45,7 +45,7 @@ (gtk_accel_path "/Main/Close" "<@PRIMARY@>w") (gtk_accel_path "/Editor/set-fade-out-length" "e") (gtk_accel_path "/Main/ExportSession" "<@PRIMARY@>e") -(gtk_accel_path "/Editor/toggle-fade-out-active" "<@SECONDARY@>e") +(gtk_accel_path "/Editor/toggle-region-fade-out" "<@SECONDARY@>e") (gtk_accel_path "/Editor/export-region" "<@PRIMARY@><@TERTIARY@>e") (gtk_accel_path "/Editor/show-editor-mixer" "<@TERTIARY@>e") ; (gtk_accel_path "/Common/goto-editor" "<@SECONDARY@>e") @@ -59,7 +59,7 @@ (gtk_accel_path "/Editor/pitch-shift-region" "<@LEVEL4@>t") (gtk_accel_path "/Editor/split-region" "z") (gtk_accel_path "/Editor/set-region-sync-position" "u") -(gtk_accel_path "/Editor/insert-region" "i") +(gtk_accel_path "/Editor/insert-region-from-region-list" "i") (gtk_accel_path "/Editor/addExistingAudioFiles" "<@PRIMARY@>i") (gtk_accel_path "/Editor/invert-selection" "<@TERTIARY@>i") (gtk_accel_path "/Main/Open" "<@PRIMARY@>o") @@ -81,7 +81,7 @@ (gtk_accel_path "/Editor/duplicate-region" "<@PRIMARY@>d") (gtk_accel_path "/Editor/multi-duplicate-region" "<@PRIMARY@><@TERTIARY@>d") (gtk_accel_path "/Editor/toggle-follow-playhead" "f") -(gtk_accel_path "/Editor/toggle-rhythm-ferret" "<@SECONDARY@>f") +(gtk_accel_path "/Editor/show-rhythm-ferret" "<@SECONDARY@>f") ; (gtk_accel_path "/Editor/set-edit-point" "g") ; (gtk_accel_path "/MouseMode/set-mouse-mode-gain" "g") (gtk_accel_path "/Editor/nudge-backward" "g") @@ -89,7 +89,7 @@ (gtk_accel_path "/Common/ToggleKeyEditor" "<@SECONDARY@>k") (gtk_accel_path "/Common/ToggleLocations" "<@SECONDARY@>l") (gtk_accel_path "/Transport/Loop" "l") -(gtk_accel_path "/Editor/lock-region" "<@LEVEL4@>l") +(gtk_accel_path "/Editor/toggle-region-lock" "<@LEVEL4@>l") (gtk_accel_path "/Editor/select-all-in-loop-range" "<@TERTIARY@>l") ;; UNTERE ZEILE @@ -110,7 +110,7 @@ (gtk_accel_path "/Main/New" "<@PRIMARY@>n") (gtk_accel_path "/Main/AddTrackBus" "<@PRIMARY@><@TERTIARY@>n") (gtk_accel_path "/Common/toggle-editor-mixer-on-top" "<@SECONDARY@>m") -(gtk_accel_path "/Editor/mute-unmute-region" "m") +(gtk_accel_path "/Editor/toggle-region-mute" "m") ;; arrow keys, navigation etc. diff --git a/gtk2_ardour/actions.cc b/gtk2_ardour/actions.cc index 49ac38d405..44200b06fa 100644 --- a/gtk2_ardour/actions.cc +++ b/gtk2_ardour/actions.cc @@ -51,7 +51,6 @@ vector > ActionManager::session_sensitive_actions; vector > ActionManager::write_sensitive_actions; vector > ActionManager::region_list_selection_sensitive_actions; vector > ActionManager::plugin_selection_sensitive_actions; -vector > ActionManager::region_selection_sensitive_actions; vector > ActionManager::track_selection_sensitive_actions; vector > ActionManager::point_selection_sensitive_actions; vector > ActionManager::time_selection_sensitive_actions; diff --git a/gtk2_ardour/actions.h b/gtk2_ardour/actions.h index 4394408229..fd9af9992a 100644 --- a/gtk2_ardour/actions.h +++ b/gtk2_ardour/actions.h @@ -36,7 +36,6 @@ namespace ActionManager { extern std::vector > region_list_selection_sensitive_actions; extern std::vector > plugin_selection_sensitive_actions; - extern std::vector > region_selection_sensitive_actions; extern std::vector > track_selection_sensitive_actions; extern std::vector > point_selection_sensitive_actions; extern std::vector > time_selection_sensitive_actions; diff --git a/gtk2_ardour/ardour-sae.menus b/gtk2_ardour/ardour-sae.menus index 9d61bf7ebb..d5e5988c41 100644 --- a/gtk2_ardour/ardour-sae.menus +++ b/gtk2_ardour/ardour-sae.menus @@ -158,9 +158,9 @@ - + - + @@ -203,19 +203,19 @@ - + - + - + - + @@ -278,7 +278,7 @@ - + diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index bcce9ff878..2768162b31 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -183,24 +183,11 @@ - - - - - - - - - - - - - - + - + @@ -239,45 +226,80 @@ #endif - - + + - - - - + - - - - - - - - + + + + + + - - - - - - - - + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -535,4 +557,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 420af313de..b50acd5253 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -735,6 +735,9 @@ Editor::Editor () TimeAxisView::CatchDeletion.connect (*this, invalidator (*this), ui_bind (&Editor::timeaxisview_deleted, this, _1), gui_context()); + _ignore_region_action = false; + _popup_region_menu_item = 0; + constructed = true; instant_save (); @@ -786,6 +789,10 @@ Editor::catch_vanishing_regionview (RegionView *rv) if (entered_regionview == rv) { set_entered_regionview (0); } + + if (!_all_region_actions_sensitized) { + sensitize_all_region_actions (true); + } } void @@ -802,6 +809,13 @@ Editor::set_entered_regionview (RegionView* rv) if ((entered_regionview = rv) != 0) { entered_regionview->entered (internal_editing ()); } + + if (!_all_region_actions_sensitized) { + /* This RegionView entry might have changed what region actions + are allowed, so sensitize them all in case a key is pressed. + */ + sensitize_all_region_actions (true); + } } void @@ -1079,9 +1093,6 @@ Editor::set_session (Session *t) compute_fixed_ruler_scale (); - /* there are never any selected regions at startup */ - sensitize_the_right_region_actions (false); - XMLNode* node = ARDOUR_UI::instance()->editor_settings(); set_state (*node, Stateful::loading_state_version); @@ -1187,9 +1198,22 @@ Editor::set_session (Session *t) /* register for undo history */ _session->register_with_memento_command_factory(_id, this); + ActionManager::ui_manager->signal_pre_activate().connect (sigc::mem_fun (*this, &Editor::action_pre_activated)); + start_updating_meters (); } +void +Editor::action_pre_activated (Glib::RefPtr const & a) +{ + if (a->get_name() == "RegionMenu") { + /* When the region menu is opened, we setup the actions so that they look right + in the menu. + */ + sensitize_the_right_region_actions (); + } +} + void Editor::build_cursors () { @@ -1614,24 +1638,7 @@ Editor::build_track_region_context_menu (framepos_t frame) if ((tr = rtv->track()) && ((pl = tr->playlist())) && !internal_editing()) { framepos_t framepos = (framepos_t) floor ((double)frame * tr->speed()); uint32_t regions_at = pl->count_regions_at (framepos); - list > regions_for_menu; - - if (selection->regions.size() > 1) { - // there's already a multiple selection: just add a - // single region context menu that will act on all - // selected regions - - for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { - regions_for_menu.push_back ((*i)->region ()); - } - } else { - boost::shared_ptr top_region = pl->top_region_at (framepos); - if (top_region) { - regions_for_menu.push_back (top_region); - } - } - - add_region_context_items (rtv->view(), regions_for_menu, edit_items, framepos, regions_at > 1); + add_region_context_items (edit_items, regions_at > 1); } } @@ -1668,24 +1675,7 @@ Editor::build_track_crossfade_context_menu (framepos_t frame) framepos_t framepos = (framepos_t) floor ((double)frame * tr->speed()); uint32_t regions_at = pl->count_regions_at (framepos); - list > regions_for_menu; - - if (selection->regions.size() > 1) { - // there's already a multiple selection: just add a - // single region context menu that will act on all - // selected regions - - for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { - regions_for_menu.push_back ((*i)->region ()); - } - } else { - boost::shared_ptr top_region = pl->top_region_at (framepos); - if (top_region) { - regions_for_menu.push_back (top_region); - } - } - - add_region_context_items (atv->audio_view(), regions_for_menu, edit_items, framepos, regions_at > 1); + add_region_context_items (edit_items, regions_at > 1); } } @@ -1695,7 +1685,7 @@ Editor::build_track_crossfade_context_menu (framepos_t frame) } void -Editor::analyze_region_selection() +Editor::analyze_region_selection () { if (analysis_window == 0) { analysis_window = new AnalysisWindow(); @@ -1805,294 +1795,10 @@ Editor::xfade_edit_right_region () } void -Editor::add_region_context_items (StreamView* sv, list > regions, Menu_Helpers::MenuList& edit_items, - framepos_t position, bool multiple_regions_at_position) +Editor::add_region_context_items (Menu_Helpers::MenuList& edit_items, bool multiple_regions_at_position) { using namespace Menu_Helpers; - Gtk::MenuItem* foo_item; - Menu *region_menu = manage (new Menu); - MenuList& items = region_menu->items(); - region_menu->set_name ("ArdourContextMenu"); - - /* Look through the regions that we are handling and make notes about what we have got */ - bool have_audio = false; - bool have_midi = false; - bool have_locked = false; - bool have_unlocked = false; - bool have_position_lock_style_audio = false; - bool have_position_lock_style_music = false; - bool have_muted = false; - bool have_unmuted = false; - bool have_opaque = false; - bool have_non_opaque = false; - bool have_not_at_natural_position = false; - bool have_envelope_visible = false; - bool have_envelope_invisible = false; - bool have_envelope_active = false; - bool have_envelope_inactive = false; - bool have_non_unity_scale_amplitude = false; - - for (list >::const_iterator i = regions.begin(); i != regions.end(); ++i) { - boost::shared_ptr ar = boost::dynamic_pointer_cast (*i); - if (ar) { - have_audio = true; - } - if (boost::dynamic_pointer_cast (*i)) { - have_midi = true; - } - - if ((*i)->locked()) { - have_locked = true; - } else { - have_unlocked = true; - } - - if ((*i)->position_lock_style() == MusicTime) { - have_position_lock_style_music = true; - } else { - have_position_lock_style_audio = true; - } - - if ((*i)->muted()) { - have_muted = true; - } else { - have_unmuted = true; - } - - if ((*i)->opaque()) { - have_opaque = true; - } else { - have_non_opaque = true; - } - - if (!(*i)->at_natural_position()) { - have_not_at_natural_position = true; - } - - if (ar) { - /* its a bit unfortunate that "envelope visible" is a view-only - property. we have to find the regionview to able to check - its current setting. - */ - - RegionView* rv = sv->find_view (ar); - have_envelope_invisible = true; - - if (rv) { - AudioRegionView* arv = dynamic_cast (rv); - if (arv && arv->envelope_visible()) { - have_envelope_visible = true; - } - } - - if (ar->envelope_active()) { - have_envelope_active = true; - } else { - have_envelope_inactive = true; - } - - if (ar->scale_amplitude() != 1) { - have_non_unity_scale_amplitude = true; - } - } - } - - if (regions.size() == 1) { - - /* when this particular menu pops up, make the relevant region - become selected. - */ - - region_menu->signal_map_event().connect ( - sigc::bind (sigc::mem_fun(*this, &Editor::set_selected_regionview_from_map_event), sv, boost::weak_ptr (regions.front())) - ); - - items.push_back (MenuElem (_("Rename..."), sigc::mem_fun(*this, &Editor::rename_region))); - - if (have_midi) { - items.push_back (MenuElem (_("List Editor..."), sigc::mem_fun(*this, &Editor::show_midi_list_editor))); - } - - items.push_back (MenuElem (_("Region Properties..."), sigc::mem_fun(*this, &Editor::edit_region))); - } - - items.push_back (MenuElem (_("Raise to Top Layer"), sigc::mem_fun(*this, &Editor::raise_region_to_top))); - items.push_back (MenuElem (_("Lower to Bottom Layer"), sigc::mem_fun (*this, &Editor::lower_region_to_bottom))); - items.push_back (SeparatorElem()); - items.push_back (MenuElem (_("Define Sync Point"), sigc::mem_fun(*this, &Editor::set_region_sync_from_edit_point))); - if (_edit_point == EditAtMouse) { - items.back ().set_sensitive (false); - } - items.push_back (MenuElem (_("Remove Sync Point"), sigc::mem_fun(*this, &Editor::remove_region_sync))); - items.push_back (SeparatorElem()); - - items.push_back (MenuElem (_("Audition"), sigc::mem_fun(*this, &Editor::play_selected_region))); - items.push_back (MenuElem (_("Export..."), sigc::mem_fun(*this, &Editor::export_region))); - items.push_back (MenuElem (_("Bounce"), sigc::mem_fun(*this, &Editor::bounce_region_selection))); - - if (have_audio) { - items.push_back (MenuElem (_("Spectral Analysis..."), sigc::mem_fun(*this, &Editor::analyze_region_selection))); - } - - items.push_back (SeparatorElem()); - - items.push_back (CheckMenuElem (_("Lock"))); - CheckMenuItem* region_lock_item = static_cast(&items.back()); - if (have_locked && !have_unlocked) { - region_lock_item->set_active(); - } else if (have_locked && have_unlocked) { - region_lock_item->set_inconsistent (); - } - region_lock_item->signal_activate().connect (sigc::mem_fun(*this, &Editor::toggle_region_lock)); - - items.push_back (CheckMenuElem (_("Glue to Bars and Beats"))); - CheckMenuItem* bbt_glue_item = static_cast(&items.back()); - - if (have_position_lock_style_music && !have_position_lock_style_audio) { - bbt_glue_item->set_active (); - } else if (have_position_lock_style_music && have_position_lock_style_audio) { - bbt_glue_item->set_inconsistent (); - } - - bbt_glue_item->signal_activate().connect (sigc::mem_fun (*this, &Editor::toggle_region_lock_style)); - - items.push_back (CheckMenuElem (_("Mute"))); - CheckMenuItem* region_mute_item = static_cast(&items.back()); - - if (have_muted && !have_unmuted) { - region_mute_item->set_active(); - } else if (have_muted && have_unmuted) { - region_mute_item->set_inconsistent (); - } - - region_mute_item->signal_activate().connect (sigc::mem_fun(*this, &Editor::toggle_region_mute)); - - items.push_back (MenuElem (_("Transpose..."), mem_fun(*this, &Editor::pitch_shift_regions))); - - if (!Profile->get_sae()) { - items.push_back (CheckMenuElem (_("Opaque"))); - CheckMenuItem* region_opaque_item = static_cast(&items.back()); - if (have_opaque && !have_non_opaque) { - region_opaque_item->set_active(); - } else if (have_opaque && have_non_opaque) { - region_opaque_item->set_inconsistent (); - } - region_opaque_item->signal_activate().connect (sigc::mem_fun(*this, &Editor::toggle_region_opaque)); - } - - items.push_back (CheckMenuElem (_("Original Position"), sigc::mem_fun(*this, &Editor::naturalize))); - if (!have_not_at_natural_position) { - items.back().set_sensitive (false); - } - - items.push_back (SeparatorElem()); - - if (have_audio) { - - if (!Profile->get_sae()) { - items.push_back (MenuElem (_("Reset Envelope"), sigc::mem_fun(*this, &Editor::reset_region_gain_envelopes))); - - items.push_back (CheckMenuElem (_("Envelope Visible"))); - CheckMenuItem* region_envelope_visible_item = static_cast (&items.back()); - if (have_envelope_visible && !have_envelope_invisible) { - region_envelope_visible_item->set_active (); - } else if (have_envelope_visible && have_envelope_invisible) { - region_envelope_visible_item->set_inconsistent (); - } - region_envelope_visible_item->signal_activate().connect (sigc::mem_fun(*this, &Editor::toggle_gain_envelope_visibility)); - - items.push_back (CheckMenuElem (_("Envelope Active"))); - CheckMenuItem* region_envelope_active_item = static_cast (&items.back()); - - if (have_envelope_active && !have_envelope_inactive) { - region_envelope_active_item->set_active (); - } else if (have_envelope_active && have_envelope_inactive) { - region_envelope_active_item->set_inconsistent (); - } - - region_envelope_active_item->signal_activate().connect (sigc::mem_fun(*this, &Editor::toggle_gain_envelope_active)); - items.push_back (SeparatorElem()); - } - - items.push_back (MenuElem (_("Normalize..."), sigc::mem_fun(*this, &Editor::normalize_region))); - if (have_non_unity_scale_amplitude) { - items.push_back (MenuElem (_("Reset Gain"), sigc::mem_fun(*this, &Editor::reset_region_scale_amplitude))); - } - - } else if (have_midi) { - items.push_back (MenuElem (_("Quantize"), sigc::mem_fun(*this, &Editor::quantize_region))); - items.push_back (MenuElem (_("Fork"), sigc::mem_fun(*this, &Editor::fork_region))); - items.push_back (SeparatorElem()); - } - - items.push_back (MenuElem (_("Strip Silence..."), sigc::mem_fun (*this, &Editor::strip_region_silence))); - items.push_back (MenuElem (_("Reverse"), sigc::mem_fun(*this, &Editor::reverse_region))); - items.push_back (SeparatorElem()); - - /* range related stuff */ - - items.push_back (MenuElem (_("Add Single Range"), sigc::mem_fun (*this, &Editor::add_location_from_audio_region))); - items.push_back (MenuElem (_("Add Range Markers"), sigc::mem_fun (*this, &Editor::add_locations_from_audio_region))); - if (selection->regions.size() < 2) { - items.back().set_sensitive (false); - } - - items.push_back (MenuElem (_("Set Range Selection"), sigc::mem_fun (*this, &Editor::set_selection_from_region))); - items.push_back (SeparatorElem()); - - /* Nudge region */ - - Menu *nudge_menu = manage (new Menu()); - MenuList& nudge_items = nudge_menu->items(); - nudge_menu->set_name ("ArdourContextMenu"); - - nudge_items.push_back (MenuElem (_("Nudge Forward"), (sigc::bind (sigc::mem_fun(*this, &Editor::nudge_forward), false, false)))); - nudge_items.push_back (MenuElem (_("Nudge Backward"), (sigc::bind (sigc::mem_fun(*this, &Editor::nudge_backward), false, false)))); - nudge_items.push_back (MenuElem (_("Nudge Forward by Capture Offset"), (sigc::mem_fun(*this, &Editor::nudge_forward_capture_offset)))); - nudge_items.push_back (MenuElem (_("Nudge Backward by Capture Offset"), (sigc::mem_fun(*this, &Editor::nudge_backward_capture_offset)))); - - items.push_back (MenuElem (_("Nudge"), *nudge_menu)); - items.push_back (SeparatorElem()); - - Menu *trim_menu = manage (new Menu); - MenuList& trim_items = trim_menu->items(); - trim_menu->set_name ("ArdourContextMenu"); - - trim_items.push_back (MenuElem (_("Start to Edit Point"), sigc::mem_fun(*this, &Editor::trim_region_from_edit_point))); - foo_item = &trim_items.back(); - if (_edit_point == EditAtMouse) { - foo_item->set_sensitive (false); - } - trim_items.push_back (MenuElem (_("Edit Point to End"), sigc::mem_fun(*this, &Editor::trim_region_to_edit_point))); - foo_item = &trim_items.back(); - if (_edit_point == EditAtMouse) { - foo_item->set_sensitive (false); - } - trim_items.push_back (MenuElem (_("Trim to Loop"), sigc::mem_fun(*this, &Editor::trim_region_to_loop))); - trim_items.push_back (MenuElem (_("Trim to Punch"), sigc::mem_fun(*this, &Editor::trim_region_to_punch))); - - items.push_back (MenuElem (_("Trim"), *trim_menu)); - items.push_back (SeparatorElem()); - - items.push_back (MenuElem (_("Split"), (sigc::mem_fun(*this, &Editor::split)))); - region_edit_menu_split_item = &items.back(); - - if (_edit_point == EditAtMouse) { - region_edit_menu_split_item->set_sensitive (false); - } - - if (have_audio) { - items.push_back (MenuElem (_("Make Mono Regions"), (sigc::mem_fun(*this, &Editor::split_multichannel_region)))); - region_edit_menu_split_multichannel_item = &items.back(); - } - - items.push_back (MenuElem (_("Duplicate"), (sigc::bind (sigc::mem_fun(*this, &Editor::duplicate_dialog), false)))); - items.push_back (MenuElem (_("Multi-Duplicate..."), (sigc::bind (sigc::mem_fun(*this, &Editor::duplicate_dialog), true)))); - items.push_back (MenuElem (_("Fill Track"), (sigc::mem_fun(*this, &Editor::region_fill_track)))); - items.push_back (SeparatorElem()); - items.push_back (MenuElem (_("Remove"), sigc::mem_fun(*this, &Editor::remove_selected_regions))); - /* OK, stick the region submenu at the top of the list, and then add the standard items. */ @@ -2101,17 +1807,27 @@ Editor::add_region_context_items (StreamView* sv, list meaning for menu titles. */ + RegionSelection rs = get_regions_from_selection_and_entered (); + string::size_type pos = 0; - string menu_item_name = (regions.size() == 1) ? regions.front()->name() : _("Selected Regions"); + string menu_item_name = (rs.size() == 1) ? rs.front()->region()->name() : _("Selected Regions"); while ((pos = menu_item_name.find ("_", pos)) != string::npos) { menu_item_name.replace (pos, 1, "__"); pos += 2; } - edit_items.push_back (MenuElem (menu_item_name, *region_menu)); + 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); + } + + edit_items.push_back (*_popup_region_menu_item); if (multiple_regions_at_position && (layering_order_editor == 0 || !layering_order_editor->is_visible ())) { - edit_items.push_back (MenuElem (_("Choose Top Region..."), (bind (mem_fun(*this, &Editor::change_region_layering_order), position)))); + edit_items.push_back (action_menu_item ("choose-top-region")); } edit_items.push_back (SeparatorElem()); } @@ -2179,7 +1895,7 @@ Editor::add_dstream_context_items (Menu_Helpers::MenuList& edit_items) 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::mem_fun(*this, &Editor::loop_selected_region))); + 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)); @@ -2219,8 +1935,8 @@ Editor::add_dstream_context_items (Menu_Helpers::MenuList& edit_items) cutnpaste_items.push_back (SeparatorElem()); - cutnpaste_items.push_back (MenuElem (_("Align"), sigc::bind (sigc::mem_fun(*this, &Editor::align), ARDOUR::SyncPoint))); - cutnpaste_items.push_back (MenuElem (_("Align Relative"), sigc::bind (sigc::mem_fun(*this, &Editor::align_relative), ARDOUR::SyncPoint))); + 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)); @@ -3529,13 +3245,10 @@ Editor::duplicate_dialog (bool with_dialog) } } - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); - if (mouse_mode != MouseRange) { - - if (rs.empty()) { - return; - } + if (mouse_mode != MouseRange && rs.empty()) { + return; } if (with_dialog) { @@ -4928,8 +4641,6 @@ Editor::get_regions_after (RegionSelection& rs, framepos_t where, const TrackVie } /** Get regions using the following conditions: - * If check_edit_position == false, then return the selected regions. - * Otherwise: * 1. If the edit point is `mouse': * if the mouse is over a selected region, or no region, return all selected regions. * if the mouse is over an unselected region, return just that region. @@ -4945,12 +4656,8 @@ Editor::get_regions_after (RegionSelection& rs, framepos_t where, const TrackVie */ RegionSelection -Editor::get_regions_for_action (bool check_edit_point) +Editor::get_regions_from_selection_and_edit_point () { - if (!check_edit_point) { - return selection->regions; - } - if (_edit_point == EditAtMouse) { if (entered_regionview == 0 || selection->regions.contains (entered_regionview)) { return selection->regions; @@ -4990,6 +4697,19 @@ Editor::get_regions_for_action (bool check_edit_point) return rs; } + +RegionSelection +Editor::get_regions_from_selection_and_entered () +{ + RegionSelection rs = selection->regions; + + if (rs.empty() && entered_regionview) { + rs.add (entered_regionview); + } + + return rs; +} + void Editor::get_regions_corresponding_to (boost::shared_ptr region, vector& regions) { @@ -5700,8 +5420,10 @@ Editor::show_editor_list (bool yn) } void -Editor::change_region_layering_order (framepos_t position) +Editor::change_region_layering_order () { + framepos_t const position = get_preferred_edit_position (); + if (!clicked_routeview) { if (layering_order_editor) { layering_order_editor->hide (); @@ -5730,10 +5452,10 @@ Editor::change_region_layering_order (framepos_t position) } void -Editor::update_region_layering_order_editor (framepos_t frame) +Editor::update_region_layering_order_editor () { if (layering_order_editor && layering_order_editor->is_visible ()) { - change_region_layering_order (frame); + change_region_layering_order (); } } @@ -5753,3 +5475,10 @@ Editor::setup_fade_images () _fade_out_images[FadeSlow] = new Gtk::Image (get_icon_path (X_("crossfade-out-long-cut"))); } + +/** @return Gtk::manage()d menu item for a given action from `editor_actions' */ +Gtk::MenuItem& +Editor::action_menu_item (std::string const & name) +{ + return *manage (editor_actions->get_action(name)->create_menu_item ()); +} diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 6ad076ffc1..7da7691cf0 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -371,7 +371,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* fades/xfades */ - void toggle_selected_region_fades (int dir); + void toggle_region_fades (int dir); void update_region_fade_visibility (); bool xfade_visibility() const { return _xfade_visibility; } void update_xfade_visibility (); @@ -678,10 +678,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::Menu* build_track_selection_context_menu (framepos_t); void add_dstream_context_items (Gtk::Menu_Helpers::MenuList&); void add_bus_context_items (Gtk::Menu_Helpers::MenuList&); - void add_region_context_items (StreamView*, std::list >, Gtk::Menu_Helpers::MenuList&, - ARDOUR::framepos_t, bool); + void add_region_context_items (Gtk::Menu_Helpers::MenuList&, bool); void add_crossfade_context_items (AudioStreamView*, boost::shared_ptr, Gtk::Menu_Helpers::MenuList&, bool many); void add_selection_context_items (Gtk::Menu_Helpers::MenuList&); + Gtk::MenuItem* _popup_region_menu_item; void handle_new_route (ARDOUR::RouteList&); void timeaxisview_deleted (TimeAxisView *); @@ -1050,6 +1050,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* KEYMAP HANDLING */ void register_actions (); + void register_region_actions (); int ensure_cursor (framepos_t* pos); @@ -1066,14 +1067,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* EDITING OPERATIONS */ void reset_point_selection (); - void toggle_region_mute (); void toggle_region_lock (); - void toggle_region_opaque (); + void toggle_opaque_region (); void toggle_record_enable (); void toggle_region_lock_style (); void raise_region (); void raise_region_to_top (); - void change_region_layering_order (ARDOUR::framepos_t); + void change_region_layering_order (); void lower_region (); void lower_region_to_bottom (); void split_regions_at (framepos_t, RegionSelection&); @@ -1082,15 +1082,15 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void crop_region_to_selection (); void crop_region_to (framepos_t start, framepos_t end); void set_sync_point (framepos_t, const RegionSelection&); - void set_region_sync_from_edit_point (); + void set_region_sync_position (); void remove_region_sync(); - void align_selection (ARDOUR::RegionPoint, framepos_t position, const RegionSelection&); - void align_selection_relative (ARDOUR::RegionPoint point, framepos_t position, const RegionSelection&); + void align_regions (ARDOUR::RegionPoint); + void align_regions_relative (ARDOUR::RegionPoint point); void align_region (boost::shared_ptr, ARDOUR::RegionPoint point, framepos_t position); void align_region_internal (boost::shared_ptr, ARDOUR::RegionPoint point, framepos_t position); void remove_selected_regions (); void remove_clicked_region (); - void edit_region (); + void show_region_properties (); void show_midi_list_editor (); void rename_region (); void duplicate_some_regions (RegionSelection&, float times); @@ -1105,7 +1105,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void strip_region_silence (); void normalize_region (); void reset_region_scale_amplitude (); - void adjust_region_scale_amplitude (bool up); + void adjust_region_gain (bool up); void quantize_region (); void fork_region (); @@ -1114,7 +1114,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void tab_to_transient (bool forward); - void use_region_as_bar (); + void set_tempo_from_region (); void use_range_as_bar (); void define_one_bar (framepos_t start, framepos_t end); @@ -1123,13 +1123,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void hide_region_from_region_list (); void show_region_in_region_list (); - void align (ARDOUR::RegionPoint); - void align_relative (ARDOUR::RegionPoint); - void naturalize (); + void naturalize_region (); void reset_focus (); - void split (); + void split_region (); void cut (); void copy (); @@ -1143,7 +1141,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD int get_prefix (float&, bool&); void keyboard_paste (); - void keyboard_insert_region_list_selection (); void region_from_selection (); void create_region_from_selection (std::vector >&); @@ -1153,7 +1150,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void play_from_edit_point_and_return (); void play_selected_region (); void play_edit_range (); - void loop_selected_region (); void play_location (ARDOUR::Location&); void loop_location (ARDOUR::Location&); @@ -1268,8 +1264,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void set_selection_from_region (); void add_location_mark (framepos_t where); - void add_location_from_audio_region (); - void add_locations_from_audio_region (); + void add_location_from_region (); + void add_locations_from_region (); void add_location_from_selection (); void set_loop_from_selection (bool play); void set_punch_from_selection (); @@ -1322,7 +1318,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void set_fade_out_shape (ARDOUR::FadeShape); void set_fade_length (bool in); - void toggle_fade_active (bool in); void set_fade_in_active (bool); void set_fade_out_active (bool); @@ -1423,7 +1418,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void set_playhead_cursor (); void kbd_driver (sigc::slot, bool use_track_canvas = true, bool use_time_canvas = true, bool can_select = true); - void kbd_mute_unmute_region (); + void toggle_region_mute (); void kbd_brush (); void kbd_do_brush (GdkEvent*); @@ -1625,16 +1620,19 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void track_selection_changed (); void region_selection_changed (); sigc::connection editor_regions_selection_changed_connection; - void sensitize_the_right_region_actions (bool have_selected_regions); + void sensitize_all_region_actions (bool); + void sensitize_the_right_region_actions (); + bool _all_region_actions_sensitized; + /** Flag to block region action handlers from doing what they normally do; + * I tried Gtk::Action::block_activate() but this doesn't work (ie it doesn't + * block) when setting a ToggleAction's active state. + */ + bool _ignore_region_action; void point_selection_changed (); void marker_selection_changed (); void cancel_selection (); - void region_selection_op (void (ARDOUR::Region::*pmf)(void)); - void region_selection_op (void (ARDOUR::Region::*pmf)(void*), void*); - void region_selection_op (void (ARDOUR::Region::*pmf)(bool), bool); - bool audio_region_selection_covers (framepos_t where); /* transport range select process */ @@ -1717,8 +1715,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void trim_region_back(); void trim_region (bool front); - void trim_region_to_edit_point (); - void trim_region_from_edit_point (); void trim_region_to_loop (); void trim_region_to_punch (); void trim_region_to_location (const ARDOUR::Location&, const char* cmd); @@ -1835,7 +1831,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD int time_stretch (RegionSelection&, float fraction); int pitch_shift (RegionSelection&, float cents); - void pitch_shift_regions (); + void pitch_shift_region (); int time_fx (RegionSelection&, float val, bool pitching); /* editor-mixer strip */ @@ -1992,7 +1988,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void get_regions_at (RegionSelection&, framepos_t where, const TrackViewList& ts) const; void get_regions_after (RegionSelection&, framepos_t where, const TrackViewList& ts) const; - RegionSelection get_regions_for_action (bool check_edit_point = true); + RegionSelection get_regions_from_selection_and_edit_point (); + RegionSelection get_regions_from_selection_and_entered (); void start_updating_meters (); void stop_updating_meters (); @@ -2052,7 +2049,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD double _last_motion_y; RegionLayeringOrderEditor* layering_order_editor; - void update_region_layering_order_editor (ARDOUR::framepos_t); + void update_region_layering_order_editor (); /** Track that was the source for the last cut/copy operation. Used as a place to paste things iff there is no selected track. @@ -2068,6 +2065,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD std::map _fade_in_images; std::map _fade_out_images; + Gtk::MenuItem& action_menu_item (std::string const &); + void action_pre_activated (Glib::RefPtr const &); + friend class Drag; friend class RegionDrag; friend class RegionMoveDrag; diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index dd3a9233bf..e3cd81a95b 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -63,7 +63,15 @@ Editor::register_actions () ActionManager::register_action (editor_actions, X_("EditPointMenu"), _("Edit Point")); ActionManager::register_action (editor_actions, X_("FadeMenu"), _("Fade")); ActionManager::register_action (editor_actions, X_("LatchMenu"), _("Latch")); - ActionManager::register_action (editor_actions, X_("Layering"), _("Layering")); + ActionManager::register_action (editor_actions, X_("RegionMenu"), _("Region")); + ActionManager::register_action (editor_actions, X_("RegionMenuLayering"), _("Layering")); + ActionManager::register_action (editor_actions, X_("RegionMenuNudge"), _("Nudge")); + ActionManager::register_action (editor_actions, X_("RegionMenuTrim"), _("Trim")); + ActionManager::register_action (editor_actions, X_("RegionMenuGain"), _("Gain")); + ActionManager::register_action (editor_actions, X_("RegionMenuRanges"), _("Ranges")); + ActionManager::register_action (editor_actions, X_("RegionMenuFades"), _("Fades")); + ActionManager::register_action (editor_actions, X_("RegionMenuMIDI"), _("MIDI")); + ActionManager::register_action (editor_actions, X_("RegionMenuDuplicate"), _("Duplicate")); ActionManager::register_action (editor_actions, X_("Link"), _("Link")); ActionManager::register_action (editor_actions, X_("ZoomFocusMenu"), _("Zoom Focus")); ActionManager::register_action (editor_actions, X_("KeyMouseActions"), _("Key Mouse")); @@ -75,11 +83,9 @@ Editor::register_actions () ActionManager::register_action (editor_actions, X_("Monitoring"), _("Monitoring")); ActionManager::register_action (editor_actions, X_("MoveActiveMarkMenu"), _("Active Mark")); ActionManager::register_action (editor_actions, X_("MovePlayHeadMenu"), _("Playhead")); - ActionManager::register_action (editor_actions, X_("NudgeRegionMenu"), _("Nudge")); ActionManager::register_action (editor_actions, X_("PlayMenu"), _("Play")); ActionManager::register_action (editor_actions, X_("PrimaryClockMenu"), _("Primary Clock")); ActionManager::register_action (editor_actions, X_("Pullup"), _("Pullup / Pulldown")); - ActionManager::register_action (editor_actions, X_("RegionMenu"), _("Region")); ActionManager::register_action (editor_actions, X_("RegionEditOps"), _("Region operations")); ActionManager::register_action (editor_actions, X_("RegionGainMenu"), _("Gain")); ActionManager::register_action (editor_actions, X_("RulerMenu"), _("Rulers")); @@ -99,11 +105,12 @@ Editor::register_actions () ActionManager::register_action (editor_actions, X_("TrackHeightMenu"), _("Height")); ActionManager::register_action (editor_actions, X_("TrackMenu"), _("Track")); ActionManager::register_action (editor_actions, X_("Tools"), _("Tools")); - ActionManager::register_action (editor_actions, X_("TrimMenu"), _("Trim")); ActionManager::register_action (editor_actions, X_("View"), _("View")); ActionManager::register_action (editor_actions, X_("ZoomFocus"), _("Zoom Focus")); ActionManager::register_action (editor_actions, X_("ZoomMenu"), _("Zoom")); + register_region_actions (); + /* add named actions for the editor */ ActionManager::register_action (editor_actions, "escape", _("Break drag or deselect all"), sigc::mem_fun (*this, &Editor::escape)); @@ -113,13 +120,6 @@ Editor::register_actions () act = ActionManager::register_toggle_action (editor_actions, "show-editor-list", _("Show Editor List"), sigc::mem_fun (*this, &Editor::editor_list_button_toggled)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "toggle-selected-region-fade-in", _("Toggle Region Fade In"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_selected_region_fades), 1));; - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "toggle-selected-region-fade-out", _("Toggle Region Fade Out"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_selected_region_fades), -1));; - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "toggle-selected-region-fades", _("Toggle Region Fades"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_selected_region_fades), 0)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "playhead-to-next-region-boundary", _("Playhead to Next Region Boundary"), sigc::bind (sigc::mem_fun(*this, &Editor::cursor_to_next_region_boundary), true )); ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "playhead-to-next-region-boundary-noselection", _("Playhead to Next Region Boundary (No Track Selection)"), sigc::bind (sigc::mem_fun(*this, &Editor::cursor_to_next_region_boundary), false )); @@ -237,12 +237,8 @@ Editor::register_actions () act = ActionManager::register_action (editor_actions, "add-location-from-playhead", _("Add Mark from Playhead"), sigc::mem_fun(*this, &Editor::add_location_from_playhead_cursor)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "nudge-forward", _("Nudge Forward"), sigc::bind (sigc::mem_fun(*this, &Editor::nudge_forward), false, false)); - ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "nudge-next-forward", _("Nudge Next Forward"), sigc::bind (sigc::mem_fun(*this, &Editor::nudge_forward), true, false)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "nudge-backward", _("Nudge Backward"), sigc::bind (sigc::mem_fun(*this, &Editor::nudge_backward), false, false)); - ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "nudge-next-backward", _("Nudge Next Backward"), sigc::bind (sigc::mem_fun(*this, &Editor::nudge_backward), true, false)); ActionManager::session_sensitive_actions.push_back (act); @@ -310,88 +306,15 @@ Editor::register_actions () act = ActionManager::register_action (editor_actions, "edit-to-playhead", _("Active Mark to Playhead"), sigc::bind (sigc::mem_fun(*this, &Editor::cursor_align), false)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "trim-front", _("Trim Start at Edit Point"), sigc::mem_fun(*this, &Editor::trim_region_front)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "trim-back", _("Trim End at Edit Point"), sigc::mem_fun(*this, &Editor::trim_region_back)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - - act = ActionManager::register_action (editor_actions, "trim-from-start", _("Start to Edit Point"), sigc::mem_fun(*this, &Editor::trim_region_from_edit_point)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "trim-to-end", _("Edit Point to End"), sigc::mem_fun(*this, &Editor::trim_region_to_edit_point)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "trim-region-to-loop", _("Trim to Loop"), sigc::mem_fun(*this, &Editor::trim_region_to_loop)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "trim-region-to-punch", _("Trim to Punch"), sigc::mem_fun(*this, &Editor::trim_region_to_punch)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "trim-to-previous-region", _("Trim to Previous"), sigc::mem_fun(*this, &Editor::trim_region_to_previous_region_end)); ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "trim-to-next-region", _("Trim to Next"), sigc::mem_fun(*this, &Editor::trim_region_to_next_region_start)); ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "set-loop-from-edit-range", _("Set Loop from Edit Range"), sigc::bind (sigc::mem_fun(*this, &Editor::set_loop_from_edit_range), false)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "set-loop-from-region", _("Set Loop from Region"), sigc::bind (sigc::mem_fun(*this, &Editor::set_loop_from_region), false)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "loop-region", _("Loop Region"), sigc::bind (sigc::mem_fun(*this, &Editor::set_loop_from_region), true)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "set-punch-from-edit-range", _("Set Punch from Edit Range"), sigc::mem_fun(*this, &Editor::set_punch_from_edit_range)); ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "set-punch-from-region", _("Set Punch From Region"), sigc::mem_fun(*this, &Editor::set_punch_from_region)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "pitch-shift-region", _("Transpose"), sigc::mem_fun(*this, &Editor::pitch_shift_regions)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "toggle-opaque-region", _("Toggle Opaque"), sigc::mem_fun(*this, &Editor::toggle_region_opaque)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "add-range-marker-from-region", _("Add 1 Range Marker"), sigc::mem_fun(*this, &Editor::add_location_from_audio_region)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "add-range-markers-from-region", _("Add Range Marker(s)"), sigc::mem_fun(*this, &Editor::add_locations_from_audio_region)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - - act = ActionManager::register_action (editor_actions, "set-fade-in-length", _("Set Fade In Length"), sigc::bind (sigc::mem_fun(*this, &Editor::set_fade_length), true)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "toggle-fade-in-active", _("Toggle Fade In Active"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_fade_active), true)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "set-fade-out-length", _("Set Fade Out Length"), sigc::bind (sigc::mem_fun(*this, &Editor::set_fade_length), false)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "toggle-fade-out-active", _("Toggle Fade Out Active"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_fade_active), false)); - ActionManager::session_sensitive_actions.push_back (act); - - act = ActionManager::register_action (editor_actions, "align-regions-start", _("Align Regions Start"), sigc::bind (sigc::mem_fun(*this, &Editor::align), ARDOUR::Start)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "align-regions-start-relative", _("Align Regions Start Relative"), sigc::bind (sigc::mem_fun(*this, &Editor::align_relative), ARDOUR::Start)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "align-regions-end", _("Align Regions End"), sigc::bind (sigc::mem_fun(*this, &Editor::align), ARDOUR::End)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "align-regions-end-relative", _("Align Regions End Relative"), sigc::bind (sigc::mem_fun(*this, &Editor::align_relative), ARDOUR::End)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - - act = ActionManager::register_action (editor_actions, "align-regions-sync", _("Align Regions Sync"), sigc::bind (sigc::mem_fun(*this, &Editor::align), ARDOUR::SyncPoint)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "align-regions-sync-relative", _("Align Regions Sync Relative"), sigc::bind (sigc::mem_fun(*this, &Editor::align_relative), ARDOUR::SyncPoint)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "play-from-edit-point", _("Play From Edit Point"), sigc::mem_fun(*this, &Editor::play_from_edit_point)); ActionManager::session_sensitive_actions.push_back (act); @@ -399,9 +322,6 @@ Editor::register_actions () ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "play-edit-range", _("Play Edit Range"), sigc::mem_fun(*this, &Editor::play_edit_range)); - act = ActionManager::register_action (editor_actions, "play-selected-regions", _("Play Selected Region(s)"), sigc::mem_fun(*this, &Editor::play_selected_region)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "brush-at-mouse", _("Brush at Mouse"), sigc::mem_fun(*this, &Editor::kbd_brush)); ActionManager::session_sensitive_actions.push_back (act); @@ -410,81 +330,8 @@ Editor::register_actions () act = ActionManager::register_action (editor_actions, "set-edit-point", _("Active Marker to Mouse"), sigc::mem_fun(*this, &Editor::set_edit_point)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "duplicate-region", _("Duplicate Region"), sigc::bind (sigc::mem_fun(*this, &Editor::duplicate_dialog), false)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "multi-duplicate-region", _("Multi-Duplicate Region..."), sigc::bind (sigc::mem_fun(*this, &Editor::duplicate_dialog), true)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "duplicate-range", _("Duplicate Range"), sigc::bind (sigc::mem_fun(*this, &Editor::duplicate_dialog), false)); ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "insert-region", _("Insert Region"), sigc::mem_fun(*this, &Editor::keyboard_insert_region_list_selection)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "normalize-region", _("Normalize Region..."), sigc::mem_fun(*this, &Editor::normalize_region)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "rename-region", _("Rename Region..."), sigc::mem_fun(*this, &Editor::rename_region)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "auto-rename-region", _("Auto-Rename Region"), sigc::mem_fun(*this, &Editor::rename_region)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "boost-region-gain", _("Boost Region Gain"), sigc::bind (sigc::mem_fun(*this, &Editor::adjust_region_scale_amplitude), true)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "cut-region-gain", _("Cut Region Gain"), sigc::bind (sigc::mem_fun(*this, &Editor::adjust_region_scale_amplitude), false)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "split-region", _("Split Region"), sigc::mem_fun(*this, &Editor::split)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "set-region-sync-position", _("Set Region Sync Position"), sigc::mem_fun(*this, &Editor::set_region_sync_from_edit_point)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "remove-region-sync", _("Remove Region Sync"), sigc::mem_fun(*this, &Editor::remove_region_sync)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "raise-region", _("Raise Region"), sigc::mem_fun(*this, &Editor::raise_region)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "lower-region", _("Lower Region"), sigc::mem_fun(*this, &Editor::lower_region)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "export-region", _("Export Region"), sigc::mem_fun(*this, &Editor::export_region)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_toggle_action (editor_actions, "lock-region", _("Lock Region"), sigc::mem_fun(*this, &Editor::toggle_region_lock)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_toggle_action (editor_actions, "glue-region", _("Glue Region to Bars and Beats"), sigc::mem_fun (*this, &Editor::toggle_region_lock_style)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "naturalize-region", _("Move to Original Position"), sigc::mem_fun (*this, &Editor::naturalize)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "reverse-region", _("Reverse"), sigc::mem_fun (*this, &Editor::reverse_region)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "monoize-region", _("Make Mono Regions"), (sigc::mem_fun(*this, &Editor::split_multichannel_region))); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "region-fill-track", _("Fill Track"), (sigc::mem_fun(*this, &Editor::region_fill_track))); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "mute-unmute-region", _("Mute/Unmute Region"), sigc::mem_fun(*this, &Editor::kbd_mute_unmute_region)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "snap-regions-to-grid", _("Snap Regions to Grid"), sigc::mem_fun(*this, &Editor::snap_regions_to_grid)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "close-region-gaps", _("Close Region Gaps"), sigc::mem_fun(*this, &Editor::close_region_gaps)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "place-transient", _("Place Transient"), sigc::mem_fun(*this, &Editor::place_transient)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); undo_action = act = ActionManager::register_action (editor_actions, "undo", _("Undo"), sigc::bind (sigc::mem_fun(*this, &Editor::undo), 1U)); ActionManager::session_sensitive_actions.push_back (act); @@ -496,9 +343,6 @@ Editor::register_actions () act = ActionManager::register_action (editor_actions, "export-range", _("Export Range"), sigc::mem_fun(*this, &Editor::export_range)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "separate-under-region", _("Separate Under Selected Regions"), sigc::mem_fun(*this, &Editor::separate_under_selected_regions)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "editor-separate", _("Separate"), sigc::mem_fun(*this, &Editor::separate_region_from_selection)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::mouse_edit_point_requires_canvas_actions.push_back (act); @@ -526,22 +370,9 @@ Editor::register_actions () act = ActionManager::register_action (editor_actions, "editor-paste", _("Paste"), sigc::mem_fun(*this, &Editor::keyboard_paste)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "quantize-region", _("Quantize Region"), sigc::mem_fun(*this, &Editor::quantize_region)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - - act = ActionManager::register_action (editor_actions, "set-tempo-from-region", _("Set Tempo from Region=Bar"), sigc::mem_fun(*this, &Editor::use_region_as_bar)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "set-tempo-from-edit-range", _("Set Tempo from Edit Range=Bar"), sigc::mem_fun(*this, &Editor::use_range_as_bar)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "split-region-at-transients", _("Split Regions At Percussion Onsets"), sigc::mem_fun(*this, &Editor::split_region_at_transients)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "toggle-rhythm-ferret", _("Rhythm Ferret..."), sigc::mem_fun(*this, &Editor::show_rhythm_ferret)); - ActionManager::session_sensitive_actions.push_back (act); - ActionManager::region_selection_sensitive_actions.push_back (act); act = ActionManager::register_toggle_action (editor_actions, "toggle-log-window", _("Log"), sigc::mem_fun (ARDOUR_UI::instance(), &ARDOUR_UI::toggle_errors)); ActionManager::session_sensitive_actions.push_back (act); @@ -1444,3 +1275,281 @@ Editor::toggle_internal_editing () set_internal_edit (tact->get_active()); } } + +/* Convenience functions to slightly reduce verbosity below */ + +static void +reg_sens (RefPtr group, char const * name, char const * label, sigc::slot slot) +{ + RefPtr act = ActionManager::register_action (group, name, label, slot); + ActionManager::session_sensitive_actions.push_back (act); +} + +static void +toggle_reg_sens (RefPtr group, char const * name, char const * label, sigc::slot slot) +{ + RefPtr act = ActionManager::register_toggle_action (group, name, label, slot); + ActionManager::session_sensitive_actions.push_back (act); +} + +void +Editor::register_region_actions () +{ + _region_actions = ActionGroup::create (X_("Region")); + + /* PART 1: actions that operate on the selection, and for which the edit point type and location is irrelevant */ + + /* Remove selected regions */ + 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)); + + /* Raise all selected regions by 1 layer */ + reg_sens (_region_actions, "raise-region", _("Raise"), sigc::mem_fun (*this, &Editor::raise_region)); + + /* Raise all selected regions to the top */ + reg_sens (_region_actions, "raise-region-to-top", _("Raise to Top"), sigc::mem_fun (*this, &Editor::raise_region_to_top)); + + /* Lower all selected regions by 1 layer */ + reg_sens (_region_actions, "lower-region", _("Lower"), sigc::mem_fun (*this, &Editor::lower_region)); + + /* Lower all selected regions to the bottom */ + reg_sens (_region_actions, "lower-region-to-bottom", _("Lower to Bottom"), sigc::mem_fun (*this, &Editor::lower_region_to_bottom)); + + /* Move selected regions to their original (`natural') position */ + reg_sens (_region_actions, "naturalize-region", _("Move to Original Position"), sigc::mem_fun (*this, &Editor::naturalize_region)); + + /* Toggle `locked' status of selected regions */ + toggle_reg_sens (_region_actions, "toggle-region-lock", _("Lock"), sigc::mem_fun(*this, &Editor::toggle_region_lock)); + + toggle_reg_sens ( + _region_actions, + "toggle-region-lock-style", + _("Glue to Bars and Beats"), + sigc::mem_fun (*this, &Editor::toggle_region_lock_style) + ); + + /* Remove sync points from selected regions */ + reg_sens (_region_actions, "remove-region-sync", _("Remove Sync"), sigc::mem_fun(*this, &Editor::remove_region_sync)); + + /* Mute or unmute selected regions */ + toggle_reg_sens (_region_actions, "toggle-region-mute", _("Mute"), sigc::mem_fun(*this, &Editor::toggle_region_mute)); + + /* Open the normalize dialogue to operate on the selected regions */ + reg_sens (_region_actions, "normalize-region", _("Normalize..."), sigc::mem_fun(*this, &Editor::normalize_region)); + + /* Reverse selected regions */ + reg_sens (_region_actions, "reverse-region", _("Reverse"), sigc::mem_fun (*this, &Editor::reverse_region)); + + /* Split selected multi-channel regions into mono regions */ + reg_sens (_region_actions, "split-multichannel-region", _("Make Mono Regions"), sigc::mem_fun (*this, &Editor::split_multichannel_region)); + + /* Boost selected region gain */ + reg_sens (_region_actions, "boost-region-gain", _("Boost Gain"), sigc::bind (sigc::mem_fun(*this, &Editor::adjust_region_gain), true)); + + /* Cut selected region gain */ + reg_sens (_region_actions, "cut-region-gain", _("Cut Gain"), sigc::bind (sigc::mem_fun(*this, &Editor::adjust_region_gain), false)); + + /* Open the pitch shift dialogue for the selected regions */ + reg_sens (_region_actions, "pitch-shift-region", _("Transpose"), sigc::mem_fun (*this, &Editor::pitch_shift_region)); + + /* Toggle selected region opacity */ + toggle_reg_sens (_region_actions, "toggle-opaque-region", _("Opaque"), sigc::mem_fun (*this, &Editor::toggle_opaque_region)); + + /* Toggle active status of selected regions' fade in */ + toggle_reg_sens ( + _region_actions, "toggle-region-fade-in", _("Fade In"), sigc::bind (sigc::mem_fun (*this, &Editor::toggle_region_fades), 1) + ); + + /* Toggle active status of selected regions' fade out */ + toggle_reg_sens ( + _region_actions, "toggle-region-fade-out", _("Fade Out"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_region_fades), -1) + ); + + /* Toggle active status of selected regions' fade in and out */ + toggle_reg_sens ( + _region_actions, "toggle-region-fades", _("Fades"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_region_fades), 0) + ); + + /* Open the dialogue to duplicate selected regions */ + reg_sens (_region_actions, "duplicate-region", _("Duplicate"), sigc::bind (sigc::mem_fun (*this, &Editor::duplicate_dialog), false)); + + /* Open the dialogue to duplicate selected regions multiple times */ + reg_sens ( + _region_actions, + "multi-duplicate-region", + _("Multi-Duplicate..."), + sigc::bind (sigc::mem_fun(*this, &Editor::duplicate_dialog), true) + ); + + /* Fill tracks with selected regions */ + reg_sens (_region_actions, "region-fill-track", _("Fill Track"), sigc::mem_fun (*this, &Editor::region_fill_track)); + + /* Set up the loop range from the selected regions */ + reg_sens ( + _region_actions, "set-loop-from-region", _("Set Loop Range"), sigc::bind (sigc::mem_fun (*this, &Editor::set_loop_from_region), false) + ); + + /* Set up the loop range from the selected regions, and start playback of it */ + reg_sens (_region_actions, "loop-region", _("Loop"), sigc::bind (sigc::mem_fun(*this, &Editor::set_loop_from_region), true)); + + /* Set the punch range from the selected regions */ + reg_sens (_region_actions, "set-punch-from-region", _("Set Punch"), sigc::mem_fun (*this, &Editor::set_punch_from_region)); + + /* Add a single range marker around all selected regions */ + reg_sens ( + _region_actions, "add-range-marker-from-region", _("Add 1 Range Marker"), sigc::mem_fun (*this, &Editor::add_location_from_region) + ); + + /* Add a range marker around each selected region */ + reg_sens ( + _region_actions, "add-range-markers-from-region", _("Add Range Marker(s)"), sigc::mem_fun (*this, &Editor::add_locations_from_region) + ); + + /* Snap selected regions to the grid */ + reg_sens (_region_actions, "snap-regions-to-grid", _("Snap to Grid"), sigc::mem_fun (*this, &Editor::snap_regions_to_grid)); + + /* Close gaps in selected regions */ + reg_sens (_region_actions, "close-region-gaps", _("Close Gaps"), sigc::mem_fun (*this, &Editor::close_region_gaps)); + + /* Open the Rhythm Ferret dialogue for the selected regions */ + reg_sens (_region_actions, "show-rhythm-ferret", _("Rhythm Ferret..."), sigc::mem_fun (*this, &Editor::show_rhythm_ferret)); + + /* Export the first selected region */ + reg_sens (_region_actions, "export-region", _("Export..."), sigc::mem_fun (*this, &Editor::export_region)); + + /* Separate under selected regions: XXX not sure what this does */ + reg_sens ( + _region_actions, + "separate-under-region", + _("Separate Under"), + sigc::mem_fun (*this, &Editor::separate_under_selected_regions) + ); + + reg_sens (_region_actions, "set-fade-in-length", _("Set Fade In Length"), sigc::bind (sigc::mem_fun (*this, &Editor::set_fade_length), true)); + reg_sens (_region_actions, "set-fade-out-length", _("Set Fade Out Length"), sigc::bind (sigc::mem_fun (*this, &Editor::set_fade_length), false)); + reg_sens (_region_actions, "set-tempo-from-region", _("Set Tempo from Region = Bar"), sigc::mem_fun (*this, &Editor::set_tempo_from_region)); + + reg_sens ( + _region_actions, + "split-region-at-transients", + _("Split at Percussion Onsets"), + sigc::mem_fun(*this, &Editor::split_region_at_transients) + ); + + /* Open the list editor dialogue for the selected regions */ + reg_sens (_region_actions, "show-region-list-editor", _("List Editor..."), sigc::mem_fun (*this, &Editor::show_midi_list_editor)); + + /* Open the region properties dialogue for the selected regions */ + reg_sens (_region_actions, "show-region-properties", _("Properties..."), sigc::mem_fun (*this, &Editor::show_region_properties)); + + reg_sens (_region_actions, "play-selected-regions", _("Play"), sigc::mem_fun(*this, &Editor::play_selected_region)); + + reg_sens (_region_actions, "bounce-region", _("Bounce"), sigc::mem_fun (*this, &Editor::bounce_region_selection)); + + reg_sens (_region_actions, "analyze-region", _("Spectral Analysis..."), sigc::mem_fun (*this, &Editor::analyze_region_selection)); + + reg_sens (_region_actions, "reset-region-gain-envelopes", _("Reset Envelope"), sigc::mem_fun (*this, &Editor::reset_region_gain_envelopes)); + + reg_sens (_region_actions, "reset-region-scale-amplitude", _("Reset Gain"), sigc::mem_fun (*this, &Editor::reset_region_scale_amplitude)); + + toggle_reg_sens ( + _region_actions, + "toggle-region-gain-envelope-visible", + _("Envelope Visible"), + sigc::mem_fun (*this, &Editor::toggle_gain_envelope_visibility) + ); + + toggle_reg_sens ( + _region_actions, + "toggle-region-gain-envelope-active", + _("Envelope Active"), + sigc::mem_fun (*this, &Editor::toggle_gain_envelope_active) + ); + + reg_sens (_region_actions, "quantize-region", _("Quantize"), sigc::mem_fun (*this, &Editor::quantize_region)); + reg_sens (_region_actions, "fork-region", _("Fork"), sigc::mem_fun (*this, &Editor::fork_region)); + reg_sens (_region_actions, "strip-region-silence", _("Strip Silence..."), sigc::mem_fun (*this, &Editor::strip_region_silence)); + reg_sens (_region_actions, "set-selection-from-region", _("Set Range Selection"), sigc::mem_fun (*this, &Editor::set_selection_from_region)); + + reg_sens (_region_actions, "nudge-forward", _("Nudge Forward"), sigc::bind (sigc::mem_fun (*this, &Editor::nudge_forward), false, false)); + reg_sens (_region_actions, "nudge-backward", _("Nudge Backward"), sigc::bind (sigc::mem_fun (*this, &Editor::nudge_backward), false, false)); + + reg_sens ( + _region_actions, + "nudge-forward-by-capture-offset", + _("Nudge Forward by Capture Offset"), + sigc::mem_fun (*this, &Editor::nudge_forward_capture_offset) + ); + + reg_sens ( + _region_actions, + "nudge-backward-by-capture-offset", + _("Nudge Backward by Capture Offset"), + sigc::mem_fun (*this, &Editor::nudge_backward_capture_offset) + ); + + reg_sens (_region_actions, "trim-region-to-loop", _("Trim to Loop"), sigc::mem_fun (*this, &Editor::trim_region_to_loop)); + reg_sens (_region_actions, "trim-region-to-punch", _("Trim to Punch"), sigc::mem_fun (*this, &Editor::trim_region_to_punch)); + + /* PART 2: actions that are not related to the selection, but for which the edit point type and location is important */ + + reg_sens ( + _region_actions, + "insert-region-from-region-list", + _("Insert Region From Region List"), + sigc::bind (sigc::mem_fun (*this, &Editor::insert_region_list_selection), 1) + ); + + /* PART 3: actions that operate on the selection and also require the edit point location */ + + reg_sens (_region_actions, "set-region-sync-position", _("Set Sync Position"), sigc::mem_fun (*this, &Editor::set_region_sync_position)); + reg_sens (_region_actions, "place-transient", _("Place Transient"), sigc::mem_fun (*this, &Editor::place_transient)); + reg_sens (_region_actions, "split-region", _("Split"), sigc::mem_fun (*this, &Editor::split_region)); + reg_sens (_region_actions, "trim-front", _("Trim Start at Edit Point"), sigc::mem_fun (*this, &Editor::trim_region_front)); + reg_sens (_region_actions, "trim-back", _("Trim End at Edit Point"), sigc::mem_fun (*this, &Editor::trim_region_back)); + + reg_sens ( + _region_actions, + "align-regions-start", + _("Align Start"), + sigc::bind (sigc::mem_fun(*this, &Editor::align_regions), ARDOUR::Start) + ); + + reg_sens ( + _region_actions, + "align-regions-start-relative", + _("Align Start Relative"), + sigc::bind (sigc::mem_fun (*this, &Editor::align_regions_relative), ARDOUR::Start) + ); + + reg_sens (_region_actions, "align-regions-end", _("Align End"), sigc::bind (sigc::mem_fun (*this, &Editor::align_regions), ARDOUR::End)); + + reg_sens ( + _region_actions, + "align-regions-end-relative", + _("Align End Relative"), + sigc::bind (sigc::mem_fun(*this, &Editor::align_regions_relative), ARDOUR::End) + ); + + reg_sens ( + _region_actions, + "align-regions-sync", + _("Align Sync"), + sigc::bind (sigc::mem_fun(*this, &Editor::align_regions), ARDOUR::SyncPoint) + ); + + reg_sens ( + _region_actions, + "align-regions-sync-relative", + _("Align Sync Relative"), + sigc::bind (sigc::mem_fun (*this, &Editor::align_regions_relative), ARDOUR::SyncPoint) + ); + + reg_sens (_region_actions, "choose-top-region", _("Choose Top..."), mem_fun (*this, &Editor::change_region_layering_order)); + + _all_region_actions_sensitized = true; + + ActionManager::add_action_group (_region_actions); +} diff --git a/gtk2_ardour/editor_keyboard.cc b/gtk2_ardour/editor_keyboard.cc index 42cfdc9f5c..8f4941a590 100644 --- a/gtk2_ardour/editor_keyboard.cc +++ b/gtk2_ardour/editor_keyboard.cc @@ -78,38 +78,6 @@ Editor::kbd_driver (sigc::slot theslot, bool use_track_canvas, b } } -void -Editor::kbd_mute_unmute_region () -{ - if (!selection->regions.empty ()) { - - if (selection->regions.size() > 1) { - begin_reversible_command (_("mute regions")); - } else { - begin_reversible_command (_("mute region")); - } - - for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { - - (*i)->region()->playlist()->clear_changes (); - (*i)->region()->set_muted (!(*i)->region()->muted ()); - _session->add_command (new StatefulDiffCommand ((*i)->region()->playlist())); - - } - - commit_reversible_command (); - - } else if (entered_regionview) { - - begin_reversible_command (_("mute region")); - entered_regionview->region()->playlist()->clear_changes (); - entered_regionview->region()->set_muted (!entered_regionview->region()->muted()); - _session->add_command (new StatefulDiffCommand (entered_regionview->region()->playlist())); - commit_reversible_command(); - - } -} - void Editor::kbd_do_brush (GdkEvent *ev) { diff --git a/gtk2_ardour/editor_keys.cc b/gtk2_ardour/editor_keys.cc index 2ef22c8273..930c5a229d 100644 --- a/gtk2_ardour/editor_keys.cc +++ b/gtk2_ardour/editor_keys.cc @@ -91,12 +91,6 @@ Editor::keyboard_paste () paste (1); } -void -Editor::keyboard_insert_region_list_selection () -{ - insert_region_list_selection (1); -} - int Editor::get_prefix (float& /*val*/, bool& was_floating) { diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 95fde99826..8e68ad4ec1 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1188,14 +1188,14 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT were_dragging = true; } - update_region_layering_order_editor (where); + update_region_layering_order_editor (); /* edit events get handled here */ if (!_drags->active () && Keyboard::is_edit_event (&event->button)) { switch (item_type) { case RegionItem: - edit_region (); + show_region_properties (); break; case TempoMarkerItem: diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index f6031a6bcd..360d1225a3 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -307,9 +307,11 @@ Editor::nudge_forward (bool next, bool force_playhead) framepos_t distance; framepos_t next_distance; - RegionSelection rs = get_regions_for_action (); + if (!_session) { + return; + } - if (!_session) return; + RegionSelection rs = get_regions_from_selection_and_entered (); if (!force_playhead && !rs.empty()) { @@ -385,9 +387,12 @@ Editor::nudge_backward (bool next, bool force_playhead) { framepos_t distance; framepos_t next_distance; - RegionSelection rs = get_regions_for_action (); - if (!_session) return; + if (!_session) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); if (!force_playhead && !rs.empty()) { @@ -474,61 +479,54 @@ Editor::nudge_backward (bool next, bool force_playhead) void Editor::nudge_forward_capture_offset () { - framepos_t distance; - RegionSelection rs = get_regions_for_action (); - - if (!_session) return; - - if (!rs.empty()) { - - begin_reversible_command (_("nudge forward")); - - distance = _session->worst_output_latency(); - - for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { - boost::shared_ptr r ((*i)->region()); - - r->clear_changes (); - r->set_position (r->position() + distance, this); - _session->add_command(new StatefulDiffCommand (r)); - } - - commit_reversible_command (); - + RegionSelection rs = get_regions_from_selection_and_entered (); + + if (!_session || rs.empty()) { + return; } + + begin_reversible_command (_("nudge forward")); + + framepos_t const distance = _session->worst_output_latency(); + + for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { + boost::shared_ptr r ((*i)->region()); + + r->clear_changes (); + r->set_position (r->position() + distance, this); + _session->add_command(new StatefulDiffCommand (r)); + } + + commit_reversible_command (); } void Editor::nudge_backward_capture_offset () { - framepos_t distance; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); - if (!_session) { + if (!_session || rs.empty()) { return; } - if (!rs.empty()) { + begin_reversible_command (_("nudge forward")); + + framepos_t const distance = _session->worst_output_latency(); - begin_reversible_command (_("nudge forward")); - - distance = _session->worst_output_latency(); - - for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { - boost::shared_ptr r ((*i)->region()); - - r->clear_changes (); - - if (r->position() > distance) { - r->set_position (r->position() - distance, this); - } else { - r->set_position (0, this); - } - _session->add_command(new StatefulDiffCommand (r)); + for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { + boost::shared_ptr r ((*i)->region()); + + r->clear_changes (); + + if (r->position() > distance) { + r->set_position (r->position() - distance, this); + } else { + r->set_position (0, this); } - - commit_reversible_command (); + _session->add_command(new StatefulDiffCommand (r)); } + + commit_reversible_command (); } /* DISPLAY MOTION */ @@ -909,12 +907,11 @@ void Editor::cursor_to_selection_start (EditorCursor *cursor) { framepos_t pos = 0; - RegionSelection rs = get_regions_for_action (); switch (mouse_mode) { case MouseObject: - if (!rs.empty()) { - pos = rs.start(); + if (!selection->regions.empty()) { + pos = selection->regions.start(); } break; @@ -939,12 +936,11 @@ void Editor::cursor_to_selection_end (EditorCursor *cursor) { framepos_t pos = 0; - RegionSelection rs = get_regions_for_action (); switch (mouse_mode) { case MouseObject: - if (!rs.empty()) { - pos = rs.end_frame(); + if (!selection->regions.empty()) { + pos = selection->regions.end_frame(); } break; @@ -1109,12 +1105,10 @@ Editor::selected_marker_to_selection_start () return; } - RegionSelection rs = get_regions_for_action (); - switch (mouse_mode) { case MouseObject: - if (!rs.empty()) { - pos = rs.start(); + if (!selection->regions.empty()) { + pos = selection->regions.start(); } break; @@ -1146,12 +1140,10 @@ Editor::selected_marker_to_selection_end () return; } - RegionSelection rs = get_regions_for_action (); - switch (mouse_mode) { case MouseObject: - if (!rs.empty()) { - pos = rs.end_frame(); + if (!selection->regions.empty()) { + pos = selection->regions.end_frame(); } break; @@ -1643,7 +1635,7 @@ Editor::temporal_zoom_region (bool both_axes) framepos_t end = 0; set tracks; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -1918,16 +1910,17 @@ Editor::add_location_from_playhead_cursor () add_location_mark (_session->audible_frame()); } +/** Add a range marker around each selected region */ void -Editor::add_locations_from_audio_region () +Editor::add_locations_from_region () { - RegionSelection rs = get_regions_for_action (); - + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } - _session->begin_reversible_command (rs.size () > 1 ? _("add markers") : _("add marker")); + _session->begin_reversible_command (selection->regions.size () > 1 ? _("add markers") : _("add marker")); XMLNode &before = _session->locations()->get_state(); for (RegionSelection::iterator i = rs.begin (); i != rs.end (); ++i) { @@ -1944,11 +1937,12 @@ Editor::add_locations_from_audio_region () _session->commit_reversible_command (); } +/** Add a single range marker around all selected regions */ void -Editor::add_location_from_audio_region () +Editor::add_location_from_region () { - RegionSelection rs = get_regions_for_action (); - + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } @@ -1958,7 +1952,7 @@ Editor::add_location_from_audio_region () string markername; - if (rs.size() > 1) { // more than one region selected + if (rs.size() > 1) { _session->locations()->next_available_name(markername, "regions"); } else { RegionView* rv = *(rs.begin()); @@ -1971,7 +1965,7 @@ Editor::add_location_from_audio_region () } // single range spanning all selected - Location *location = new Location (*_session, rs.start(), rs.end_frame(), markername, Location::IsRangeMarker); + Location *location = new Location (*_session, selection->regions.start(), selection->regions.end_frame(), markername, Location::IsRangeMarker); _session->locations()->add (location, true); XMLNode &after = _session->locations()->get_state(); @@ -2373,28 +2367,6 @@ Editor::play_selection () _session->request_play_range (&selection->time, true); } -void -Editor::loop_selected_region () -{ - RegionSelection rs = get_regions_for_action (); - - if (!rs.empty()) { - RegionView *rv = *(rs.begin()); - Location* tll; - - if ((tll = transport_loop_location()) != 0) { - - tll->set (rv->region()->position(), rv->region()->last_frame()); - - // enable looping, reposition and start rolling - - _session->request_play_loop (true); - _session->request_locate (tll->start(), false); - _session->request_transport_speed (1.0f); - } - } -} - void Editor::play_location (Location& location) { @@ -2449,7 +2421,7 @@ Editor::lower_region_to_bottom () /** Show the region editor for the selected regions */ void -Editor::edit_region () +Editor::show_region_properties () { selection->foreach_regionview (&RegionView::show_region_editor); } @@ -2462,10 +2434,10 @@ Editor::show_midi_list_editor () } void -Editor::rename_region() +Editor::rename_region () { - RegionSelection rs = get_regions_for_action (); - + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } @@ -2488,7 +2460,7 @@ Editor::rename_region() d.set_size_request (300, -1); d.set_position (Gtk::WIN_POS_MOUSE); - entry.set_text (rs.front()->region()->name()); + entry.set_text (selection->regions.front()->region()->name()); entry.select_region (0, -1); entry.signal_activate().connect (sigc::bind (sigc::mem_fun (d, &Dialog::response), RESPONSE_OK)); @@ -2497,17 +2469,19 @@ Editor::rename_region() entry.grab_focus(); - int ret = d.run(); + int const ret = d.run(); d.hide (); - if (ret == RESPONSE_OK) { - std::string str = entry.get_text(); - strip_whitespace_edges (str); - if (!str.empty()) { - rs.front()->region()->set_name (str); - _regions->redisplay (); - } + if (ret != RESPONSE_OK) { + return; + } + + std::string str = entry.get_text(); + strip_whitespace_edges (str); + if (!str.empty()) { + rs.front()->region()->set_name (str); + _regions->redisplay (); } } @@ -2546,8 +2520,9 @@ Editor::play_selected_region () { framepos_t start = max_framepos; framepos_t end = 0; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } @@ -2658,8 +2633,8 @@ Editor::create_region_from_selection (vector >& new_re void Editor::split_multichannel_region () { - RegionSelection rs = get_regions_for_action (); - + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } @@ -2882,15 +2857,11 @@ Editor::separate_regions_using_location (Location& loc) void Editor::separate_under_selected_regions () { - RegionSelection rs = get_regions_for_action (); - vector playlists; - if (!_session) { - return; - } + RegionSelection rs = get_regions_from_selection_and_entered (); - if (rs.empty()) { + if (!_session || rs.empty()) { return; } @@ -3050,14 +3021,13 @@ Editor::crop_region_to (framepos_t start, framepos_t end) void Editor::region_fill_track () { - framepos_t end; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; } - end = _session->current_end_frame (); + framepos_t const end = _session->current_end_frame (); begin_reversible_command (_("region fill")); @@ -3130,11 +3100,9 @@ Editor::region_fill_selection () } void -Editor::set_region_sync_from_edit_point () +Editor::set_region_sync_position () { - framepos_t where = get_preferred_edit_position (); - RegionSelection rs = get_regions_for_action (); - set_sync_point (where, rs); + set_sync_point (get_preferred_edit_position (), get_regions_from_selection_and_edit_point ()); } void @@ -3169,65 +3137,66 @@ Editor::set_sync_point (framepos_t where, const RegionSelection& rs) void Editor::remove_region_sync () { - RegionSelection rs = get_regions_for_action (); - + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } - begin_reversible_command (_("remove sync")); + begin_reversible_command (_("remove region sync")); + for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { (*i)->region()->clear_changes (); (*i)->region()->clear_sync_position (); _session->add_command(new StatefulDiffCommand ((*i)->region())); } + commit_reversible_command (); } void -Editor::naturalize () +Editor::naturalize_region () { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; } - begin_reversible_command (_("naturalize")); + if (rs.size() > 1) { + begin_reversible_command (_("move regions to original position")); + } else { + begin_reversible_command (_("move region to original position")); + } + for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { (*i)->region()->clear_changes (); (*i)->region()->move_to_natural_position (this); _session->add_command (new StatefulDiffCommand ((*i)->region())); } + commit_reversible_command (); } void -Editor::align (RegionPoint what) +Editor::align_regions (RegionPoint what) { - RegionSelection rs = get_regions_for_action (); - framepos_t where = get_preferred_edit_position(); - - if (!rs.empty()) { - align_selection (what, where, rs); - } else { - - RegionSelection rs; - get_regions_at (rs, where, selection->tracks); - align_selection (what, where, rs); + RegionSelection const rs = get_regions_from_selection_and_edit_point (); + + if (rs.empty()) { + return; } -} -void -Editor::align_relative (RegionPoint what) -{ - framepos_t where = get_preferred_edit_position(); - RegionSelection rs = get_regions_for_action (); + begin_reversible_command (_("align selection")); - if (!rs.empty()) { - align_selection_relative (what, where, rs); + framepos_t const position = get_preferred_edit_position (); + + for (RegionSelection::const_iterator i = rs.begin(); i != rs.end(); ++i) { + align_region_internal ((*i)->region(), what, position); } + + commit_reversible_command (); } struct RegionSortByTime { @@ -3237,12 +3206,16 @@ struct RegionSortByTime { }; void -Editor::align_selection_relative (RegionPoint point, framepos_t position, const RegionSelection& rs) +Editor::align_regions_relative (RegionPoint point) { + RegionSelection const rs = get_regions_from_selection_and_edit_point (); + if (rs.empty()) { return; } + framepos_t const position = get_preferred_edit_position (); + framepos_t distance = 0; framepos_t pos = 0; int dir = 1; @@ -3320,22 +3293,6 @@ Editor::align_selection_relative (RegionPoint point, framepos_t position, const commit_reversible_command (); } -void -Editor::align_selection (RegionPoint point, framepos_t position, const RegionSelection& rs) -{ - if (rs.empty()) { - return; - } - - begin_reversible_command (_("align selection")); - - for (RegionSelection::const_iterator i = rs.begin(); i != rs.end(); ++i) { - align_region_internal ((*i)->region(), point, position); - } - - commit_reversible_command (); -} - void Editor::align_region (boost::shared_ptr region, RegionPoint point, framepos_t position) { @@ -3384,7 +3341,7 @@ void Editor::trim_region (bool front) { framepos_t where = get_preferred_edit_position(); - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_edit_point (); if (rs.empty()) { return; @@ -3430,10 +3387,11 @@ Editor::trim_region_to_punch () } trim_region_to_location (*loc, _("trim to punch")); } + void Editor::trim_region_to_location (const Location& loc, const char* str) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); begin_reversible_command (str); @@ -3472,78 +3430,6 @@ Editor::trim_region_to_location (const Location& loc, const char* str) commit_reversible_command (); } -void -Editor::trim_region_to_edit_point () -{ - RegionSelection rs = get_regions_for_action (); - - framepos_t where = get_preferred_edit_position(); - - begin_reversible_command (_("trim region start to edit point")); - - for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) { - RegionView* rv = (*x); - - /* require region to cover trim */ - if (!rv->region()->covers (where)) { - continue; - } - - RouteTimeAxisView* tav = dynamic_cast (&rv->get_time_axis_view()); - if (!tav) { - return; - } - - float speed = 1.0; - - if (tav->track() != 0) { - speed = tav->track()->speed(); - } - - rv->region()->clear_changes (); - rv->region()->trim_end (session_frame_to_track_frame(where, speed), this); - _session->add_command(new StatefulDiffCommand (rv->region())); - } - - commit_reversible_command (); -} - -void -Editor::trim_region_from_edit_point () -{ - RegionSelection rs = get_regions_for_action (); - - framepos_t where = get_preferred_edit_position(); - - begin_reversible_command (_("trim region end to edit point")); - - for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) { - RegionView* rv = (*x); - - /* require region to cover trim */ - if (!rv->region()->covers (where)) { - continue; - } - - RouteTimeAxisView* tav = dynamic_cast (&rv->get_time_axis_view()); - if (!tav) { - return; - } - - float speed = 1.0; - - if (tav->track() != 0) { - speed = tav->track()->speed(); - } - - rv->region()->clear_changes (); - rv->region()->trim_front (session_frame_to_track_frame(where, speed), this); - _session->add_command(new StatefulDiffCommand (rv->region())); - } - - commit_reversible_command (); -} - void Editor::trim_region_to_previous_region_end () { @@ -3559,7 +3445,7 @@ Editor::trim_region_to_next_region_start () void Editor::trim_to_region(bool forward) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); begin_reversible_command (_("trim to region")); @@ -3834,7 +3720,7 @@ Editor::cut_copy (CutCopyOp op) /* we only want to cut regions if some are selected */ if (!selection->regions.empty()) { - rs = get_regions_for_action (false); + rs = selection->regions; } switch (current_mouse_mode()) { @@ -3962,13 +3848,9 @@ Editor::remove_clicked_region () void Editor::remove_selected_regions () { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); - if (!_session) { - return; - } - - if (rs.empty()) { + if (!_session || rs.empty()) { return; } @@ -4492,8 +4374,8 @@ Editor::normalize_region () return; } - RegionSelection rs = get_regions_for_action (false); - + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } @@ -4565,7 +4447,7 @@ Editor::reset_region_scale_amplitude () return; } - RegionSelection rs = get_regions_for_action (false); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -4586,19 +4468,15 @@ Editor::reset_region_scale_amplitude () } void -Editor::adjust_region_scale_amplitude (bool up) +Editor::adjust_region_gain (bool up) { - if (!_session) { + RegionSelection rs = get_regions_from_selection_and_entered (); + + if (!_session || rs.empty()) { return; } - RegionSelection rs = get_regions_for_action (); - - if (rs.empty()) { - return; - } - - begin_reversible_command ("denormalize"); + begin_reversible_command ("adjust region gain"); for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) { AudioRegionView* const arv = dynamic_cast(*r); @@ -4654,7 +4532,7 @@ Editor::strip_region_silence () return; } - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -4695,7 +4573,7 @@ Editor::apply_midi_note_edit_op (MidiOperator& op) { Command* cmd; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -4721,13 +4599,12 @@ Editor::apply_midi_note_edit_op (MidiOperator& op) } commit_reversible_command (); - rs.clear (); } void Editor::fork_region () { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -4757,7 +4634,6 @@ Editor::fork_region () } commit_reversible_command (); - rs.clear (); set_canvas_cursor (current_canvas_cursor); } @@ -4788,7 +4664,7 @@ Editor::quantize_region () void Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -4854,40 +4730,11 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress } commit_reversible_command (); - rs.clear (); out: set_canvas_cursor (current_canvas_cursor); } -void -Editor::region_selection_op (void (Region::*pmf)(void)) -{ - for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { - Region* region = (*i)->region().get(); - (region->*pmf)(); - } -} - - -void -Editor::region_selection_op (void (Region::*pmf)(void*), void *arg) -{ - for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { - Region* region = (*i)->region().get(); - (region->*pmf)(arg); - } -} - -void -Editor::region_selection_op (void (Region::*pmf)(bool), bool yn) -{ - for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { - Region* region = (*i)->region().get(); - (region->*pmf)(yn); - } -} - void Editor::external_edit_region () { @@ -4897,11 +4744,10 @@ Editor::external_edit_region () void Editor::brush (framepos_t pos) { - RegionSelection sel; - RegionSelection rs = get_regions_for_action (); - snap_to (pos); + RegionSelection rs = get_regions_from_selection_and_entered (); + if (rs.empty()) { return; } @@ -4914,7 +4760,7 @@ Editor::brush (framepos_t pos) void Editor::reset_region_gain_envelopes () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; @@ -4939,7 +4785,11 @@ Editor::reset_region_gain_envelopes () void Editor::toggle_gain_envelope_visibility () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); + if (_ignore_region_action) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; @@ -4962,7 +4812,11 @@ Editor::toggle_gain_envelope_visibility () void Editor::toggle_gain_envelope_active () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); + if (_ignore_region_action) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; @@ -4985,13 +4839,17 @@ Editor::toggle_gain_envelope_active () void Editor::toggle_region_lock () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); + if (_ignore_region_action) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; } - _session->begin_reversible_command (_("region lock")); + _session->begin_reversible_command (_("toggle region lock")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { (*i)->region()->clear_changes (); @@ -5005,7 +4863,11 @@ Editor::toggle_region_lock () void Editor::toggle_region_lock_style () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); + if (_ignore_region_action) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; @@ -5023,37 +4885,20 @@ Editor::toggle_region_lock_style () _session->commit_reversible_command (); } - void -Editor::toggle_region_mute () +Editor::toggle_opaque_region () { - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); + if (_ignore_region_action) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); if (!_session || rs.empty()) { return; } - _session->begin_reversible_command (_("region mute")); - - for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { - (*i)->region()->clear_changes (); - (*i)->region()->set_muted (!(*i)->region()->muted()); - _session->add_command (new StatefulDiffCommand ((*i)->region())); - } - - _session->commit_reversible_command (); -} - -void -Editor::toggle_region_opaque () -{ - RegionSelection rs = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id); - - if (!_session || rs.empty()) { - return; - } - - _session->begin_reversible_command (_("region opacity")); + _session->begin_reversible_command (_("change region opacity")); for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { (*i)->region()->clear_changes (); @@ -5089,7 +4934,7 @@ Editor::toggle_record_enable () void Editor::set_fade_length (bool in) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5157,59 +5002,10 @@ Editor::set_fade_length (bool in) commit_reversible_command (); } -void -Editor::toggle_fade_active (bool in) -{ - RegionSelection rs = get_regions_for_action (); - - if (rs.empty()) { - return; - } - - const char* cmd = (in ? _("toggle fade in active") : _("toggle fade out active")); - bool have_switch = false; - bool yn = false; - - begin_reversible_command (cmd); - - for (RegionSelection::iterator x = rs.begin(); x != rs.end(); ++x) { - AudioRegionView* tmp = dynamic_cast (*x); - - if (!tmp) { - return; - } - - boost::shared_ptr region (tmp->audio_region()); - - /* make the behaviour consistent across all regions */ - - if (!have_switch) { - if (in) { - yn = region->fade_in_active(); - } else { - yn = region->fade_out_active(); - } - have_switch = true; - } - - region->clear_changes (); - - if (in) { - region->set_fade_in_active (!yn); - } else { - region->set_fade_out_active (!yn); - } - - _session->add_command(new StatefulDiffCommand (region)); - } - - commit_reversible_command (); -} - void Editor::set_fade_in_shape (FadeShape shape) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5240,7 +5036,7 @@ Editor::set_fade_in_shape (FadeShape shape) void Editor::set_fade_out_shape (FadeShape shape) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5270,7 +5066,7 @@ Editor::set_fade_out_shape (FadeShape shape) void Editor::set_fade_in_active (bool yn) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5299,7 +5095,7 @@ Editor::set_fade_in_active (bool yn) void Editor::set_fade_out_active (bool yn) { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5325,18 +5121,18 @@ Editor::set_fade_out_active (bool yn) } void -Editor::toggle_selected_region_fades (int dir) +Editor::toggle_region_fades (int dir) { - RegionSelection::iterator i; boost::shared_ptr ar; bool yn; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; } + RegionSelection::iterator i; for (i = rs.begin(); i != rs.end(); ++i) { if ((ar = boost::dynamic_pointer_cast((*i)->region())) != 0) { if (dir == -1) { @@ -5454,7 +5250,7 @@ Editor::set_playhead_cursor () } void -Editor::split () +Editor::split_region () { if (((mouse_mode == MouseRange) || (mouse_mode != MouseObject && _join_object_range_state == JOIN_OBJECT_RANGE_RANGE)) && @@ -5463,9 +5259,9 @@ Editor::split () return; } - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_edit_point (); - framepos_t where = get_preferred_edit_position(); + framepos_t where = get_preferred_edit_position (); if (rs.empty()) { return; @@ -5638,7 +5434,7 @@ Editor::set_loop_from_region (bool play) framepos_t start = max_framepos; framepos_t end = 0; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5697,7 +5493,7 @@ Editor::set_punch_from_region () framepos_t start = max_framepos; framepos_t end = 0; - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5716,9 +5512,9 @@ Editor::set_punch_from_region () } void -Editor::pitch_shift_regions () +Editor::pitch_shift_region () { - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_entered (); if (rs.empty()) { return; @@ -5728,15 +5524,11 @@ Editor::pitch_shift_regions () } void -Editor::use_region_as_bar () +Editor::set_tempo_from_region () { - if (!_session) { - return; - } + RegionSelection rs = get_regions_from_selection_and_entered (); - RegionSelection rs = get_regions_for_action (); - - if (rs.empty()) { + if (!_session || rs.empty()) { return; } @@ -5845,13 +5637,9 @@ Editor::split_region_at_transients () { AnalysisFeatureList positions; - if (!_session) { - return; - } + RegionSelection rs = get_regions_from_selection_and_entered (); - RegionSelection rs = get_regions_for_action (); - - if (rs.empty()) { + if (!_session || rs.empty()) { return; } @@ -6021,7 +5809,7 @@ Editor::place_transient() return; } - RegionSelection rs = get_regions_for_action (); + RegionSelection rs = get_regions_from_selection_and_edit_point (); if (rs.empty()) { return; @@ -6054,15 +5842,11 @@ Editor::remove_transient(ArdourCanvas::Item* item) } void -Editor::snap_regions_to_grid() +Editor::snap_regions_to_grid () { - if (!_session) { - return; - } + RegionSelection rs = get_regions_from_selection_and_entered (); - RegionSelection rs = get_regions_for_action (); - - if (rs.empty()) { + if (!_session || rs.empty()) { return; } @@ -6078,19 +5862,15 @@ Editor::snap_regions_to_grid() } void -Editor::close_region_gaps() +Editor::close_region_gaps () { - if (!_session) { + RegionSelection rs = get_regions_from_selection_and_entered (); + + if (!_session || rs.empty()) { return; } - RegionSelection rs = get_regions_for_action (); - - if (rs.empty()) { - return; - } - - Dialog dialog (rs.size() > 1 ? _("Conform regions") : _("Conform region")); + Dialog dialog (rs.size() > 1 ? _("Close region gaps") : _("Close region gaps")); HBox hbox_crossfade; hbox_crossfade.set_spacing (10); @@ -6172,6 +5952,8 @@ Editor::tab_to_transient (bool forward) { AnalysisFeatureList positions; + RegionSelection rs = get_regions_from_selection_and_entered (); + if (!_session) { return; } @@ -6201,8 +5983,6 @@ Editor::tab_to_transient (bool forward) } else { - RegionSelection rs = get_regions_for_action (); - if (rs.empty()) { return; } @@ -6687,3 +6467,33 @@ Editor::end_visual_state_op (uint32_t n) return false; // do not call again } +void +Editor::toggle_region_mute () +{ + if (_ignore_region_action) { + return; + } + + RegionSelection rs = get_regions_from_selection_and_entered (); + + if (rs.empty ()) { + return; + } + + if (rs.size() > 1) { + begin_reversible_command (_("mute regions")); + } else { + begin_reversible_command (_("mute region")); + } + + for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) { + + (*i)->region()->playlist()->clear_changes (); + (*i)->region()->set_muted (!(*i)->region()->muted ()); + _session->add_command (new StatefulDiffCommand ((*i)->region()->playlist())); + + } + + commit_reversible_command (); +} + diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index 4fc418b8b3..0845aed01a 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -26,6 +26,7 @@ #include "ardour/playlist.h" #include "ardour/route_group.h" #include "ardour/profile.h" +#include "ardour/midi_region.h" #include "editor.h" #include "actions.h" @@ -927,27 +928,208 @@ Editor::time_selection_changed () } } +/** Set all region actions to have a given sensitivity */ void -Editor::sensitize_the_right_region_actions (bool have_selected_regions) +Editor::sensitize_all_region_actions (bool s) { - for (vector >::iterator x = ActionManager::region_selection_sensitive_actions.begin(); - x != ActionManager::region_selection_sensitive_actions.end(); ++x) { + Glib::ListHandle > all = _region_actions->get_actions (); - string accel_path = (*x)->get_accel_path (); - AccelKey key; + for (Glib::ListHandle >::iterator i = all.begin(); i != all.end(); ++i) { + (*i)->set_sensitive (s); + } - /* if there is an accelerator, it should always be sensitive - to allow for keyboard ops on entered regions. - */ + _all_region_actions_sensitized = s; +} - bool known = ActionManager::lookup_entry (accel_path, key); +/** Sensitize region-based actions based on the selection ONLY, ignoring the entered_regionview. + * This method should be called just before displaying a Region menu. When a Region menu is not + * currently being shown, all region actions are sensitized so that hotkey-triggered actions + * on entered_regionviews work without having to check sensitivity every time the selection or + * entered_regionview changes. + * + * This method also sets up toggle action state as appropriate. + */ +void +Editor::sensitize_the_right_region_actions () +{ + RegionSelection rs = get_regions_from_selection_and_entered (); + sensitize_all_region_actions (!rs.empty ()); - if (known && ((key.get_key() != GDK_VoidSymbol) && (key.get_key() != 0))) { - (*x)->set_sensitive (true); + _ignore_region_action = true; + + /* Look through the regions that are selected and make notes about what we have got */ + + bool have_audio = false; + bool have_midi = false; + bool have_locked = false; + bool have_unlocked = false; + bool have_position_lock_style_audio = false; + bool have_position_lock_style_music = false; + bool have_muted = false; + bool have_unmuted = false; + bool have_opaque = false; + bool have_non_opaque = false; + bool have_not_at_natural_position = false; + bool have_envelope_visible = false; + bool have_envelope_invisible = false; + bool have_envelope_active = false; + bool have_envelope_inactive = false; + bool have_non_unity_scale_amplitude = false; + + for (list::const_iterator i = rs.begin(); i != rs.end(); ++i) { + + boost::shared_ptr r = (*i)->region (); + boost::shared_ptr ar = boost::dynamic_pointer_cast (r); + + if (ar) { + have_audio = true; + } + + if (boost::dynamic_pointer_cast (r)) { + have_midi = true; + } + + if (r->locked()) { + have_locked = true; } else { - (*x)->set_sensitive (have_selected_regions); + have_unlocked = true; + } + + if (r->position_lock_style() == MusicTime) { + have_position_lock_style_music = true; + } else { + have_position_lock_style_audio = true; + } + + if (r->muted()) { + have_muted = true; + } else { + have_unmuted = true; + } + + if (r->opaque()) { + have_opaque = true; + } else { + have_non_opaque = true; + } + + if (!r->at_natural_position()) { + have_not_at_natural_position = true; + } + + if (ar) { + /* its a bit unfortunate that "envelope visible" is a view-only + property. we have to find the regionview to able to check + its current setting. + */ + + have_envelope_invisible = true; + + if (*i) { + AudioRegionView* arv = dynamic_cast (*i); + if (arv && arv->envelope_visible()) { + have_envelope_visible = true; + } + } + + if (ar->envelope_active()) { + have_envelope_active = true; + } else { + have_envelope_inactive = true; + } + + if (ar->scale_amplitude() != 1) { + have_non_unity_scale_amplitude = true; + } } } + + if (rs.size() > 1) { + _region_actions->get_action("show-region-list-editor")->set_sensitive (false); + _region_actions->get_action("show-region-properties")->set_sensitive (false); + _region_actions->get_action("rename-region")->set_sensitive (false); + } else if (rs.size() == 1) { + _region_actions->get_action("add-range-markers-from-region")->set_sensitive (false); + _region_actions->get_action("close-region-gaps")->set_sensitive (false); + } + + + if (!have_midi) { + _region_actions->get_action("show-region-list-editor")->set_sensitive (false); + _region_actions->get_action("quantize-region")->set_sensitive (false); + _region_actions->get_action("fork-region")->set_sensitive (false); + } + + if (_edit_point == EditAtMouse) { + _region_actions->get_action("set-region-sync-position")->set_sensitive (false); + _region_actions->get_action("trim-front")->set_sensitive (false); + _region_actions->get_action("trim-back")->set_sensitive (false); + _region_actions->get_action("split-region")->set_sensitive (false); + _region_actions->get_action("place-transient")->set_sensitive (false); + } + + if (have_audio) { + + if (have_envelope_visible && !have_envelope_invisible) { + Glib::RefPtr::cast_dynamic (_region_actions->get_action("toggle-region-gain-envelope-visible"))->set_active (); + } else if (have_envelope_visible && have_envelope_invisible) { +// _region_actions->get_action("toggle-region-gain-envelope-visible")->set_inconsistent (); + } + + if (have_envelope_active && !have_envelope_inactive) { + Glib::RefPtr::cast_dynamic (_region_actions->get_action("toggle-region-gain-envelope-active"))->set_active (); + } else if (have_envelope_active && have_envelope_inactive) { +// _region_actions->get_action("toggle-region-gain-envelope-active")->set_inconsistent (); + } + + } else { + + _region_actions->get_action("analyze-region")->set_sensitive (false); + _region_actions->get_action("reset-region-gain-envelopes")->set_sensitive (false); + _region_actions->get_action("toggle-region-gain-envelope-visible")->set_sensitive (false); + _region_actions->get_action("toggle-region-gain-envelope-active")->set_sensitive (false); + + } + + if (!have_non_unity_scale_amplitude || !have_audio) { + _region_actions->get_action("reset-region-scale-amplitude")->set_sensitive (false); + } + + Glib::RefPtr::cast_dynamic (_region_actions->get_action("toggle-region-lock"))->set_active (have_locked && !have_unlocked); + if (have_locked && have_unlocked) { +// _region_actions->get_action("toggle-region-lock")->set_inconsistent (); + } + + Glib::RefPtr::cast_dynamic (_region_actions->get_action("toggle-region-lock-style"))->set_active (have_position_lock_style_music && !have_position_lock_style_audio); + + if (have_position_lock_style_music && have_position_lock_style_audio) { +// _region_actions->get_action("toggle-region-lock-style")->set_inconsistent (); + } + + Glib::RefPtr::cast_dynamic (_region_actions->get_action("toggle-region-mute"))->set_active (have_muted && !have_unmuted); + if (have_muted && have_unmuted) { +// _region_actions->get_action("toggle-region-mute")->set_inconsistent (); + } + + Glib::RefPtr::cast_dynamic (_region_actions->get_action("toggle-opaque-region"))->set_active (have_opaque && !have_non_opaque); + if (have_opaque && have_non_opaque) { +// _region_actions->get_action("toggle-opaque-region")->set_inconsistent (); + } + + if (!have_not_at_natural_position) { + _region_actions->get_action("naturalize-region")->set_sensitive (false); + } + + /* XXX: should also check that there is a track of the appropriate type for the selected region */ + if (_edit_point == EditAtMouse || _regions->get_single_selection() == 0 || selection->tracks.empty()) { + _region_actions->get_action("insert-region-from-region-list")->set_sensitive (false); + } else { + _region_actions->get_action("insert-region-from-region-list")->set_sensitive (true); + } + + _ignore_region_action = false; + + _all_region_actions_sensitized = false; } @@ -969,10 +1151,15 @@ Editor::region_selection_changed () _regions->set_selected (selection->regions); } - sensitize_the_right_region_actions (!selection->regions.empty()); - _regions->block_change_connection (false); editor_regions_selection_changed_connection.block(false); + + if (!_all_region_actions_sensitized) { + /* This selection change might have changed what region actions + are allowed, so sensitize them all in case a key is pressed. + */ + sensitize_all_region_actions (true); + } } void diff --git a/gtk2_ardour/ergonomic-us.bindings.in b/gtk2_ardour/ergonomic-us.bindings.in index 0101bf9202..c340adbb03 100644 --- a/gtk2_ardour/ergonomic-us.bindings.in +++ b/gtk2_ardour/ergonomic-us.bindings.in @@ -90,7 +90,7 @@ ; (gtk_accel_path "/options/OutputAutoConnectMaster" "") ; (gtk_accel_path "/JACK/JACKLatency64" "") (gtk_accel_path "/Editor/undo" "<@PRIMARY@>z") -(gtk_accel_path "/Editor/insert-region" "i") +(gtk_accel_path "/Editor/insert-region-from-region-list" "i") ; (gtk_accel_path "/Editor/center-playhead" "") ; (gtk_accel_path "/Snap/snap-to-region-start" "") ; (gtk_accel_path "/Editor/View" "") @@ -302,7 +302,7 @@ (gtk_accel_path "/Editor/temporal-zoom-out" "r") ; (gtk_accel_path "/options/UseSoftwareMonitoring" "") ; (gtk_accel_path "/Editor/Subframes100" "") -(gtk_accel_path "/Editor/mute-unmute-region" "<@SECONDARY@>m") +(gtk_accel_path "/Editor/toggle-region-mute" "<@SECONDARY@>m") (gtk_accel_path "/Editor/add-location-from-playhead" "m") ; (gtk_accel_path "/options/OutputAutoConnectManual" "") ; (gtk_accel_path "/Snap/snap-to-region-sync" "") @@ -317,9 +317,9 @@ ; (gtk_accel_path "/options/MeterHoldLong" "") ; (gtk_accel_path "/Snap/snap-to-seconds" "") (gtk_accel_path "/Editor/set-fade-in-length" "q") -(gtk_accel_path "/Editor/toggle-fade-in-active" "<@SECONDARY@>q") +(gtk_accel_path "/Editor/toggle-region-fade-in" "<@SECONDARY@>q") (gtk_accel_path "/Editor/set-fade-out-length" "e") -(gtk_accel_path "/Editor/toggle-fade-out-active" "<@SECONDARY@>e") +(gtk_accel_path "/Editor/toggle-region-fade-out" "<@SECONDARY@>e") (gtk_accel_path "/Editor/trim-from-start" "<@TERTIARY@>braceleft") (gtk_accel_path "/Editor/trim-to-end" "<@TERTIARY@>braceright") (gtk_accel_path "/Editor/trim-front" "a") diff --git a/gtk2_ardour/mnemonic-us.bindings.in b/gtk2_ardour/mnemonic-us.bindings.in index b8ce5e26f2..b2645ca136 100644 --- a/gtk2_ardour/mnemonic-us.bindings.in +++ b/gtk2_ardour/mnemonic-us.bindings.in @@ -107,25 +107,25 @@ This mode provides many different operations on both regions and control points, @trans|Transport/ToggleRollForgetCapture|<@PRIMARY@>space|stop and destroy @trans|Transport/record-roll|<@TERTIARY@>space|start recording -@rop|Editor/set-fade-in-length|slash|set fade in length -@rop|Editor/set-fade-out-length|<@PRIMARY@>slash|toggle fade in active -@rop|Editor/toggle-fade-out-active|backslash|set fade out length -@rop|Editor/toggle-fade-out-active|<@PRIMARY@>backslash|toggle fade out active +@rop|Region/set-fade-in-length|slash|set fade in length +@rop|Region/toggle-region-fade-out|<@PRIMARY@>slash|toggle fade in active +@rop|Region/set-fade-out-length|backslash|set fade out length +@rop|Region/toggle-region-fade-out|<@PRIMARY@>backslash|toggle fade out active -@eep|Editor/trim-from-start|<@TERTIARY@>braceleft|trim region start to edit point -@eep|Editor/trim-to-end|<@TERTIARY@>braceright|trim region end to edit point +@eep|Region/trim-from-start|<@TERTIARY@>braceleft|trim region start to edit point +@eep|Region/trim-to-end|<@TERTIARY@>braceright|trim region end to edit point @eep|Editor/trim-to-previous-region|<@PRIMARY@>j|trim region to end of previous region @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|Editor/set-loop-from-region|<@SECONDARY@>bracketright|set loop range from region(s) +@ranges|Region/set-loop-from-region|<@SECONDARY@>bracketright|set loop range from region(s) @ranges|Editor/set-punch-from-edit-range|bracketleft|set punch range from edit range -@ranges|Editor/set-punch-from-region|<@SECONDARY@>bracketleft|set punch range from region(s) +@ranges|Region/set-punch-from-region|<@SECONDARY@>bracketleft|set punch range from region(s) -@rop|Editor/boost-region-gain|asciicircum|increase region gain -@rop|Editor/cut-region-gain|ampersand|reduce region gain +@rop|Region/boost-region-gain|asciicircum|increase region gain +@rop|Region/cut-region-gain|ampersand|reduce region gain ;; letters ;; TOP ROW @@ -134,31 +134,31 @@ This mode provides many different operations on both regions and control points, ;; note that ctrl-w is special and consumed by the keyboard snooper -@rop|Editor/set-edit-point|e|set fade out length +@rop|Region/set-edit-point|e|set fade out length @select|Editor/select-all-before-edit-cursor|<@PRIMARY@>e|select all before EP -@rop|Editor/export-region|<@PRIMARY@><@LEVEL4@>e|export selected region(s) +@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|<@TERTIARY@>e|toggle editor window mixer @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|Editor/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|Editor/pitch-shift-region|<@SECONDARY@>t|transpose +@rop|Region/pitch-shift-region|<@SECONDARY@>t|transpose @eep|Editor/insert-time|<@PRIMARY@>t|insert time @mmode|MouseMode/set-mouse-mode-object-range|y|link object/range tools @select|Editor/select-all-between-cursors|<@PRIMARY@>u|all enclosed by edit range @select|Editor/select-all-within-cursors|u|all present in edit range -@eep|Editor/insert-region|i|insert from region list +@eep|Region/insert-region-from-region-list|i|insert from region list @select|Editor/invert-selection|<@TERTIARY@>i|invert selection @sess|Editor/addExistingAudioFiles|<@SECONDARY@>i|import audio files @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 @wvis|Common/ToggleOptionsEditor|<@WINDOW@>o|toggle preferences dialog -@rop|Editor/naturalize-region|<@LEVEL4@>o|move to original position +@rop|Region/naturalize-region|<@LEVEL4@>o|move to original position @trans|Editor/set-playhead|p|toggle auto-punch status @select|Editor/select-all-before-playhead|<@PRIMARY@>p|all before playhead @midi|MIDI/panic|<@SECONDARY@>p|MIDI panic (stop all notes etc) @@ -172,17 +172,17 @@ This mode provides many different operations on both regions and control points, @aep|Editor/align-regions-sync|<@TERTIARY@>a|align sync points @aep|Editor/align-regions-start|<@PRIMARY@><@LEVEL4@>a|align start(s) @aep|Editor/align-regions-start-relative|<@LEVEL4@>a|align start(s) relative -@rop|Editor/split-region|s|split +@rop|Region/split-region|s|split @sess|Common/Save|<@PRIMARY@>s|save session @sess|Main/Snapshot|<@PRIMARY@><@TERTIARY@>s|snapshot session -@rop|Editor/duplicate-region|d|duplicate region (once) -@rop|Editor/multi-duplicate-region|<@TERTIARY@>d|duplicate region (multi) +@rop|Region/duplicate-region|d|duplicate region (once) +@rop|Region/multi-duplicate-region|<@TERTIARY@>d|duplicate region (multi) @select|Editor/select-all-in-punch-range|<@PRIMARY@>d|select all in punch range @vis|Editor/fit-tracks|f|fit tracks vertically @trans|Editor/toggle-follow-playhead|<@PRIMARY@>f|toggle playhead tracking -@wvis|Editor/toggle-rhythm-ferret|<@WINDOW@>f|toggle rhythm ferret window +@wvis|Region/show-rhythm-ferret|<@WINDOW@>f|show rhythm ferret window @mmode|MouseMode/set-mouse-mode-gain|g|region gain mode -@epp|Editor/play-selected-regions|h|play selected region(s) +@epp|Region/play-selected-regions|h|play selected region(s) @eep|Editor/trim-front|j|trim front @eep|Editor/trim-back|k|trim back @wvis|Common/ToggleKeyEditor|<@WINDOW@>k|toggle key bindings editor @@ -200,16 +200,16 @@ This mode provides many different operations on both regions and control points, @edit|Editor/editor-cut|<@PRIMARY@>x|cut @edit|Editor/editor-copy|<@PRIMARY@>c|copy @wvis|Common/ToggleColorManager|<@WINDOW@>c|toggle color manager -@rop|Editor/set-region-sync-position|v|set region sync point +@rop|Region/set-region-sync-position|v|set region sync point @edit|Editor/editor-paste|<@PRIMARY@>v|paste @-group|Editor/brush-at-mouse|<@PRIMARY@>b|some text @trans|Editor/track-record-enable-toggle|<@SECONDARY@>b|toggle track rec-enable @wvis|Common/ToggleBigClock|<@WINDOW@>b|toggle big clock -@rop|Editor/normalize-region|n|normalize +@rop|Region/normalize-region|n|normalize @sess|Main/AddTrackBus|<@PRIMARY@><@TERTIARY@>n|add track(s) or bus(ses) @sess|Main/New|<@PRIMARY@>n|open a new session @mmode|MouseMode/toggle-internal-edit|m|toggle MIDI note editing -@rop|Editor/mute-unmute-region|<@PRIMARY@>m|mute/unmute +@rop|Region/toggle-region-mute|<@PRIMARY@>m|mute/unmute @wvis|Common/toggle-editor-mixer-on-top|<@WINDOW@>m|rotate editor \& mixer window ;; arrow keys, navigation etc. @@ -256,13 +256,13 @@ This mode provides many different operations on both regions and control points, ;; keypad -@rop|Editor/nudge-backward|KP_Subtract|nudge backward +@rop|Region/nudge-backward|KP_Subtract|nudge backward @-group|Editor/nudge-next-backward|<@PRIMARY@>KP_Subtract|some text @movp|Editor/jump-forward-to-mark|<@PRIMARY@>KP_Right|to next mark @movp|Editor/jump-backward-to-mark|<@PRIMARY@>KP_Left|to previous mark -@rop|Editor/nudge-forward|KP_Add|nudge forward +@rop|Region/nudge-forward|KP_Add|nudge forward @-group|Editor/nudge-next-forward|<@PRIMARY@>KP_Add|some text @-group|Editor/start-range|<@PRIMARY@>KP_Down|some text diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index 318a35090c..fa27f5c45c 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -293,6 +293,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible { static sigc::signal DropDownKeys; Glib::RefPtr editor_actions; + Glib::RefPtr _region_actions; virtual void reset_focus () = 0; diff --git a/gtk2_ardour/rhythm_ferret.cc b/gtk2_ardour/rhythm_ferret.cc index 4e87b7c46d..da31feca3c 100644 --- a/gtk2_ardour/rhythm_ferret.cc +++ b/gtk2_ardour/rhythm_ferret.cc @@ -330,8 +330,8 @@ RhythmFerret::do_action () void RhythmFerret::do_split_action () { - RegionSelection regions = editor.get_regions_for_action (); - + RegionSelection& regions (editor.get_selection().regions); + if (regions.empty()) { return; }