meterbridge: ignore non-visible routes/meters.
authorRobin Gareus <robin@gareus.org>
Sat, 6 Jul 2013 20:48:43 +0000 (22:48 +0200)
committerRobin Gareus <robin@gareus.org>
Wed, 10 Jul 2013 13:27:12 +0000 (15:27 +0200)
gtk2_ardour/meterbridge.cc
gtk2_ardour/meterbridge.h

index 1cd48dc69271292aff28ae80bd890801a9b8be9c..f24f34efc20c522e3ac28321df82ae0e5eb0365a 100644 (file)
@@ -95,27 +95,6 @@ struct SignalOrderRouteSorter {
        }
 };
 
-/* modified version of above
- * used in Meterbridge::sync_order_keys()
- */
-struct MeterOrderRouteSorter {
-       bool operator() (MeterStrip *ma, MeterStrip *mb) {
-               boost::shared_ptr<Route> a = ma->route();
-               boost::shared_ptr<Route> b = mb->route();
-               if (a->is_master() || a->is_monitor()) {
-                       /* "a" is a special route (master, monitor, etc), and comes
-                        * last in the mixer ordering
-                        */
-                       return false;
-               } else if (b->is_master() || b->is_monitor()) {
-                       /* everything comes before b */
-                       return true;
-               }
-               return a->order_key (MixerSort) < b->order_key (MixerSort);
-       }
-};
-
-
 Meterbridge::Meterbridge ()
        : Window (Gtk::WINDOW_TOPLEVEL)
        , VisibilityTracker (*((Gtk::Window*) this))
@@ -419,8 +398,8 @@ Meterbridge::session_going_away ()
 {
        ENSURE_GUI_THREAD (*this, &Meterbridge::session_going_away);
 
-       for (list<MeterStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
-               delete (*i);
+       for (list<MeterBridgeStrip>::iterator i = strips.begin(); i != strips.end(); ++i) {
+               delete ((*i).s);
        }
 
        strips.clear ();
@@ -534,9 +513,9 @@ Meterbridge::fast_update_strips ()
        if (!is_mapped () || !_session) {
                return;
        }
-       for (list<MeterStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
-               // TODO skip inactive/hidden routes
-               (*i)->fast_update ();
+       for (list<MeterBridgeStrip>::iterator i = strips.begin(); i != strips.end(); ++i) {
+               if (!(*i).visible) continue;
+               (*i).s->fast_update ();
        }
 }
 
@@ -554,14 +533,14 @@ Meterbridge::add_strips (RouteList& routes)
                }
 
                strip = new MeterStrip (_session, route);
-               strips.push_back (strip);
+               strips.push_back (MeterBridgeStrip(strip));
                route->active_changed.connect (*this, invalidator (*this), boost::bind (&Meterbridge::resync_order, this), gui_context ());
 
                meterarea.pack_start (*strip, false, false);
                strip->show();
        }
 
-       sync_order_keys(MixerSort);
+       resync_order();
        update_metrics();
 }
 
@@ -572,9 +551,12 @@ Meterbridge::remove_strip (MeterStrip* strip)
                return;
        }
 
-       list<MeterStrip *>::iterator i;
-       if ((i = find (strips.begin(), strips.end(), strip)) != strips.end()) {
-               strips.erase (i);
+       list<MeterBridgeStrip>::iterator i;
+       for (list<MeterBridgeStrip>::iterator i = strips.begin(); i != strips.end(); ++i) {
+               if ( (*i).s == strip) {
+                       strips.erase (i);
+                       break;
+               }
        }
        update_metrics();
 }
