Optimize automation-event process splitting
[ardour.git] / gtk2_ardour / route_group_menu.cc
index 0aeb0915f840ac8f6721982953f2b2e3ffcea27a..63577392a779ab5b39dd48c3eca61754d3db04e6 100644 (file)
 
 #include <gtkmm/menu.h>
 #include <gtkmm/stock.h>
+
 #include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/doi.h"
+
 #include "ardour/session.h"
 #include "ardour/route_group.h"
 #include "ardour/route.h"
 #include "route_group_menu.h"
 #include "route_group_dialog.h"
-#include "i18n.h"
+
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace ARDOUR;
@@ -51,7 +55,7 @@ void
 RouteGroupMenu::build (WeakRouteList const & s)
 {
        assert (!s.empty ());
-       
+
        using namespace Menu_Helpers;
 
        _subject = s;
@@ -68,7 +72,7 @@ RouteGroupMenu::build (WeakRouteList const & s)
        _inhibit_group_selected = true;
 
        delete _menu;
-       
+
        /* Note: don't use manage() here, otherwise if our _menu object is attached as a submenu
           and its parent is then destroyed, our _menu object will be deleted and we'll have no
           way of knowing about it.  Without manage(), when the above happens our _menu's gobject
@@ -77,14 +81,14 @@ RouteGroupMenu::build (WeakRouteList const & s)
        _menu = new Menu;
 
        MenuList& items = _menu->items ();
-       
+
        items.push_back (MenuElem (_("New Group..."), sigc::mem_fun (*this, &RouteGroupMenu::new_group)));
        items.push_back (SeparatorElem ());
 
        RadioMenuItem::Group group;
        items.push_back (RadioMenuElem (group, _("No Group")));
        RadioMenuItem* i = static_cast<RadioMenuItem *> (&items.back ());
-       i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::set_group), (RouteGroup *) 0));
+       i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::set_group), i, (RouteGroup *) 0));
 
        if (groups.size() == 1 && *groups.begin() == 0) {
                i->set_active ();
@@ -112,7 +116,7 @@ RouteGroupMenu::add_item (RouteGroup* rg, std::set<RouteGroup*> const & groups,
 
        items.push_back (RadioMenuElem (*group, rg->name()));
        RadioMenuItem* i = static_cast<RadioMenuItem*> (&items.back ());
-       i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::set_group), rg));
+       i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::set_group), i, rg));
 
        if (groups.size() == 1 && *groups.begin() == rg) {
                /* there's only one active group, and it's this one */
@@ -127,11 +131,14 @@ RouteGroupMenu::add_item (RouteGroup* rg, std::set<RouteGroup*> const & groups,
  *  @param Group, or 0 for none.
  */
 void
-RouteGroupMenu::set_group (RouteGroup* g)
+RouteGroupMenu::set_group (Gtk::RadioMenuItem* e, RouteGroup* g)
 {
        if (_inhibit_group_selected) {
                return;
        }
+       if (e && !e->get_active()) {
+               return;
+       }
 
        for (WeakRouteList::const_iterator i = _subject.begin(); i != _subject.end(); ++i) {
                boost::shared_ptr<Route> r = i->lock ();
@@ -158,16 +165,23 @@ RouteGroupMenu::new_group ()
        }
 
        RouteGroup* g = new RouteGroup (*_session, "");
-       g->apply_changes (*_default_properties);
+       RouteGroupDialog* d = new RouteGroupDialog (g, true);
 
-       RouteGroupDialog d (g, true);
+       d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::new_group_dialog_finished), d));
+       d->present ();
+}
 
-       if (d.do_run ()) {
-               delete g;
+void
+RouteGroupMenu::new_group_dialog_finished (int r, RouteGroupDialog* d)
+{
+       if (r == RESPONSE_OK) {
+               _session->add_route_group (d->group());
+               set_group (0, d->group());
        } else {
-               _session->add_route_group (g);
-               set_group (g);
+               delete d->group ();
        }
+
+       delete_when_idle (d);
 }
 
 Gtk::Menu *