summaryrefslogtreecommitdiff
path: root/gtk2_ardour/group_tabs.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-05-19 10:45:55 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-05-31 15:30:43 -0400
commitc6ad232796d5bcae405c356a1e2bc3c4077533e0 (patch)
tree6d2e90801acb20eef74ab5582af5e01e4b4e99a2 /gtk2_ardour/group_tabs.cc
parent8e81db7a92c3af8d2650493bfa21be21851ecb73 (diff)
more work on presenting GUI actions to connect Route groups and control masters
Diffstat (limited to 'gtk2_ardour/group_tabs.cc')
-rw-r--r--gtk2_ardour/group_tabs.cc225
1 files changed, 155 insertions, 70 deletions
diff --git a/gtk2_ardour/group_tabs.cc b/gtk2_ardour/group_tabs.cc
index 32b6569488..180a0df00f 100644
--- a/gtk2_ardour/group_tabs.cc
+++ b/gtk2_ardour/group_tabs.cc
@@ -18,9 +18,12 @@
*/
#include <gtkmm/stock.h>
+
#include "ardour/session.h"
#include "ardour/route_group.h"
#include "ardour/route.h"
+#include "ardour/vca_manager.h"
+#include "ardour/vca.h"
#include "gui_thread.h"
#include "route_group_dialog.h"
@@ -310,43 +313,69 @@ GroupTabs::get_menu (RouteGroup* g, bool TabArea)
_menu = new Menu;
_menu->set_name ("ArdourContextMenu");
MenuList& items = _menu->items();
+ Menu* new_from;
if (!TabArea) {
items.push_back (MenuElem (_("Create New Group ..."), hide_return (sigc::mem_fun(*this, &GroupTabs::create_and_add_group))));
- items.push_back (MenuElem (_("Create New Control Master ..."), hide_return (sigc::mem_fun(*this, &GroupTabs::create_and_add_master))));
- items.push_back (MenuElem (_("Create New Group & Control Master ..."), hide_return (sigc::mem_fun(*this, &GroupTabs::create_and_add_group_with_master))));
+ items.push_back (MenuElem (_("Create New Group with Control Master ..."), hide_return (sigc::mem_fun(*this, &GroupTabs::create_and_add_group_with_master))));
}
- Menu* new_from = new Menu;
+ new_from = new Menu;
{
MenuList& f = new_from->items ();
- f.push_back (MenuElem (_("Selection..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_selection), false, false)));
- f.push_back (MenuElem (_("Record Enabled..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_rec_enabled), false, false)));
- f.push_back (MenuElem (_("Soloed..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_soloed), false, false)));
+ f.push_back (MenuElem (_("Selection..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_selection), false)));
+ f.push_back (MenuElem (_("Record Enabled..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_rec_enabled), false)));
+ f.push_back (MenuElem (_("Soloed..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_soloed), false)));
}
- items.push_back (MenuElem (_("Create New Group From"), *new_from));
+ items.push_back (MenuElem (_("Create New Group From..."), *new_from));
new_from = new Menu;
{
MenuList& f = new_from->items ();
- f.push_back (MenuElem (_("Selection..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_selection), true, false)));
- f.push_back (MenuElem (_("Record Enabled..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_rec_enabled), true, false)));
- f.push_back (MenuElem (_("Soloed..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_soloed), true, false)));
+ f.push_back (MenuElem (_("Selection..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_selection), true)));
+ f.push_back (MenuElem (_("Record Enabled..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_rec_enabled), true)));
+ f.push_back (MenuElem (_("Soloed..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_soloed), true)));
}
- items.push_back (MenuElem (_("Create New Master From"), *new_from));
+ items.push_back (MenuElem (_("Create New Group with Master From..."), *new_from));
- new_from = new Menu;
+ Menu* vca_menu;
+ const VCAList vcas = _session->vca_manager().vcas ();
+
+ vca_menu = new Menu;
{
- MenuList& f = new_from->items ();
- f.push_back (MenuElem (_("Selection..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_selection), true, true)));
- f.push_back (MenuElem (_("Record Enabled..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_rec_enabled), true, true)));
- f.push_back (MenuElem (_("Soloed..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_soloed), true, true)));
+ MenuList& f (vca_menu->items());
+ f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 0)));
+ for (VCAList::const_iterator v = vcas.begin(); v != vcas.end(); ++v) {
+ f.push_back (MenuElem (string_compose ("VCA %1", (*v)->number()), sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), (*v)->number())));
+ }
}
- items.push_back (MenuElem (_("Create New Group & Master From"), *new_from));
- Menu* vca_menu;
+ items.push_back (MenuElem (_("Assign Selection to Control Master..."), *vca_menu));
+
+ vca_menu = new Menu;
+ {
+ MenuList& f (vca_menu->items());
+ f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 0)));
+ for (VCAList::const_iterator v = vcas.begin(); v != vcas.end(); ++v) {
+ f.push_back (MenuElem (string_compose ("VCA %1", (*v)->number()), sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), (*v)->number())));
+ }
+
+ }
+ items.push_back (MenuElem (_("Assign Record Enabled to Control Master..."), *vca_menu));
+
+ vca_menu = new Menu;
+ {
+ MenuList& f (vca_menu->items());
+ f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 0)));
+ for (VCAList::const_iterator v = vcas.begin(); v != vcas.end(); ++v) {
+ f.push_back (MenuElem (string_compose ("VCA %1", (*v)->number()), sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), (*v)->number())));
+ }
+
+ }
+ items.push_back (MenuElem (_("Assign Soloed to Control Master...")));
if (g) {
+ items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Edit Group..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::edit_group), g)));
items.push_back (MenuElem (_("Collect Group"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::collect), g)));
items.push_back (MenuElem (_("Remove Group"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::remove_group), g)));
@@ -362,8 +391,11 @@ GroupTabs::get_menu (RouteGroup* g, bool TabArea)
vca_menu = new Menu;
MenuList& f (vca_menu->items());
- f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 0)));
- f.push_back (MenuElem ("VCA 1", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 1)));
+ f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_group_to_master), 0, g)));
+
+ for (VCAList::const_iterator v = vcas.begin(); v != vcas.end(); ++v) {
+ f.push_back (MenuElem (string_compose ("VCA %1", (*v)->number()), sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_group_to_master), (*v)->number(), g)));
+ }
items.push_back (MenuElem (_("Assign Group to Control Master..."), *vca_menu));
}
@@ -374,71 +406,91 @@ GroupTabs::get_menu (RouteGroup* g, bool TabArea)
items.push_back (MenuElem (_("Disable All Groups"), sigc::mem_fun(*this, &GroupTabs::disable_all)));
items.push_back (SeparatorElem());
- vca_menu = new Menu;
- {
- MenuList& f (vca_menu->items());
- f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 0)));
- f.push_back (MenuElem ("VCA 1", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 1)));
+ return _menu;
+}
+void
+GroupTabs::assign_group_to_master (uint32_t which, RouteGroup* group)
+{
+ if (!_session || !group) {
+ return;
}
- items.push_back (MenuElem (_("Assign Selection to Control Master..."), *vca_menu));
+ boost::shared_ptr<VCA> master;
- vca_menu = new Menu;
- {
- MenuList& f (vca_menu->items());
- f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 0)));
- f.push_back (MenuElem ("VCA 1", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_recenabled_to_master), 1)));
+ if (which == 0) {
+ if (_session->vca_manager().create_vca (1)) {
+ /* error */
+ return;
+ }
+ /* VCAs use 1-based counting. Get most recently created VCA... */
+ which = _session->vca_manager().n_vcas();
}
- items.push_back (MenuElem (_("Assign Record Enabled to Control Master..."), *vca_menu));
- vca_menu = new Menu;
- {
- MenuList& f (vca_menu->items());
- f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 0)));
- f.push_back (MenuElem ("VCA 1", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_soloed_to_master), 1)));
+ master = _session->vca_manager().vca_by_number (which);
+ if (!master) {
+ /* should never happen; if it does, basically something deeply
+ odd happened, no reason to tell user because there's no
+ sensible explanation.
+ */
+ return;
}
- items.push_back (MenuElem (_("Assign Soloed to Control Master...")));
-
- return _menu;
+ group->assign_master (master);
}
void
-GroupTabs::assign_selection_to_master (uint32_t which)
+GroupTabs::assign_some_to_master (uint32_t which, RouteList rl)
{
-}
+ if (!_session) {
+ return;
+ }
-void
-GroupTabs::assign_recenabled_to_master (uint32_t which)
-{
-}
+ boost::shared_ptr<VCA> master;
+
+ if (which == 0) {
+ if (_session->vca_manager().create_vca (1)) {
+ /* error */
+ return;
+ }
+
+ /* VCAs use 1-based counting. Get most recently created VCA... */
+ which = _session->vca_manager().n_vcas();
+ }
+
+ master = _session->vca_manager().vca_by_number (which);
+
+ if (!master) {
+ /* should never happen; if it does, basically something deeply
+ odd happened, no reason to tell user because there's no
+ sensible explanation.
+ */
+ return;
+ }
-void
-GroupTabs::assign_soloed_to_master (uint32_t which)
-{
-}
-void
-GroupTabs::new_from_selection (bool just_master, bool with_master)
-{
- RouteList rl = selected_routes ();
if (rl.empty()) {
return;
}
- run_new_group_dialog (rl, with_master);
+ for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
+ (*r)->assign (master);
+ }
}
-void
-GroupTabs::new_from_rec_enabled (bool just_master, bool with_master)
+RouteList
+GroupTabs::get_rec_enabled ()
{
- boost::shared_ptr<RouteList> rl = _session->get_routes ();
-
RouteList rec_enabled;
+ if (!_session) {
+ return rec_enabled;
+ }
+
+ boost::shared_ptr<RouteList> rl = _session->get_routes ();
+
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
boost::shared_ptr<Track> trk (boost::dynamic_pointer_cast<Track> (*i));
if (trk && trk->rec_enable_control()->get_value()) {
@@ -446,15 +498,12 @@ GroupTabs::new_from_rec_enabled (bool just_master, bool with_master)
}
}
- if (rec_enabled.empty()) {
- return;
- }
-
- run_new_group_dialog (rec_enabled, with_master);
+ return rec_enabled;
}
-void
-GroupTabs::new_from_soloed (bool just_master, bool with_master)
+
+RouteList
+GroupTabs::get_soloed ()
{
boost::shared_ptr<RouteList> rl = _session->get_routes ();
@@ -466,16 +515,52 @@ GroupTabs::new_from_soloed (bool just_master, bool with_master)
}
}
- if (soloed.empty()) {
- return;
- }
+ return soloed;
+}
+
+void
+GroupTabs::assign_selection_to_master (uint32_t which)
+{
+ assign_some_to_master (which, selected_routes ());
+}
+
+void
+GroupTabs::assign_recenabled_to_master (uint32_t which)
+{
+ assign_some_to_master (which, get_rec_enabled());
+}
- run_new_group_dialog (soloed, with_master);
+void
+GroupTabs::assign_soloed_to_master (uint32_t which)
+{
+ assign_some_to_master (which, get_soloed());
+}
+
+void
+GroupTabs::new_from_selection (bool with_master)
+{
+ run_new_group_dialog (selected_routes(), with_master);
+}
+
+void
+GroupTabs::new_from_rec_enabled (bool with_master)
+{
+ run_new_group_dialog (get_rec_enabled(), with_master);
+}
+
+void
+GroupTabs::new_from_soloed (bool with_master)
+{
+ run_new_group_dialog (get_soloed(), with_master);
}
void
GroupTabs::run_new_group_dialog (RouteList const & rl, bool with_master)
{
+ if (rl.empty()) {
+ return;
+ }
+
RouteGroup* g = new RouteGroup (*_session, "");
RouteGroupDialog d (g, true);