Commit: 5b364dd780b9e97b686409907dddee5caaccf9c2
Author: Campbell Barton
Date:   Wed Dec 20 16:40:53 2017 +1100
Branches: blender2.8
https://developer.blender.org/rB5b364dd780b9e97b686409907dddee5caaccf9c2

Manipulator: tooltip support

Currently operators and properties are used.

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

M       source/blender/editors/include/UI_interface.h
M       source/blender/editors/interface/interface_region_tooltip.c
M       source/blender/windowmanager/intern/wm_event_system.c
M       source/blender/windowmanager/manipulators/WM_manipulator_api.h
M       source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
M       source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c

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

diff --git a/source/blender/editors/include/UI_interface.h 
b/source/blender/editors/include/UI_interface.h
index 8fc455e446f..c94a890b357 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -73,6 +73,7 @@ struct bNodeSocket;
 struct wmDropBox;
 struct wmDrag;
 struct wmEvent;
+struct wmManipulator;
 struct wmMsgBus;
 
 typedef struct uiBut uiBut;
@@ -1137,6 +1138,7 @@ void UI_butstore_unregister(uiButStore *bs_handle, uiBut 
**but_p);
 
 /* ui_interface_region_tooltip.c */
 struct ARegion *UI_tooltip_create_from_button(struct bContext *C, struct 
ARegion *butregion, uiBut *but);
+struct ARegion *UI_tooltip_create_from_manipulator(struct bContext *C, struct 
wmManipulator *mpr);
 void UI_tooltip_free(struct bContext *C, struct ARegion *ar);
 
 /* How long before a tool-tip shows. */
diff --git a/source/blender/editors/interface/interface_region_tooltip.c 
b/source/blender/editors/interface/interface_region_tooltip.c
index bdc13f58226..3ff3e7d7a21 100644
--- a/source/blender/editors/interface/interface_region_tooltip.c
+++ b/source/blender/editors/interface/interface_region_tooltip.c
@@ -620,6 +620,112 @@ static uiTooltipData 
*ui_tooltip_data_from_button(bContext *C, uiBut *but)
        }
 }
 
