update osx dmg packaging to new pango
[ardour.git] / gtk2_ardour / meterbridge.cc
index c8566adb640d300c6c393068a13cf932569d6450..8756089e00180f1cc06950dfe22f086ab49e80f5 100644 (file)
@@ -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,6 +632,8 @@ Meterbridge::remove_strip (MeterStrip* strip)
                        break;
                }
        }
+
+       resync_order();
 }
 
 void
@@ -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,6 +763,13 @@ 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();
 }
 
@@ -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