Adding Fl_Widget::label_image_spacing() (#1039)
- May need a better method name. - This makes the gap between the image in a label and the label text user settable. - Can be tested using test/label app
This commit is contained in:
parent
325ac336c7
commit
cfc54a3b19
@ -63,6 +63,8 @@ struct FL_EXPORT Fl_Label {
|
||||
Fl_Align align_;
|
||||
/** type of label. \see Fl_Labeltype */
|
||||
uchar type;
|
||||
/** Spacing between an image and the label text */
|
||||
uchar spacing;
|
||||
|
||||
/** Draws the label aligned to the given box */
|
||||
void draw(int,int,int,int, Fl_Align) const ;
|
||||
@ -685,6 +687,17 @@ public:
|
||||
*/
|
||||
void bind_deimage(int f) { if (f) set_flag(DEIMAGE_BOUND); else clear_flag(DEIMAGE_BOUND); }
|
||||
|
||||
/** Set the gap between the label and the image in pixels.
|
||||
This value is limited to 0..255.
|
||||
\param[in] gap spacing in pixels
|
||||
*/
|
||||
void label_image_spacing(int gap) { label_.spacing = (uchar)gap; }
|
||||
|
||||
/** Return the gap size between the label and the image.
|
||||
\return spacing in pixels
|
||||
*/
|
||||
int label_image_spacing() { return label_.spacing; }
|
||||
|
||||
/** Gets the current tooltip text.
|
||||
\return a pointer to the tooltip text or NULL
|
||||
\see tooltip(const char*), copy_tooltip(const char*)
|
||||
|
@ -977,10 +977,10 @@ inline void fl_rtl_draw(const char *str, int n, int x, int y) {
|
||||
FL_EXPORT void fl_measure(const char *str, int &x, int &y, int draw_symbols = 1);
|
||||
FL_EXPORT void fl_draw(const char *str, int x, int y, int w, int h,
|
||||
Fl_Align align, Fl_Image *img = 0,
|
||||
int draw_symbols = 1, int gap = 0);
|
||||
int draw_symbols = 1, int spacing = 0);
|
||||
FL_EXPORT void fl_draw(const char *str, int x, int y, int w, int h, Fl_Align align,
|
||||
void (*callthis)(const char *, int, int, int),
|
||||
Fl_Image *img = 0, int draw_symbols = 1, int gap = 0);
|
||||
Fl_Image *img = 0, int draw_symbols = 1, int spacing = 0);
|
||||
|
||||
// boxtypes:
|
||||
|
||||
|
@ -113,6 +113,7 @@ void Fl_Choice::draw() {
|
||||
l.font = m.labelsize_ || m.labelfont_ ? m.labelfont_ : textfont();
|
||||
l.size = m.labelsize_ ? m.labelsize_ : textsize();
|
||||
l.color= m.labelcolor_ ? m.labelcolor_ : textcolor();
|
||||
l.spacing = 0;
|
||||
if (!m.active()) l.color = fl_inactive((Fl_Color)l.color);
|
||||
fl_draw_shortcut = 2; // hack value to make '&' disappear
|
||||
l.draw(xx+3, yy, ww>6 ? ww-6 : 0, hh, FL_ALIGN_LEFT);
|
||||
|
@ -261,6 +261,7 @@ int Fl_Menu_Item::measure(int* hp, const Fl_Menu_* m) const {
|
||||
l.font = labelsize_ || labelfont_ ? labelfont_ : (m ? m->textfont() : FL_HELVETICA);
|
||||
l.size = labelsize_ ? labelsize_ : m ? m->textsize() : FL_NORMAL_SIZE;
|
||||
l.color = FL_FOREGROUND_COLOR; // this makes no difference?
|
||||
l.spacing = 0;
|
||||
fl_draw_shortcut = 1;
|
||||
int w = 0; int h = 0;
|
||||
l.measure(w, hp ? *hp : h);
|
||||
@ -280,6 +281,7 @@ void Fl_Menu_Item::draw(int x, int y, int w, int h, const Fl_Menu_* m,
|
||||
l.font = labelsize_ || labelfont_ ? labelfont_ : (m ? m->textfont() : FL_HELVETICA);
|
||||
l.size = labelsize_ ? labelsize_ : m ? m->textsize() : FL_NORMAL_SIZE;
|
||||
l.color = labelcolor_ ? labelcolor_ : m ? m->textcolor() : int(FL_FOREGROUND_COLOR);
|
||||
l.spacing = 0;
|
||||
if (!active()) l.color = fl_inactive((Fl_Color)l.color);
|
||||
if (selected) {
|
||||
Fl_Color r = m ? m->selection_color() : FL_SELECTION_COLOR;
|
||||
|
@ -118,6 +118,7 @@ Fl_Widget::Fl_Widget(int X, int Y, int W, int H, const char* L) {
|
||||
label_.size = FL_NORMAL_SIZE;
|
||||
label_.color = FL_FOREGROUND_COLOR;
|
||||
label_.align_ = FL_ALIGN_CENTER;
|
||||
label_.spacing = 0;
|
||||
tooltip_ = 0;
|
||||
callback_ = default_callback;
|
||||
user_data_ = 0;
|
||||
|
@ -526,6 +526,7 @@ void Fl_Window::draw_backdrop() {
|
||||
l1.image = image();
|
||||
if (!active_r() && l1.image && l1.deimage) l1.image = l1.deimage;
|
||||
l1.type = labeltype();
|
||||
l1.spacing = 0;
|
||||
l1.draw(0,0,w(),h(),align());
|
||||
}
|
||||
}
|
||||
|
@ -209,7 +209,7 @@ void fl_draw(
|
||||
int x, int y, int w, int h, // bounding box
|
||||
Fl_Align align,
|
||||
void (*callthis)(const char*,int,int,int),
|
||||
Fl_Image* img, int draw_symbols, int gap)
|
||||
Fl_Image* img, int draw_symbols, int spacing)
|
||||
{
|
||||
char *linebuf = NULL; // Pointer to a buffer managed by expand_text_
|
||||
const char* p; // Scratch pointer into text, multiple use
|
||||
@ -258,7 +258,7 @@ void fl_draw(
|
||||
// Width and height of both symbols combined
|
||||
symtotal = symwidth[0] + symwidth[1];
|
||||
// Image width if image is to the left or right of the text, else 0
|
||||
imgtotal = (img && (align&FL_ALIGN_IMAGE_NEXT_TO_TEXT)) ? img->w() + gap : 0;
|
||||
imgtotal = (img && (align&FL_ALIGN_IMAGE_NEXT_TO_TEXT)) ? img->w() + spacing : 0;
|
||||
|
||||
int strw = 0; // Width of text only without symbols
|
||||
int strh; // Height of text only without symbols
|
||||
@ -289,7 +289,7 @@ void fl_draw(
|
||||
// Figure out vertical position of the first element
|
||||
int xpos; // Position of image or text
|
||||
int ypos; // Position of image or text
|
||||
int imgh = img && imgvert ? img->h() + gap : 0; // Height of image if image is above or below text
|
||||
int imgh = img && imgvert ? img->h() + spacing : 0; // Height of image if image is above or below text
|
||||
int imgw[2] = {0, 0}; // Width of image on the left and right side of the text
|
||||
|
||||
symoffset = 0;
|
||||
@ -316,14 +316,14 @@ void fl_draw(
|
||||
}
|
||||
|
||||
img->draw(xpos, ypos - height);
|
||||
ypos += img->h() + gap;
|
||||
ypos += img->h() + spacing;
|
||||
}
|
||||
|
||||
// Draw the image if either on the *left* or *right* side of the text
|
||||
if (img && !imgvert) {
|
||||
if (align & FL_ALIGN_TEXT_OVER_IMAGE) {
|
||||
// Image is to the right of the text
|
||||
imgw[1] = img->w() + gap;
|
||||
imgw[1] = img->w() + spacing;
|
||||
// Find the horizontal position of the image
|
||||
if (align & FL_ALIGN_LEFT) {
|
||||
xpos = x + symwidth[0] + strw + 1;
|
||||
@ -332,10 +332,10 @@ void fl_draw(
|
||||
} else {
|
||||
xpos = x + (w - strw - symtotal - imgw[1]) / 2 + symwidth[0] + strw + 1;
|
||||
}
|
||||
xpos += gap;
|
||||
xpos += spacing;
|
||||
} else {
|
||||
// Image is to the left of the text
|
||||
imgw[0] = img->w() + gap;
|
||||
imgw[0] = img->w() + spacing;
|
||||
// Find the horizontal position of the image
|
||||
if (align & FL_ALIGN_LEFT) {
|
||||
xpos = x + symwidth[0] - 1;
|
||||
@ -401,7 +401,7 @@ void fl_draw(
|
||||
xpos = x + (w - img->w() - symtotal) / 2 + symwidth[0];
|
||||
}
|
||||
|
||||
img->draw(xpos, ypos + gap);
|
||||
img->draw(xpos, ypos + spacing);
|
||||
}
|
||||
|
||||
// Draw the symbols, if any...
|
||||
@ -476,13 +476,13 @@ void fl_draw(
|
||||
Fl_Align align,
|
||||
Fl_Image* img,
|
||||
int draw_symbols,
|
||||
int gap)
|
||||
int spacing)
|
||||
{
|
||||
if ((!str || !*str) && !img) return;
|
||||
if (w && h && !fl_not_clipped(x, y, w, h) && (align & FL_ALIGN_INSIDE)) return;
|
||||
if (align & FL_ALIGN_CLIP)
|
||||
fl_push_clip(x, y, w, h);
|
||||
fl_draw(str, x, y, w, h, align, fl_draw, img, draw_symbols, gap);
|
||||
fl_draw(str, x, y, w, h, align, fl_draw, img, draw_symbols, spacing);
|
||||
if (align & FL_ALIGN_CLIP)
|
||||
fl_pop_clip();
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ fl_normal_label(const Fl_Label* o, int X, int Y, int W, int H, Fl_Align align)
|
||||
{
|
||||
fl_font(o->font, o->size);
|
||||
fl_color((Fl_Color)o->color);
|
||||
fl_draw(o->value, X, Y, W, H, align, o->image);
|
||||
fl_draw(o->value, X, Y, W, H, align, o->image, 1, o->spacing);
|
||||
}
|
||||
|
||||
void
|
||||
@ -44,11 +44,11 @@ fl_normal_measure(const Fl_Label* o, int& W, int& H) {
|
||||
if (o->align_ & FL_ALIGN_IMAGE_BACKDROP) { // backdrop: ignore
|
||||
// ignore backdrop image for calculation
|
||||
} else if (o->align_ & FL_ALIGN_IMAGE_NEXT_TO_TEXT) { // text and image side by side
|
||||
W += iw;
|
||||
W += iw + o->spacing;
|
||||
if (ih > H) H = ih;
|
||||
} else {
|
||||
if (iw > W) W = iw;
|
||||
H += ih;
|
||||
H += ih + o->spacing;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -32,6 +32,7 @@ Fl_Box *text;
|
||||
Fl_Input *input;
|
||||
Fl_Hor_Value_Slider *fonts;
|
||||
Fl_Hor_Value_Slider *sizes;
|
||||
Fl_Hor_Value_Slider *spacing;
|
||||
Fl_Double_Window *window;
|
||||
Fl_Pixmap *img;
|
||||
|
||||
@ -64,6 +65,11 @@ void font_cb(Fl_Widget *,void *) {
|
||||
window->redraw();
|
||||
}
|
||||
|
||||
void spacing_cb(Fl_Widget *,void *) {
|
||||
text->label_image_spacing(int(spacing->value()));
|
||||
window->redraw();
|
||||
}
|
||||
|
||||
void size_cb(Fl_Widget *,void *) {
|
||||
text->labelsize(int(sizes->value()));
|
||||
window->redraw();
|
||||
@ -114,9 +120,9 @@ Fl_Menu_Item choices[] = {
|
||||
int main(int argc, char **argv) {
|
||||
img = new Fl_Pixmap(blast_xpm);
|
||||
|
||||
window = new Fl_Double_Window(440,420);
|
||||
window = new Fl_Double_Window(440,445);
|
||||
|
||||
input = new Fl_Input(70,375,350,25,"Label:");
|
||||
input = new Fl_Input(70,400,350,25,"Label:");
|
||||
input->static_value("The quick brown fox jumped over the lazy dog.");
|
||||
input->when(FL_WHEN_CHANGED);
|
||||
input->callback(input_cb);
|
||||
@ -136,6 +142,13 @@ int main(int argc, char **argv) {
|
||||
fonts->value(0);
|
||||
fonts->callback(font_cb);
|
||||
|
||||
spacing=new Fl_Hor_Value_Slider(70,375,350,25,"Spacing:");
|
||||
spacing->align(FL_ALIGN_LEFT);
|
||||
spacing->bounds(0,100);
|
||||
spacing->step(1);
|
||||
spacing->value(0);
|
||||
spacing->callback(spacing_cb);
|
||||
|
||||
Fl_Group *g = new Fl_Group(70,275,350,50);
|
||||
imageb = new Fl_Toggle_Button(70,275,50,25,"image");
|
||||
imageb->callback(image_cb);
|
||||
|
Loading…
Reference in New Issue
Block a user