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