[Bf-blender-cvs] [d1921a46ca5] soc-2020-custom-menus: Custom Menu: Add item selection, link add and remove buttons and name edition
TempoDev
noreply at git.blender.org
Sat Jun 13 23:27:41 CEST 2020
Commit: d1921a46ca56bd766fb24701630e9260289fae82
Author: TempoDev
Date: Sat Jun 13 23:27:26 2020 +0200
Branches: soc-2020-custom-menus
https://developer.blender.org/rBd1921a46ca56bd766fb24701630e9260289fae82
Custom Menu: Add item selection, link add and remove buttons and name edition
===================================================================
M release/scripts/modules/rna_custom_menu_ui.py
M release/scripts/startup/bl_operators/userpref.py
M source/blender/makesdna/DNA_userdef_types.h
M source/blender/makesrna/intern/rna_userdef.c
===================================================================
diff --git a/release/scripts/modules/rna_custom_menu_ui.py b/release/scripts/modules/rna_custom_menu_ui.py
index d688bcaf5de..8814e7cdfb0 100644
--- a/release/scripts/modules/rna_custom_menu_ui.py
+++ b/release/scripts/modules/rna_custom_menu_ui.py
@@ -152,10 +152,11 @@ def draw_item_box(context, row):
active = cm.item_name_get(context=cm.cm_context_selected, index=0, spacetype=cm.cm_space_selected)
if active == "":
box_col.label(text="none")
- while active != "":
- box_col.label(text=active)
- item_index = item_index + 1
- active = cm.item_name_get(context=cm.cm_context_selected, index=item_index, spacetype=cm.cm_space_selected)
+ #while active != "":
+ # box_col.label(text=active)
+ # item_index = item_index + 1
+ # active = cm.item_name_get(context=cm.cm_context_selected, index=item_index, spacetype=cm.cm_space_selected)
+ box_col.prop(cm, "cm_item_selected", text="", expand=True)
row = row.split(factor=0.9, align=True)
col = row.column(align=True)
@@ -166,6 +167,22 @@ def draw_item_box(context, row):
col.operator("wm.keyconfig_preset_add", text="", icon='TRIA_DOWN').remove_active = True
row.separator()
+def draw_item_editor(context, row):
+ prefs = context.preferences
+ cm = prefs.custom_menu
+
+ col = row.column()
+
+ active = cm.item_name_get(context=cm.cm_context_selected, index=0, spacetype=cm.cm_space_selected)
+ if (active == ""):
+ col.label(text="No item in this list.")
+ col.label(text="Add one or choose another list to get started")
+ elif (cm.item_selected() >= 0):
+ col.prop(cm, "cm_item_name")
+ else :
+ col.label(text="No item selected.")
+
+
def draw_custom_menu(context, layout):
wm = context.window_manager
@@ -224,6 +241,6 @@ def draw_custom_menu(context, layout):
row = layout.row()
draw_item_box(context=context, row=row)
- row.label(text="riht")
+ draw_item_editor(context=context, row=row)
layout.separator()
diff --git a/release/scripts/startup/bl_operators/userpref.py b/release/scripts/startup/bl_operators/userpref.py
index a1b1d66115f..daac5e6c748 100644
--- a/release/scripts/startup/bl_operators/userpref.py
+++ b/release/scripts/startup/bl_operators/userpref.py
@@ -1182,13 +1182,14 @@ class PREFERENCES_OT_menuitem_remove(Operator):
@classmethod
def poll(cls, context):
- return hasattr(context, "keymap")
+ return True#hasattr(context, "keymap")
def execute(self, context):
- km = context.keymap
- kmi = km.keymap_items.from_id(self.item_id)
- km.keymap_items.remove(kmi)
+ prefs = context.preferences
+ cm = prefs.custom_menu
+
+ cm.item_remove(context=cm.cm_context_selected, spacetype=cm.cm_space_selected, index=(cm.item_selected()))
context.preferences.is_dirty = True
return {'FINISHED'}
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index b95cf4c0da6..cb8ecc68ed4 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -882,7 +882,9 @@ typedef struct UserDef {
/** custom menu **/
int cmspaceselect;
- int cmcontextselect;
+ short cmcontextselect;
+ short cmitemselect;
+ char cmitemname[64];
/** The UI for the user preferences. */
UserDef_SpaceData space_data;
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index fb979aa73a1..fb268578bb7 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -187,6 +187,8 @@ static const EnumPropertyItem rna_enum_userdef_viewport_aa_items[] = {
# include "BKE_screen.h"
# include "BKE_blender_user_menu.h"
+# include "ED_screen.h"
+
# include "DEG_depsgraph.h"
# include "GPU_draw.h"
@@ -848,6 +850,52 @@ static const EnumPropertyItem *rna_userdef_contexts_itemf(bContext *UNUSED(C),
return item;
}
+static const EnumPropertyItem *rna_userdef_item_set(bContext *UNUSED(C),
+ PointerRNA *ptr,
+ PropertyRNA *UNUSED(prop),
+ bool *r_free)
+{
+ UserDef *userdef = ptr->data;
+ int totitem = 0;
+ EnumPropertyItem *item = NULL;
+ const char **contexts_list = CTX_data_list_mode_string();
+
+ int i = 0;
+
+ if (userdef->cmspaceselect > 0 && userdef->cmcontextselect >= 0) {
+ bUserMenu *bum = BKE_blender_user_menu_find(&U.user_menus,
+ userdef->cmspaceselect,
+ contexts_list[userdef->cmcontextselect]);
+ if (bum) {
+
+ ListBase *lb = &bum->items;
+ i = 0;
+ for (bUserMenuItem *umi = lb->first; umi; umi = umi->next, i++) {
+ EnumPropertyItem new_item;
+ if (!strcmp(umi->ui_name, ""))
+ new_item = (EnumPropertyItem){i + 1, " ", 0, " ", " "};
+ else
+ new_item = (EnumPropertyItem){i + 1, umi->ui_name, 0, umi->ui_name, umi->ui_name};
+ RNA_enum_item_add(&item, &totitem, &new_item);
+ }
+ }
+ }
+
+# ifndef NDEBUG
+ if (i == 0) {
+ //do nothing for now
+ }
+# endif
+
+ /* may be unused */
+ UNUSED_VARS(audio_device_items);
+
+ RNA_enum_item_end(&item, &totitem);
+ *r_free = true;
+
+ return item;
+}
+
# ifdef WITH_INTERNATIONAL
static const EnumPropertyItem *rna_lang_enum_properties_itemf(bContext *UNUSED(C),
PointerRNA *UNUSED(ptr),
@@ -1164,8 +1212,11 @@ static const char *rna_UserDef_usermenu_item_name_get(UserDef *userdef, const ch
ListBase *lb = &bum->items;
i = 0;
for (bUserMenuItem *umi = lb->first; umi; umi = umi->next, i++) {
- if (i == index)
+ if (i == index) {
+ if (!strcmp(umi->ui_name, ""))
+ return " ";
return umi->ui_name;
+ }
}
return "";
@@ -1185,14 +1236,112 @@ static void rna_UserDef_usermenu_item_add(UserDef *userdef, const char *spacetyp
}
if (st == NULL) return;
- bUserMenu *bum = BKE_blender_user_menu_find(&userdef->user_menus, st->spaceid, context);
- if (!bum) return;
+ bUserMenu *bum = BKE_blender_user_menu_ensure(&userdef->user_menus, st->spaceid, context);
ListBase *lb = &bum->items;
bUserMenuItem_Op *bumi = (bUserMenuItem_Op *)BKE_blender_user_menu_item_add(
lb, USER_MENU_TYPE_OPERATOR);
+
+ //auto operator setup might be removed in futur updates
+ wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_add", true);
STRNCPY(bumi->item.ui_name, "new item");
- //printf("%s\n", bumi->item.ui_name);
+ STRNCPY(bumi->op_idname, ot->idname);
+}
+
+static void rna_UserDef_usermenu_item_remove(UserDef *userdef, const char *spacetype, const char *context, int index)
+{
+ int i = 0;
+ const ListBase *spacetypes = BKE_spacetypes_list();
+ SpaceType *st = NULL;
+
+ for (i = 0, st = spacetypes->first; st; st = st->next, i++) {
+ int id = st->spaceid;
+ char *space_name = st->name;
+ if (!strcmp(space_name, spacetype))
+ break;
+ }
+ if (st == NULL) return;
+
+ bUserMenu *bum = BKE_blender_user_menu_find(&userdef->user_menus, st->spaceid, context);
+ if (!bum) return;
+
+ ListBase *lb = &bum->items;
+ i = 0;
+ for (bUserMenuItem *umi = lb->first; umi; umi = umi->next, i++) {
+ if (i == index) {
+ ED_screen_user_menu_item_remove(lb, umi);
+ return;
+ }
+ }
+}
+
+static int rna_UserDef_usermenu_item_selected(UserDef *userdef)
+{
+ return userdef->cmitemselect - 1;
+}
+
+/* usermenu item name */
+static void rna_UserDef_usermenu_name_get(PointerRNA *ptr, char *value)
+{
+ int i = 0;
+ UserDef *userdef = (UserDef *)ptr->data;
+ const char **contexts_list = CTX_data_list_mode_string();
+
+ if (userdef->cmspaceselect > 0 && userdef->cmcontextselect >= 0) {
+ bUserMenu *bum = BKE_blender_user_menu_find(&userdef->user_menus, userdef->cmspaceselect, contexts_list[userdef->cmcontextselect]);
+ if (!bum) return;
+
+ ListBase *lb = &bum->items;
+ i = 0;
+ for (bUserMenuItem *umi = lb->first; umi; umi = umi->next, i++) {
+ if (i == userdef->cmitemselect - 1) {
+ BLI_strncpy(value, umi->ui_name, FILE_MAX);
+ return;
+ }
+ }
+ }
+}
+
+static void rna_UserDef_usermenu_name_set(PointerRNA *ptr, char *value)
+{
+ int i = 0;
+ UserDef *userdef = (UserDef *)ptr->data;
+ const char **contexts_list = CTX_data_list_mode_string();
+
+ if (userdef->cmspaceselect > 0 && userdef->cmcontextselect >= 0) {
+ bUserMenu *bum = BKE_blender_user_menu_find(&userdef->user_menus, userdef->cmspaceselect, contexts_list[userdef->cmcontextselect]);
+ if (!bum) return;
+
+ ListBase *lb = &bum->items;
+ i = 0;
+ for (bUserMenuItem *umi = lb->first; umi; umi = umi->next, i++) {
+ if (i == userdef->cmitemselect - 1) {
+ BLI_strncpy(umi->ui_name, value, FILE_MAX);
+ return;
+ }
+ }
+ }
+}
+
+static int rna_UserDef_usermenu_item_length(PointerRNA *ptr)
+{
+ int i = 0;
+ UserDef *userdef = (UserDef *)ptr->data;
+ const char **contexts_list = CTX_data_list_mode_string();
+
+ if (userdef->cmspaceselect > 0 && userdef->cmcontextselect >= 0) {
+ bUserMenu *bum = BKE_blender_user_menu_find(&userdef->user_menus, userdef->cmspaceselect, contexts_list[userdef->cmcontextselect]);
+ if (!bum) return 0;
+
+ ListBase *lb = &bum->items;
+ i = 0;
+ for (bUserMenuItem *umi = lb->first; umi; umi = umi->next, i++) {
+ if (i == userdef->cmitemselect - 1) {
+ return strlen(umi->ui_name);
+ }
+ }
+ }
+ return 0;
}
#else
@@ -6027,6 +6176,19 @@ static void rna_def_userdef_custom_menu(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL},
};
+ static const EnumPropertyItem custom_menu_null[] = {
+ {0, "NULL", 0, "None", "No context found"},
+ {0, NULL, 0, NULL, NULL},
+ };
+
+ static const EnumPropertyItem custom_menu_type_items[] = {
+ {1, "OPERATOR", 0, "Operator", "Operator"},
+ {2, "MENU", 0, "Menu", "Menu"},
+ {3,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list