fix visibility of punch and loop rects.
[ardour.git] / gtk2_ardour / meterbridge.cc
index c8566adb640d300c6c393068a13cf932569d6450..4d2a0c7b3b0e8c4861455944e3ae6ea80443ac49 100644 (file)
@@ -92,7 +92,7 @@ struct SignalOrderRouteSorter {
                        /* everything comes before b */
                        return true;
                }
-               return a->order_key (MixerSort) < b->order_key (MixerSort);
+               return a->order_key () < b->order_key ();
        }
 };
 
@@ -138,7 +138,7 @@ Meterbridge::Meterbridge ()
 
        signal_delete_event().connect (sigc::mem_fun (*this, &Meterbridge::hide_window));
        signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
-       Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this, _1), gui_context());
+       Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this), gui_context());
        MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context());
        MeterStrip::MetricChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::resync_order, this), gui_context());
        MeterStrip::ConfigurationChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::queue_resize, this), gui_context());
@@ -376,6 +376,10 @@ Meterbridge::on_size_allocate (Gtk::Allocation& a)
        const Gtk::Scrollbar * hsc = scroller.get_hscrollbar();
 
        if (scroller.get_hscrollbar_visible() && hsc) {
+               if (!scroll_connection.connected()) {
+                       scroll_connection = scroller.get_hscrollbar()->get_adjustment()->signal_value_changed().connect(sigc::mem_fun (*this, &Meterbridge::on_scroll));
+                       scroller.get_hscrollbar()->get_adjustment()->signal_changed().connect(sigc::mem_fun (*this, &Meterbridge::on_scroll));
+               }
                gint scrollbar_spacing;
                gtk_widget_style_get (GTK_WIDGET (scroller.gobj()),
                                "scrollbar-spacing", &scrollbar_spacing, NULL);
@@ -389,6 +393,41 @@ Meterbridge::on_size_allocate (Gtk::Allocation& a)
        Gtk::Window::on_size_allocate(a);
 }
 
+void
+Meterbridge::on_scroll()
+{
+       if (!scroller.get_hscrollbar()) return;
+
+       Adjustment* adj = scroller.get_hscrollbar()->get_adjustment();
+       int leftend = adj->get_value();
+       int rightend = scroller.get_width() + leftend;
+
+       int mm_left = _mm_left;
+       int mm_right = _mm_right;
+       ARDOUR::MeterType mt_left = _mt_left;
+       ARDOUR::MeterType mt_right = _mt_right;
+
+       for (unsigned int i = 0; i < _metrics.size(); ++i) {
+               int sx, dx, dy;
+               int mm = _metrics[i]->get_metric_mode();
+               sx = (mm & 2) ? _metrics[i]->get_width() : 0;
+
+               _metrics[i]->translate_coordinates(meterarea, sx, 0, dx, dy);
+
+               if (dx < leftend && !(mm&2)) {
+                       mm_left = mm;
+                       mt_left = _metrics[i]->meter_type();
+               }
+               if (dx > rightend && (mm&2)) {
+                       mm_right = mm;
+                       mt_right = _metrics[i]->meter_type();
+                       break;
+               }
+       }
+       metrics_left.set_metric_mode(mm_left, mt_left);
+       metrics_right.set_metric_mode(mm_right, mt_right);
+}
+
 void
 Meterbridge::set_session (Session* s)
 {
@@ -593,10 +632,12 @@ Meterbridge::remove_strip (MeterStrip* strip)
                        break;
                }
        }
+
+       resync_order();
 }
 
 void
-Meterbridge::sync_order_keys (RouteSortOrderKey)
+Meterbridge::sync_order_keys ()
 {
        Glib::Threads::Mutex::Lock lm (_resync_mutex);
 
@@ -661,11 +702,11 @@ Meterbridge::sync_order_keys (RouteSortOrderKey)
 
                MeterType nmt = (*i).s->meter_type();
                if (nmt == MeterKrms) nmt = MeterPeak; // identical metrics
-               if (pos == 0) {
+               if (vis == 1) {
                        (*i).s->set_tick_bar(1);
                }
 
-               if ((*i).visible && nmt != lmt && pos == 0) {
+               if ((*i).visible && nmt != lmt && vis == 1) {
                        lmt = nmt;
                        metrics_left.set_metric_mode(1, lmt);
                } else if ((*i).visible && nmt != lmt) {
@@ -722,13 +763,20 @@ Meterbridge::sync_order_keys (RouteSortOrderKey)
                delete (_metrics.back());
                _metrics.pop_back();
        }
+
+       _mm_left = metrics_left.get_metric_mode();
+       _mt_left = metrics_left.meter_type();
+       _mm_right = metrics_right.get_metric_mode();
+       _mt_right = metrics_right.meter_type();
+
+       on_scroll();
        queue_resize();
 }
 
 void
 Meterbridge::resync_order()
 {
-       sync_order_keys(MixerSort);
+       sync_order_keys();
 }
 
 void
@@ -761,6 +809,9 @@ Meterbridge::parameter_changed (std::string const & p)
        else if (p == "show-name-on-meterbridge") {
                scroller.queue_resize();
        }
+       else if (p == "meterbridge-label-height") {
+               scroller.queue_resize();
+       }
 }
 
 void