summaryrefslogtreecommitdiff
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
parent2faaf71573b977a8aabb3c6fdfd914647ccf1829 (diff)
change metric-scale on the sides of meterbridge when scrolling
-rw-r--r--gtk2_ardour/meter_strip.cc5
-rw-r--r--gtk2_ardour/meter_strip.h2
-rw-r--r--gtk2_ardour/meterbridge.cc46
-rw-r--r--gtk2_ardour/meterbridge.h6
4 files changed, 59 insertions, 0 deletions
diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc
index 1f22222293..87fbb62406 100644
--- a/gtk2_ardour/meter_strip.cc
+++ b/gtk2_ardour/meter_strip.cc
@@ -474,7 +474,12 @@ MeterStrip::meter_metrics_expose (GdkEventExpose *ev)
void
MeterStrip::set_metric_mode (int metricmode, ARDOUR::MeterType mt)
{
+ if (metric_type == mt && _metricmode == metricmode) {
+ return;
+ }
metric_type = mt;
+ _metricmode = metricmode;
+
_types.clear ();
switch(metricmode) {
case 0:
diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h
index 2a45933f9e..896725656b 100644
--- a/gtk2_ardour/meter_strip.h
+++ b/gtk2_ardour/meter_strip.h
@@ -65,6 +65,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI
void set_meter_type_multi (int, ARDOUR::RouteGroup*, ARDOUR::MeterType);
void set_metric_mode (int, ARDOUR::MeterType);
+ int get_metric_mode() { return _metricmode; }
void set_tick_bar (int);
int get_tick_bar() { return _tick_bar; }
bool has_midi() { return _has_midi; }
@@ -121,6 +122,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI
bool _has_midi;
int _tick_bar;
int _strip_type;
+ int _metricmode;
LevelMeterHBox *level_meter;
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();
}
diff --git a/gtk2_ardour/meterbridge.h b/gtk2_ardour/meterbridge.h
index cca31d370c..2fac91cd0a 100644
--- a/gtk2_ardour/meterbridge.h
+++ b/gtk2_ardour/meterbridge.h
@@ -147,6 +147,12 @@ class Meterbridge :
void parameter_changed (std::string const & p);
void on_theme_changed ();
+
+ void on_scroll ();
+ sigc::connection scroll_connection;
+
+ int _mm_left, _mm_right;
+ ARDOUR::MeterType _mt_left, _mt_right;
};
#endif