[Bf-blender-cvs] [8d0a3b5c1cb] soc-2020-custom-menus: Custom Menu : fix add to quick favorite and start property editor
TempoDev
noreply at git.blender.org
Fri Jul 31 03:40:04 CEST 2020
Commit: 8d0a3b5c1cbddff449e1a5918a76731d67b82f4b
Author: TempoDev
Date: Fri Jul 31 03:39:49 2020 +0200
Branches: soc-2020-custom-menus
https://developer.blender.org/rB8d0a3b5c1cbddff449e1a5918a76731d67b82f4b
Custom Menu : fix add to quick favorite and start property editor
===================================================================
M release/scripts/modules/rna_user_menus_ui.py
M source/blender/editors/include/ED_screen.h
M source/blender/editors/include/UI_interface.h
M source/blender/editors/interface/interface_context_menu.c
M source/blender/editors/interface/interface_templates.c
M source/blender/editors/screen/screen_user_menu.c
M source/blender/makesdna/DNA_userdef_types.h
M source/blender/makesrna/intern/rna_ui_api.c
M source/blender/makesrna/intern/rna_userdef.c
===================================================================
diff --git a/release/scripts/modules/rna_user_menus_ui.py b/release/scripts/modules/rna_user_menus_ui.py
index 749692b9cc2..1c94e1ea934 100644
--- a/release/scripts/modules/rna_user_menus_ui.py
+++ b/release/scripts/modules/rna_user_menus_ui.py
@@ -147,17 +147,18 @@ def draw_item_editor(context, row):
if (current.type == "OPERATOR"):
umi_op = current.get_operator()
col.prop(umi_op, "operator")
+ box = col.box()
+ box.template_user_menu_item_properties(umi_op)
if (current.type == "MENU"):
umi_pm = current.get_menu()
col.prop(umi_pm, "id_name", text="ID name")
else:
col.label(text="No item selected.")
-def draw_user_menu_preference_expanded(context, layout):
+def draw_user_menu_preference_expanded(context, layout, kmi):
prefs = context.preferences
um = prefs.user_menus
umg = um.active_group
- kmi = umg.keymap
layout.prop(kmi, "idname", text="")
layout.prop(kmi.properties, "index", text="")
@@ -174,11 +175,13 @@ def draw_user_menu_preference(context, layout):
row.prop(um, "expanded", text="", emboss=False)
- row.prop(umg, "name")
- pie_text = "List"
- if umg.is_pie:
- pie_text = "Pie"
- row.prop(umg, "is_pie", text=pie_text, toggle=True)
+ qf = um.menus[0]
+ if umg != qf:
+ row.prop(umg, "name")
+ pie_text = "List"
+ if umg.is_pie:
+ pie_text = "Pie"
+ row.prop(umg, "is_pie", text=pie_text, toggle=True)
row.prop(kmi, "map_type", text="")
map_type = kmi.map_type
@@ -199,7 +202,7 @@ def draw_user_menu_preference(context, layout):
if um.expanded:
box = col.box()
- draw_user_menu_preference_expanded(context=context, layout=box)
+ draw_user_menu_preference_expanded(context=context, layout=box, kmi=kmi)
def menu_id(context, umg):
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index c0226895ca8..8226672fc83 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -383,7 +383,7 @@ struct bUserMenu **ED_screen_user_menus_find_menu(const struct bContext *C,
uint *r_len,
struct bUserMenusGroup *umg);
struct bUserMenu **ED_screen_user_menus_find(const struct bContext *C, uint *r_len, int id);
-struct bUserMenu *ED_screen_user_menu_ensure(struct bContext *C);
+struct bUserMenu *ED_screen_user_menu_ensure(struct bContext *C, int id);
struct bUserMenuItem_Op *ED_screen_user_menu_item_find_operator(struct ListBase *lb,
const struct wmOperatorType *ot,
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 2c42f3a5071..0731c1e9ec3 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -2121,6 +2121,7 @@ void uiTemplateCacheFile(uiLayout *layout,
const struct bContext *C,
struct PointerRNA *ptr,
const char *propname);
+void uiTemplateUserMenuItemProperties(uiLayout *layout, PointerRNA *ptr);
/* Default UIList class name, keep in sync with its declaration in bl_ui/__init__.py */
#define UI_UL_DEFAULT_CLASS_NAME "UI_UL_list"
diff --git a/source/blender/editors/interface/interface_context_menu.c b/source/blender/editors/interface/interface_context_menu.c
index 79a6d7198ff..2af1bf4cc42 100644
--- a/source/blender/editors/interface/interface_context_menu.c
+++ b/source/blender/editors/interface/interface_context_menu.c
@@ -451,7 +451,7 @@ static void ui_but_user_menu_add(bContext *C, uiBut *but, bUserMenu *um)
static void popup_user_menu_add_or_replace_func(bContext *C, void *arg1, void *UNUSED(arg2))
{
uiBut *but = arg1;
- bUserMenu *um = ED_screen_user_menu_ensure(C);
+ bUserMenu *um = ED_screen_user_menu_ensure(C, 0);
U.runtime.is_dirty = true;
ui_but_user_menu_add(C, but, um);
}
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index d3487b635ce..babeb64870b 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -7402,3 +7402,83 @@ void uiTemplateFileSelectPath(uiLayout *layout, bContext *C, FileSelectParams *p
}
/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Keymap Template
+ * \{ */
+
+static void template_user_menu_item_properties(uiLayout *layout,
+ const char *title,
+ PointerRNA *ptr)
+{
+ uiLayout *flow, *box, *row;
+
+ uiItemS(layout);
+
+ if (title) {
+ uiItemL(layout, title, ICON_NONE);
+ }
+
+ flow = uiLayoutColumnFlow(layout, 2, false);
+
+ int i = 0;
+ RNA_STRUCT_BEGIN_SKIP_RNA_TYPE (ptr, prop) {
+ const bool is_set = RNA_property_is_set(ptr, prop);
+ uiBut *but;
+
+ // recurse for nested properties
+ if (RNA_property_type(prop) == PROP_POINTER) {
+ PointerRNA propptr = RNA_property_pointer_get(ptr, prop);
+
+ if (propptr.data && RNA_struct_is_a(propptr.type, &RNA_OperatorProperties)) {
+ const char *name = RNA_property_ui_name(prop);
+ template_user_menu_item_properties(layout, name, &propptr);
+ continue;
+ }
+ }
+
+ box = uiLayoutBox(flow);
+ uiLayoutSetActive(box, is_set);
+ row = uiLayoutRow(box, false);
+
+ // property value
+ uiItemFullR(row, ptr, prop, -1, 0, 0, NULL, ICON_NONE);
+
+ if (is_set) {
+ // unset operator
+ uiBlock *block = uiLayoutGetBlock(row);
+ UI_block_emboss_set(block, UI_EMBOSS_NONE);
+ but = uiDefIconButO(block,
+ UI_BTYPE_BUT,
+ "UI_OT_unset_property_button",
+ WM_OP_EXEC_DEFAULT,
+ ICON_X,
+ 0,
+ 0,
+ UI_UNIT_X,
+ UI_UNIT_Y,
+ NULL);
+ but->rnapoin = *ptr;
+ but->rnaprop = prop;
+ UI_block_emboss_set(block, UI_EMBOSS);
+ }
+ if (i >= 6)
+ break;
+ i++;
+ }
+ RNA_STRUCT_END;
+}
+
+void uiTemplateUserMenuItemProperties(uiLayout *layout, PointerRNA *ptr)
+{
+ PointerRNA propptr = RNA_pointer_get(ptr, "prop");
+
+ if (propptr.data) {
+ uiBut *but = uiLayoutGetBlock(layout)->buttons.last;
+
+ WM_operator_properties_sanitize(&propptr, false);
+ template_user_menu_item_properties(layout, NULL, &propptr);
+ }
+}
+
+/** \} */
\ No newline at end of file
diff --git a/source/blender/editors/screen/screen_user_menu.c b/source/blender/editors/screen/screen_user_menu.c
index ddc3360de84..b1c213761b6 100644
--- a/source/blender/editors/screen/screen_user_menu.c
+++ b/source/blender/editors/screen/screen_user_menu.c
@@ -110,14 +110,19 @@ bUserMenu **ED_screen_user_menus_find_menu(const bContext *C, uint *r_len, bUser
bUserMenu **ED_screen_user_menus_find(const bContext *C, uint *r_len, int id)
{
bUserMenusGroup *umg = ED_screen_user_menus_group_find(id);
+ if (!umg)
+ return NULL;
return ED_screen_user_menus_find_menu(C, r_len, umg);
}
-bUserMenu *ED_screen_user_menu_ensure(bContext *C)
+bUserMenu *ED_screen_user_menu_ensure(bContext *C, int id)
{
+ bUserMenusGroup *umg = ED_screen_user_menus_group_find(id);
+ if (!umg)
+ return NULL;
SpaceLink *sl = CTX_wm_space_data(C);
const char *context = screen_menu_context_string(C, sl);
- return BKE_blender_user_menu_ensure(&U.user_menus, sl->spacetype, context);
+ return BKE_blender_user_menu_ensure(&umg->menus, sl->spacetype, context);
}
/** \} */
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index e076a3d7df3..ad92b02534c 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -551,6 +551,7 @@ typedef struct bUserMenuItem_Op {
bUserMenuItem item;
char op_idname[64];
struct IDProperty *prop;
+ struct PointerRNA *ptr;
char opcontext;
char _pad0[7];
} bUserMenuItem_Op;
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index 8dfa54b95da..8a85b924505 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -1639,6 +1639,12 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_property_ui_text(parm, "Item", "");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
api_ui_item_common_text(func);
+
+ /* User menu template */
+ func = RNA_def_function(
+ srna, "template_user_menu_item_properties", "uiTemplateUserMenuItemProperties");
+ parm = RNA_def_pointer(func, "item", "um_item_op", "", "");
+ RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 86a27c61095..3d413548a9d 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -1494,15 +1494,10 @@ static void rna_UserDef_usermenus_item_op_set(PointerRNA *ptr, const char *value
if (origin_ot == ot || ot == NULL)
return;
- struct PointerRNA *opptr = MEM_callocN(sizeof(PointerRNA), "uiButOpPtr");
- WM_operator_properties_create_ptr(opptr, ot);
- WM_operator_properties_default(opptr, false);
-
- IDProperty *properties = opptr->data;
- umi_op->prop = properties;
-
BLI_strncpy(umi_op->op_idname, value, FILE_MAX);
- free(opptr);
+ umi_op->prop = NULL;
+ WM_operator_properties_alloc(&(umi_op->ptr), &(umi_op->prop), umi_op->op_idname);
+ WM_operator_properties_sanitize(umi_op->ptr, 1);
}
static void rna_UserDef_usermenu_draw(UserDef *UNUSED(userdef),
More information about the Bf-blender-cvs
mailing list