[Bf-blender-cvs] [1e689098004] soc-2020-custom-menus: Custom Menus : Add icon edition

TempoDev noreply at git.blender.org
Sun Aug 2 22:33:36 CEST 2020


Commit: 1e689098004704fcf112909b37db0fc3d2b9ed4a
Author: TempoDev
Date:   Sun Aug 2 22:33:24 2020 +0200
Branches: soc-2020-custom-menus
https://developer.blender.org/rB1e689098004704fcf112909b37db0fc3d2b9ed4a

Custom Menus : Add icon edition

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

M	release/scripts/modules/rna_user_menus_ui.py
M	release/scripts/startup/bl_operators/userpref.py
M	source/blender/blenkernel/intern/blender_user_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_userdef.c

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

diff --git a/release/scripts/modules/rna_user_menus_ui.py b/release/scripts/modules/rna_user_menus_ui.py
index f6b2effa026..7277ea54e35 100644
--- a/release/scripts/modules/rna_user_menus_ui.py
+++ b/release/scripts/modules/rna_user_menus_ui.py
@@ -68,7 +68,9 @@ def draw_button(context, box, item, index):
     row = col.row(align=True)
     if item.type == "SEPARATOR":
         name = "___________"
-    row.prop(item, "is_selected", text=name, toggle=1)
+    icons = bpy.types.UILayout.bl_rna.functions["prop"].parameters["icon"].enum_items.keys()
+    selected_icon = icons[item.icon]
+    row.prop(item, "is_selected", icon=selected_icon, text=name, toggle=1)
     if item.type == "SUBMENU":
         sm = item.get_submenu()
         if um.active_group.is_pie and index >= 0:
@@ -144,6 +146,12 @@ def draw_item_editor(context, row):
     elif current:
         col.prop(current, "type")
         if (current.type != "SEPARATOR"):
+            rowsub = col.row(align=True)
+            icons = bpy.types.UILayout.bl_rna.functions["prop"].parameters["icon"].enum_items.keys()
+            current.icon_name = icons[current.icon]
+            rowsub.operator("preferences.icon_change", text="", icon='TRIA_LEFT').value = -1
+            rowsub.prop(current, "icon_name", text="")
+            rowsub.operator("preferences.icon_change", text="", icon='TRIA_RIGHT').value = 1
             col.prop(current, "name")
         if (current.type == "OPERATOR"):
             umi_op = current.get_operator()
@@ -200,8 +208,7 @@ def draw_user_menu_preference(context, layout):
     kmi = get_keymap(context, -1, False)
     map_type = None
 
-    col = _indented_layout(layout, 0)
-    box = col.box()
+    box = layout.box()
     row = box.row()
 
     row.prop(um, "expanded", text="", emboss=False)
@@ -274,11 +281,12 @@ def draw_user_menus(context, layout):
     #rowsub.operator("preferences.keyconfig_export", text="", icon='EXPORT')
 
     row = layout.row()
+    row.separator()
 
-    layout.separator()
     draw_user_menu_preference(context=context, layout=row)
 
     row = layout.row()
+    row.separator()
 
     if um.active_group.is_pie:
         draw_pie(context=context, row=row)
@@ -286,5 +294,5 @@ def draw_user_menus(context, layout):
         draw_item_box(context=context, row=row)
     draw_item_editor(context=context, row=row)
 
-    layout.separator()
+    row.separator()
 
diff --git a/release/scripts/startup/bl_operators/userpref.py b/release/scripts/startup/bl_operators/userpref.py
index 73179e302fc..5b81d5d25fc 100644
--- a/release/scripts/startup/bl_operators/userpref.py
+++ b/release/scripts/startup/bl_operators/userpref.py
@@ -1334,6 +1334,23 @@ class PREFERENCES_OT_pie_menuitem_add(Operator):
         context.preferences.is_dirty = True
         return {'FINISHED'}
 
