Remove unnecessary _have_transaction flag in TrimDrag. Fix undo when a trim of one...
[ardour.git] / gtk2_ardour / route_group_menu.cc
index 6c3e9db73dea4edfb363b0ea4644f163fb3606c0..42d09ab9602f631f539996080d276637a5083c1d 100644 (file)
 
 using namespace Gtk;
 using namespace ARDOUR;
+using namespace PBD;
 
-RouteGroupMenu::RouteGroupMenu (Session& s, RouteGroup::Property p)
-       : _session (s),
-         _default_properties (p)
+RouteGroupMenu::RouteGroupMenu (Session* s, PropertyList* plist)
+       : SessionHandlePtr (s)
+       , _default_properties (plist)
+       , _inhibit_group_selected (false)
+       , _selected_route_group (0)
 {
        rebuild (0);
 }
 
+RouteGroupMenu::~RouteGroupMenu()
+{
+       delete _default_properties; 
+}
+
 void
 RouteGroupMenu::rebuild (RouteGroup* curr)
 {
        using namespace Menu_Helpers;
 
+       _selected_route_group = curr;
+
+       _inhibit_group_selected = true;
+
        items().clear ();
 
-       items().push_back (MenuElem (_("New group..."), mem_fun (*this, &RouteGroupMenu::new_group)));
+       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"), bind (mem_fun (*this, &RouteGroupMenu::set_group), (RouteGroup *) 0)));
+       items().push_back (RadioMenuElem (group, _("No group"), sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::set_group), (RouteGroup *) 0)));
 
        if (curr == 0) {
                static_cast<RadioMenuItem*> (&items().back())->set_active ();
        }
 
-       _session.foreach_route_group (bind (mem_fun (*this, &RouteGroupMenu::add_item), curr, &group));
+       if (_session) {
+               _session->foreach_route_group (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::add_item), curr, &group));
+       }
+
+       _inhibit_group_selected = false;
 }
 
 void
@@ -60,7 +76,7 @@ RouteGroupMenu::add_item (RouteGroup* rg, RouteGroup* curr, RadioMenuItem::Group
 {
        using namespace Menu_Helpers;
 
-       items().push_back (RadioMenuElem (*group, rg->name(), bind (mem_fun(*this, &RouteGroupMenu::set_group), rg)));
+       items().push_back (RadioMenuElem (*group, rg->name(), sigc::bind (sigc::mem_fun(*this, &RouteGroupMenu::set_group), rg)));
 
        if (rg == curr) {
                static_cast<RadioMenuItem*> (&items().back())->set_active ();
@@ -70,20 +86,35 @@ RouteGroupMenu::add_item (RouteGroup* rg, RouteGroup* curr, RadioMenuItem::Group
 void
 RouteGroupMenu::set_group (RouteGroup* g)
 {
-       GroupSelected (g);
-}
+       if (g == _selected_route_group) {
+               /* cut off the signal_toggled that GTK emits for an option that is being un-selected
+                  when a new option is being selected instead
+               */
+               return;
+       }
+       
+       if (!_inhibit_group_selected) {
+               GroupSelected (g);
+       }
 
+       _selected_route_group = g;
+}
 
 void
 RouteGroupMenu::new_group ()
 {
-       RouteGroup* g = new RouteGroup (_session, "", RouteGroup::Active, _default_properties);
+       if (!_session) {
+               return;
+       }
+
+       RouteGroup* g = new RouteGroup (*_session, "");
+       g->apply_changes (*_default_properties);
 
        RouteGroupDialog d (g, Gtk::Stock::NEW);
        int const r = d.do_run ();
 
        if (r == Gtk::RESPONSE_OK) {
-               _session.add_route_group (g);
+               _session->add_route_group (g);
                set_group (g);
        } else {
                delete g;