@@ -583,8 +565,8 @@ void
 Meterbridge::update_metrics ()
 {
        bool have_midi = false;
-       for (list<MeterStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
-               if ( (*i)->has_midi ()) {
+       for (list<MeterBridgeStrip>::iterator i = strips.begin(); i != strips.end(); ++i) {
+               if ( (*i).s->has_midi () && (*i).visible) {
                        have_midi = true;
                        break;
                }
@@ -600,49 +582,57 @@ void
 Meterbridge::sync_order_keys (RouteSortOrderKey src)
 {
        MeterOrderRouteSorter sorter;
-       std::list<MeterStrip *> copy (strips);
+       std::list<MeterBridgeStrip> copy (strips);
        copy.sort(sorter);
 
        int pos = 0;
 
-       for (list<MeterStrip *>::iterator i = copy.begin(); i != copy.end(); ++i) {
+       for (list<MeterBridgeStrip>::iterator i = copy.begin(); i != copy.end(); ++i) {
 
-               if (! (*i)->route()->active()) {
-                       (*i)->hide();
+               if (! (*i).s->route()->active()) {
+                       (*i).s->hide();
+                       (*i).visible = false;
                }
-               else if ((*i)->route()->is_master()) {
+               else if ((*i).s->route()->is_master()) {
                        if (_show_master) {
-                               (*i)->show();
+                               (*i).s->show();
+                               (*i).visible = true;
                        } else {
-                               (*i)->hide();
+                               (*i).s->hide();
+                               (*i).visible = false;
                        }
                }
-               else if (boost::dynamic_pointer_cast<AudioTrack>((*i)->route()) == 0
-                               && boost::dynamic_pointer_cast<MidiTrack>((*i)->route()) == 0
+               else if (boost::dynamic_pointer_cast<AudioTrack>((*i).s->route()) == 0
+                               && boost::dynamic_pointer_cast<MidiTrack>((*i).s->route()) == 0
                                ) {
                        /* non-master bus */
                        if (_show_busses) {
-                               (*i)->show();
+                               (*i).s->show();
+                               (*i).visible = true;
                        } else {
-                               (*i)->hide();
+                               (*i).s->hide();
+                               (*i).visible = false;
                        }
                }
-               else if (boost::dynamic_pointer_cast<MidiTrack>((*i)->route())) {
+               else if (boost::dynamic_pointer_cast<MidiTrack>((*i).s->route())) {
                        if (_show_midi) {
-                               (*i)->show();
+                               (*i).s->show();
+                               (*i).visible = true;
                        } else {
-                               (*i)->hide();
+                               (*i).s->hide();
+                               (*i).visible = false;
                        }
                }
                else {
-                       (*i)->show();
+                       (*i).s->show();
+                       (*i).visible = true;
                }
-               meterarea.reorder_child(*(*i), pos++);
+               meterarea.reorder_child(*((*i).s), pos++);
        }
 }
 
 void
-Meterbridge::resync_order ()
+Meterbridge::resync_order()
 {
        sync_order_keys(MixerSort);
 }
@@ -652,18 +642,22 @@ Meterbridge::parameter_changed (std::string const & p)
 {
        if (p == "show-busses-on-meterbridge") {
                _show_busses = _session->config.get_show_busses_on_meterbridge();
-               sync_order_keys(MixerSort);
+               resync_order();
+               update_metrics();
        }
        else if (p == "show-master-on-meterbridge") {
                _show_master = _session->config.get_show_master_on_meterbridge();
-               sync_order_keys(MixerSort);
+               resync_order();
+               update_metrics();
        }
        else if (p == "show-midi-on-meterbridge") {
                _show_midi = _session->config.get_show_midi_on_meterbridge();
-               sync_order_keys(MixerSort);
+               resync_order();
+               update_metrics();
        }
        else if (p == "meter-line-up-level") {
                meter_clear_pattern_cache();
+               update_metrics();
        }
 }
 
index faa107c14e9b9f8192f8adc00a380ef897de6b6e..e8ab97d93bbec10f984fd2ea91fa87bd5c94322f 100644 (file)
@@ -82,7 +82,34 @@ class Meterbridge :
        void sync_order_keys (ARDOUR::RouteSortOrderKey src);
        void resync_order ();
 
-       std::list<MeterStrip *> strips;
+       struct MeterBridgeStrip {
+               MeterStrip *s;
+               bool visible;
+
+               MeterBridgeStrip(MeterStrip *ss) {
+                       s = ss;
+                       visible = true;
+               }
+       };
+
+       struct MeterOrderRouteSorter {
+               bool operator() (struct MeterBridgeStrip ma, struct MeterBridgeStrip mb) {
+                       boost::shared_ptr<ARDOUR::Route> a = ma.s->route();
+                       boost::shared_ptr<ARDOUR::Route> b = mb.s->route();
+                       if (a->is_master() || a->is_monitor()) {
+                               /* "a" is a special route (master, monitor, etc), and comes
+                                * last in the mixer ordering
+                                */
+                               return false;
+                       } else if (b->is_master() || b->is_monitor()) {
+                               /* everything comes before b */
+                               return true;
+                       }
+                       return a->order_key (ARDOUR::MixerSort) < b->order_key (ARDOUR::MixerSort);
+               }
+       };
+
+       std::list<MeterBridgeStrip> strips;
 
        MeterStrip metrics_left;
        MeterStrip metrics_right;