Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-08-31 07:37:10 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-08-31 07:37:10 +0300
commitb1ccb6ad25b82acf424e9c6130a6e83568a5d37e (patch)
tree12fe6321f7ad0a928963c1d99414a58f96bb7986 /source/blender/editors/interface
parent39ee0f01e3b340e9c39c9d95df6acdba27694337 (diff)
Tool System: support tool description for tips
When the description isn't set, the operators is used instead.
Diffstat (limited to 'source/blender/editors/interface')
-rw-r--r--source/blender/editors/interface/interface_region_tooltip.c119
1 files changed, 94 insertions, 25 deletions
diff --git a/source/blender/editors/interface/interface_region_tooltip.c b/source/blender/editors/interface/interface_region_tooltip.c
index 97f501b7448..ae6ab09a62a 100644
--- a/source/blender/editors/interface/interface_region_tooltip.c
+++ b/source/blender/editors/interface/interface_region_tooltip.c
@@ -67,6 +67,10 @@
#include "BLF_api.h"
#include "BLT_translation.h"
+#ifdef WITH_PYTHON
+# include "BPY_extern.h"
+#endif
+
#include "ED_screen.h"
#include "interface_intern.h"
@@ -306,13 +310,13 @@ static void ui_tooltip_region_free_cb(ARegion *ar)
/** \name ToolTip Creation
* \{ */
-static uiTooltipData *ui_tooltip_data_from_keymap(bContext *C, wmKeyMap *keymap)
+static bool ui_tooltip_data_append_from_keymap(
+ bContext *C, uiTooltipData *data,
+ wmKeyMap *keymap)
{
+ const int fields_len_init = data->fields_len;
char buf[512];
- /* create tooltip data */
- uiTooltipData *data = MEM_callocN(sizeof(uiTooltipData), "uiTooltipData");
-
for (wmKeyMapItem *kmi = keymap->items.first; kmi; kmi = kmi->next) {
wmOperatorType *ot = WM_operatortype_find(kmi->idname, true);
if (ot != NULL) {
@@ -341,7 +345,7 @@ static uiTooltipData *ui_tooltip_data_from_keymap(bContext *C, wmKeyMap *keymap)
}
/* Python */
- {
+ if (U.flag & USER_TOOLTIPS_PYTHON) {
uiTooltipField *field = text_field_add(
data, &(uiTooltipFormat){
.style = UI_TIP_STYLE_NORMAL,
@@ -354,6 +358,88 @@ static uiTooltipData *ui_tooltip_data_from_keymap(bContext *C, wmKeyMap *keymap)
}
}
}
+
+ return (fields_len_init != data->fields_len);
+}
+
+
+/**
+ * Special tool-system exception.
+ */
+static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but)
+{
+ if (but->optype == NULL) {
+ return NULL;
+ }
+
+ if (!STREQ(but->optype->idname, "WM_OT_tool_set_by_name")) {
+ return NULL;
+ }
+
+ char tool_name[MAX_NAME];
+ RNA_string_get(but->opptr, "name", tool_name);
+ BLI_assert(tool_name[0] != '\0');
+
+ /* We have a tool, now extract the info. */
+ uiTooltipData *data = MEM_callocN(sizeof(uiTooltipData), "uiTooltipData");
+
+#ifdef WITH_PYTHON
+ /* it turns out to be most simple to do this via Python since C
+ * doesn't have access to information about non-active tools.
+ */
+ char expr[256];
+
+ /* Tip */
+ {
+ SNPRINTF(
+ expr,
+ "__import__('bl_ui').space_toolsystem_common.description_from_name("
+ "__import__('bpy').context, "
+ "__import__('bpy').context.space_data.type, "
+ "'%s') + '.'",
+ tool_name);
+
+ char *expr_result = NULL;
+ if (BPY_execute_string_as_string(C, expr, true, &expr_result)) {
+ if (!STREQ(expr_result, ".")) {
+ uiTooltipField *field = text_field_add(
+ data, &(uiTooltipFormat){
+ .style = UI_TIP_STYLE_NORMAL,
+ .color_id = UI_TIP_LC_MAIN,
+ .is_pad = true,
+ });
+ field->text = expr_result;
+ }
+ else {
+ MEM_freeN(expr_result);
+ }
+ }
+ }
+
+ /* Keymap */
+
+ /* This is too handy not to expose somehow, let's be sneaky for now. */
+ if (CTX_wm_window(C)->eventstate->shift) {
+ SNPRINTF(
+ expr,
+ "getattr("
+ "__import__('bl_ui').space_toolsystem_common.keymap_from_name("
+ "__import__('bpy').context, "
+ "__import__('bpy').context.space_data.type, "
+ "'%s'), "
+ "'as_pointer', lambda: 0)()",
+ tool_name);
+
+ intptr_t expr_result = 0;
+ if (BPY_execute_string_as_intptr(C, expr, true, &expr_result)) {
+ if (expr_result != 0) {
+ wmKeyMap *keymap = (wmKeyMap *)expr_result;
+ ui_tooltip_data_append_from_keymap(C, data, keymap);
+ }
+ }
+ }
+#endif /* WITH_PYTHON */
+
if (data->fields_len == 0) {
MEM_freeN(data);
return NULL;
@@ -894,31 +980,14 @@ ARegion *UI_tooltip_create_from_button(bContext *C, ARegion *butregion, uiBut *b
}
uiTooltipData *data = NULL;
- /* custom tips for pre-defined operators */
- if (but->optype) {
- /* TODO(campbell): we now use 'WM_OT_tool_set_by_name', this logic will be moved into the status bar. */
- if (false && STREQ(but->optype->idname, "WM_OT_tool_set")) {
- char keymap[64] = "";
- RNA_string_get(but->opptr, "keymap", keymap);
- if (keymap[0]) {
- ScrArea *sa = CTX_wm_area(C);
- /* It happens in rare cases, for tooltips originated from the toolbar.
- * It is hard to reproduce, but it happens when the mouse is nowhere near the actual tool. */
- if (sa == NULL) {
- return NULL;
- }
- wmKeyMap *km = WM_keymap_find_all(C, keymap, sa->spacetype, RGN_TYPE_WINDOW);
- if (km != NULL) {
- data = ui_tooltip_data_from_keymap(C, km);
- }
- }
- }
+ if (data == NULL) {
+ data = ui_tooltip_data_from_tool(C, but);
}
- /* toolsystem exception */
if (data == NULL) {
data = ui_tooltip_data_from_button(C, but);
}
+
if (data == NULL) {
return NULL;
}