mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 14:54:56 +01:00
Make the route group submenu of the RouteTimeAxisView menu apply to the selection.
git-svn-id: svn://localhost/ardour2/branches/3.0@9087 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
aeff4ebb79
commit
965a974083
7 changed files with 79 additions and 60 deletions
|
|
@ -1255,19 +1255,6 @@ MixerStrip::comment_changed (void *src)
|
|||
}
|
||||
}
|
||||
|
||||
/** Set the route group for this strip's route, or remove it from its current group.
|
||||
* @param rg New RouteGroup, or 0.
|
||||
*/
|
||||
void
|
||||
MixerStrip::set_route_group (RouteGroup *rg)
|
||||
{
|
||||
if (rg) {
|
||||
rg->add (_route);
|
||||
} else if (_route->route_group ()) {
|
||||
_route->route_group()->remove (_route);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
MixerStrip::select_route_group (GdkEventButton *ev)
|
||||
{
|
||||
|
|
@ -1284,10 +1271,11 @@ MixerStrip::select_route_group (GdkEventButton *ev)
|
|||
plist->add (Properties::solo, true);
|
||||
|
||||
group_menu = new RouteGroupMenu (_session, plist);
|
||||
group_menu->GroupSelected.connect (sigc::mem_fun (*this, &MixerStrip::set_route_group));
|
||||
}
|
||||
|
||||
group_menu->build (route_group ());
|
||||
WeakRouteList r;
|
||||
r.push_back (route ());
|
||||
group_menu->build (r);
|
||||
group_menu->menu()->popup (1, ev->time);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -248,7 +248,6 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
|
|||
void comment_edited ();
|
||||
bool ignore_comment_edit;
|
||||
|
||||
void set_route_group (ARDOUR::RouteGroup *);
|
||||
bool select_route_group (GdkEventButton *);
|
||||
void route_group_changed ();
|
||||
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
#include "gtkmm2ext/utils.h"
|
||||
#include "ardour/session.h"
|
||||
#include "ardour/route_group.h"
|
||||
#include "ardour/route.h"
|
||||
#include "route_group_menu.h"
|
||||
#include "route_group_dialog.h"
|
||||
#include "i18n.h"
|
||||
|
|
@ -35,7 +36,6 @@ RouteGroupMenu::RouteGroupMenu (Session* s, PropertyList* plist)
|
|||
, _menu (0)
|
||||
, _default_properties (plist)
|
||||
, _inhibit_group_selected (false)
|
||||
, _selected_route_group (0)
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -46,13 +46,24 @@ RouteGroupMenu::~RouteGroupMenu()
|
|||
delete _default_properties;
|
||||
}
|
||||
|
||||
/** @param curr Current route group to mark as selected, or 0 for no group */
|
||||
/** @param s Routes to operate on */
|
||||
void
|
||||
RouteGroupMenu::build (RouteGroup* curr)
|
||||
RouteGroupMenu::build (WeakRouteList const & s)
|
||||
{
|
||||
assert (!s.empty ());
|
||||
|
||||
using namespace Menu_Helpers;
|
||||
|
||||
_selected_route_group = curr;
|
||||
_subject = s;
|
||||
|
||||
/* FInd all the route groups that our subjects are members of */
|
||||
std::set<RouteGroup*> groups;
|
||||
for (WeakRouteList::const_iterator i = _subject.begin (); i != _subject.end(); ++i) {
|
||||
boost::shared_ptr<Route> r = i->lock ();
|
||||
if (r) {
|
||||
groups.insert (r->route_group ());
|
||||
}
|
||||
}
|
||||
|
||||
_inhibit_group_selected = true;
|
||||
|
||||
|
|
@ -71,30 +82,44 @@ RouteGroupMenu::build (RouteGroup* curr)
|
|||
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")));
|
||||
RadioMenuItem* i = static_cast<RadioMenuItem *> (&items.back ());
|
||||
i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::set_group), (RouteGroup *) 0));
|
||||
|
||||
if (curr == 0) {
|
||||
static_cast<RadioMenuItem*> (&items.back())->set_active ();
|
||||
if (groups.size() == 1 && *groups.begin() == 0) {
|
||||
i->set_active ();
|
||||
} else if (groups.size() > 1) {
|
||||
i->set_inconsistent ();
|
||||
}
|
||||
|
||||
if (_session) {
|
||||
_session->foreach_route_group (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::add_item), curr, &group));
|
||||
_session->foreach_route_group (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::add_item), groups, &group));
|
||||
}
|
||||
|
||||
_inhibit_group_selected = false;
|
||||
}
|
||||
|
||||
/** @param rg Route group to add.
|
||||
* @param groups Active route groups (may included 0 for `no group')
|
||||
* @param group Radio item group to add radio items to.
|
||||
*/
|
||||
void
|
||||
RouteGroupMenu::add_item (RouteGroup* rg, RouteGroup* curr, RadioMenuItem::Group* group)
|
||||
RouteGroupMenu::add_item (RouteGroup* rg, std::set<RouteGroup*> const & groups, RadioMenuItem::Group* group)
|
||||
{
|
||||
using namespace Menu_Helpers;
|
||||
|
||||
MenuList& items = _menu->items ();
|
||||
|
||||
items.push_back (RadioMenuElem (*group, rg->name(), sigc::bind (sigc::mem_fun(*this, &RouteGroupMenu::set_group), rg)));
|
||||
items.push_back (RadioMenuElem (*group, rg->name()));
|
||||
RadioMenuItem* i = static_cast<RadioMenuItem*> (&items.back ());
|
||||
i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::set_group), rg));
|
||||
|
||||
if (rg == curr) {
|
||||
static_cast<RadioMenuItem*> (&items.back())->set_active ();
|
||||
if (groups.size() == 1 && *groups.begin() == rg) {
|
||||
/* there's only one active group, and it's this one */
|
||||
i->set_active ();
|
||||
} else if (groups.size() > 1) {
|
||||
/* there are >1 active groups */
|
||||
i->set_inconsistent ();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -104,18 +129,25 @@ RouteGroupMenu::add_item (RouteGroup* rg, RouteGroup* curr, RadioMenuItem::Group
|
|||
void
|
||||
RouteGroupMenu::set_group (RouteGroup* g)
|
||||
{
|
||||
if (g == _selected_route_group) {
|
||||
/* cut off the signal_toggled that GTK emits for an option that is being un-selected
|
||||
when a new option is being selected instead
|
||||
*/
|
||||
if (_inhibit_group_selected) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_inhibit_group_selected) {
|
||||
GroupSelected (g);
|
||||
}
|
||||
|
||||
_selected_route_group = g;
|
||||
for (WeakRouteList::const_iterator i = _subject.begin(); i != _subject.end(); ++i) {
|
||||
boost::shared_ptr<Route> r = i->lock ();
|
||||
if (!r || r->route_group () == g) {
|
||||
/* lock of weak_ptr failed, or the group for this route is already right */
|
||||
continue;
|
||||
}
|
||||
|
||||
if (g) {
|
||||
g->add (r);
|
||||
} else {
|
||||
if (r->route_group ()) {
|
||||
r->route_group()->remove (r);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -30,20 +30,18 @@ public:
|
|||
~RouteGroupMenu();
|
||||
|
||||
Gtk::Menu* menu ();
|
||||
void build (ARDOUR::RouteGroup *);
|
||||
void build (ARDOUR::WeakRouteList const &);
|
||||
void detach ();
|
||||
|
||||
sigc::signal<void, ARDOUR::RouteGroup*> GroupSelected;
|
||||
|
||||
private:
|
||||
void add_item (ARDOUR::RouteGroup *, ARDOUR::RouteGroup *, Gtk::RadioMenuItem::Group*);
|
||||
void add_item (ARDOUR::RouteGroup *, std::set<ARDOUR::RouteGroup*> const &, Gtk::RadioMenuItem::Group*);
|
||||
void new_group ();
|
||||
void set_group (ARDOUR::RouteGroup *);
|
||||
|
||||
Gtk::Menu* _menu;
|
||||
PBD::PropertyList* _default_properties;
|
||||
bool _inhibit_group_selected;
|
||||
ARDOUR::RouteGroup* _selected_route_group;
|
||||
ARDOUR::WeakRouteList _subject;
|
||||
};
|
||||
|
||||
#endif /* __ardour_gtk_route_group_menu_h__ */
|
||||
|
|
|
|||
|
|
@ -231,7 +231,6 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, boost::sh
|
|||
plist->add (ARDOUR::Properties::solo, true);
|
||||
|
||||
route_group_menu = new RouteGroupMenu (_session, plist);
|
||||
route_group_menu->GroupSelected.connect (sigc::mem_fun (*this, &RouteTimeAxisView::set_route_group_from_menu));
|
||||
|
||||
gm.get_gain_slider().signal_scroll_event().connect(sigc::mem_fun(*this, &RouteTimeAxisView::controls_ebox_scroll), false);
|
||||
gm.get_gain_slider().set_name ("TrackGainFader");
|
||||
|
|
@ -280,24 +279,15 @@ RouteTimeAxisView::route_group_click (GdkEventButton *ev)
|
|||
return false;
|
||||
}
|
||||
|
||||
route_group_menu->build (_route->route_group ());
|
||||
WeakRouteList r;
|
||||
r.push_back (route ());
|
||||
|
||||
route_group_menu->build (r);
|
||||
route_group_menu->menu()->popup (ev->button, ev->time);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
RouteTimeAxisView::set_route_group_from_menu (RouteGroup *eg)
|
||||
{
|
||||
if (eg) {
|
||||
eg->add (_route);
|
||||
} else {
|
||||
if (_route->route_group()) {
|
||||
_route->route_group()->remove (_route);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RouteTimeAxisView::playlist_changed ()
|
||||
{
|
||||
|
|
@ -609,7 +599,20 @@ RouteTimeAxisView::build_display_menu ()
|
|||
items.back().set_sensitive (_editor.get_selection().tracks.size() <= 1);
|
||||
|
||||
route_group_menu->detach ();
|
||||
route_group_menu->build (_route->route_group ());
|
||||
|
||||
WeakRouteList r;
|
||||
for (TrackSelection::iterator i = _editor.get_selection().tracks.begin(); i != _editor.get_selection().tracks.end(); ++i) {
|
||||
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
|
||||
if (rtv) {
|
||||
r.push_back (rtv->route ());
|
||||
}
|
||||
}
|
||||
|
||||
if (r.empty ()) {
|
||||
r.push_back (route ());
|
||||
}
|
||||
|
||||
route_group_menu->build (r);
|
||||
items.push_back (MenuElem (_("Route Group"), *route_group_menu->menu ()));
|
||||
|
||||
build_automation_action_menu ();
|
||||
|
|
|
|||
|
|
@ -207,8 +207,6 @@ protected:
|
|||
|
||||
virtual void label_view ();
|
||||
|
||||
void set_route_group_from_menu (ARDOUR::RouteGroup *);
|
||||
|
||||
void reset_samples_per_unit ();
|
||||
void horizontal_position_changed ();
|
||||
|
||||
|
|
|
|||
|
|
@ -488,7 +488,8 @@ namespace ARDOUR {
|
|||
|
||||
typedef std::list<framepos_t> AnalysisFeatureList;
|
||||
|
||||
typedef std::list<boost::shared_ptr<Route> > RouteList;
|
||||
typedef std::list<boost::shared_ptr<Route> > RouteList;
|
||||
typedef std::list<boost::weak_ptr <Route> > WeakRouteList;
|
||||
|
||||
class Bundle;
|
||||
typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue