[Bf-blender-cvs] [c662090] master: Tooltips: abbreviate long python operator tooltips

Walid Shouman noreply at git.blender.org
Mon Dec 9 04:25:20 CET 2013


Commit: c6620905a7c812aefac128f95960a38123b5af38
Author: Walid Shouman
Date:   Mon Dec 9 14:20:53 2013 +1100
http://developer.blender.org/rBc6620905a7c812aefac128f95960a38123b5af38

Tooltips: abbreviate long python operator tooltips

Some tooltips would end up containing long string/array args spanning the screen.

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

M	source/blender/editors/interface/interface_regions.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_operators.c

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

diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 4566746..bb8da28 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -541,6 +541,9 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
 
 		str = WM_operator_pystring_ex(C, NULL, false, false, but->optype, opptr);
 
+		/* avoid overly verbose tips (eg, arrays of 20 layers), exact limit is arbitrary */
+		WM_operator_pystring_abbreviate(str, 32);
+
 		/* operator info */
 		if ((U.flag & USER_TOOLTIPS_PYTHON) == 0) {
 			BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), TIP_("Python: %s"), str);
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 26294dd..d8f558b 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -278,6 +278,7 @@ char		*WM_operator_pystring_ex(struct bContext *C, struct wmOperator *op,
                                      struct wmOperatorType *ot, struct PointerRNA *opptr);
 char		*WM_operator_pystring(struct bContext *C, struct wmOperator *op,
                                   const bool all_args, const bool macro_args);
+bool         WM_operator_pystring_abbreviate(char *str, int str_len_max);
 char		*WM_prop_pystring_assign(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int index);
 void		WM_operator_bl_idname(char *to, const char *from);
 void		WM_operator_py_idname(char *to, const char *from);
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 91790f7..ac32d16 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -611,6 +611,47 @@ char *WM_operator_pystring(bContext *C, wmOperator *op,
 	return WM_operator_pystring_ex(C, op, all_args, macro_args, op->type, op->ptr);
 }
 
+
+/**
+ * \return true if the string was shortened
+ */
+bool WM_operator_pystring_abbreviate(char *str, int str_len_max)
+{
+	const int str_len = strlen(str);
+	const char *parens_start = strchr(str, '(');
+
+	if (parens_start) {
+		const int parens_start_pos = parens_start - str;
+		const char *parens_end = strrchr(parens_start + 1, ')');
+
+		if (parens_end) {
+			const int parens_len = parens_end - parens_start;
+
+			if (parens_len > str_len_max) {
+				const char *comma_first = strchr(parens_start, ',');
+
+				/* truncate after the first comma */
+				if (comma_first) {
+					const char end_str[] = " ... )";
+					const int end_str_len = sizeof(end_str) - 1;
+
+					/* leave a place for the first argument*/
+					const int new_str_len = (comma_first - parens_start) + 1;
+
+					if (str_len >= new_str_len + parens_start_pos + end_str_len + 1) {
+						/* append " ... )" to the string after the comma */
+						memcpy(str + new_str_len + parens_start_pos, end_str, end_str_len + 1);
+
+						return true;
+					}
+				}
+			}
+		}
+	}
+
+	return false;
+}
+
 /* return NULL if no match is found */
 #if 0
 static char *wm_prop_pystring_from_context(bContext *C, PointerRNA *ptr, PropertyRNA *prop, int index)




More information about the Bf-blender-cvs mailing list