Make the value box size of Fl_Value_Slider user settable (STR 3222)

For a very simple test program see STR 3222, File 2:
https://www.fltk.org/strfiles/3222/value_slider.cxx

Known issues:
 - range checking of the value box size is very limited
 - resizing the widget does not change the value box size
 - drawing issues are possible if the value box size and the widget
   size are not compatible (e.g. value box too large)
This commit is contained in:
Albrecht Schlosser 2022-11-26 19:54:48 +01:00
parent e1a781717e
commit 191aeefc4a
2 changed files with 106 additions and 33 deletions

View File

@ -1,5 +1,5 @@
//
// Value slider header file for the Fast Light Tool Kit (FLTK).
// Value Slider header file for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2022 by Bill Spitzak and others.
//
@ -25,30 +25,97 @@
/**
The Fl_Value_Slider widget is a Fl_Slider widget
with a box displaying the current value.
\image html value_slider.png
\image latex value_slider.png "Fl_Value_Slider" width=4cm
\image html value_slider.png
\image latex value_slider.png "Fl_Value_Slider" width=4cm
*/
class FL_EXPORT Fl_Value_Slider : public Fl_Slider {
Fl_Font textfont_;
Fl_Fontsize textsize_;
Fl_Color textcolor_;
Fl_Font textfont_;
Fl_Fontsize textsize_;
Fl_Color textcolor_;
short value_width_;
short value_height_;
protected:
void draw();
void draw();
public:
int handle(int);
Fl_Value_Slider(int x,int y,int w,int h, const char *l = 0);
/** Gets the typeface of the text in the value box. */
Fl_Font textfont() const {return textfont_;}
/** Sets the typeface of the text in the value box. */
void textfont(Fl_Font s) {textfont_ = s;}
/** Gets the size of the text in the value box. */
Fl_Fontsize textsize() const {return textsize_;}
/** Sets the size of the text in the value box. */
void textsize(Fl_Fontsize s) {textsize_ = s;}
/** Gets the color of the text in the value box. */
Fl_Color textcolor() const {return textcolor_;}
/** Sets the color of the text in the value box. */
void textcolor(Fl_Color s) {textcolor_ = s;}
int handle(int);
Fl_Value_Slider(int x, int y, int w, int h, const char *l = 0);
/** Gets the typeface of the text in the value box. */
Fl_Font textfont() const { return textfont_; }
/** Sets the typeface of the text in the value box. */
void textfont(Fl_Font s) { textfont_ = s; }
/** Gets the size of the text in the value box. */
Fl_Fontsize textsize() const { return textsize_; }
/** Sets the size of the text in the value box. */
void textsize(Fl_Fontsize s) { textsize_ = s; }
/** Gets the color of the text in the value box. */
Fl_Color textcolor() const { return textcolor_; }
/** Sets the color of the text in the value box. */
void textcolor(Fl_Color s) { textcolor_ = s; }
/** Sets the width of the value box in pixels (horizontal mode only).
Limited range checking is applied but drawing errors may occur if
the size \p s is set too high or too low, particularly if the widget
is resized (later).
The programmer is responsible for setting sensible values and
widget sizes.
The default value set by the constructor is 35.
\param[in] s new width of the value box
\since 1.4.0
*/
void value_width(int s) {
if (s > w() - 10)
s = w() - 10;
if (s < 10)
s = 10;
value_width_ = (short)s;
}
/** Gets the width of the value box in pixels (horizontal mode only).
\since 1.4.0
*/
int value_width() const { return (value_width_); }
/** Sets the height of the value box in pixels (vertical mode only).
Limited range checking is applied but drawing errors may occur if
the size \p s is set too high or too low, particularly if the widget
is resized (later).
The programmer is responsible for setting sensible values and
widget sizes.
The default value set by the constructor is 25.
\param[in] s new height of the value box
\since 1.4.0
*/
void value_height(int s) {
if (s > h() - 10)
s = h() - 10;
if (s < 10)
s = 10;
value_height_ = (short)s;
}
/** Gets the height of the value box in pixels (vertical mode only).
\since 1.4.0
*/
int value_height() const { return (value_height_); }
};
#endif

View File

@ -1,7 +1,7 @@
//
// Value slider widget for the Fast Light Tool Kit (FLTK).
// Value Slider widget for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2010 by Bill Spitzak and others.
// Copyright 1998-2022 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@ -30,17 +30,24 @@ Fl_Value_Slider::Fl_Value_Slider(int X, int Y, int W, int H, const char*l)
textfont_ = FL_HELVETICA;
textsize_ = 10;
textcolor_ = FL_FOREGROUND_COLOR;
value_width_ = 35;
value_height_ = 25;
}
void Fl_Value_Slider::draw() {
int sxx = x(), syy = y(), sww = w(), shh = h();
int bxx = x(), byy = y(), bww = w(), bhh = h();
if (horizontal()) {
bww = 35; sxx += 35; sww -= 35;
bww = value_width();
sxx += value_width();
sww -= value_width();
} else {
syy += 25; bhh = 25; shh -= 25;
syy += value_height();
bhh = value_height();
shh -= value_height();
}
if (damage()&FL_DAMAGE_ALL) draw_box(box(),sxx,syy,sww,shh,color());
if (damage() & FL_DAMAGE_ALL)
draw_box(box(), sxx, syy, sww, shh, color());
Fl_Slider::draw(sxx+Fl::box_dx(box()),
syy+Fl::box_dy(box()),
sww-Fl::box_dw(box()),
@ -60,15 +67,14 @@ int Fl_Value_Slider::handle(int event) {
}
int sxx = x(), syy = y(), sww = w(), shh = h();
if (horizontal()) {
sxx += 35; sww -= 35;
sxx += value_width();
sww -= value_width();
} else {
syy += 25; shh -= 25;
syy += value_height();
shh -= value_height();
}
return Fl_Slider::handle(event,
sxx+Fl::box_dx(box()),
syy+Fl::box_dy(box()),
sww-Fl::box_dw(box()),
shh-Fl::box_dh(box()));
return Fl_Slider::handle(event, sxx + Fl::box_dx(box()), syy + Fl::box_dy(box()),
sww - Fl::box_dw(box()), shh - Fl::box_dh(box()));
}