+class PREFERENCES_OT_icon_change(Operator):
+    """change user menu item icon"""
+    bl_idname = "preferences.icon_change"
+    bl_label = "Change User Menu Item Icon"
+
+    value: IntProperty()
+
+    def execute(self, context):
+        prefs = context.preferences
+        um = prefs.user_menus
+        item = um.active_item
+        icons = bpy.types.UILayout.bl_rna.functions["prop"].parameters["icon"].enum_items.keys()
+
+        item.icon = item.icon + self.value
+        item.icon_name = icons[item.icon]
+        return {'FINISHED'}
+
 classes = (
     PREFERENCES_OT_addon_disable,
     PREFERENCES_OT_addon_enable,
@@ -1367,4 +1384,5 @@ classes = (
     PREFERENCES_OT_menuitem_up,
     PREFERENCES_OT_menuitem_down,
     PREFERENCES_OT_pie_menuitem_add,
+    PREFERENCES_OT_icon_change,
 )
diff --git a/source/blender/blenkernel/intern/blender_user_menu.c b/source/blender/blenkernel/intern/blender_user_menu.c
index dd0f72a6383..f8982e58e2a 100644
--- a/source/blender/blenkernel/intern/blender_user_menu.c
+++ b/source/blender/blenkernel/intern/blender_user_menu.c
@@ -108,6 +108,7 @@ bUserMenuItem *BKE_blender_user_menu_item_add(ListBase *lb, int type)
 
   bUserMenuItem *umi = MEM_callocN(size, __func__);
   umi->type = type;
+  umi->icon = 0;
   if (lb)
     BLI_addtail(lb, umi);
   return umi;
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 95071d11b8a..9147d9e5110 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -7462,9 +7462,6 @@ static void template_user_menu_item_properties(uiLayout *layout,
       but->rnaprop = prop;
       UI_block_emboss_set(block, UI_EMBOSS);
     }
-    if (i > 5)
-      break;
-    i++;
   }
   RNA_STRUCT_END;
 }
