[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