summaryrefslogtreecommitdiff
path: root/gtk2_ardour/route_group_menu.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2011-02-23 01:05:15 +0000
committerCarl Hetherington <carl@carlh.net>2011-02-23 01:05:15 +0000
commit465aaffdd44d3cfaed0c1313599f11b1f75086ee (patch)
tree9991588e9383e75ac668d81ac7000830fcd2a82b /gtk2_ardour/route_group_menu.cc
parent5da5a1c100be8e50aefc464d6d93c5d3eb76a07c (diff)
Desensitize Remote Control ID menu option if there are > 1 selected tracks.
git-svn-id: svn://localhost/ardour2/branches/3.0@8937 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/route_group_menu.cc')
-rw-r--r--gtk2_ardour/route_group_menu.cc55
1 files changed, 44 insertions, 11 deletions
diff --git a/gtk2_ardour/route_group_menu.cc b/gtk2_ardour/route_group_menu.cc
index 123d925a8e..5b6c275516 100644
--- a/gtk2_ardour/route_group_menu.cc
+++ b/gtk2_ardour/route_group_menu.cc
@@ -19,6 +19,7 @@
#include <gtkmm/menu.h>
#include <gtkmm/stock.h>
+#include "gtkmm2ext/utils.h"
#include "ardour/session.h"
#include "ardour/route_group.h"
#include "route_group_menu.h"
@@ -31,20 +32,23 @@ using namespace PBD;
RouteGroupMenu::RouteGroupMenu (Session* s, PropertyList* plist)
: SessionHandlePtr (s)
+ , _menu (0)
, _default_properties (plist)
, _inhibit_group_selected (false)
, _selected_route_group (0)
{
- rebuild (0);
+
}
RouteGroupMenu::~RouteGroupMenu()
{
- delete _default_properties;
+ delete _menu;
+ delete _default_properties;
}
+/** @param curr Current route group to mark as selected, or 0 for no group */
void
-RouteGroupMenu::rebuild (RouteGroup* curr)
+RouteGroupMenu::build (RouteGroup* curr)
{
using namespace Menu_Helpers;
@@ -52,16 +56,25 @@ RouteGroupMenu::rebuild (RouteGroup* curr)
_inhibit_group_selected = true;
- items().clear ();
-
- items().push_back (MenuElem (_("New group..."), sigc::mem_fun (*this, &RouteGroupMenu::new_group)));
- items().push_back (SeparatorElem ());
+ 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
+ will be destroyed and its value set to 0, so we know.
+ */
+ _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"), sigc::bind (sigc::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 ();
+ static_cast<RadioMenuItem*> (&items.back())->set_active ();
}
if (_session) {
@@ -76,10 +89,12 @@ RouteGroupMenu::add_item (RouteGroup* rg, RouteGroup* curr, RadioMenuItem::Group
{
using namespace Menu_Helpers;
- items().push_back (RadioMenuElem (*group, rg->name(), sigc::bind (sigc::mem_fun(*this, &RouteGroupMenu::set_group), rg)));
+ MenuList& items = _menu->items ();
+
+ 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 ();
+ static_cast<RadioMenuItem*> (&items.back())->set_active ();
}
}
@@ -122,3 +137,21 @@ RouteGroupMenu::new_group ()
set_group (g);
}
}
+
+Gtk::Menu *
+RouteGroupMenu::menu ()
+{
+ /* Our menu's gobject can be 0 if it was attached as a submenu whose
+ parent was subsequently deleted.
+ */
+ assert (_menu && _menu->gobj());
+ return _menu;
+}
+
+void
+RouteGroupMenu::detach ()
+{
+ if (_menu && _menu->gobj ()) {
+ Gtkmm2ext::detach_menu (*_menu);
+ }
+}