[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