Fl_Browser mods for scrollbar sizing
1) Moved Fl::scrollbar_size() implementation from Fl_Browser_ to Fl:: 2) Modified Fl_Browser as per fltk.dev discussions: * Deprecate Fl_Browser scrollbar_width() method * Introduce Fl_Browser scrollbar_size() method with global fallback behavior * Docs for above Todo: Make similar changes to other scrollbar oriented widgets git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6737 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
eb6b632b0a
commit
bb20a128f2
1
FL/Fl.H
1
FL/Fl.H
@ -124,6 +124,7 @@ public: // should be private!
|
||||
static Fl_Image* scheme_bg_;
|
||||
|
||||
static int e_original_keysym; // late addition
|
||||
static int scrollbar_size_;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@ -37,6 +37,7 @@
|
||||
#include "Fl_Group.H"
|
||||
#endif
|
||||
#include "Fl_Scrollbar.H"
|
||||
#include <FL/Fl.H> // Fl::scrollbar_size()
|
||||
|
||||
#define FL_NORMAL_BROWSER 0 /**< type() of Fl_Browser */
|
||||
#define FL_SELECT_BROWSER 1 /**< type() of FL_Select_Browser */
|
||||
@ -78,8 +79,7 @@ class FL_EXPORT Fl_Browser_ : public Fl_Group {
|
||||
void* selection_; // which is selected (except for FL_MULTI_BROWSER)
|
||||
void *redraw1,*redraw2; // minimal update pointers
|
||||
void* max_width_item; // which item has max_width_
|
||||
|
||||
static int scrollbar_width_;
|
||||
int scrollbar_size_; // size of scrollbar trough
|
||||
|
||||
void update_top();
|
||||
|
||||
@ -304,14 +304,60 @@ public:
|
||||
void textcolor(unsigned col) { textcolor_ = col; }
|
||||
|
||||
/**
|
||||
Gets the current width of scrollbars in pixels.
|
||||
*/
|
||||
static int scrollbar_width() { return scrollbar_width_; }
|
||||
/**
|
||||
Sets the width of scrollbars to pixel size \p width.
|
||||
*/
|
||||
static void scrollbar_width(int width) { scrollbar_width_ = width; }
|
||||
Gets the current size of the scrollbars' troughs, in pixels.
|
||||
|
||||
If this value is zero (default), this widget will use the
|
||||
Fl::scrollbar_size() value as the scrollbar's width.
|
||||
|
||||
\returns Scrollbar size in pixels, or 0 if the global Fl::scrollsize() is being used.
|
||||
\see Fl::scrollbar_size(int)
|
||||
*/
|
||||
int scrollbar_size() const {
|
||||
return(scrollbar_size_);
|
||||
}
|
||||
/**
|
||||
Sets the pixel size of the scrollbars' troughs to the \p size, in pixels.
|
||||
|
||||
Normally you should not need this method, and should use
|
||||
Fl::scrollbar_size(int) instead to manage the size of ALL
|
||||
your widgets' scrollbars. This ensures your application
|
||||
has a consistent UI, is the default behavior, and is normally
|
||||
what you want.
|
||||
|
||||
Only use THIS method if you really need to override the global
|
||||
scrollbar size. The need for this should be rare.
|
||||
|
||||
Setting \p size to the special value of 0 causes the widget to
|
||||
track the global Fl::scrollbar_size(), which is the default.
|
||||
|
||||
\param[in] size Sets the scrollbar size in pixels.\n
|
||||
If 0 (default), scrollbar size tracks the global Fl::scrollbar_size()
|
||||
\see Fl::scrollbar_size()
|
||||
*/
|
||||
void scrollbar_size(int size) {
|
||||
scrollbar_size_ = size;
|
||||
}
|
||||
/**
|
||||
This method has been deprecated, existing for backwards compatibility only.
|
||||
Use scrollbar_size() instead.
|
||||
This method always returns the global value Fl::scrollbar_size().
|
||||
\returns Always returns the global value Fl::scrollbar_size().
|
||||
\todo This method should eventually be removed in 1.4+
|
||||
*/
|
||||
int scrollbar_width() const {
|
||||
return(Fl::scrollbar_size());
|
||||
}
|
||||
/**
|
||||
This method has been deprecated, existing for backwards compatibility only.
|
||||
Use scrollbar_size(int) instead.
|
||||
This method sets the global Fl::scrollbar_size(), and forces this
|
||||
instance of the widget to use it.
|
||||
\todo This method should eventually be removed in 1.4+
|
||||
*/
|
||||
void scrollbar_width(int width) {
|
||||
Fl::scrollbar_size(width);
|
||||
scrollbar_size_ = 0;
|
||||
}
|
||||
/**
|
||||
Moves the vertical scrollbar to the righthand side of the list.
|
||||
For back compatibility.
|
||||
|
||||
28
src/Fl.cxx
28
src/Fl.cxx
@ -73,7 +73,9 @@ int Fl::damage_,
|
||||
Fl::e_clicks,
|
||||
Fl::e_is_click,
|
||||
Fl::e_keysym,
|
||||
Fl::e_original_keysym;
|
||||
Fl::e_original_keysym,
|
||||
Fl::scrollbar_size_ = 16;
|
||||
|
||||
char *Fl::e_text = (char *)"";
|
||||
int Fl::e_length;
|
||||
int Fl::visible_focus_ = 1,
|
||||
@ -99,6 +101,30 @@ Fl::version() {
|
||||
return FL_VERSION;
|
||||
}
|
||||
|
||||
/**
|
||||
Gets the default scrollbar size used by
|
||||
Fl_Browser_,
|
||||
Fl_Help_View,
|
||||
Fl_Scroll, and
|
||||
Fl_Text_Display widgets.
|
||||
\returns The default size for widget scrollbars, in pixels.
|
||||
*/
|
||||
int Fl::scrollbar_size() {
|
||||
return scrollbar_size_;
|
||||
}
|
||||
|
||||
/**
|
||||
Sets the default scrollbar size that is used by the
|
||||
Fl_Browser_,
|
||||
Fl_Help_View,
|
||||
Fl_Scroll, and
|
||||
Fl_Text_Display widgets.
|
||||
\param[in] W The new default size for widget scrollbars, in pixels.
|
||||
*/
|
||||
void Fl::scrollbar_size(int W) {
|
||||
scrollbar_size_ = W;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Returns whether or not the mouse event is inside the given rectangle.
|
||||
|
||||
@ -67,36 +67,6 @@ static void hscrollbar_callback(Fl_Widget* s, void*) {
|
||||
((Fl_Browser_*)(s->parent()))->hposition(int(((Fl_Scrollbar*)s)->value()));
|
||||
}
|
||||
|
||||
// Scrollbar size should be part of the Fl class, but is left here for
|
||||
// binary compatibility in 1.1.x - M. Sweet
|
||||
int Fl_Browser_::scrollbar_width_ = 16;
|
||||
|
||||
/**
|
||||
Gets the default scrollbar size used by
|
||||
Fl_Browser_,
|
||||
Fl_Help_View,
|
||||
Fl_Scroll, and
|
||||
Fl_Text_Display widgets.
|
||||
\returns The default size for widget scrollbars, in pixels.
|
||||
\todo The source code for this method needs to be moved from Fl_Browser_.cxx to Fl.cxx
|
||||
*/
|
||||
int Fl::scrollbar_size() {
|
||||
return Fl_Browser_::scrollbar_width();
|
||||
}
|
||||
|
||||
/**
|
||||
Sets the default scrollbar size that is used by the
|
||||
Fl_Browser_,
|
||||
Fl_Help_View,
|
||||
Fl_Scroll, and
|
||||
Fl_Text_Display widgets.
|
||||
\param[in] W The new default size for widget scrollbars, in pixels.
|
||||
\todo The source code for this method needs to be moved from Fl_Browser_.cxx to Fl.cxx
|
||||
*/
|
||||
void Fl::scrollbar_size(int W) {
|
||||
Fl_Browser_::scrollbar_width(W);
|
||||
}
|
||||
|
||||
// return where to draw the actual box:
|
||||
/**
|
||||
Returns the bounding box for the interior of the list's display window, inside
|
||||
@ -105,19 +75,20 @@ void Fl::scrollbar_size(int W) {
|
||||
(The original contents of these parameters are overwritten)
|
||||
*/
|
||||
void Fl_Browser_::bbox(int& X, int& Y, int& W, int& H) const {
|
||||
int scrollsize = scrollbar_size_ ? scrollbar_size_ : Fl::scrollbar_size();
|
||||
Fl_Boxtype b = box() ? box() : FL_DOWN_BOX;
|
||||
X = x()+Fl::box_dx(b);
|
||||
Y = y()+Fl::box_dy(b);
|
||||
W = w()-Fl::box_dw(b);
|
||||
H = h()-Fl::box_dh(b);
|
||||
if (scrollbar.visible()) {
|
||||
W -= scrollbar_width_;
|
||||
if (scrollbar.align() & FL_ALIGN_LEFT) X += scrollbar_width_;
|
||||
W -= scrollsize;
|
||||
if (scrollbar.align() & FL_ALIGN_LEFT) X += scrollsize;
|
||||
}
|
||||
if (W < 0) W = 0;
|
||||
if (hscrollbar.visible()) {
|
||||
H -= scrollbar_width_;
|
||||
if (scrollbar.align() & FL_ALIGN_TOP) Y += scrollbar_width_;
|
||||
H -= scrollsize;
|
||||
if (scrollbar.align() & FL_ALIGN_TOP) Y += scrollsize;
|
||||
}
|
||||
if (H < 0) H = 0;
|
||||
}
|
||||
@ -141,15 +112,16 @@ int Fl_Browser_::leftedge() const {
|
||||
\param[in] X,Y,W,H The new position and size for the browser, in pixels.
|
||||
*/
|
||||
void Fl_Browser_::resize(int X, int Y, int W, int H) {
|
||||
int scrollsize = scrollbar_size_ ? scrollbar_size_ : Fl::scrollbar_size();
|
||||
Fl_Widget::resize(X, Y, W, H);
|
||||
// move the scrollbars so they can respond to events:
|
||||
bbox(X,Y,W,H);
|
||||
scrollbar.resize(
|
||||
scrollbar.align()&FL_ALIGN_LEFT ? X-scrollbar_width_ : X+W,
|
||||
Y, scrollbar_width_, H);
|
||||
scrollbar.align()&FL_ALIGN_LEFT ? X-scrollsize : X+W,
|
||||
Y, scrollsize, H);
|
||||
hscrollbar.resize(
|
||||
X, scrollbar.align()&FL_ALIGN_TOP ? Y-scrollbar_width_ : Y+H,
|
||||
W, scrollbar_width_);
|
||||
X, scrollbar.align()&FL_ALIGN_TOP ? Y-scrollsize : Y+H,
|
||||
W, scrollsize);
|
||||
}
|
||||
|
||||
// Cause minimal update to redraw the given item:
|
||||
@ -483,11 +455,12 @@ J1:
|
||||
}
|
||||
|
||||
// update the scrollbars and redraw them:
|
||||
int scrollsize = scrollbar_size_ ? scrollbar_size_ : Fl::scrollbar_size();
|
||||
int dy = top_ ? item_quick_height(top_) : 0; if (dy < 10) dy = 10;
|
||||
if (scrollbar.visible()) {
|
||||
scrollbar.damage_resize(
|
||||
scrollbar.align()&FL_ALIGN_LEFT ? X-scrollbar_width_ : X+W,
|
||||
Y, scrollbar_width_, H);
|
||||
scrollbar.align()&FL_ALIGN_LEFT ? X-scrollsize : X+W,
|
||||
Y, scrollsize, H);
|
||||
scrollbar.value(position_, H, 0, full_height_);
|
||||
scrollbar.linesize(dy);
|
||||
if (drawsquare) draw_child(scrollbar);
|
||||
@ -495,8 +468,8 @@ J1:
|
||||
}
|
||||
if (hscrollbar.visible()) {
|
||||
hscrollbar.damage_resize(
|
||||
X, scrollbar.align()&FL_ALIGN_TOP ? Y-scrollbar_width_ : Y+H,
|
||||
W, scrollbar_width_);
|
||||
X, scrollbar.align()&FL_ALIGN_TOP ? Y-scrollsize : Y+H,
|
||||
W, scrollsize);
|
||||
hscrollbar.value(hposition_, W, 0, full_width_);
|
||||
hscrollbar.linesize(dy);
|
||||
if (drawsquare) draw_child(hscrollbar);
|
||||
@ -506,7 +479,7 @@ J1:
|
||||
// draw that little square between the scrollbars:
|
||||
if (drawsquare && scrollbar.visible() && hscrollbar.visible()) {
|
||||
fl_color(parent()->color());
|
||||
fl_rectf(scrollbar.x(), hscrollbar.y(), scrollbar_width_,scrollbar_width_);
|
||||
fl_rectf(scrollbar.x(), hscrollbar.y(), scrollsize, scrollsize);
|
||||
}
|
||||
|
||||
real_hposition_ = hposition_;
|
||||
@ -964,6 +937,7 @@ Fl_Browser_::Fl_Browser_(int X, int Y, int W, int H, const char* L)
|
||||
has_scrollbar_ = BOTH;
|
||||
max_width = 0;
|
||||
max_width_item = 0;
|
||||
scrollbar_size_ = 0;
|
||||
redraw1 = redraw2 = 0;
|
||||
end();
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user