Factor route group menu out into its own class.
authorCarl Hetherington <carl@carlh.net>
Mon, 29 Jun 2009 00:38:58 +0000 (00:38 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 29 Jun 2009 00:38:58 +0000 (00:38 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@5292 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/mixer_strip.cc
gtk2_ardour/mixer_strip.h
gtk2_ardour/route_group_menu.cc [new file with mode: 0644]
gtk2_ardour/route_group_menu.h [new file with mode: 0644]
gtk2_ardour/route_time_axis.cc
gtk2_ardour/route_time_axis.h
gtk2_ardour/wscript

index 646d55ff6b9095e02eedf61f748016d51659ef89..00c7503efa30d69ac6e70c096faebbfd2d43ab52 100644 (file)
@@ -58,7 +58,7 @@
 #include "io_selector.h"
 #include "utils.h"
 #include "gui_thread.h"
-#include "route_group_dialog.h"
+#include "route_group_menu.h"
 
 #include "i18n.h"
 
@@ -1060,50 +1060,19 @@ MixerStrip::set_route_group (RouteGroup *rg)
        _route->set_route_group (rg, this);
 }
 
-void
-MixerStrip::add_route_group_to_menu (RouteGroup *rg, RadioMenuItem::Group* group)
-{
-       using namespace Menu_Helpers;
-
-       MenuList& items = group_menu->items();
-
-       items.push_back (RadioMenuElem (*group, rg->name(), bind (mem_fun(*this, &MixerStrip::set_route_group), rg)));
-
-       if (_route->route_group() == rg) {
-               static_cast<RadioMenuItem*>(&items.back())->set_active ();
-       }
-}
-
 bool
 MixerStrip::select_route_group (GdkEventButton *ev)
 {
        using namespace Menu_Helpers;
 
-       if (group_menu == 0) {
-               group_menu = new Menu;
-       } 
-       group_menu->set_name ("ArdourContextMenu");
-       MenuList& items = group_menu->items();
-       RadioMenuItem::Group group;
-
-       switch (ev->button) {
-       case 1:
+       if (ev->button == 1) {
 
-               items.clear ();
-               
-               items.push_back (MenuElem (_("New group..."), mem_fun (*this, &MixerStrip::set_route_group_to_new)));
-               
-               items.push_back (SeparatorElem ());
-               
-               items.push_back (RadioMenuElem (group, _("No group"), bind (mem_fun(*this, &MixerStrip::set_route_group), (RouteGroup *) 0)));
-
-               _session.foreach_route_group (bind (mem_fun (*this, &MixerStrip::add_route_group_to_menu), &group));
+               if (group_menu == 0) {
+                       group_menu = new RouteGroupMenu (_session);
+                       group_menu->GroupSelected.connect (mem_fun (*this, &MixerStrip::set_route_group));
+               }
 
                group_menu->popup (1, ev->time);
-               break;
-
-       default:
-               break;
        }
        
        return true;
@@ -1516,21 +1485,3 @@ MixerStrip::set_button_names ()
                
        }
 }
-
-void
-MixerStrip::set_route_group_to_new ()
-{
-       RouteGroup* g = new RouteGroup (_session, "", RouteGroup::Active);
-       g->set_active (true, this);
-
-       RouteGroupDialog d (g, Gtk::Stock::NEW);
-       int const r = d.do_run ();
-
-       if (r == Gtk::RESPONSE_OK) {
-               _session.add_route_group (g);
-               _route->set_route_group (g, this);
-       } else {
-               delete g;
-       }
-}
-
index 46cc572200e2922fc97dcf5f7fe05817fce9e80c..30557b115edc229d3171c729a9fffdc7702eb5a3 100644 (file)
@@ -53,9 +53,6 @@
 #include "processor_box.h"
 #include "ardour_dialog.h"
 
-class MotionController;
-
-
 namespace Gtkmm2ext {
        class SliderController;
 }
@@ -76,6 +73,8 @@ namespace Gtk {
 
 class Mixer_UI;
 class IOSelectorWindow;
+class MotionController;
+class RouteGroupMenu;
 
 class MixerStrip : public RouteUI, public Gtk::EventBox
 {
@@ -176,7 +175,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
 
        Gtk::Button   group_button;
        Gtk::Label    group_label;
-       Gtk::Menu    *group_menu;
+       RouteGroupMenu *group_menu;
 
        gint input_press (GdkEventButton *);
        gint output_press (GdkEventButton *);
@@ -226,7 +225,6 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
        bool ignore_comment_edit;
 
        void set_route_group (ARDOUR::RouteGroup *);
-       void add_route_group_to_menu (ARDOUR::RouteGroup *, Gtk::RadioMenuItem::Group*);
        bool select_route_group (GdkEventButton *);
        void route_group_changed (void *);
 
@@ -256,8 +254,6 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
        boost::shared_ptr<ARDOUR::Delivery> _current_delivery;
        void revert_to_default_display ();
 
-       void set_route_group_to_new ();
-
        static int scrollbar_height;
 };
 
diff --git a/gtk2_ardour/route_group_menu.cc b/gtk2_ardour/route_group_menu.cc
new file mode 100644 (file)
index 0000000..e42cded
--- /dev/null
@@ -0,0 +1,71 @@
+#include <gtkmm/menu.h>
+#include <gtkmm/stock.h>
+#include "ardour/session.h"
+#include "ardour/route_group.h"
+#include "route_group_menu.h"
+#include "route_group_dialog.h"
+#include "i18n.h"
+
+using namespace Gtk;
+using namespace ARDOUR;
+
+RouteGroupMenu::RouteGroupMenu (Session& s)
+       : _session (s)
+{
+       rebuild (0);
+}
+
+void
+RouteGroupMenu::rebuild (RouteGroup* curr)
+{
+       using namespace Menu_Helpers;
+       
+       items().clear ();
+
+       items().push_back (MenuElem (_("New group..."), 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)));
+
+       if (curr == 0) {
+               static_cast<RadioMenuItem*> (&items().back())->set_active ();
+       }
+               
+       _session.foreach_route_group (bind (mem_fun (*this, &RouteGroupMenu::add_item), curr, &group));
+}
+
+void
+RouteGroupMenu::add_item (RouteGroup* rg, RouteGroup* curr, RadioMenuItem::Group* group)
+{
+       using namespace Menu_Helpers;
+
+       items().push_back (RadioMenuElem (*group, rg->name(), bind (mem_fun(*this, &RouteGroupMenu::set_group), rg)));
+       
+       if (rg == curr) {
+               static_cast<RadioMenuItem*> (&items().back())->set_active ();
+       }       
+}
+
+void
+RouteGroupMenu::set_group (RouteGroup* g)
+{
+       GroupSelected (g);
+}
+
+
+void
+RouteGroupMenu::new_group ()
+{
+       RouteGroup* g = new RouteGroup (_session, "", RouteGroup::Active);
+
+       RouteGroupDialog d (g, Gtk::Stock::NEW);
+       int const r = d.do_run ();
+
+       if (r == Gtk::RESPONSE_OK) {
+               _session.add_route_group (g);
+               set_group (g);
+       } else {
+               delete g;
+       }
+}
diff --git a/gtk2_ardour/route_group_menu.h b/gtk2_ardour/route_group_menu.h
new file mode 100644 (file)
index 0000000..09a31e6
--- /dev/null
@@ -0,0 +1,21 @@
+namespace ARDOUR {
+       class Session;
+       class RouteGroup;
+}
+
+class RouteGroupMenu : public Gtk::Menu
+{
+public:
+       RouteGroupMenu (ARDOUR::Session &);
+
+       void rebuild (ARDOUR::RouteGroup *);
+
+       sigc::signal<void, ARDOUR::RouteGroup*> GroupSelected;
+       
+private:
+       void add_item (ARDOUR::RouteGroup *, ARDOUR::RouteGroup *, Gtk::RadioMenuItem::Group*);
+       void new_group ();
+       void set_group (ARDOUR::RouteGroup *);
+       
+       ARDOUR::Session& _session;
+};
index a31c84dba32e9eeaa2ce0f22902323fcf79f62bd..f0a08570304568fbd16e44b1832c2c709580effb 100644 (file)
@@ -75,7 +75,7 @@
 #include "simplerect.h"
 #include "streamview.h"
 #include "utils.h"
-#include "route_group_dialog.h"
+#include "route_group_menu.h"
 
 #include "ardour/track.h"
 
@@ -253,6 +253,9 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
        _editor.ZoomChanged.connect (mem_fun(*this, &RouteTimeAxisView::reset_samples_per_unit));
        ColorsChanged.connect (mem_fun (*this, &RouteTimeAxisView::color_handler));
 
+       route_group_menu = new RouteGroupMenu (_session);
+       route_group_menu->GroupSelected.connect (mem_fun (*this, &RouteTimeAxisView::set_route_group_from_menu));
+
        gm.get_gain_slider().signal_scroll_event().connect(mem_fun(*this, &RouteTimeAxisView::controls_ebox_scroll), false);
        gm.get_gain_slider().set_name ("TrackGainFader");
 }
