]> git.sesse.net Git - nageru/commitdiff
Make NonlinearFader work with fixed 0..1000 range, not 0..height().
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 6 Oct 2016 18:14:30 +0000 (20:14 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 19 Oct 2016 22:55:44 +0000 (00:55 +0200)
In particular, this fixes an issue where the range could be wrong
just after the widget is created, but the page it is not is not shown
yet (so there hasn't been a resize event yet).

Also makes for more consistent scroll wheel and arrow key behavior,
as it is not longer dependent on widget size.

nonlinear_fader.cpp
nonlinear_fader.h
ui_audio_expanded_view.ui
ui_audio_miniview.ui

index 7c26434aac743faeda9e29434758a78543e68b13..b548c29493206bc6f5a3569ffc657f55f4178550 100644 (file)
@@ -17,35 +17,35 @@ namespace {
 
 vector<pair<double, double>> fader_control_points = {
        // The main area is from +6 to -12 dB (18 dB), and we use half the slider range for it.
-       { 6.0, 0.0 },
+       { 6.0, 1.0 },
        { -12.0, 0.5 },
 
        // -12 to -21 is half the range (9 dB). Halve.
-       { -21.0, 0.625 },
+       { -21.0, 0.325 },
 
        // -21 to -30 (9 dB) gets the same range as the previous one.
-       { -30.0, 0.75 },
+       { -30.0, 0.25 },
 
        // -30 to -48 (18 dB) gets half of half.
-       { -48.0, 0.875 },
+       { -48.0, 0.125 },
 
        // -48 to -84 (36 dB) gets half of half of half.
-       { -84.0, 1.0 },
+       { -84.0, 0.0 },
 };
 
 double slider_fraction_to_db(double db)
 {
-       if (db <= fader_control_points[0].second) {
+       if (db >= fader_control_points[0].second) {
                return fader_control_points[0].first;
        }
-       if (db >= fader_control_points.back().second) {
+       if (db <= fader_control_points.back().second) {
                return fader_control_points.back().first;
        }
        for (unsigned i = 1; i < fader_control_points.size(); ++i) {
-               const double x0 = fader_control_points[i - 1].second;
-               const double x1 = fader_control_points[i].second;
-               const double y0 = fader_control_points[i - 1].first;
-               const double y1 = fader_control_points[i].first;
+               const double x0 = fader_control_points[i].second;
+               const double x1 = fader_control_points[i - 1].second;
+               const double y0 = fader_control_points[i].first;
+               const double y1 = fader_control_points[i - 1].first;
                if (db >= x0 && db <= x1) {
                        const double t = (db - x0) / (x1 - x0);
                        return y0 + t * (y1 - y0);
@@ -100,8 +100,8 @@ void NonLinearFader::paintEvent(QPaintEvent *event)
        // FIXME: Where does the slider_length / 2 come from? I can't really find it
        // in the Qt code, but it seems to match up with reality.
        int slider_length = sr.height();
-       int slider_min = gr.top() + (slider_length / 2);
-       int slider_max = gr.bottom() + (slider_length / 2) - slider_length + 1;
+       int slider_max = gr.top() + (slider_length / 2);
+       int slider_min = gr.bottom() + (slider_length / 2) - slider_length + 1;
 
        QPainter p(this);
 
@@ -119,15 +119,6 @@ void NonLinearFader::paintEvent(QPaintEvent *event)
        QSlider::paintEvent(event);
 }
 
-void NonLinearFader::resizeEvent(QResizeEvent *event)
-{
-       QSlider::resizeEvent(event);
-       inhibit_updates = true;
-       setRange(0, event->size().height() - 1);
-       inhibit_updates = false;
-       update_slider_position();
-}
-
 void NonLinearFader::sliderChange(SliderChange change)
 {
        QSlider::sliderChange(change);
@@ -135,7 +126,7 @@ void NonLinearFader::sliderChange(SliderChange change)
                if (value() == 0) {
                        db_value = -HUGE_VAL;
                } else {
-                       double frac = 1.0 - value() / (height() - 1.0);
+                       double frac = double(value() - minimum()) / (maximum() - minimum());
                        db_value = slider_fraction_to_db(frac);
                }
                emit dbValueChanged(db_value);
@@ -145,6 +136,7 @@ void NonLinearFader::sliderChange(SliderChange change)
 void NonLinearFader::update_slider_position()
 {
        inhibit_updates = true;
-       setValue(lrint((1.0 - db_to_slider_fraction(db_value)) * (height() - 1.0)));
+       double val = db_to_slider_fraction(db_value) * (maximum() - minimum()) + minimum();
+       setValue(lrint(val));
        inhibit_updates = false;
 }
index 4126fbd5bd1e6963908b8d885272ceeb955d1ee3..cd844be2ef9d3386789b9f674ed242772657d3c4 100644 (file)
@@ -15,7 +15,6 @@ signals:
 
 protected:
        void paintEvent(QPaintEvent *event) override;
-       void resizeEvent(QResizeEvent *event) override;
        void sliderChange(SliderChange change) override;
 
 private:
index 8e431b47d6b09f5bf89d3aa512c901b0f143266d..489e4b20c4e090415c600d76767a33a5ced2bcb3 100644 (file)
         <layout class="QHBoxLayout" name="fader_centerer">
          <item>
           <widget class="NonLinearFader" name="fader">
+           <property name="maximum">
+            <number>1000</number>
+           </property>
+           <property name="singleStep">
+            <number>10</number>
+           </property>
+           <property name="pageStep">
+            <number>100</number>
+           </property>
            <property name="orientation">
             <enum>Qt::Vertical</enum>
            </property>
index 0761931d29202cc2dddf87db6c608e4ddf0d9572..7aa1aa0f346c90a02a70b0d3599fc18559f20c6f 100644 (file)
                 <item>
                  <widget class="NonLinearFader" name="fader">
                   <property name="minimum">
-                   <number>-390</number>
+                   <number>0</number>
                   </property>
                   <property name="maximum">
-                   <number>60</number>
+                   <number>1000</number>
                   </property>
-                  <property name="pageStep">
+                  <property name="singleStep">
                    <number>10</number>
                   </property>
+                  <property name="pageStep">
+                   <number>100</number>
+                  </property>
                   <property name="orientation">
                    <enum>Qt::Vertical</enum>
                   </property>