From 8818d8484ea82c1597a970f28195f00a2419bcf3 Mon Sep 17 00:00:00 2001 From: Ben Loftis Date: Mon, 7 Aug 2023 09:12:10 -0500 Subject: [PATCH] region groups: allow the user to explictly group and ungroup regions --- gtk2_ardour/ardour.keys.in | 2 ++ gtk2_ardour/ardour.menus.in | 8 ++++++++ gtk2_ardour/editor.h | 3 +++ gtk2_ardour/editor_actions.cc | 3 +++ gtk2_ardour/editor_ops.cc | 38 +++++++++++++++++++++++++++++++++++ 5 files changed, 54 insertions(+) diff --git a/gtk2_ardour/ardour.keys.in b/gtk2_ardour/ardour.keys.in index d64a4b4dc5..9bef940ae0 100644 --- a/gtk2_ardour/ardour.keys.in +++ b/gtk2_ardour/ardour.keys.in @@ -210,6 +210,8 @@ This mode provides many different operations on both regions and control points, @wvis|Common/ToggleMaximalEditor| <@PRIMARY@><@SECONDARY@>f|maximise editor space @wvis|Common/ToggleMaximalMixer| <@PRIMARY@><@TERTIARY@>f|maximise mixer space @mmode|MouseMode/set-mouse-mode-object| g|object mode +@edit|Editor/group-selected-regions| <@PRIMARY@>g|group selected regions +@edit|Editor/ungroup-selected-regions| <@PRIMARY@><@TERTIARY@>g|ungroup selected regions @edit|Region/play-selected-regions| h|play selected region(s) @eep|Region/trim-front| j|trim front @eep|Region/trim-back| k|trim back diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index ec157a1c11..0a82463aba 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -346,6 +346,10 @@ + + + + @@ -860,6 +864,10 @@ + + + + diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 5f27d170b1..ec735cd0ac 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1435,6 +1435,9 @@ private: void play_location (ARDOUR::Location&); void loop_location (ARDOUR::Location&); + void group_selected_regions (); + void ungroup_selected_regions (); + void calc_extra_zoom_edges(samplepos_t &start, samplepos_t &end); void temporal_zoom_selection (Editing::ZoomAxis); void temporal_zoom_session (); diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index 045584cbb3..7319b80091 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -378,6 +378,9 @@ Editor::register_actions () reg_sens (editor_actions, "main-menu-play-selected-regions", _("Play Selected Regions"), sigc::mem_fun (*this, &Editor::play_selected_region)); reg_sens (editor_actions, "main-menu-tag-selected-regions", _("Tag Selected Regions"), sigc::mem_fun (*this, &Editor::tag_selected_region)); + reg_sens (editor_actions, "group-selected-regions", _("Group Selected Regions"), sigc::mem_fun (*this, &Editor::group_selected_regions)); + reg_sens (editor_actions, "ungroup-selected-regions", _("Ungroup Selected Regions"), sigc::mem_fun (*this, &Editor::ungroup_selected_regions)); + reg_sens (editor_actions, "play-from-edit-point", _("Play from Edit Point"), sigc::mem_fun(*this, &Editor::play_from_edit_point)); reg_sens (editor_actions, "play-from-edit-point-and-return", _("Play from Edit Point and Return"), sigc::mem_fun(*this, &Editor::play_from_edit_point_and_return)); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 75757a49ef..a82e47253a 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -3127,6 +3127,44 @@ Editor::play_edit_range () } } +void +Editor::group_selected_regions () +{ + RegionSelection rs = get_regions_from_selection_and_entered (); + + if (rs.empty ()) { + return; + } + + Region::RegionGroupRetainer rgr; + begin_reversible_command (_("group regions")); + for (RegionSelection::iterator i = rs.begin (); i != rs.end (); ++i) { + (*i)->region ()->clear_changes (); + (*i)->region ()->set_region_group (true); + _session->add_command (new StatefulDiffCommand ((*i)->region ())); + } + commit_reversible_command (); +} + +void +Editor::ungroup_selected_regions () +{ + RegionSelection rs = get_regions_from_selection_and_entered (); + + if (rs.empty ()) { + return; + } + + begin_reversible_command (_("ungroup regions")); + for (RegionSelection::iterator i = rs.begin (); i != rs.end (); ++i) { + (*i)->region ()->clear_changes (); + (*i)->region ()->unset_region_group (); + _session->add_command (new StatefulDiffCommand ((*i)->region ())); + } + selection->clear_regions (); + commit_reversible_command (); +} + void Editor::play_selected_region () {