summaryrefslogtreecommitdiff
path: root/src/Fl_Scrollbar.cxx
diff options
context:
space:
mode:
authorBill Spitzak <spitzak@gmail.com>2000-01-20 06:14:34 +0000
committerBill Spitzak <spitzak@gmail.com>2000-01-20 06:14:34 +0000
commitfafc3286cd4810ba6889891deea546004e58e212 (patch)
treeee53a3cdd81dfffebf1b9016685f00a2841157ac /src/Fl_Scrollbar.cxx
parentecc91867b307b1280e0a1cb1beb3fd8d2ebdc4b4 (diff)
Pageup/down by correct amount in scrollbar
Handles minimum size of slider in scrollbar when deciding whether to page up/dwon. Code from Matt Morrise so that shift+click extends the selection in the browser (ctrl+click remains for toggling the current item). git-svn-id: file:///fltk/svn/fltk/branches/branch-1.0@990 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_Scrollbar.cxx')
-rw-r--r--src/Fl_Scrollbar.cxx94
1 files changed, 42 insertions, 52 deletions
diff --git a/src/Fl_Scrollbar.cxx b/src/Fl_Scrollbar.cxx
index 464266a17..4f05ef761 100644
--- a/src/Fl_Scrollbar.cxx
+++ b/src/Fl_Scrollbar.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Scrollbar.cxx,v 1.7.2.6 2000/01/17 20:40:12 bill Exp $"
+// "$Id: Fl_Scrollbar.cxx,v 1.7.2.7 2000/01/20 06:14:32 bill Exp $"
//
// Scroll bar widget for the Fast Light Tool Kit (FLTK).
//
@@ -32,17 +32,22 @@
#define REPEAT .05
void Fl_Scrollbar::increment_cb() {
+ int ls = maximum()>=minimum() ? linesize_ : -linesize_;
int i;
- int W = horizontal() ? w() : h();
- int S = int(slider_size()*W+.5);
-
switch (pushed_) {
- case 1: i = -linesize_; break;
- default:i = linesize_; break;
- case 5: i = -int(S * (maximum() - minimum()) / W); break;
- case 6: i = int(S * (maximum() - minimum()) / W); break;
+ case 1:
+ i = -ls;
+ break;
+ default:
+ i = ls;
+ break;
+ case 5:
+ i = -int((maximum()-minimum())*slider_size()/(1.0-slider_size())) + ls;
+ break;
+ case 6:
+ i = int((maximum()-minimum())*slider_size()/(1.0-slider_size())) - ls;
+ break;
}
- if (maximum() < minimum() && pushed_ < 3) i = -i;
handle_drag(clamp(value() + i));
}
@@ -56,7 +61,6 @@ int Fl_Scrollbar::handle(int event) {
// area of scrollbar:
int area;
int X=x(); int Y=y(); int W=w(); int H=h();
- int SX = X; int SY = Y; int SW = W; int SH = H;
// adjust slider area to be inside the arrow buttons:
if (horizontal()) {
@@ -66,49 +70,35 @@ int Fl_Scrollbar::handle(int event) {
}
// which widget part is highlighted?
- int mx = Fl::event_x();
- int my = Fl::event_y();
- if (!Fl::event_inside(SX, SY, SW, SH)) area = 0;
- else if (horizontal()) {
- if (mx < X) area = 1;
- else if (mx >= X+W) area = 2;
- else {
- int sliderx;
- int S = int(slider_size()*W+.5);
- double val;
- if (minimum() == maximum())
- val = 0.5;
- else
- val = (value()-minimum())/(maximum()-minimum());
- if (val >= 1.0) sliderx = W-S;
- else if (val <= 0.0) sliderx = 0;
- else sliderx = int(val*(W-S)+.5);
-
- if (mx < X+sliderx) area = 5;
- else if (mx >= X+sliderx+S) area = 6;
- else area = 8;
- }
+ int relx;
+ int ww;
+ if (horizontal()) {
+ relx = Fl::event_x()-X;
+ ww = W;
} else {
- if (mx < X || mx >= X+W) area = 0;
- else if (my < Y) area = 1;
- else if (my >= Y+H) area = 2;
- else {
- int slidery;
- int S = int(slider_size()*H+.5);
- double val;
- if (minimum() == maximum())
- val = 0.5;
- else
- val = (value()-minimum())/(maximum()-minimum());
- if (val >= 1.0) slidery = H-S;
- else if (val <= 0.0) slidery = 0;
- else slidery = int(val*(H-S)+.5);
-
- if (my < Y+slidery) area = 5;
- else if (my >= Y+slidery+S) area = 6;
- else area = 8;
- }
+ relx = Fl::event_y()-Y;
+ ww = H;
}
+ if (relx < 0) area = 1;
+ else if (relx >= ww) area = 2;
+ else {
+ int S = int(slider_size()*ww+.5);
+ int T = (horizontal() ? H : W)/2+1;
+ if (S < T) S = T;
+ double val;
+ if (minimum() == maximum())
+ val = 0.5;
+ else
+ val = (value()-minimum())/(maximum()-minimum());
+ int sliderx;
+ if (val >= 1.0) sliderx = ww-S;
+ else if (val <= 0.0) sliderx = 0;
+ else sliderx = int(val*(ww-S)+.5);
+ if (relx < sliderx) area = 5;
+ else if (relx >= sliderx+S) area = 6;
+ else area = 8;
+ }
+
switch (event) {
case FL_ENTER:
case FL_LEAVE:
@@ -249,5 +239,5 @@ Fl_Scrollbar::Fl_Scrollbar(int X, int Y, int W, int H, const char* L)
}
//
-// End of "$Id: Fl_Scrollbar.cxx,v 1.7.2.6 2000/01/17 20:40:12 bill Exp $".
+// End of "$Id: Fl_Scrollbar.cxx,v 1.7.2.7 2000/01/20 06:14:32 bill Exp $".
//