Addresses STR# 3423; adds missing scrollbar_size() methods and honors global Fl::scrollbar_size().
Includes mods to unittest's scrollbar size test. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12538 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
3256932e2a
commit
127147ca97
@ -24,6 +24,7 @@
|
||||
#ifndef FL_TEXT_DISPLAY_H
|
||||
#define FL_TEXT_DISPLAY_H
|
||||
|
||||
#include <FL/Fl.H> // Fl::scrollbar_size()
|
||||
#include "fl_draw.H"
|
||||
#include "Fl_Group.H"
|
||||
#include "Fl_Widget.H"
|
||||
@ -222,18 +223,65 @@ public:
|
||||
*/
|
||||
void cursor_color(Fl_Color n) {mCursor_color = n;}
|
||||
|
||||
/**
|
||||
Gets the width/height of the scrollbars.
|
||||
\return width of scrollbars
|
||||
*/
|
||||
int scrollbar_width() const { return scrollbar_width_; }
|
||||
/**
|
||||
This method has been deprecated, existing for backwards compatibility only.
|
||||
Use scrollbar_size() instead.
|
||||
This method returns the global value Fl::scrollbar_size() unless
|
||||
a specific scrollbar_width_ has been set.
|
||||
\todo This method should eventually be removed.
|
||||
*/
|
||||
int scrollbar_width() const {
|
||||
return scrollbar_width_ ? scrollbar_width_ : 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
|
||||
*/
|
||||
void scrollbar_width(int width) {
|
||||
Fl::scrollbar_size(width);
|
||||
scrollbar_width_ = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
Sets the width/height of the scrollbars.
|
||||
\param W width of scrollbars
|
||||
*/
|
||||
void scrollbar_width(int W) { scrollbar_width_ = W; }
|
||||
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::scrollbar_size() is being used.
|
||||
\see Fl::scrollbar_size(int)
|
||||
*/
|
||||
int scrollbar_size() const {
|
||||
return(scrollbar_width_);
|
||||
}
|
||||
|
||||
/**
|
||||
Sets the pixel size of the scrollbars' troughs to \p newSize, 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 newSize to the special value of 0 causes the widget to
|
||||
track the global Fl::scrollbar_size(), which is the default.
|
||||
|
||||
\param[in] newSize 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 newSize) {
|
||||
scrollbar_width_ = newSize;
|
||||
}
|
||||
|
||||
/**
|
||||
Gets the scrollbar alignment type.
|
||||
\return scrollbar alignment
|
||||
@ -522,7 +570,7 @@ protected:
|
||||
|
||||
Fl_Scrollbar* mHScrollBar;
|
||||
Fl_Scrollbar* mVScrollBar;
|
||||
int scrollbar_width_;
|
||||
int scrollbar_width_; // size of scrollbar trough (behavior changed in 1.4)
|
||||
Fl_Align scrollbar_align_;
|
||||
int dragPos, dragType, dragging;
|
||||
int display_insert_position_hint;
|
||||
|
||||
@ -127,8 +127,8 @@ Fl_Text_Display::Fl_Text_Display(int X, int Y, int W, int H, const char* l)
|
||||
|
||||
end();
|
||||
|
||||
scrollbar_width(Fl::scrollbar_size());
|
||||
scrollbar_align(FL_ALIGN_BOTTOM_RIGHT);
|
||||
scrollbar_width_ = 0; // 0: uses Fl::scrollbar_size()
|
||||
scrollbar_align_ = FL_ALIGN_BOTTOM_RIGHT;
|
||||
|
||||
mCursorOn = 0;
|
||||
mCursorPos = 0;
|
||||
@ -466,6 +466,7 @@ void Fl_Text_Display::recalc_display() {
|
||||
// did we have scrollbars initially?
|
||||
unsigned int hscrollbarvisible = mHScrollBar->visible();
|
||||
unsigned int vscrollbarvisible = mVScrollBar->visible();
|
||||
int scrollsize = scrollbar_width_ ? scrollbar_width_ : Fl::scrollbar_size();
|
||||
|
||||
int oldTAWidth = text_area.w;
|
||||
|
||||
@ -506,7 +507,7 @@ void Fl_Text_Display::recalc_display() {
|
||||
if (nvlines < 1) nvlines = 1;
|
||||
if (nlines >= nvlines-1) {
|
||||
mVScrollBar->set_visible(); // we need a vertical scrollbar
|
||||
text_area.w -= scrollbar_width();
|
||||
text_area.w -= scrollsize;
|
||||
}
|
||||
}
|
||||
|
||||
@ -552,7 +553,7 @@ void Fl_Text_Display::recalc_display() {
|
||||
calc_last_char();
|
||||
|
||||
// figure the scrollbars
|
||||
if (scrollbar_width()) {
|
||||
if (scrollsize) {
|
||||
|
||||
/* Decide if the vertical scrollbar needs to be visible */
|
||||
if (!mVScrollBar->visible() &&
|
||||
@ -560,7 +561,7 @@ void Fl_Text_Display::recalc_display() {
|
||||
mNBufferLines >= mNVisibleLines-(mContinuousWrap?0:1))
|
||||
{
|
||||
mVScrollBar->set_visible();
|
||||
text_area.w -= scrollbar_width();
|
||||
text_area.w -= scrollsize;
|
||||
again = 1;
|
||||
}
|
||||
|
||||
@ -594,7 +595,7 @@ void Fl_Text_Display::recalc_display() {
|
||||
char wrap_at_bounds = mContinuousWrap && (mWrapMarginPix<text_area.w);
|
||||
if (!wrap_at_bounds) {
|
||||
mHScrollBar->set_visible();
|
||||
text_area.h -= scrollbar_width();
|
||||
text_area.h -= scrollsize;
|
||||
again = 1; // loop again to see if we now need vert. & recalc sizes
|
||||
}
|
||||
}
|
||||
@ -605,28 +606,28 @@ void Fl_Text_Display::recalc_display() {
|
||||
// Note: width and height have been calculated above.
|
||||
text_area.x = X + mLineNumWidth + LEFT_MARGIN;
|
||||
if (mVScrollBar->visible() && scrollbar_align() & FL_ALIGN_LEFT)
|
||||
text_area.x += scrollbar_width();
|
||||
text_area.x += scrollsize;
|
||||
|
||||
text_area.y = Y + TOP_MARGIN;
|
||||
if (mHScrollBar->visible() &&
|
||||
scrollbar_align() & FL_ALIGN_TOP)
|
||||
text_area.y += scrollbar_width();
|
||||
text_area.y += scrollsize;
|
||||
|
||||
// position and resize scrollbars
|
||||
if (mVScrollBar->visible()) {
|
||||
if (scrollbar_align() & FL_ALIGN_LEFT) {
|
||||
#ifdef LINENUM_LEFT_OF_VSCROLL
|
||||
mVScrollBar->resize(text_area.x - LEFT_MARGIN - scrollbar_width(),
|
||||
mVScrollBar->resize(text_area.x - LEFT_MARGIN - scrollsize,
|
||||
#else
|
||||
mVScrollBar->resize(X,
|
||||
#endif
|
||||
text_area.y - TOP_MARGIN,
|
||||
scrollbar_width(),
|
||||
scrollsize,
|
||||
text_area.h + TOP_MARGIN + BOTTOM_MARGIN);
|
||||
} else {
|
||||
mVScrollBar->resize(X+W-scrollbar_width(),
|
||||
mVScrollBar->resize(X+W-scrollsize,
|
||||
text_area.y - TOP_MARGIN,
|
||||
scrollbar_width(),
|
||||
scrollsize,
|
||||
text_area.h + TOP_MARGIN + BOTTOM_MARGIN);
|
||||
}
|
||||
}
|
||||
@ -636,12 +637,12 @@ void Fl_Text_Display::recalc_display() {
|
||||
mHScrollBar->resize(text_area.x - LEFT_MARGIN,
|
||||
Y,
|
||||
text_area.w + LEFT_MARGIN + RIGHT_MARGIN,
|
||||
scrollbar_width());
|
||||
scrollsize);
|
||||
} else {
|
||||
mHScrollBar->resize(text_area.x - LEFT_MARGIN,
|
||||
Y + H - scrollbar_width(),
|
||||
Y + H - scrollsize,
|
||||
text_area.w + LEFT_MARGIN + RIGHT_MARGIN,
|
||||
scrollbar_width());
|
||||
scrollsize);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3661,6 +3662,9 @@ void Fl_Text_Display::draw(void) {
|
||||
// background color -- change if inactive
|
||||
Fl_Color bgcolor = active_r() ? color() : fl_inactive(color());
|
||||
|
||||
// scrollbar size
|
||||
int scrollsize = scrollbar_width_ ? scrollbar_width_ : Fl::scrollbar_size();
|
||||
|
||||
// draw the non-text, non-scrollbar areas.
|
||||
if (damage() & FL_DAMAGE_ALL) {
|
||||
recalc_display();
|
||||
@ -3674,9 +3678,9 @@ void Fl_Text_Display::draw(void) {
|
||||
draw_box(box(), x(), y(), W, H, bgcolor);
|
||||
|
||||
if (mHScrollBar->visible())
|
||||
W -= scrollbar_width();
|
||||
W -= scrollsize;
|
||||
if (mVScrollBar->visible())
|
||||
H -= scrollbar_width();
|
||||
H -= scrollsize;
|
||||
|
||||
// left margin
|
||||
fl_rectf(text_area.x-LEFT_MARGIN, text_area.y-TOP_MARGIN,
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
#include <FL/Fl_Browser.H>
|
||||
#include <FL/Fl_Tree.H>
|
||||
#include <FL/Fl_Table.H>
|
||||
#include <FL/Fl_Text_Display.H>
|
||||
#include <FL/Fl_Value_Slider.H>
|
||||
|
||||
//
|
||||
@ -67,50 +68,37 @@ class MyTable : public Fl_Table {
|
||||
~MyTable() { }
|
||||
};
|
||||
|
||||
static const char *phonetics[] = {
|
||||
"Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot",
|
||||
"Golf", "Hotel", "India", "Juliet", "Kilo", "Lima", "Mike",
|
||||
"November", "Oscar", "Papa", "Quebec", "Romeo", "Sierra", "Tango",
|
||||
"Uniform", "Victor", "Whiskey", "X-ray", "Yankee", "Zulu", NULL
|
||||
};
|
||||
|
||||
class ScrollBarSizeTest : public Fl_Group {
|
||||
Fl_Browser *brow_a, *brow_b, *brow_c;
|
||||
Fl_Tree *tree_a, *tree_b, *tree_c;
|
||||
MyTable *table_a,*table_b,*table_c;
|
||||
Fl_Browser *brow_a, *brow_b, *brow_c;
|
||||
Fl_Tree *tree_a, *tree_b, *tree_c;
|
||||
MyTable *table_a,*table_b,*table_c;
|
||||
Fl_Text_Display *text_a, *text_b, *text_c;
|
||||
|
||||
Fl_Browser *makebrowser(int X,int Y,int W,int H,const char*L=0) {
|
||||
Fl_Browser *b = new Fl_Browser(X,Y,W,H,L);
|
||||
b->type(FL_MULTI_BROWSER);
|
||||
b->align(FL_ALIGN_TOP);
|
||||
b->add("Papa"); b->add("Delta"); b->add("Hotel");
|
||||
b->add("Long entry will show h-bar");
|
||||
b->add("Charlie"); b->add("Echo"); b->add("Foxtrot");
|
||||
b->add("Golf"); b->add("Lima"); b->add("Victor");
|
||||
b->add("Alpha"); b->add("Xray"); b->add("Yankee");
|
||||
b->add("Oscar"); b->add("India"); b->add("Juliet");
|
||||
b->add("Kilo"); b->add("Mike"); b->add("Sierra");
|
||||
b->add("November"); b->add("Tango"); b->add("Quebec");
|
||||
b->add("Bravo"); b->add("Romeo"); b->add("Uniform");
|
||||
b->add("Whisky"); b->add("Zulu");
|
||||
b->add("Papa"); b->add("Delta"); b->add("Hotel");
|
||||
b->add("Charlie"); b->add("Echo"); b->add("Foxtrot");
|
||||
b->add("Golf"); b->add("Lima"); b->add("Victor");
|
||||
b->add("Alpha"); b->add("Xray"); b->add("Yankee");
|
||||
b->add("Oscar"); b->add("India"); b->add("Juliet");
|
||||
b->add("Kilo"); b->add("Mike"); b->add("Sierra");
|
||||
b->add("November"); b->add("Tango"); b->add("Quebec");
|
||||
b->add("Bravo"); b->add("Romeo"); b->add("Uniform");
|
||||
b->add("Whisky"); b->add("Zulu");
|
||||
for (int t=0; phonetics[t]; t++ ) {
|
||||
b->add(phonetics[t]);
|
||||
if ( phonetics[t][0] == 'C' ) b->add("Long entry will show h-bar");
|
||||
}
|
||||
return(b);
|
||||
}
|
||||
Fl_Tree *maketree(int X,int Y,int W,int H,const char*L=0) {
|
||||
Fl_Tree *b = new Fl_Tree(X,Y,W,H,L);
|
||||
b->type(FL_TREE_SELECT_MULTI);
|
||||
b->align(FL_ALIGN_TOP);
|
||||
b->add("Papa"); b->add("Delta"); b->add("Hotel");
|
||||
b->add("Long entry will show h-bar");
|
||||
b->add("Charlie"); b->add("Echo"); b->add("Foxtrot");
|
||||
b->add("Golf"); b->add("Lima"); b->add("Victor");
|
||||
b->add("Alpha"); b->add("Xray"); b->add("Yankee");
|
||||
b->add("Oscar"); b->add("India"); b->add("Juliet");
|
||||
b->add("Kilo"); b->add("Mike"); b->add("Sierra");
|
||||
b->add("November"); b->add("Tango"); b->add("Quebec");
|
||||
b->add("Bravo"); b->add("Romeo"); b->add("Uniform");
|
||||
b->add("Whisky"); b->add("Zulu");
|
||||
for (int t=0; phonetics[t]; t++ ) {
|
||||
b->add(phonetics[t]);
|
||||
if ( phonetics[t][0] == 'C' ) b->add("Long entry will show h-bar");
|
||||
}
|
||||
return(b);
|
||||
}
|
||||
MyTable *maketable(int X,int Y,int W,int H,const char*L=0) {
|
||||
@ -119,6 +107,16 @@ class ScrollBarSizeTest : public Fl_Group {
|
||||
mta->end();
|
||||
return(mta);
|
||||
}
|
||||
Fl_Text_Display *maketextdisplay(int X,int Y,int W,int H,const char*L=0) {
|
||||
Fl_Text_Display *dpy = new Fl_Text_Display(X,Y,W,H,L);
|
||||
Fl_Text_Buffer *buf = new Fl_Text_Buffer();
|
||||
dpy->buffer(buf);
|
||||
for (int t=0; phonetics[t]; t++ ) {
|
||||
buf->printf("%s\n", phonetics[t]);
|
||||
if ( phonetics[t][0] == 'C' ) buf->printf("Long entry will show h-bar\n");
|
||||
}
|
||||
return(dpy);
|
||||
}
|
||||
void slide_cb2(Fl_Value_Slider *in) {
|
||||
const char *label = in->label();
|
||||
int val = int(in->value());
|
||||
@ -127,6 +125,7 @@ class ScrollBarSizeTest : public Fl_Group {
|
||||
brow_a->scrollbar_size(val);
|
||||
tree_a->scrollbar_size(val);
|
||||
table_a->scrollbar_size(val);
|
||||
text_a->scrollbar_size(val);
|
||||
} else {
|
||||
Fl::scrollbar_size(val);
|
||||
}
|
||||
@ -173,6 +172,8 @@ public:
|
||||
int treeh = browh;
|
||||
int tabley = treey + treeh + 20;
|
||||
int tableh = browh;
|
||||
int texty = tabley + tableh + 20;
|
||||
int texth = browh;
|
||||
brow_a = makebrowser(X+ 10,browy,100,browh,"Browser A");
|
||||
brow_b = makebrowser(X+120,browy,100,browh,"Browser B");
|
||||
brow_c = makebrowser(X+230,browy,100,browh,"Browser C");
|
||||
@ -182,6 +183,9 @@ public:
|
||||
table_a = maketable(X+ 10,tabley,100,tableh,"Table A");
|
||||
table_b = maketable(X+120,tabley,100,tableh,"Table B");
|
||||
table_c = maketable(X+230,tabley,100,tableh,"Table C");
|
||||
text_a = maketextdisplay(X+ 10,texty,100,texth,"Text Display A");
|
||||
text_b = maketextdisplay(X+120,texty,100,texth,"Text Display B");
|
||||
text_c = maketextdisplay(X+230,texty,100,texth,"Text Display C");
|
||||
Fl_Value_Slider *slide_glob = new Fl_Value_Slider(X+100,Y,100,18,"Global Scroll Size");
|
||||
slide_glob->value(16);
|
||||
slide_glob->type(FL_HORIZONTAL);
|
||||
@ -198,14 +202,19 @@ public:
|
||||
slide_browa->step(1.0);
|
||||
slide_browa->callback(slide_cb, (void*)this);
|
||||
slide_browa->labelsize(12);
|
||||
int msgbox_x = brow_c->x() + brow_c->w() + 20;
|
||||
int msgbox_w = W-(msgbox_x-X);
|
||||
Fl_Box *msgbox = new Fl_Box(msgbox_x,browy,msgbox_w,H-Y-48);
|
||||
msgbox->label("\nVerify global scroll sizing and per-widget scroll sizing. "
|
||||
"Scrollbar's size should change interactively as size sliders are changed. "
|
||||
"Changing 'Global Scroll Size' should affect all three browser's scrollbars UNLESS "
|
||||
"the 'A: Scroll Size' slider is changed, in which case its value will take precedence "
|
||||
"for the 'A' group of widgets.");
|
||||
msgbox->labelsize(10);
|
||||
msgbox->align(FL_ALIGN_INSIDE|FL_ALIGN_CENTER|FL_ALIGN_LEFT|FL_ALIGN_WRAP);
|
||||
msgbox->box(FL_FLAT_BOX);
|
||||
msgbox->color(53); // 90% gray
|
||||
end();
|
||||
label("Verify global scroll sizing and per-widget scroll sizing.\n"
|
||||
"Scrollbar's size should change interactively as size sliders are changed.\n"
|
||||
"Changing 'Global Scroll Size' should affect all three browser's scrollbars UNLESS\n"
|
||||
"the 'A: Scroll Size' slider is changed, in which case its value will take precedence\n"
|
||||
"for the 'A' group of widgets.");
|
||||
labelsize(10);
|
||||
align(FL_ALIGN_INSIDE|FL_ALIGN_BOTTOM|FL_ALIGN_LEFT|FL_ALIGN_WRAP);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user