+static uiTooltipData *ui_tooltip_data_from_manipulator(bContext *C, 
wmManipulator *mpr)
+{
+       uiTooltipData *data = MEM_callocN(sizeof(uiTooltipData), 
"uiTooltipData");
+
+       /* TODO(campbell): a way for manipulators to have their own 
descriptions (low priority). */
+
+       /* Operator Actions */
+       {
+               bool use_drag = mpr->drag_part != -1 && mpr->highlight_part != 
mpr->drag_part;
+
+               const struct {
+                       int part;
+                       const char *prefix;
+               } mpop_actions[] = {
+                       {
+                               .part = mpr->highlight_part,
+                               .prefix = use_drag ? TIP_("Click") : NULL,
+                       }, {
+                               .part = use_drag ? mpr->drag_part : -1,
+                               .prefix = use_drag ? TIP_("Drag") : NULL,
+                       },
+               };
+
+               for (int i = 0; i < ARRAY_SIZE(mpop_actions); i++) {
+                       wmManipulatorOpElem *mpop = (mpop_actions[i].part != 
-1) ? WM_manipulator_operator_get(mpr, mpop_actions[i].part) : NULL;
+                       if (mpop != NULL) {
+                               /* Description */
+                               const char *info = 
RNA_struct_ui_description(mpop->type->srna);
+                               if (!(info && info[0])) {
+                                       info  = 
RNA_struct_ui_name(mpop->type->srna);
+                               }
+
+                               if (info && info[0]) {
+                                       char *text = NULL;
+                                       if (mpop_actions[i].prefix != NULL) {
+                                               text = BLI_sprintfN("%s: %s", 
mpop_actions[i].prefix, info);
+                                       }
+                                       else {
+                                               text = BLI_strdup(info);
+                                       }
+
+                                       if (text != NULL) {
+                                               uiTooltipField *field = 
text_field_add(
+                                                       data, 
&(uiTooltipFormat){
+                                                           .style = 
UI_TIP_STYLE_HEADER,
+                                                           .color_id = 
UI_TIP_LC_VALUE,
+                                                           .is_pad = true,
+                                                       });
+                                               field->text = text;
+                                       }
+                               }
+
+                               /* Shortcut */
+                               {
+                                       bool found = false;
+                                       IDProperty *prop = mpop->ptr.data;
+                                       char buf[128];
+                                       if (WM_key_event_operator_string(
+                                                   C, mpop->type->idname, 
WM_OP_INVOKE_DEFAULT, prop, true,
+                                                   buf, ARRAY_SIZE(buf)))
+                                       {
+                                               found = true;
+                                       }
+                                       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"), found ? buf : "None");
+                               }
+                       }
+               }
+       }
+
+       /* Property Actions */
+       if (mpr->type->target_property_defs_len) {
+               wmManipulatorProperty *mpr_prop_array = 
WM_manipulator_target_property_array(mpr);
+               for (int i = 0; i < mpr->type->target_property_defs_len; i++) {
+                       /* TODO(campbell): function callback descriptions. */
+                       wmManipulatorProperty *mpr_prop = &mpr_prop_array[i];
+                       if (mpr_prop->prop != NULL) {
+                               const char *info = 
RNA_property_ui_description(mpr_prop->prop);
+                               if (info && info[0]) {
+                                       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(info);
+                               }
+                       }
+               }
+       }
+
+       if (data->fields_len == 0) {
+               MEM_freeN(data);
+               return NULL;
+       }
+       else {
+               return data;
+       }
+}
+
+
 static ARegion *ui_tooltip_create_with_data(
         bContext *C, uiTooltipData *data,
         const float init_position[2],
@@ -827,6 +933,23 @@ ARegion *UI_tooltip_create_from_button(bContext *C, 
ARegion *butregion, uiBut *b
        return ui_tooltip_create_with_data(C, data, init_position, aspect);
 }
 
+ARegion *UI_tooltip_create_from_manipulator(bContext *C, wmManipulator *mpr)
+{
+       wmWindow *win = CTX_wm_window(C);
+       const float aspect = 1.0f;
+       float init_position[2];
+
+       uiTooltipData *data = ui_tooltip_data_from_manipulator(C, mpr);
+       if (data == NULL) {
+               return NULL;
+       }
+
+       init_position[0] = win->eventstate->x;
+       init_position[1] = win->eventstate->y;
+
+       return ui_tooltip_create_with_data(C, data, init_position, aspect);
+}
+
 void UI_tooltip_free(bContext *C, ARegion *ar)
 {
        ui_region_temp_remove(C, CTX_wm_screen(C), ar);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c 
b/source/blender/windowmanager/intern/wm_event_system.c
index b1ec1c009df..d50788063e2 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -2251,13 +2251,32 @@ static int wm_handlers_do_intern(bContext *C, wmEvent 
*event, ListBase *handlers
                                wm_manipulatormap_handler_context(C, handler);
                                wm_region_mouse_co(C, event);
 
+                               if (event->type == MOUSEMOVE) {
+                                       WM_manipulatormap_tooltip_clear(C, 
mmap);
+                               }
+
                                /* handle manipulator highlighting */
                                if (event->type == MOUSEMOVE && 
!wm_manipulatormap_modal_get(mmap)) {
                                        int part;
                                        mpr = 
wm_manipulatormap_highlight_find(mmap, C, event, &part);
                                        wm_manipulatormap_highlight_set(mmap, 
C, mpr, part);
+                                       if (mpr != NULL) {
+                                               
WM_manipulatormap_tooltip_timer_init(C, mmap);
+                                       }
                                }
                                /* handle user configurable manipulator-map 
keymap */
+                               else if ((event->type == TIMER) &&
+                                        (event->customdata == 
WM_manipulatormap_tooltip_timer_get(mmap)))
+                               {
+                                       if (mpr) {
+                                               if (mpr->state & 
WM_MANIPULATOR_STATE_MODAL) {
+                                                       
WM_manipulatormap_tooltip_clear(C, mmap);
+                                               }
+                                               else {
+                                                       
WM_manipulatormap_tooltip_create(C, mmap);
+                                               }
+                                       }
+                               }
                                else {
                                        /* Either we operate on a single 
highlighted item
                                         * or groups attached to the selected 
manipulators.
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h 
b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
index 9214bccb6a0..7a31f4e6f1f 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
@@ -259,6 +259,15 @@ bool WM_manipulatormap_minmax(
         const struct wmManipulatorMap *mmap, bool use_hidden, bool use_select,
         float r_min[3], float r_max[3]);
 
+void WM_manipulatormap_tooltip_create(
+        struct bContext *C, struct wmManipulatorMap *mmap);
+void WM_manipulatormap_tooltip_clear(
+        struct bContext *C, struct wmManipulatorMap *mmap);
+void WM_manipulatormap_tooltip_timer_init(
+        struct bContext *C, struct wmManipulatorMap *mmap);
+const void *WM_manipulatormap_tooltip_timer_get(
+        struct wmManipulatorMap *mmap);
+
 /* -------------------------------------------------------------------- */
 /* wmManipulatorMapType */
 
diff --git 
a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h 
b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
index 419ac7d5521..fc814adaef1 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
@@ -115,6 +115,9 @@ struct wmManipulatorMap {
                /* cursor location at point of entering modal (see: 
WM_MANIPULATOR_GRAB_CURSOR) */
                int event_xy[2];
                short event_grabcursor;
+
+               struct ARegion *tooltip;
+               struct wmTimer *tooltip_timer;
        } mmap_context;
 };
 
diff --git 
a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c 
b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c
index 7e4d4f16646..ab7b4688d49 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c
@@ -51,6 +51,9 @@
 #include "WM_types.h"
 #include "wm_event_system.h"
 
+/* for tool-tips */
+#include "UI_interface.h"
+
 #include "DEG_depsgraph.h"
 
 /* own includes */
@@ -888,6 +891,8 @@ void wm_manipulatormap_modal_set(
                BLI_assert(mmap->mmap_context.modal == NULL);
                wmWindow *win = CTX_wm_window(C);
 
+               WM_manipulatormap_tooltip_clear(C, mmap);
+
                /* For now only grab cursor for 3D manipulators. */
                int retval = OPERATOR_RUNNING_MODAL;
 
@@ -996,6 +1001,54 @@ void WM_manipulatormap_message_subscribe(
 /** \} */ /* wmManipulatorMap */
 
 
+/* -------------------------------------------------------------------- */
+/** \name Tooltip Handling
+ *
+ * \{ */
+
+
+void WM_manipulatormap_tooltip_create(
+        bContext *C, wmManipulatorMap *mmap)
+{
+       WM_manipulatormap_tooltip_clear(C, mmap);
+       if (mmap->mmap_context.highlight) {
+               mmap->mmap_context.tooltip = 
UI_tooltip_create_from_manipulator(C, mmap->mmap_context.highlight);
+       }
+}
+
+void WM_manipulatormap_tooltip_clear(
+        bContext *C, wmManipulatorMap *mmap)
+{
+       if (mmap->mmap_context.tooltip_timer != NULL) {
+               wmWindowManager *wm = CTX_wm_manager(C);
+               wmWindow *win = CTX_wm_window(C);
+               WM_event_remove_timer(wm, win, 
mmap->mmap_context.tooltip_timer);
+               mmap->mmap_context.tooltip_timer = NULL;
+       }
+       if (mmap->mmap_context.tooltip != NULL) {
+               UI_tooltip_free(C, mmap->mmap_context.tooltip);
+               mmap->mmap_context.tooltip = NULL;
+       }
+}
+
+void WM_manipulatormap_tooltip_timer_init(
+        bContext *C, wmManipulatorMap *mmap)
+{
+       if (mmap->mmap_context.tooltip_timer == NULL) {
+               wmWindowMan

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