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:
Matthias Melcher 2024-08-14 01:45:20 +02:00
parent 325ac336c7
commit cfc54a3b19
9 changed files with 48 additions and 17 deletions

View File

@ -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*)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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