Change arrow keys in log slider to even increments. #1232

This commit is contained in:
Matthias Melcher 2025-12-06 00:16:00 +01:00
parent 87160b6eb9
commit b2746ad286
2 changed files with 19 additions and 4 deletions

View File

@ -102,6 +102,7 @@ protected:
void draw_ticks(const Fl_Rect& r, int S);
double value_to_position(double val) const;
double position_to_value(double pos) const;
double increment_lin_log(double v, int n, int range);
public:

View File

@ -247,6 +247,20 @@ void Fl_Slider::draw_ticks(const Fl_Rect& r, int /*S*/ /*, int min_spacing*/)
}
}
/**
Adds a sensible step value to the passed value.
The step size is not useful in logarithmic scales.
*/
double Fl_Slider::increment_lin_log(double v, int n, int range) {
if (scale() == Scale_Type::LOG_SCALE) {
double pos = value_to_position(v);
pos = pos + (n*4/(double)range);
return position_to_value(pos);
} else {
return increment(v, n);
}
}
int Fl_Slider::handle(int event, int X, int Y, int W, int H) {
// Fl_Widget_Tracker wp(this);
@ -330,7 +344,7 @@ int Fl_Slider::handle(int event, int X, int Y, int W, int H) {
if (horizontal()) return 0;
handle_push();
if (wp.deleted()) return 1;
handle_drag(clamp(increment(value(),-1)));
handle_drag(clamp(increment_lin_log(value(), -1, H)));
if (wp.deleted()) return 1;
handle_release();
return 1;
@ -338,7 +352,7 @@ int Fl_Slider::handle(int event, int X, int Y, int W, int H) {
if (horizontal()) return 0;
handle_push();
if (wp.deleted()) return 1;
handle_drag(clamp(increment(value(),1)));
handle_drag(clamp(increment_lin_log(value(), 1, H)));
if (wp.deleted()) return 1;
handle_release();
return 1;
@ -346,7 +360,7 @@ int Fl_Slider::handle(int event, int X, int Y, int W, int H) {
if (!horizontal()) return 0;
handle_push();
if (wp.deleted()) return 1;
handle_drag(clamp(increment(value(),-1)));
handle_drag(clamp(increment_lin_log(value(), -1, W)));
if (wp.deleted()) return 1;
handle_release();
return 1;
@ -354,7 +368,7 @@ int Fl_Slider::handle(int event, int X, int Y, int W, int H) {
if (!horizontal()) return 0;
handle_push();
if (wp.deleted()) return 1;
handle_drag(clamp(increment(value(),1)));
handle_drag(clamp(increment_lin_log(value(), 1, W)));
if (wp.deleted()) return 1;
handle_release();
return 1;