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.
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.
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.
{ -12.0, 0.5 },
// -12 to -21 is half the range (9 dB). Halve.
{ -12.0, 0.5 },
// -12 to -21 is half the range (9 dB). Halve.
// -21 to -30 (9 dB) gets the same range as the previous one.
// -21 to -30 (9 dB) gets the same range as the previous one.
// -30 to -48 (18 dB) gets half of half.
// -30 to -48 (18 dB) gets half of half.
// -48 to -84 (36 dB) gets half of half of half.
// -48 to -84 (36 dB) gets half of half of half.
};
double slider_fraction_to_db(double db)
{
};
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;
}
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) {
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);
if (db >= x0 && db <= x1) {
const double t = (db - x0) / (x1 - x0);
return y0 + t * (y1 - y0);
// 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();
// 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;
QSlider::paintEvent(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);
void NonLinearFader::sliderChange(SliderChange change)
{
QSlider::sliderChange(change);
if (value() == 0) {
db_value = -HUGE_VAL;
} else {
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);
db_value = slider_fraction_to_db(frac);
}
emit dbValueChanged(db_value);
void NonLinearFader::update_slider_position()
{
inhibit_updates = true;
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;
}
inhibit_updates = false;
}
protected:
void paintEvent(QPaintEvent *event) override;
protected:
void paintEvent(QPaintEvent *event) override;
- void resizeEvent(QResizeEvent *event) override;
void sliderChange(SliderChange change) override;
private:
void sliderChange(SliderChange change) override;
private:
<layout class="QHBoxLayout" name="fader_centerer">
<item>
<widget class="NonLinearFader" name="fader">
<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>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<item>
<widget class="NonLinearFader" name="fader">
<property name="minimum">
<item>
<widget class="NonLinearFader" name="fader">
<property name="minimum">
</property>
<property name="maximum">
</property>
<property name="maximum">
- <property name="pageStep">
+ <property name="singleStep">
<number>10</number>
</property>
<number>10</number>
</property>
+ <property name="pageStep">
+ <number>100</number>
+ </property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>