diff options
-rw-r--r-- | gtk2_ardour/mixer_strip.cc | 3 | ||||
-rw-r--r-- | gtk2_ardour/route_group_menu.cc | 55 | ||||
-rw-r--r-- | gtk2_ardour/route_group_menu.h | 8 | ||||
-rw-r--r-- | gtk2_ardour/route_time_axis.cc | 21 | ||||
-rw-r--r-- | gtk2_ardour/route_time_axis.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/time_axis_view.cc | 8 |
6 files changed, 65 insertions, 31 deletions
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index cb159e46da..ce07737760 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -1287,7 +1287,8 @@ MixerStrip::select_route_group (GdkEventButton *ev) group_menu->GroupSelected.connect (sigc::mem_fun (*this, &MixerStrip::set_route_group)); } - group_menu->popup (1, ev->time); + group_menu->build (route_group ()); + group_menu->menu()->popup (1, ev->time); } return true; 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); + } +} diff --git a/gtk2_ardour/route_group_menu.h b/gtk2_ardour/route_group_menu.h index b588be7838..e771cf0180 100644 --- a/gtk2_ardour/route_group_menu.h +++ b/gtk2_ardour/route_group_menu.h @@ -23,14 +23,15 @@ #include "ardour/route_group.h" #include "ardour/session_handle.h" - -class RouteGroupMenu : public Gtk::Menu, public ARDOUR::SessionHandlePtr +class RouteGroupMenu : public ARDOUR::SessionHandlePtr { public: RouteGroupMenu (ARDOUR::Session*, PBD::PropertyList*); ~RouteGroupMenu(); - void rebuild (ARDOUR::RouteGroup *); + Gtk::Menu* menu (); + void build (ARDOUR::RouteGroup *); + void detach (); sigc::signal<void, ARDOUR::RouteGroup*> GroupSelected; @@ -39,6 +40,7 @@ public: void new_group (); void set_group (ARDOUR::RouteGroup *); + Gtk::Menu* _menu; PBD::PropertyList* _default_properties; bool _inhibit_group_selected; ARDOUR::RouteGroup* _selected_route_group; diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 035043b887..3aee99b0fb 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -120,7 +120,6 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, boost::sh gm.get_level_meter().setup_meters(50); _has_state = true; - playlist_menu = 0; playlist_action_menu = 0; automation_action_menu = 0; plugins_submenu_item = 0; @@ -251,9 +250,6 @@ RouteTimeAxisView::~RouteTimeAxisView () delete *i; } - delete playlist_menu; - playlist_menu = 0; - delete playlist_action_menu; playlist_action_menu = 0; @@ -289,8 +285,8 @@ RouteTimeAxisView::route_group_click (GdkEventButton *ev) return false; } - route_group_menu->rebuild (_route->route_group ()); - route_group_menu->popup (ev->button, ev->time); + route_group_menu->build (_route->route_group ()); + route_group_menu->menu()->popup (ev->button, ev->time); return false; } @@ -443,6 +439,9 @@ RouteTimeAxisView::build_display_menu () items.push_back (MenuElem (_("Color..."), sigc::mem_fun (*this, &RouteUI::choose_color))); + if (_size_menu) { + detach_menu (*_size_menu); + } build_size_menu (); items.push_back (MenuElem (_("Height"), *_size_menu)); @@ -450,6 +449,7 @@ RouteTimeAxisView::build_display_menu () if (!Profile->get_sae()) { items.push_back (MenuElem (_("Remote Control ID..."), sigc::mem_fun (*this, &RouteUI::open_remote_control_id_dialog))); + items.back().set_sensitive (_editor.get_selection().tracks.size() <= 1); items.push_back (SeparatorElem()); } @@ -458,7 +458,7 @@ RouteTimeAxisView::build_display_menu () if (is_track()) { - Menu *layers_menu = manage(new Menu); + Menu* layers_menu = manage (new Menu); MenuList &layers_items = layers_menu->items(); layers_menu->set_name("ArdourContextMenu"); @@ -546,8 +546,9 @@ RouteTimeAxisView::build_display_menu () build_playlist_menu (); items.push_back (MenuElem (_("Playlist"), *playlist_action_menu)); - route_group_menu->rebuild (_route->route_group ()); - items.push_back (MenuElem (_("Route Group"), *route_group_menu)); + route_group_menu->detach (); + route_group_menu->build (_route->route_group ()); + items.push_back (MenuElem (_("Route Group"), *route_group_menu->menu ())); build_automation_action_menu (); items.push_back (MenuElem (_("Automation"), *automation_action_menu)); @@ -1430,8 +1431,6 @@ RouteTimeAxisView::build_playlist_menu () playlist_action_menu->set_name ("ArdourContextMenu"); playlist_items.clear(); - delete playlist_menu; - vector<boost::shared_ptr<Playlist> > playlists, playlists_tr; boost::shared_ptr<Track> tr = track(); RadioMenuItem::Group playlist_group; diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h index 54d06b4135..940964df53 100644 --- a/gtk2_ardour/route_time_axis.h +++ b/gtk2_ardour/route_time_axis.h @@ -266,7 +266,6 @@ protected: Gtk::RadioMenuItem* normal_track_mode_item; Gtk::RadioMenuItem* non_layered_track_mode_item; Gtk::RadioMenuItem* destructive_track_mode_item; - Gtk::Menu* playlist_menu; Gtk::Menu* playlist_action_menu; Gtk::MenuItem* playlist_item; Gtk::Menu* mode_menu; diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index 3ac5fc6c38..ee09adad83 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -617,9 +617,7 @@ TimeAxisView::conditionally_add_to_selection () void TimeAxisView::popup_display_menu (guint32 when) { - if (display_menu == 0) { - build_display_menu (); - } + build_display_menu (); conditionally_add_to_selection (); display_menu->popup (1, when); @@ -1356,9 +1354,11 @@ TimeAxisView::get_child_list () void TimeAxisView::build_size_menu () { - if (_size_menu) { + if (_size_menu && _size_menu->gobj ()) { return; } + + delete _size_menu; using namespace Menu_Helpers; |