Commit: 01a3c9560938c98793a2d2a0b61e574ed5c27e4a
Author: Campbell Barton
Date:   Sat Nov 4 19:24:43 2017 +1100
Branches: master
https://developer.blender.org/rB01a3c9560938c98793a2d2a0b61e574ed5c27e4a

UI: tool-tip refactor, don't hard code field types

Allow other kinds of tips be created w/o exceeding hard limits.

===================================================================

M       source/blender/editors/interface/interface_region_tooltip.c

===================================================================

diff --git a/source/blender/editors/interface/interface_region_tooltip.c 
b/source/blender/editors/interface/interface_region_tooltip.c
index 49c6fff7fc0..ace1afb79aa 100644
--- a/source/blender/editors/interface/interface_region_tooltip.c
+++ b/source/blender/editors/interface/interface_region_tooltip.c
@@ -68,44 +68,66 @@
 #define UI_TIP_PADDING      (int)(UI_TIP_PAD_FAC * UI_UNIT_Y)
 #define UI_TIP_MAXWIDTH     600
 
-#define MAX_TOOLTIP_LINES 8
-typedef struct uiTooltipData {
-       rcti bbox;
-       uiFontStyle fstyle;
-       char lines[MAX_TOOLTIP_LINES][2048];
-       char header[2048], active_info[2048];
-       struct {
-               enum {
-                       UI_TIP_STYLE_NORMAL = 0,
-                       UI_TIP_STYLE_HEADER,
-                       UI_TIP_STYLE_MONO,
-               } style : 3;
-               enum {
-                       UI_TIP_LC_MAIN = 0,     /* primary text */
-                       UI_TIP_LC_VALUE,        /* the value of buttons (also 
shortcuts) */
-                       UI_TIP_LC_ACTIVE,       /* titles of active enum values 
*/
-                       UI_TIP_LC_NORMAL,       /* regular text */
-                       UI_TIP_LC_PYTHON,       /* Python snippet */
-                       UI_TIP_LC_ALERT,        /* description of why operator 
can't run */
-               } color_id : 4;
-               int is_pad : 1;
-       } format[MAX_TOOLTIP_LINES];
 
+typedef struct uiTooltipFormat {
+       enum {
+               UI_TIP_STYLE_NORMAL = 0,
+               UI_TIP_STYLE_HEADER,
+               UI_TIP_STYLE_MONO,
+       } style : 3;
+       enum {
+               UI_TIP_LC_MAIN = 0,     /* primary text */
+               UI_TIP_LC_VALUE,        /* the value of buttons (also 
shortcuts) */
+               UI_TIP_LC_ACTIVE,       /* titles of active enum values */
+               UI_TIP_LC_NORMAL,       /* regular text */
+               UI_TIP_LC_PYTHON,       /* Python snippet */
+               UI_TIP_LC_ALERT,        /* description of why operator can't 
run */
+       } color_id : 4;
+       int is_pad : 1;
+} uiTooltipFormat;
+
+typedef struct uiTooltipField {
+       char *text;
+       char *text_suffix;
        struct {
                uint x_pos;     /* x cursor position at the end of the last 
line */
                uint lines;     /* number of lines, 1 or more with word-wrap */
-       } line_geom[MAX_TOOLTIP_LINES];
+       } geom;
+       uiTooltipFormat format;
 
-       int wrap_width;
+} uiTooltipField;
 
-       int totline;
+#define MAX_TOOLTIP_LINES 8
+typedef struct uiTooltipData {
+       rcti bbox;
+       uiTooltipField *fields;
+       uint            fields_len;
+       uiFontStyle fstyle;
+       int wrap_width;
        int toth, lineh;
 } uiTooltipData;
 
 #define UI_TIP_LC_MAX 6
 
 BLI_STATIC_ASSERT(UI_TIP_LC_MAX == UI_TIP_LC_ALERT + 1, "invalid lc-max");
-BLI_STATIC_ASSERT(sizeof(((uiTooltipData *)NULL)->format[0]) <= sizeof(int), 
"oversize");
+BLI_STATIC_ASSERT(sizeof(uiTooltipFormat) <= sizeof(int), "oversize");
+
+static uiTooltipField *text_field_add_only(
+        uiTooltipData *data)
+{
+       data->fields_len += 1;
+       data->fields = MEM_recallocN(data->fields, sizeof(*data->fields) * 
data->fields_len);
+       return &data->fields[data->fields_len - 1];
+}
+
+static uiTooltipField *text_field_add(
+        uiTooltipData *data,
+        const uiTooltipFormat *format)
+{
+       uiTooltipField *field = text_field_add_only(data);
+       field->format = *format;
+       return field;
+}
 
 /* -------------------------------------------------------------------- */
 /** \name ToolTip Callbacks (Draw & Free)
@@ -187,12 +209,14 @@ static void ui_tooltip_region_draw_cb(const bContext 
*UNUSED(C), ARegion *ar)
        bbox.xmin += 0.5f * pad_px;  /* add padding to the text */
        bbox.ymax -= 0.25f * pad_px;
 
