Factor route group menu out into its own class.

git-svn-id: svn://localhost/ardour2/branches/3.0@5292 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2009-06-29 00:38:58 +00:00
parent 1a5de76f7e
commit 7a4f1b9cf6
7 changed files with 112 additions and 115 deletions

View 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;
if (ev->button == 1) {
switch (ev->button) {
case 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;
}
}

View 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;
};

View File

@ -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;
}
}

View File

@ -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;
};

View 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;
}
}

View 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;

View 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