diff --git a/source/blender/editors/screen/screen_user_menu.c b/source/blender/editors/screen/screen_user_menu.c
index b1c213761b6..a8ed52a81a8 100644
--- a/source/blender/editors/screen/screen_user_menu.c
+++ b/source/blender/editors/screen/screen_user_menu.c
@@ -290,7 +290,7 @@ bool screen_user_menu_draw_items(const bContext *C, uiLayout *layout, ListBase *
       wmOperatorType *ot = WM_operatortype_find(umi_op->op_idname, false);
       if (ot != NULL) {
         IDProperty *prop = umi_op->prop ? IDP_CopyProperty(umi_op->prop) : NULL;
-        uiItemFullO_ptr(layout, ot, ui_name, ICON_NONE, prop, umi_op->opcontext, 0, NULL);
+        uiItemFullO_ptr(layout, ot, ui_name, umi->icon, prop, umi_op->opcontext, 0, NULL);
         is_empty = false;
       }
       else {
@@ -305,7 +305,7 @@ bool screen_user_menu_draw_items(const bContext *C, uiLayout *layout, ListBase *
       bUserMenuItem_Menu *umi_mt = (bUserMenuItem_Menu *)umi;
       MenuType *mt = WM_menutype_find(umi_mt->mt_idname, false);
       if (mt != NULL) {
-        uiItemM_ptr(layout, mt, ui_name, ICON_NONE);
+        uiItemM_ptr(layout, mt, ui_name, umi->icon);
         is_empty = false;
       }
       else {
@@ -320,7 +320,7 @@ bool screen_user_menu_draw_items(const bContext *C, uiLayout *layout, ListBase *
       bUserMenuItem_SubMenu *umi_mt = (bUserMenuItem_SubMenu *)umi;
 
       uiItemMenuF(
-          layout, ui_name, ICON_NONE, &screen_user_menu_draw_submenu, (void *)&umi_mt->items);
+          layout, ui_name, umi->icon, &screen_user_menu_draw_submenu, (void *)&umi_mt->items);
       is_empty = false;
     }
     else if (umi->type == USER_MENU_TYPE_PROP) {
@@ -351,7 +351,7 @@ bool screen_user_menu_draw_items(const bContext *C, uiLayout *layout, ListBase *
           prop = RNA_struct_find_property(&prop_ptr, umi_pr->prop_id);
           if (prop) {
             ok = true;
-            uiItemFullR(layout, &prop_ptr, prop, umi_pr->prop_index, 0, 0, ui_name, ICON_NONE);
+            uiItemFullR(layout, &prop_ptr, prop, umi_pr->prop_index, 0, 0, ui_name, umi->icon);
             is_empty = false;
           }
         }
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index ad92b02534c..5d247adb28c 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -542,9 +542,11 @@ typedef struct bUserMenuItem {
   struct bUserMenuItem_SubMenu *parent;
   char ui_name[64];
   char type;
+  char icon;
   // editor
+  char icon_name[64];
   char is_selected;
-  char _pad0[6];
+  char _pad0[5];
 } bUserMenuItem;
 
 typedef struct bUserMenuItem_Op {
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index bd203565730..172f3ecd9cf 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -1485,6 +1485,33 @@ static void rna_UserDef_usermenus_pie_set(PointerRNA *ptr, int value)
   umg->pie = value;
 }
 
+static PointerRNA rna_UserDef_usermenus_item_op_prop_get(PointerRNA *ptr)
+{
+  bUserMenuItem_Op *umi_op = ptr->data;
+
+  if (umi_op->ptr) {
+    return *(umi_op->ptr);
+  }
+
+  /*return rna_pointer_inherit_refine(ptr, &RNA_OperatorProperties, op->properties); */
+  return PointerRNA_NULL;
+}
+
+static void rna_UserDef_usermenus_item_op_get(PointerRNA *ptr, char *value)
+{
+  bUserMenuItem_Op *umi_op = ptr->data;
+  WM_operator_py_idname(value, umi_op->op_idname);
+}
+
+static int rna_UserDef_usermenus_item_op_length(PointerRNA *ptr)
+{
+  bUserMenuItem_Op *umi_op = ptr->data;
+  char pyname[OP_MAX_TYPENAME];
+
+  WM_operator_py_idname(pyname, umi_op->op_idname);
+  return strlen(pyname);
+}
+
 static void rna_UserDef_usermenus_item_op_set(PointerRNA *ptr, const char *value)
 {
   bUserMenuItem_Op *umi_op = (bUserMenuItem_Op *)ptr->data;
@@ -6432,13 +6459,17 @@ static void rna_def_userdef_usermenus_items_subtypes(BlenderRNA *brna)
   prop = RNA_def_property(srna, "operator", PROP_STRING, PROP_NONE);
   RNA_def_property_string_sdna(prop, NULL, "op_idname");
   RNA_def_property_ui_text(prop, "operator", "the operator that will be executed");
-  RNA_def_property_string_funcs(prop, NULL, NULL, "rna_UserDef_usermenus_item_op_set");
+  RNA_def_property_string_funcs(prop,
+                                "rna_UserDef_usermenus_item_op_get",
+                                "rna_UserDef_usermenus_item_op_length",
+                                "rna_UserDef_usermenus_item_op_set");
   RNA_def_struct_name_property(srna, prop);
 
   prop = RNA_def_property(srna, "prop", PROP_POINTER, PROP_NONE);
   RNA_def_property_pointer_sdna(prop, NULL, "prop");
-  RNA_def_property_struct_type(prop, "PropertyGroupItem");
-  RNA_def_property_ui_text(prop, "properties", "");
+  RNA_def_property_struct_type(prop, "OperatorProperties");
+  RNA_def_property_ui_text(prop, "properties", "properties of the operator");
+  RNA_def_property_pointer_funcs(prop, "rna_UserDef_usermenus_item_op_prop_get", NULL, NULL, NULL);
 
   /* menu item */
   srna = RNA_def_struct(brna, "um_item_menu", NULL);
@@ -6582,6 +6613,20 @@ static void rna_def_userdef_usermenu(BlenderRNA *brna)
       prop, "rna_UserDef_usermenus_item_type_get", "rna_UserDef_usermenus_item_type_set", NULL);
   RNA_def_property_ui_text(prop, "type", "the type of item");
 
+  prop = RNA_def_property(srna, "icon", PROP_INT, PROP_NONE);
+  RNA_def_property_int_sdna(prop, NULL, "icon");
+  RNA_def_property_range(prop, 0, 255);
+  RNA_def_property_ui_text(prop, "icon", "the icon to display");
+
+  prop

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list