@@ -279,6 +282,8 @@ RouteTimeAxisView::~RouteTimeAxisView ()
        }
        
        _automation_tracks.clear ();
+
+       delete route_group_menu;
 }
 
 void
@@ -315,45 +320,14 @@ RouteTimeAxisView::edit_click (GdkEventButton *ev)
        if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
                _route->set_route_group (0, this);
                return FALSE;
-       } 
-
-       using namespace Menu_Helpers;
-
-       MenuList& items = route_group_menu.items ();
-       RadioMenuItem::Group group;
-
-       items.clear ();
-
-       items.push_back (MenuElem (_("New group..."), mem_fun (*this, &RouteTimeAxisView::set_route_group_to_new)));
-
-       items.push_back (SeparatorElem ());
-       
-       items.push_back (RadioMenuElem (group, _("No group"), 
-                                       bind (mem_fun(*this, &RouteTimeAxisView::set_route_group_from_menu), (RouteGroup *) 0)));
-       
-       if (_route->route_group() == 0) {
-               static_cast<RadioMenuItem*>(&items.back())->set_active ();
        }
 
-       _session.foreach_route_group (bind (mem_fun (*this, &RouteTimeAxisView::add_route_group_menu_item), &group));
-       route_group_menu.popup (ev->button, ev->time);
+       route_group_menu->rebuild (_route->route_group ());
+       route_group_menu->popup (ev->button, ev->time);
 
        return FALSE;
 }
 
