From 87c1c8112fa44ccb94a3e996b7499d6577d85d7f Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Tue, 13 Jul 2021 15:01:00 +0200 Subject: UI: Support UI list tooltips, defined via Python scripts Makes it possible to create tooltips for UI list rows, which can be filled in .py scripts, similar to how they can extend other menus. This is used by the (to be committed) Pose Library add-on to display pose operations (selecting bones of a pose, blending a pose, etc). It's important that the Python scripts check if the UI list is the correct one by checking the list ID. For this to work, a new `bpy.context.ui_list` can be checked. For example, the Pose Library add-on does the following check: ``` def is_pose_asset_view() -> bool: # Important: Must check context first, or the menu is added for every kind of list. list = getattr(context, "ui_list", None) if not list or list.bl_idname != "UI_UL_asset_view" or list.list_id != "pose_assets": return False if not context.asset_handle: return False return True ``` --- source/blender/windowmanager/WM_api.h | 1 + source/blender/windowmanager/intern/wm_uilist_type.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) (limited to 'source/blender/windowmanager') diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 601db427381..c529fef73ef 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -624,6 +624,7 @@ void WM_uilisttype_free(void); void WM_uilisttype_to_full_list_id(const struct uiListType *ult, const char *list_id, char *r_ui_list_id); +const char *WM_uilisttype_list_id_get(const struct uiListType *ult, struct uiList *list); /* wm_menu_type.c */ void WM_menutype_init(void); diff --git a/source/blender/windowmanager/intern/wm_uilist_type.c b/source/blender/windowmanager/intern/wm_uilist_type.c index 434131903fc..6d298ee63f1 100644 --- a/source/blender/windowmanager/intern/wm_uilist_type.c +++ b/source/blender/windowmanager/intern/wm_uilist_type.c @@ -21,6 +21,7 @@ */ #include +#include #include "BLI_sys_types.h" @@ -109,3 +110,16 @@ void WM_uilisttype_to_full_list_id(const uiListType *ult, /* We tag the list id with the list type... */ BLI_snprintf(r_full_list_id, UI_MAX_NAME_STR, "%s_%s", ult->idname, list_id ? list_id : ""); } + +/** + * Get the "non-full" list-ID, see #WM_uilisttype_to_full_list_id() for details. + * + * \note Assumes `uiList.list_id` was set using #WM_uilisttype_to_full_list_id()! + */ +const char *WM_uilisttype_list_id_get(const uiListType *ult, uiList *list) +{ + /* Some sanity check for the assumed behavior of #WM_uilisttype_to_full_list_id(). */ + BLI_assert((list->list_id + strlen(ult->idname))[0] == '_'); + /* +1 to skip the '_' */ + return list->list_id + strlen(ult->idname) + 1; +} -- cgit v1.2.3