From 932b0e9ec1d0f7fb506ccd13bf08a4efe5f91297 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 7 Sep 2011 11:56:23 +0000 Subject: Update route colours when they are added to / removed from groups which share colour (more of #4064). git-svn-id: svn://localhost/ardour2/branches/3.0@10060 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/group_tabs.cc | 61 ++++++++++++++++++++++++++++++--- gtk2_ardour/group_tabs.h | 10 ++++++ libs/ardour/ardour/route_group.h | 6 ++-- libs/ardour/ardour/route_group_member.h | 2 +- libs/ardour/ardour/session.h | 18 ++++++++-- libs/ardour/route_group.cc | 4 +-- libs/ardour/route_group_member.cc | 5 +-- libs/ardour/session.cc | 20 +++++++++-- libs/ardour/session_state.cc | 5 +-- 9 files changed, 112 insertions(+), 19 deletions(-) diff --git a/gtk2_ardour/group_tabs.cc b/gtk2_ardour/group_tabs.cc index 8deec1d70a..59c1b40e35 100644 --- a/gtk2_ardour/group_tabs.cc +++ b/gtk2_ardour/group_tabs.cc @@ -56,7 +56,16 @@ GroupTabs::set_session (Session* s) SessionHandlePtr::set_session (s); if (_session) { - _session->RouteGroupChanged.connect (_session_connections, invalidator (*this), boost::bind (&GroupTabs::set_dirty, this), gui_context()); + _session->RouteGroupPropertyChanged.connect ( + _session_connections, invalidator (*this), boost::bind (&GroupTabs::route_group_property_changed, this, _1), gui_context() + ); + _session->RouteAddedToRouteGroup.connect ( + _session_connections, invalidator (*this), boost::bind (&GroupTabs::route_added_to_route_group, this, _1, _2), gui_context() + ); + _session->RouteRemovedFromRouteGroup.connect ( + _session_connections, invalidator (*this), boost::bind (&GroupTabs::route_removed_from_route_group, this, _1, _2), gui_context() + ); + _session->route_group_removed.connect (_session_connections, invalidator (*this), boost::bind (&GroupTabs::set_dirty, this), gui_context()); } } @@ -528,9 +537,7 @@ GroupTabs::set_group_color (RouteGroup* group, Gdk::Color color) for our routes. */ - for (RouteList::iterator i = group->route_list()->begin(); i != group->route_list()->end(); ++i) { - (*i)->gui_changed (X_("color"), 0); - } + emit_gui_changed_for_members (group); } /** @return the ID string to use for the GUI state of a route group */ @@ -577,3 +584,49 @@ GroupTabs::group_color (RouteGroup* group) return c; } +void +GroupTabs::route_group_property_changed (RouteGroup* rg) +{ + /* This is a bit of a hack, but this might change + our route's effective color, so emit gui_changed + for our routes. + */ + + emit_gui_changed_for_members (rg); + + set_dirty (); +} + +void +GroupTabs::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr w) +{ + /* Similarly-spirited hack as in route_group_property_changed */ + + boost::shared_ptr r = w.lock (); + if (!r) { + return; + } + + r->gui_changed (X_("color"), 0); +} + +void +GroupTabs::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr w) +{ + /* Similarly-spirited hack as in route_group_property_changed */ + + boost::shared_ptr r = w.lock (); + if (!r) { + return; + } + + r->gui_changed (X_("color"), 0); +} + +void +GroupTabs::emit_gui_changed_for_members (RouteGroup* rg) +{ + for (RouteList::iterator i = rg->route_list()->begin(); i != rg->route_list()->end(); ++i) { + (*i)->gui_changed (X_("color"), 0); + } +} diff --git a/gtk2_ardour/group_tabs.h b/gtk2_ardour/group_tabs.h index eaf03f6a22..059f3ce60b 100644 --- a/gtk2_ardour/group_tabs.h +++ b/gtk2_ardour/group_tabs.h @@ -30,6 +30,10 @@ class Editor; /** Parent class for tabs which represent route groups as colored tabs; * Currently used on the left-hand side of the editor and at the top of the mixer. + * + * This class also contains a fair bit of code to handle changes to route + * group colours; it seems a bit out of place, but I could not really think + * of a better place to put it. */ class GroupTabs : public CairoWidget, public ARDOUR::SessionHandlePtr { @@ -62,6 +66,8 @@ protected: }; private: + static void emit_gui_changed_for_members (ARDOUR::RouteGroup *); + /** Compute all the tabs for this widget. * @return Tabs. */ @@ -110,6 +116,10 @@ private: Tab * click_to_tab (double, std::list::iterator *, std::list::iterator *); + void route_group_property_changed (ARDOUR::RouteGroup *); + void route_added_to_route_group (ARDOUR::RouteGroup *, boost::weak_ptr); + void route_removed_from_route_group (ARDOUR::RouteGroup *, boost::weak_ptr); + Gtk::Menu* _menu; std::list _tabs; ///< current list of tabs Tab* _dragging; ///< tab being dragged, or 0 diff --git a/libs/ardour/ardour/route_group.h b/libs/ardour/ardour/route_group.h index 1f6be864cd..22e527ff9e 100644 --- a/libs/ardour/ardour/route_group.h +++ b/libs/ardour/ardour/route_group.h @@ -123,8 +123,10 @@ class RouteGroup : public SessionObject boost::shared_ptr route_list() { return routes; } - /** Emitted when a route has been added to or removed from this group */ - PBD::Signal0 MembershipChanged; + /** Emitted when a route has been added to this group */ + PBD::Signal2 > RouteAdded; + /** Emitted when a route has been removed from this group */ + PBD::Signal2 > RouteRemoved; XMLNode& get_state (); diff --git a/libs/ardour/ardour/route_group_member.h b/libs/ardour/ardour/route_group_member.h index ff99d27c13..860b836209 100644 --- a/libs/ardour/ardour/route_group_member.h +++ b/libs/ardour/ardour/route_group_member.h @@ -34,7 +34,7 @@ class RouteGroupMember RouteGroup* route_group () const { return _route_group; } /** Emitted when this member joins or leaves a route group */ - PBD::Signal0 route_group_changed; + PBD::Signal1 route_group_changed; protected: RouteGroup* _route_group; diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 1daa82dc48..cafcd4382f 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -289,8 +289,18 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi PBD::Signal0 Located; PBD::Signal1 RouteAdded; - /** Emitted when anything about any of our route groups changes */ - PBD::Signal0 RouteGroupChanged; + /** Emitted when a property of one of our route groups changes. + * The parameter is the RouteGroup that has changed. + */ + PBD::Signal1 RouteGroupPropertyChanged; + /** Emitted when a route is added to one of our route groups. + * First parameter is the RouteGroup, second is the route. + */ + PBD::Signal2 > RouteAddedToRouteGroup; + /** Emitted when a route is removed from one of our route groups. + * First parameter is the RouteGroup, second is the route. + */ + PBD::Signal2 > RouteRemovedFromRouteGroup; /* Step Editing status changed */ PBD::Signal1 StepEditStatusChange; @@ -1234,7 +1244,9 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi int load_regions (const XMLNode& node); int load_compounds (const XMLNode& node); - void route_group_changed (); + void route_added_to_route_group (RouteGroup *, boost::weak_ptr); + void route_removed_from_route_group (RouteGroup *, boost::weak_ptr); + void route_group_property_changed (RouteGroup *); /* SOURCES */ diff --git a/libs/ardour/route_group.cc b/libs/ardour/route_group.cc index 0806ad7730..42aa30c0f1 100644 --- a/libs/ardour/route_group.cc +++ b/libs/ardour/route_group.cc @@ -144,7 +144,7 @@ RouteGroup::add (boost::shared_ptr r) r->DropReferences.connect_same_thread (*this, boost::bind (&RouteGroup::remove_when_going_away, this, boost::weak_ptr (r))); _session.set_dirty (); - MembershipChanged (); /* EMIT SIGNAL */ + RouteAdded (this, boost::weak_ptr (r)); /* EMIT SIGNAL */ return 0; } @@ -167,7 +167,7 @@ RouteGroup::remove (boost::shared_ptr r) r->leave_route_group (); routes->erase (i); _session.set_dirty (); - MembershipChanged (); /* EMIT SIGNAL */ + RouteRemoved (this, boost::weak_ptr (r)); /* EMIT SIGNAL */ return 0; } diff --git a/libs/ardour/route_group_member.cc b/libs/ardour/route_group_member.cc index e4075df689..9b23fd922b 100644 --- a/libs/ardour/route_group_member.cc +++ b/libs/ardour/route_group_member.cc @@ -31,13 +31,14 @@ RouteGroupMember::join_route_group (RouteGroup *rg) } _route_group = rg; - route_group_changed (); /* EMIT SIGNAL */ + route_group_changed (rg); /* EMIT SIGNAL */ } void RouteGroupMember::leave_route_group () { + RouteGroup* rg = _route_group; _route_group = 0; - route_group_changed (); /* EMIT SIGNAL */ + route_group_changed (rg); /* EMIT SIGNAL */ } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 9053797ad2..c5b32b943b 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -4033,11 +4033,25 @@ Session::solo_control_mode_changed () } } -/** Called when anything about any of our route groups changes (membership, state etc.) */ +/** Called when a property of one of our route groups changes */ void -Session::route_group_changed () +Session::route_group_property_changed (RouteGroup* rg) { - RouteGroupChanged (); /* EMIT SIGNAL */ + RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */ +} + +/** Called when a route is added to one of our route groups */ +void +Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr r) +{ + RouteAddedToRouteGroup (rg, r); +} + +/** Called when a route is removed from one of our route groups */ +void +Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr r) +{ + RouteRemovedFromRouteGroup (rg, r); } vector diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 074527dc33..e43be3cd44 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -2388,8 +2388,9 @@ Session::add_route_group (RouteGroup* g) _route_groups.push_back (g); route_group_added (g); /* EMIT SIGNAL */ - g->MembershipChanged.connect_same_thread (*this, boost::bind (&Session::route_group_changed, this)); - g->PropertyChanged.connect_same_thread (*this, boost::bind (&Session::route_group_changed, this)); + g->RouteAdded.connect_same_thread (*this, boost::bind (&Session::route_added_to_route_group, this, _1, _2)); + g->RouteRemoved.connect_same_thread (*this, boost::bind (&Session::route_removed_from_route_group, this, _1, _2)); + g->PropertyChanged.connect_same_thread (*this, boost::bind (&Session::route_group_property_changed, this, g)); set_dirty (); } -- cgit v1.2.3