summaryrefslogtreecommitdiff
path: root/src/Fl_Scroll.cxx
diff options
context:
space:
mode:
authorBill Spitzak <spitzak@gmail.com>2000-08-12 08:42:12 +0000
committerBill Spitzak <spitzak@gmail.com>2000-08-12 08:42:12 +0000
commitfb06bd8019a0bb1d8288f42b0b68d4e5a1348f54 (patch)
tree5091f1623bf2763193358f70e02d3cf6c587ff13 /src/Fl_Scroll.cxx
parent797d78d86c4ce3bc830b5fcd30ac5a6c73d0ee42 (diff)
Patch from Mike Lindner to make the turning on/off of scrollbars on
Fl_Scroll smarter. It appears to work with my own tests. He did not handle FL_ALIGN_TOP correctly, fixed that. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.0@1285 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_Scroll.cxx')
-rw-r--r--src/Fl_Scroll.cxx82
1 files changed, 50 insertions, 32 deletions
diff --git a/src/Fl_Scroll.cxx b/src/Fl_Scroll.cxx
index 35d28c0f8..5378bf3dd 100644
--- a/src/Fl_Scroll.cxx
+++ b/src/Fl_Scroll.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Scroll.cxx,v 1.7.2.3 2000/06/05 21:20:56 mike Exp $"
+// "$Id: Fl_Scroll.cxx,v 1.7.2.4 2000/08/12 08:42:12 spitzak Exp $"
//
// Scroll widget for the Fast Light Tool Kit (FLTK).
//
@@ -116,40 +116,58 @@ void Fl_Scroll::draw() {
}
// turn the scrollbars on and off as necessary:
- for (int z = 0; z<2; z++) {
- if ((type()&VERTICAL) && (type()&ALWAYS_ON || t < Y || b > Y+H)) {
- if (!scrollbar.visible()) {
- scrollbar.set_visible();
- W -= scrollbar.w();
- d = FL_DAMAGE_ALL;
- }
- } else {
- if (scrollbar.visible()) {
- scrollbar.clear_visible();
- draw_clip(this,
- scrollbar.align()&FL_ALIGN_LEFT ? X-scrollbar.w() : X+W,
- Y, scrollbar.w(), H);
- W += scrollbar.w();
- d = FL_DAMAGE_ALL;
- }
+ // See if children would fit if we had no scrollbars...
+ X = x()+Fl::box_dx(box());
+ Y = y()+Fl::box_dy(box());
+ W = w()-Fl::box_dw(box());
+ H = h()-Fl::box_dh(box());
+ int vneeded = 0;
+ int hneeded = 0;
+ if (type() & VERTICAL) {
+ if ((type() & ALWAYS_ON) || t < Y || b > Y+H) {
+ vneeded = 1;
+ W -= scrollbar.w();
+ if (scrollbar.align() & FL_ALIGN_LEFT) X += scrollbar.w();
}
- if ((type()&HORIZONTAL) && (type()&ALWAYS_ON || l < X || r > X+W)) {
- if (!hscrollbar.visible()) {
- hscrollbar.set_visible();
- H -= hscrollbar.h();
- d = FL_DAMAGE_ALL;
- }
- } else {
- if (hscrollbar.visible()) {
- hscrollbar.clear_visible();
- draw_clip(this, X,
- scrollbar.align()&FL_ALIGN_TOP ? Y-hscrollbar.h() : Y+H,
- W, hscrollbar.h());
- H += hscrollbar.h();
- d = FL_DAMAGE_ALL;
+ }
+ if (type() & HORIZONTAL) {
+ if ((type() & ALWAYS_ON) || l < X || r > X+W) {
+ hneeded = 1;
+ H -= hscrollbar.h();
+ if (scrollbar.align() & FL_ALIGN_TOP) Y += hscrollbar.h();
+ // recheck vertical since we added a horizontal scrollbar
+ if (!vneeded && (type() & VERTICAL)) {
+ if ((type() & ALWAYS_ON) || t < Y || b > Y+H) {
+ vneeded = 1;
+ W -= scrollbar.w();
+ if (scrollbar.align() & FL_ALIGN_LEFT) X += scrollbar.w();
+ }
}
}
}
+ // Now that we know what's needed, make it so.
+ if (vneeded && !scrollbar.visible()) {
+ scrollbar.set_visible();
+ d = FL_DAMAGE_ALL;
+ }
+ else if (!vneeded && scrollbar.visible()) {
+ scrollbar.clear_visible();
+ draw_clip(this,
+ scrollbar.align()&FL_ALIGN_LEFT ? X : X+W-scrollbar.w(),
+ Y, scrollbar.w(), H);
+ d = FL_DAMAGE_ALL;
+ }
+ if (hneeded && !hscrollbar.visible()) {
+ hscrollbar.set_visible();
+ d = FL_DAMAGE_ALL;
+ }
+ else if (!hneeded && hscrollbar.visible()) {
+ hscrollbar.clear_visible();
+ draw_clip(this,
+ X, scrollbar.align()&FL_ALIGN_TOP ? Y : Y+H-hscrollbar.h(),
+ W, hscrollbar.h());
+ d = FL_DAMAGE_ALL;
+ }
scrollbar.resize(scrollbar.align()&FL_ALIGN_LEFT ? X-scrollbar.w() : X+W,
Y, scrollbar.w(), H);
@@ -231,5 +249,5 @@ int Fl_Scroll::handle(int event) {
}
//
-// End of "$Id: Fl_Scroll.cxx,v 1.7.2.3 2000/06/05 21:20:56 mike Exp $".
+// End of "$Id: Fl_Scroll.cxx,v 1.7.2.4 2000/08/12 08:42:12 spitzak Exp $".
//