-       for (i = 0; i < data->totline; i++) {
-               bbox.ymin = bbox.ymax - (data->lineh * 
data->line_geom[i].lines);
-               if (data->format[i].style == UI_TIP_STYLE_HEADER) {
+       for (i = 0; i < data->fields_len; i++) {
+               const uiTooltipField *field = &data->fields[i];
+               const uiTooltipField *field_next = (i + 1) != data->fields_len 
? &data->fields[i + 1] : NULL;
+
+               bbox.ymin = bbox.ymax - (data->lineh * field->geom.lines);
+               if (field->format.style == UI_TIP_STYLE_HEADER) {
                        /* draw header and active data (is done here to be able 
to change color) */
                        uiFontStyle fstyle_header = data->fstyle;
-                       float xofs, yofs;
 
                        /* override text-style */
                        fstyle_header.shadow = 1;
@@ -203,23 +227,26 @@ static void ui_tooltip_region_draw_cb(const bContext 
*UNUSED(C), ARegion *ar)
 
                        UI_fontstyle_set(&fstyle_header);
                        glColor3fv(tip_colors[UI_TIP_LC_MAIN]);
-                       UI_fontstyle_draw(&fstyle_header, &bbox, data->header);
+                       UI_fontstyle_draw(&fstyle_header, &bbox, field->text);
 
-                       /* offset to the end of the last line */
-                       xofs = data->line_geom[i].x_pos;
-                       yofs = data->lineh * (data->line_geom[i].lines - 1);
-                       bbox.xmin += xofs;
-                       bbox.ymax -= yofs;
-
-                       glColor3fv(tip_colors[UI_TIP_LC_ACTIVE]);
                        fstyle_header.shadow = 0;
-                       UI_fontstyle_draw(&fstyle_header, &bbox, 
data->active_info);
 
-                       /* undo offset */
-                       bbox.xmin -= xofs;
-                       bbox.ymax += yofs;
+                       /* offset to the end of the last line */
+                       if (field->text_suffix) {
+                               float xofs = field->geom.x_pos;
+                               float yofs = data->lineh * (field->geom.lines - 
1);
+                               bbox.xmin += xofs;
+                               bbox.ymax -= yofs;
+
+                               glColor3fv(tip_colors[UI_TIP_LC_ACTIVE]);
+                               UI_fontstyle_draw(&fstyle_header, &bbox, 
field->text_suffix);
+
+                               /* undo offset */
+                               bbox.xmin -= xofs;
+                               bbox.ymax += yofs;
+                       }
                }
-               else if (data->format[i].style == UI_TIP_STYLE_MONO) {
+               else if (field->format.style == UI_TIP_STYLE_MONO) {
                        uiFontStyle fstyle_mono = data->fstyle;
                        fstyle_mono.uifont_id = blf_mono_font;
                        fstyle_mono.word_wrap = true;
@@ -227,23 +254,23 @@ static void ui_tooltip_region_draw_cb(const bContext 
*UNUSED(C), ARegion *ar)
                        UI_fontstyle_set(&fstyle_mono);
                        /* XXX, needed because we dont have mono in 'U.uifonts' 
*/
                        BLF_size(fstyle_mono.uifont_id, fstyle_mono.points * 
U.pixelsize, U.dpi);
-                       glColor3fv(tip_colors[data->format[i].color_id]);
-                       UI_fontstyle_draw(&fstyle_mono, &bbox, data->lines[i]);
+                       glColor3fv(tip_colors[field->format.color_id]);
+                       UI_fontstyle_draw(&fstyle_mono, &bbox, field->text);
                }
                else {
                        uiFontStyle fstyle_normal = data->fstyle;
-                       BLI_assert(data->format[i].style == 
UI_TIP_STYLE_NORMAL);
+                       BLI_assert(field->format.style == UI_TIP_STYLE_NORMAL);
                        fstyle_normal.word_wrap = true;
 
                        /* draw remaining data */
                        UI_fontstyle_set(&fstyle_normal);
-                       glColor3fv(tip_colors[data->format[i].color_id]);
-                       UI_fontstyle_draw(&fstyle_normal, &bbox, 
data->lines[i]);
+                       glColor3fv(tip_colors[field->format.color_id]);
+                       UI_fontstyle_draw(&fstyle_normal, &bbox, field->text);
                }
 
-               bbox.ymax -= data->lineh * data->line_geom[i].lines;
+               bbox.ymax -= data->lineh * field->geom.lines;
 
-               if ((i + 1 != data->totline) && data->format[i + 1].is_pad) {
+               if (field_next && field_next->format.is_pad) {
                        bbox.ymax -= data->lineh * (UI_TIP_PAD_FAC - 1);
                }
        }
@@ -260,6 +287,15 @@ static void ui_tooltip_region_free_cb(ARegion *ar)
        uiTooltipData *data;
 
        data = ar->regiondata;
+
+       for (int  i = 0; i < data->fields_len; i++) {
+               const uiTooltipField *field = &data->fields[i];
+               MEM_freeN(field->text);
+               if (field->text_suffix) {
+                       MEM_freeN(field->text_suffix);
+               }
+       }
+       MEM_freeN(data->fields);
        MEM_freeN(data);
        ar->regiondata = NULL;
 }
@@ -289,48 +325,63 @@ static uiTooltipData 
*ui_tooltip_data_from_button(bContext *C, uiBut *but)
 
        /* Tip */
        if (but_tip.strinfo) {
-               if (enum_label.strinfo) {
-                       BLI_snprintf(data->header, sizeof(data->header), "%s:  
", but_tip.strinfo);
-                       BLI_strncpy(data->active_info, enum_label.strinfo, 
sizeof(data->lines[0]));
-               }
-               else {
-                       BLI_snprintf(data->header, sizeof(data->header), "%s.", 
but_tip.strinfo);
+               {
+                       uiTooltipField *field = text_field_add(
+                               data, &(uiTooltipFormat){
+                                   .style = UI_TIP_STYLE_HEADER,
+                                   .color_id = UI_TIP_LC_NORMAL,
+                               });
+                       if (enum_label.strinfo) {
+                               field->text = BLI_sprintfN("%s:  ", 
but_tip.strinfo);
+                               field->text_suffix = 
BLI_strdup(enum_label.strinfo);
+                       }
+                       else {
+                               field->text = BLI_sprintfN("%s.", 
but_tip.strinfo);
+                       }
                }
-               data->format[data->totline].style = UI_TIP_STYLE_HEADER;
-               data->totline++;
 
                /* special case enum rna buttons */
                if ((but->type & UI_BTYPE_ROW) && but->rnaprop && 
RNA_property_flag(but->rnaprop) & PROP_ENUM_FLAG) {
-                       BLI_strncpy(data->lines[data->totline], 
IFACE_("(Shift-Click/Drag to select multiple)"),
-                                   sizeof(data->lines[0]));
-
-                       data->format[data->totline].color_id = UI_TIP_LC_NORMAL;
-                       data->totline++;
+                       uiTooltipField *field = text_field_add(
+                               data, &(uiTooltipFormat){
+                                   .style = UI_TIP_STYLE_NORMAL,
+                                   .color_id = UI_TIP_LC_NORMAL,
+                               });
+                       field->text = BLI_strdup(IFACE_("(Shift-Click/Drag to 
select multiple)"));
                }
 
        }
-       /* Enum item label & tip */
+       /* Enum field label & tip */
        if (enum_tip.strinfo) {
-               BLI_strncpy(data->lines[data->totline], enum_tip.strinfo, 
sizeof(data->lines[0]));
-               data->format[data->totline].is_pad = true;
-               data->format[data->totline].color_id = UI_TIP_LC_VALUE;
-               data->totline++;
+               uiTooltipField *field = text_field_add(
+                       data, &(uiTooltipFormat){
+                           .style = UI_TIP_STYLE_NORMAL,
+                           .color_id = UI_TIP_LC_VALUE,
+                           .is_pad = true,
+                       });
+               field->text = BLI_strdup(enum_tip.strinfo);
        }
 
        /* Op shortcut */
        if (op_keymap.strinfo) {
-               BLI_snprintf(data->lines[data->totline], 
sizeof(data->lines[0]), TIP_("Shortcut: %s"), op_keymap.strinfo);
-               data->format[data->totline].is_pad = true;
-               data->format[data->totline].color_id = UI_TIP_LC_VALUE;
-               data->totline++;
+               uiTooltipField *field = text_field_add(
+                       data, &(uiTooltipFormat){
+                           .style = UI_TIP_STYLE_NORMAL,
+                           .color_id = UI_TIP_LC_VALUE,
+                           .is_pad = true,
+                       });
+               field->text = BLI_sprintfN(TIP_("Shortcut: %s"), 
op_keymap.strinfo);
        }
 
        /* Property context-toggle shortcut */
        if (prop_keymap.strinfo) {
-               BLI_snprintf(data->lines[data->totline], 
sizeof(data->lines[0]), TIP_("Shortcut: %s"), prop_keymap.strinfo);
-               data->format[data->totline].is_pad = true;
-               data->format[data->totline].color_id = UI_TIP_LC_VALUE;
-               data->totline++;
+               uiTooltipField *field = text_field_add(
+                       data, &(uiTooltipFormat){
+                           .style = UI_TIP_STYLE_NORMAL,
+                           .color_id = UI_TIP_LC_VALUE,
+                           .is_pad = true,
+                   

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to