summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/mixer_strip.cc3
-rw-r--r--gtk2_ardour/route_group_menu.cc55
-rw-r--r--gtk2_ardour/route_group_menu.h8
-rw-r--r--gtk2_ardour/route_time_axis.cc21
-rw-r--r--gtk2_ardour/route_time_axis.h1
-rw-r--r--gtk2_ardour/time_axis_view.cc8
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;