diff options
| author | Albrecht Schlosser <albrechts.fltk@online.de> | 2020-11-22 19:19:19 +0100 |
|---|---|---|
| committer | Albrecht Schlosser <albrechts.fltk@online.de> | 2022-11-22 19:32:54 +0100 |
| commit | ecc47d0cc3e1784e17ac94829202f2bdbd38a682 (patch) | |
| tree | 2519c9b11a598ed4ad1faf9d07c205da5c4903c7 /src/Fl_Scrollbar.cxx | |
| parent | 4daec2a9408c674f8d62f8770ec8c035c25f2294 (diff) | |
Refactor and simplify "arrow drawing" in widgets
"Arrows" in widgets are those GUI elements mostly represented by
triangles pointing in a particular direction as in scrollbars,
choice widgets, some menus, valuators and Fl_Counter widgets.
The code has been simplified and standardized such that all these
GUI elements are drawn identically per FLTK scheme.
Widget authors no longer need to write code to calculate arrow sizes
and draw polygons etc.
Different schemes can and do implement different drawing functions.
Todo: see comments "FIXME_ARROW" in src/Fl_Menu_Button.cxx and
src/Fl_Menu.cxx
Diffstat (limited to 'src/Fl_Scrollbar.cxx')
| -rw-r--r-- | src/Fl_Scrollbar.cxx | 83 |
1 files changed, 39 insertions, 44 deletions
diff --git a/src/Fl_Scrollbar.cxx b/src/Fl_Scrollbar.cxx index 64071dbe2..d8d42ce80 100644 --- a/src/Fl_Scrollbar.cxx +++ b/src/Fl_Scrollbar.cxx @@ -1,7 +1,7 @@ // // Scroll bar widget for the Fast Light Tool Kit (FLTK). // -// Copyright 1998-2015 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 @@ -196,61 +196,56 @@ int Fl_Scrollbar::handle(int event) { } void Fl_Scrollbar::draw() { - if (damage()&FL_DAMAGE_ALL) draw_box(); - int X = x()+Fl::box_dx(box()); - int Y = y()+Fl::box_dy(box()); - int W = w()-Fl::box_dw(box()); - int H = h()-Fl::box_dh(box()); + if (damage() & FL_DAMAGE_ALL) draw_box(); + int X = x() + Fl::box_dx(box()); + int Y = y() + Fl::box_dy(box()); + int W = w() - Fl::box_dw(box()); + int H = h() - Fl::box_dh(box()); + Fl_Rect ab; // arrow box + + int inset = 3; + if (W < 8 || H < 8) + inset = 2; + if (horizontal()) { - if (W < 3*H) {Fl_Slider::draw(X,Y,W,H); return;} - Fl_Slider::draw(X+H,Y,W-2*H,H); + if (W < 3*H) { + Fl_Slider::draw(X, Y, W, H); + return; + } + Fl_Slider::draw(X+H, Y, W-2*H, H); if (damage()&FL_DAMAGE_ALL) { draw_box((pushed_==1) ? fl_down(slider()) : slider(), X, Y, H, H, selection_color()); draw_box((pushed_==2) ? fl_down(slider()) : slider(), X+W-H, Y, H, H, selection_color()); - if (active_r()) - fl_color(labelcolor()); - else - fl_color(fl_inactive(labelcolor())); - int w1 = (H-4)/3; if (w1 < 1) w1 = 1; - int x1 = X+(H-w1-1)/2; - int yy1 = Y+(H-2*w1-1)/2; - if (Fl::is_scheme("gtk+")) { - fl_polygon(x1, yy1+w1, x1+w1, yy1+2*w1, x1+w1-1, yy1+w1, x1+w1, yy1); - x1 += (W-H); - fl_polygon(x1, yy1, x1+1, yy1+w1, x1, yy1+2*w1, x1+w1, yy1+w1); - } else { - fl_polygon(x1, yy1+w1, x1+w1, yy1+2*w1, x1+w1, yy1); - x1 += (W-H); - fl_polygon(x1, yy1, x1, yy1+2*w1, x1+w1, yy1+w1); - } + + Fl_Color arrowcolor = active_r() ? labelcolor() : fl_inactive(labelcolor()); + ab = Fl_Rect(X, Y, H, H); + ab.inset(inset); + fl_draw_arrow(ab, FL_ARROW_SINGLE, FL_ORIENT_LEFT, arrowcolor); // left arrow + ab = Fl_Rect(X+W-H, Y, H, H); + ab.inset(inset); + fl_draw_arrow(ab, FL_ARROW_SINGLE, FL_ORIENT_RIGHT, arrowcolor); // right arrow } } else { // vertical - if (H < 3*W) {Fl_Slider::draw(X,Y,W,H); return;} - Fl_Slider::draw(X,Y+W,W,H-2*W); - if (damage()&FL_DAMAGE_ALL) { + if (H < 3*W) { + Fl_Slider::draw(X, Y, W, H); + return; + } + Fl_Slider::draw(X, Y+W, W, H-2*W); + if (damage() & FL_DAMAGE_ALL) { draw_box((pushed_==1) ? fl_down(slider()) : slider(), X, Y, W, W, selection_color()); draw_box((pushed_==2) ? fl_down(slider()) : slider(), X, Y+H-W, W, W, selection_color()); - if (active_r()) - fl_color(labelcolor()); - else - fl_color(fl_inactive(labelcolor())); - int w1 = (W-4)/3; if (w1 < 1) w1 = 1; - int x1 = X+(W-2*w1-1)/2; - int yy1 = Y+(W-w1-1)/2; - if (Fl::is_scheme("gtk+")) { - fl_polygon(x1, yy1+w1, x1+w1, yy1+w1-1, x1+2*w1, yy1+w1, x1+w1, yy1); - yy1 += H-W; - fl_polygon(x1, yy1, x1+w1, yy1+1, x1+w1, yy1+w1); - fl_polygon(x1+w1, yy1+1, x1+2*w1, yy1, x1+w1, yy1+w1); - } else { - fl_polygon(x1, yy1+w1, x1+2*w1, yy1+w1, x1+w1, yy1); - yy1 += H-W; - fl_polygon(x1, yy1, x1+w1, yy1+w1, x1+2*w1, yy1); - } + + Fl_Color arrowcolor = active_r() ? labelcolor() : fl_inactive(labelcolor()); + ab = Fl_Rect(X, Y, W, W); + ab.inset(inset); + fl_draw_arrow(ab, FL_ARROW_SINGLE, FL_ORIENT_UP, arrowcolor); // up arrow + ab = Fl_Rect(X, Y+H-W, W, W); + ab.inset(inset); + fl_draw_arrow(ab, FL_ARROW_SINGLE, FL_ORIENT_DOWN, arrowcolor); // down arrow } } } |