-void
-RouteTimeAxisView::add_route_group_menu_item (RouteGroup *eg, RadioMenuItem::Group* group)
-{
-       using namespace Menu_Helpers;
-
-       MenuList &items = route_group_menu.items();
-
-       items.push_back (RadioMenuElem (*group, eg->name(), bind (mem_fun(*this, &RouteTimeAxisView::set_route_group_from_menu), eg)));
-       if (_route->route_group() == eg) {
-               static_cast<RadioMenuItem*>(&items.back())->set_active ();
-       }
-}
-
 void
 RouteTimeAxisView::set_route_group_from_menu (RouteGroup *eg)
 {
@@ -2422,18 +2396,3 @@ RouteTimeAxisView::set_button_names ()
        mute_button_label.set_text (_("m"));
 }
 
-void
-RouteTimeAxisView::set_route_group_to_new ()
-{
-       RouteGroup* g = new RouteGroup (_session, "", RouteGroup::Active);
-
-       RouteGroupDialog d (g, Gtk::Stock::NEW);
-       int const r = d.do_run ();
-
-       if (r == Gtk::RESPONSE_OK) {
-               _session.add_route_group (g);
-               _route->set_route_group (g, this);
-       } else {
-               delete g;
-       }
-}
index 34896e46398604824a5b0551d1f463dc7deb176c..45e961c69e65871a017404c5d776184da2388bf3 100644 (file)
@@ -45,7 +45,6 @@
 #include "canvas.h"
 #include "gain_meter.h"
 
-
 namespace ARDOUR {
        class Session;
        class Region;
@@ -67,6 +66,7 @@ class AutomationTimeAxisView;
 class AutomationLine;
 class ProcessorAutomationLine;
 class TimeSelection;
+class RouteGroupMenu;
 
 class RouteTimeAxisView : public RouteUI, public TimeAxisView
 {
@@ -223,9 +223,7 @@ protected:
 
        virtual void label_view ();
        
-       void add_route_group_menu_item (ARDOUR::RouteGroup *, Gtk::RadioMenuItem::Group*);
        void set_route_group_from_menu (ARDOUR::RouteGroup *);
-       void set_route_group_to_new ();
 
        void reset_samples_per_unit ();
 
@@ -281,7 +279,7 @@ protected:
        
        Gtk::Menu           subplugin_menu;
        Gtk::Menu*          automation_action_menu;
-       Gtk::Menu           route_group_menu;
+       RouteGroupMenu*     route_group_menu;
        Gtk::RadioMenuItem* align_existing_item;
        Gtk::RadioMenuItem* align_capture_item;
        Gtk::RadioMenuItem* normal_track_mode_item;
index 9c27e92f6c0a4103e08e3ce2ca684d7503777cf5..accc7cdd7200f057c2aa046d1192e672975090eb 100644 (file)
@@ -192,6 +192,7 @@ def build(bld):
                return_ui.cc
                rhythm_ferret.cc
                route_group_dialog.cc
+               route_group_menu.cc
                route_params_ui.cc
                route_processor_selection.cc
                route_time_axis.cc