summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGreg Ercolano <erco@seriss.com>2014-07-16 03:32:14 +0000
committerGreg Ercolano <erco@seriss.com>2014-07-16 03:32:14 +0000
commitafcd967fd88b5cc0f7b43441d985ea739455e414 (patch)
tree344518bf1b455db0429fa06e25155ba2ac9cf68a /src
parent73821732239738743ac5dc6833222b0c88437b8f (diff)
* Modified the ScrollInfo structure for more modularity,
which helps doxygen docs be clear. * Changed loop in recalc_scrollbars() to loop thru /all/ children and skip over scrollbars, instead of assuming fix_scrollbar_order() has been called. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@10220 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
-rw-r--r--src/Fl_Scroll.cxx133
1 files changed, 67 insertions, 66 deletions
diff --git a/src/Fl_Scroll.cxx b/src/Fl_Scroll.cxx
index 117456164..1df49b290 100644
--- a/src/Fl_Scroll.cxx
+++ b/src/Fl_Scroll.cxx
@@ -100,60 +100,61 @@ void Fl_Scroll::draw_clip(void* v,int X, int Y, int W, int H) {
void Fl_Scroll::recalc_scrollbars(ScrollInfo &si) {
// inner box of widget (excluding scrollbars)
- si.innerbox_x = x()+Fl::box_dx(box());
- si.innerbox_y = y()+Fl::box_dy(box());
- si.innerbox_w = w()-Fl::box_dw(box());
- si.innerbox_h = h()-Fl::box_dh(box());
+ si.innerbox.x = x()+Fl::box_dx(box());
+ si.innerbox.y = y()+Fl::box_dy(box());
+ si.innerbox.w = w()-Fl::box_dw(box());
+ si.innerbox.h = h()-Fl::box_dh(box());
// accumulate a bounding box for all the children
- si.child_l = si.innerbox_x;
- si.child_r = si.innerbox_x;
- si.child_b = si.innerbox_y;
- si.child_t = si.innerbox_y;
+ si.child.l = si.innerbox.x;
+ si.child.r = si.innerbox.x;
+ si.child.b = si.innerbox.y;
+ si.child.t = si.innerbox.y;
int first = 1;
Fl_Widget*const* a = array();
- for (int i=children()-2; i--;) {
+ for (int i=children(); i--;) {
Fl_Widget* o = *a++;
+ if ( o==&scrollbar || o==&hscrollbar ) continue;
if ( first ) {
first = 0;
- si.child_l = o->x();
- si.child_r = o->x()+o->w();
- si.child_b = o->y()+o->h();
- si.child_t = o->y();
+ si.child.l = o->x();
+ si.child.r = o->x()+o->w();
+ si.child.b = o->y()+o->h();
+ si.child.t = o->y();
} else {
- if (o->x() < si.child_l) si.child_l = o->x();
- if (o->y() < si.child_t) si.child_t = o->y();
- if (o->x()+o->w() > si.child_r) si.child_r = o->x()+o->w();
- if (o->y()+o->h() > si.child_b) si.child_b = o->y()+o->h();
+ if (o->x() < si.child.l) si.child.l = o->x();
+ if (o->y() < si.child.t) si.child.t = o->y();
+ if (o->x()+o->w() > si.child.r) si.child.r = o->x()+o->w();
+ if (o->y()+o->h() > si.child.b) si.child.b = o->y()+o->h();
}
}
// Turn the scrollbars on and off as necessary.
// See if children would fit if we had no scrollbars...
{
- int X = si.innerbox_x;
- int Y = si.innerbox_y;
- int W = si.innerbox_w;
- int H = si.innerbox_h;
+ int X = si.innerbox.x;
+ int Y = si.innerbox.y;
+ int W = si.innerbox.w;
+ int H = si.innerbox.h;
si.scrollsize = scrollbar_size_ ? scrollbar_size_ : Fl::scrollbar_size();
si.vneeded = 0;
si.hneeded = 0;
if (type() & VERTICAL) {
- if ((type() & ALWAYS_ON) || si.child_t < Y || si.child_b > Y+H) {
+ if ((type() & ALWAYS_ON) || si.child.t < Y || si.child.b > Y+H) {
si.vneeded = 1;
W -= si.scrollsize;
if (scrollbar.align() & FL_ALIGN_LEFT) X += si.scrollsize;
}
}
if (type() & HORIZONTAL) {
- if ((type() & ALWAYS_ON) || si.child_l < X || si.child_r > X+W) {
+ if ((type() & ALWAYS_ON) || si.child.l < X || si.child.r > X+W) {
si.hneeded = 1;
H -= si.scrollsize;
if (scrollbar.align() & FL_ALIGN_TOP) Y += si.scrollsize;
// recheck vertical since we added a horizontal scrollbar
if (!si.vneeded && (type() & VERTICAL)) {
- if ((type() & ALWAYS_ON) || si.child_t < Y || si.child_b > Y+H) {
+ if ((type() & ALWAYS_ON) || si.child.t < Y || si.child.b > Y+H) {
si.vneeded = 1;
W -= si.scrollsize;
if (scrollbar.align() & FL_ALIGN_LEFT) X += si.scrollsize;
@@ -161,51 +162,51 @@ void Fl_Scroll::recalc_scrollbars(ScrollInfo &si) {
}
}
}
- si.innerchild_x = X;
- si.innerchild_y = Y;
- si.innerchild_w = W;
- si.innerchild_h = H;
+ si.innerchild.x = X;
+ si.innerchild.y = Y;
+ si.innerchild.w = W;
+ si.innerchild.h = H;
}
// calculate hor scrollbar position
- si.hscroll_x = si.innerchild_x;
- si.hscroll_y = (scrollbar.align() & FL_ALIGN_TOP)
- ? si.innerbox_y
- : si.innerbox_y + si.innerbox_h - si.scrollsize;
- si.hscroll_w = si.innerchild_w;
- si.hscroll_h = si.scrollsize;
+ si.hscroll.x = si.innerchild.x;
+ si.hscroll.y = (scrollbar.align() & FL_ALIGN_TOP)
+ ? si.innerbox.y
+ : si.innerbox.y + si.innerbox.h - si.scrollsize;
+ si.hscroll.w = si.innerchild.w;
+ si.hscroll.h = si.scrollsize;
// calculate ver scrollbar position
- si.vscroll_x = (scrollbar.align() & FL_ALIGN_LEFT)
- ? si.innerbox_x
- : si.innerbox_x + si.innerbox_w - si.scrollsize;
- si.vscroll_y = si.innerchild_y;
- si.vscroll_w = si.scrollsize;
- si.vscroll_h = si.innerchild_h;
+ si.vscroll.x = (scrollbar.align() & FL_ALIGN_LEFT)
+ ? si.innerbox.x
+ : si.innerbox.x + si.innerbox.w - si.scrollsize;
+ si.vscroll.y = si.innerchild.y;
+ si.vscroll.w = si.scrollsize;
+ si.vscroll.h = si.innerchild.h;
// calculate h/v scrollbar values (pos/size/first/total)
- si.hpos = si.innerchild_x - si.child_l;
- si.hsize = si.innerchild_w;
- si.hfirst = 0;
- si.htotal = si.child_r - si.child_l;
- if ( si.hpos < 0 ) { si.htotal += (-si.hpos); si.hfirst = si.hpos; }
-
- si.vpos = si.innerchild_y - si.child_t;
- si.vsize = si.innerchild_h;
- si.vfirst = 0;
- si.vtotal = si.child_b - si.child_t;
- if ( si.vpos < 0 ) { si.vtotal += (-si.vpos); si.vfirst = si.vpos; }
+ si.hscroll.pos = si.innerchild.x - si.child.l;
+ si.hscroll.size = si.innerchild.w;
+ si.hscroll.first = 0;
+ si.hscroll.total = si.child.r - si.child.l;
+ if ( si.hscroll.pos < 0 ) { si.hscroll.total += (-si.hscroll.pos); si.hscroll.first = si.hscroll.pos; }
+
+ si.vscroll.pos = si.innerchild.y - si.child.t;
+ si.vscroll.size = si.innerchild.h;
+ si.vscroll.first = 0;
+ si.vscroll.total = si.child.b - si.child.t;
+ if ( si.vscroll.pos < 0 ) { si.vscroll.total += (-si.vscroll.pos); si.vscroll.first = si.vscroll.pos; }
// printf("DEBUG --- ScrollInfo ---\n");
// printf("DEBUG scrollsize: %d\n", si.scrollsize);
// printf("DEBUG hneeded, vneeded: %d %d\n", si.hneeded, si.vneeded);
-// printf("DEBUG innerbox xywh: %d %d %d %d\n", si.innerbox_x, si.innerbox_y, si.innerbox_w, si.innerbox_h);
-// printf("DEBUG innerchild xywh: %d %d %d %d\n", si.innerchild_x, si.innerchild_y, si.innerchild_w, si.innerchild_h);
-// printf("DEBUG child lrbt: %d %d %d %d\n", si.child_l, si.child_r, si.child_b, si.child_t);
-// printf("DEBUG hscroll xywh: %d %d %d %d\n", si.hscroll_x, si.hscroll_y, si.hscroll_w, si.hscroll_h);
-// printf("DEBUG vscroll xywh: %d %d %d %d\n", si.vscroll_x, si.vscroll_y, si.vscroll_w, si.vscroll_h);
-// printf("DEBUG horz scroll vals: %d %d %d %d\n", si.hpos, si.hsize, si.hfirst, si.htotal);
-// printf("DEBUG vert scroll vals: %d %d %d %d\n", si.vpos, si.vsize, si.vfirst, si.vtotal);
+// printf("DEBUG innerbox.x, si.innerbox.y, si.innerbox.w,si.innerbox.h);
+// printf("DEBUG innerchild.xywh: %d %d %d %d\n", si.innerchild.x, si.innerchild.y, si.innerchild.w, si.innerchild.h);
+// printf("DEBUG child lrbt: %d %d %d %d\n", si.child.l, si.child.r, si.child.b, si.child.t);
+// printf("DEBUG hscroll xywh: %d %d %d %d\n", si.hscroll.x, si.hscroll.y, si.hscroll.w, si.hscroll.h);
+// printf("DEBUG vscroll xywh: %d %d %d %d\n", si.vscroll.x, si.vscroll.y, si.vscroll.w, si.vscroll.h);
+// printf("DEBUG horz scroll vals: %d %d %d %d\n", si.hscroll.pos, si.hscroll.size, si.hscroll.first, si.hscroll.total);
+// printf("DEBUG vert scroll vals: %d %d %d %d\n", si.vscroll.pos, si.vscroll.size, si.vscroll.first, si.vscroll.total);
// printf("DEBUG \n");
}
@@ -286,7 +287,7 @@ void Fl_Scroll::draw() {
}
else if (!si.vneeded && scrollbar.visible()) {
scrollbar.clear_visible();
- draw_clip(this, si.vscroll_x, si.vscroll_y, si.vscroll_w, si.vscroll_h);
+ draw_clip(this, si.vscroll.x, si.vscroll.y, si.vscroll.w, si.vscroll.h);
d = FL_DAMAGE_ALL;
}
if (si.hneeded && !hscrollbar.visible()) {
@@ -295,7 +296,7 @@ void Fl_Scroll::draw() {
}
else if (!si.hneeded && hscrollbar.visible()) {
hscrollbar.clear_visible();
- draw_clip(this, si.hscroll_x, si.hscroll_y, si.hscroll_w, si.hscroll_h);
+ draw_clip(this, si.hscroll.x, si.hscroll.y, si.hscroll.w, si.hscroll.h);
d = FL_DAMAGE_ALL;
}
else if ( hscrollbar.h() != si.scrollsize || scrollbar.w() != si.scrollsize ) {
@@ -303,13 +304,13 @@ void Fl_Scroll::draw() {
d = FL_DAMAGE_ALL;
}
- scrollbar.resize(si.vscroll_x, si.vscroll_y, si.vscroll_w, si.vscroll_h);
- oldy = yposition_ = si.vpos; // si.innerchild_y - si.child_t;
- scrollbar.value(si.vpos, si.vsize, si.vfirst, si.vtotal);
+ scrollbar.resize(si.vscroll.x, si.vscroll.y, si.vscroll.w, si.vscroll.h);
+ oldy = yposition_ = si.vscroll.pos; // si.innerchild.y - si.child.t;
+ scrollbar.value(si.vscroll.pos, si.vscroll.size, si.vscroll.first, si.vscroll.total);
- hscrollbar.resize(si.hscroll_x, si.hscroll_y, si.hscroll_w, si.hscroll_h);
- oldx = xposition_ = si.hpos; // si.innerchild_x - si.child_l;
- hscrollbar.value(si.hpos, si.hsize, si.hfirst, si.htotal);
+ hscrollbar.resize(si.hscroll.x, si.hscroll.y, si.hscroll.w, si.hscroll.h);
+ oldx = xposition_ = si.hscroll.pos; // si.innerchild.x - si.child.l;
+ hscrollbar.value(si.hscroll.pos, si.hscroll.size, si.hscroll.first, si.hscroll.total);
}
// draw the scrollbars: