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:
Greg Ercolano 2017-11-02 21:14:40 +00:00
parent 3256932e2a
commit 127147ca97
3 changed files with 127 additions and 66 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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);
}
};