diff options
author | Carl Hetherington <carl@carlh.net> | 2011-02-23 01:05:15 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2011-02-23 01:05:15 +0000 |
commit | 465aaffdd44d3cfaed0c1313599f11b1f75086ee (patch) | |
tree | 9991588e9383e75ac668d81ac7000830fcd2a82b /gtk2_ardour/route_group_menu.cc | |
parent | 5da5a1c100be8e50aefc464d6d93c5d3eb76a07c (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.cc | 55 |
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); + } +} |