summaryrefslogtreecommitdiff
path: root/gtk2_ardour/meterbridge.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2013-07-29 15:26:36 +0200
committerRobin Gareus <robin@gareus.org>2013-07-29 15:26:36 +0200
commit3ab25dc6f37a0a5b07502d1e891dcec9e99dcd02 (patch)
treee0712ac77385db1c1e97b145f805eda63c384a16 /gtk2_ardour/meterbridge.cc
parent2faaf71573b977a8aabb3c6fdfd914647ccf1829 (diff)
change metric-scale on the sides of meterbridge when scrolling
Diffstat (limited to 'gtk2_ardour/meterbridge.cc')
-rw-r--r--gtk2_ardour/meterbridge.cc46
1 files changed, 46 insertions, 0 deletions
diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc
index c8566adb64..0183c0f4d2 100644
--- a/gtk2_ardour/meterbridge.cc
+++ b/gtk2_ardour/meterbridge.cc
@@ -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);
@@ -390,6 +394,41 @@ Meterbridge::on_size_allocate (Gtk::Allocation& 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)
{
SessionHandlePtr::set_session (s);
@@ -722,6 +761,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();
}