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
This commit is contained in:
Bill Spitzak 2000-01-20 06:14:34 +00:00
parent ecc91867b3
commit fafc3286cd
3 changed files with 77 additions and 62 deletions

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl_Browser_.cxx,v 1.10.2.7 1999/12/19 05:32:33 bill Exp $"
// "$Id: Fl_Browser_.cxx,v 1.10.2.8 2000/01/20 06:14:31 bill Exp $"
//
// Base Browser widget class for the Fast Light Tool Kit (FLTK).
//
@ -547,24 +547,48 @@ int Fl_Browser_::handle(int event) {
switch (event) {
case FL_PUSH:
if (!Fl::event_inside(X, Y, W, H)) return 0;
if (type() == FL_SELECT_BROWSER) deselect();
my = py = Fl::event_y();
change = 0;
if (type() == FL_NORMAL_BROWSER || !top_)
;
else if (type() == FL_MULTI_BROWSER) {
else if (type() != FL_MULTI_BROWSER) {
change = select_only(find_item(my), when() & FL_WHEN_CHANGED);
} else {
void* l = find_item(my);
whichway = 1;
if (Fl::event_state(FL_SHIFT|FL_CTRL)) { // toggle selection:
if (Fl::event_state(FL_CTRL)) { // toggle selection:
if (l) {
whichway = !item_selected(l);
change = select(l, whichway, when() & FL_WHEN_CHANGED);
}
} else {
} else if (Fl::event_state(FL_SHIFT)) { // extend selection:
change = 0;
if (selection_ && l != selection_) {
void *m = l;
int down = 0;
whichway = item_selected(selection_);
for (m = selection_; m; m = item_next(m)) {
if (m == l) down = 1;
}
void *n;
if (down) {
m = selection_;
n = l;
} else {
m = l;
n = selection_;
}
while (m != n) {
select(m, whichway, when() & FL_WHEN_CHANGED);
m = item_next(m);
}
select(n, whichway, when() & FL_WHEN_CHANGED);
select(l, whichway, when() & FL_WHEN_CHANGED);
change = 1;
}
} else { // select only this item
change = select_only(l, when() & FL_WHEN_CHANGED);
}
} else {
change = select_only(find_item(my), when() & FL_WHEN_CHANGED);
}
return 1;
case FL_DRAG:
@ -676,5 +700,5 @@ void Fl_Browser_::item_select(void*, int) {}
int Fl_Browser_::item_selected(void* l) const {return l==selection_;}
//
// End of "$Id: Fl_Browser_.cxx,v 1.10.2.7 1999/12/19 05:32:33 bill Exp $".
// End of "$Id: Fl_Browser_.cxx,v 1.10.2.8 2000/01/20 06:14:31 bill Exp $".
//

View File

@ -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 $".
//

View File

@ -1,5 +1,5 @@
//
// "$Id: browser.cxx,v 1.5.2.1 1999/04/26 06:45:28 bill Exp $"
// "$Id: browser.cxx,v 1.5.2.2 2000/01/20 06:14:34 bill Exp $"
//
// Browser test program for the Fast Light Tool Kit (FLTK).
//
@ -80,6 +80,7 @@ int main(int argc, char **argv) {
window.box(FL_NO_BOX); // because it is filled with browser
Fl_Select_Browser browser(0,0,400,400,0);
browser.type(FL_MULTI_BROWSER);
//browser.type(FL_HOLD_BROWSER);
//browser.color(42);
browser.callback(b_cb);
// browser.scrollbar_right();
@ -95,6 +96,6 @@ int main(int argc, char **argv) {
}
//
// End of "$Id: browser.cxx,v 1.5.2.1 1999/04/26 06:45:28 bill Exp $".
// End of "$Id: browser.cxx,v 1.5.2.2 2000/01/20 06:14:34 bill Exp $".
//