From 191aeefc4a4161cb132065625a5e5eacb567688a Mon Sep 17 00:00:00 2001 From: Albrecht Schlosser Date: Sat, 26 Nov 2022 19:54:48 +0100 Subject: [PATCH] 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) --- FL/Fl_Value_Slider.H | 109 ++++++++++++++++++++++++++++++++-------- src/Fl_Value_Slider.cxx | 30 ++++++----- 2 files changed, 106 insertions(+), 33 deletions(-) diff --git a/FL/Fl_Value_Slider.H b/FL/Fl_Value_Slider.H index 53d264de7..e49b046a1 100644 --- a/FL/Fl_Value_Slider.H +++ b/FL/Fl_Value_Slider.H @@ -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 diff --git a/src/Fl_Value_Slider.cxx b/src/Fl_Value_Slider.cxx index 8406519dc..918d07742 100644 --- a/src/Fl_Value_Slider.cxx +++ b/src/Fl_Value_Slider.cxx @@ -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())); }