[Bf-blender-cvs] [48b5c909757] soc-2020-custom-menus: Custom Menus : Add keymap
TempoDev
noreply at git.blender.org
Fri Jul 24 15:49:37 CEST 2020
Commit: 48b5c90975710b424915a1daaf321c1ae811bd3e
Author: TempoDev
Date: Thu Jul 23 21:22:56 2020 +0200
Branches: soc-2020-custom-menus
https://developer.blender.org/rB48b5c90975710b424915a1daaf321c1ae811bd3e
Custom Menus : Add keymap
===================================================================
M release/datafiles/userdef/userdef_default.c
M release/scripts/modules/rna_user_menus_ui.py
M source/blender/blenloader/intern/readfile.c
M source/blender/makesrna/intern/rna_userdef.c
===================================================================
diff --git a/release/datafiles/userdef/userdef_default.c b/release/datafiles/userdef/userdef_default.c
index 608ca7aa0df..180a489b075 100644
--- a/release/datafiles/userdef/userdef_default.c
+++ b/release/datafiles/userdef/userdef_default.c
@@ -238,6 +238,5 @@ const UserDef U_default = {
.um_space_select = 1,
.um_context_select = 0,
.um_item_select = NULL,
- .um_buttons = {NULL},
},
};
diff --git a/release/scripts/modules/rna_user_menus_ui.py b/release/scripts/modules/rna_user_menus_ui.py
index e1868333ea5..b86b4200a16 100644
--- a/release/scripts/modules/rna_user_menus_ui.py
+++ b/release/scripts/modules/rna_user_menus_ui.py
@@ -26,7 +26,6 @@ import bpy
from bpy.app.translations import pgettext_iface as iface_
from bpy.app.translations import contexts as i18n_contexts
-
def _indented_layout(layout, level):
indentpx = 16
if level == 0:
@@ -38,6 +37,24 @@ def _indented_layout(layout, level):
col = split.column()
return col
+def get_keymap(context, index):
+ prefs = context.preferences
+ um = prefs.user_menus
+
+ if index < 0:
+ index = menu_id(context, um.active_group)
+
+ for km in context.window_manager.keyconfigs.user.keymaps:
+ for kmi in km.keymap_items:
+ if kmi.idname == "wm.call_user_menu":
+ if kmi.properties.index == index:
+ return kmi
+ km = context.window_manager.keyconfigs.user.keymaps['Window']
+ kmi = km.keymap_items.new("wm.call_user_menu",'RIGHTMOUSE', 'PRESS', shift=True, ctrl=True, alt=True)
+ kmi.properties.index = index
+ kmi.active = True
+ return kmi
+
def draw_button(context, box, item):
prefs = context.preferences
um = prefs.user_menus
@@ -140,12 +157,22 @@ def draw_item_editor(context, row):
else:
col.label(text="No item selected.")
-def draw_user_menu_preference(context, layout):
+def draw_user_menu_preference_expanded(context, layout):
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="")
+
+
+def draw_user_menu_preference(context, layout):
+ prefs = context.preferences
+ um = prefs.user_menus
+ umg = um.active_group
+ kmi = get_keymap(context, -1)
+
col = _indented_layout(layout, 0)
row = col.row()
@@ -157,9 +184,57 @@ def draw_user_menu_preference(context, layout):
pie_text = "Pie"
row.prop(umg, "is_pie", text=pie_text, toggle=True)
- #row.prop(kmi, )
+ row.prop(kmi, "map_type", text="")
+ map_type = kmi.map_type
+ if map_type == 'KEYBOARD':
+ row.prop(kmi, "type", text="", full_event=True)
+ elif map_type == 'MOUSE':
+ row.prop(kmi, "type", text="", full_event=True)
+ elif map_type == 'NDOF':
+ row.prop(kmi, "type", text="", full_event=True)
+ elif map_type == 'TWEAK':
+ subrow = row.row()
+ subrow.prop(kmi, "type", text="")
+ subrow.prop(kmi, "value", text="")
+ elif map_type == 'TIMER':
+ row.prop(kmi, "type", text="")
+ else:
+ row.label()
+
+ if um.expanded:
+ box = col.box()
+ draw_user_menu_preference_expanded(context=context, layout=box)
+
+
+def menu_id(context, umg):
+ prefs = context.preferences
+ um = prefs.user_menus
+
+ i = 0
+ for item in um.menus:
+ if item == umg:
+ return i
+ i = i + 1
+ return -1
+def ensure_keymap(context):
+ prefs = context.preferences
+ um = prefs.user_menus
+ umg = um.active_group
+ index = menu_id(context, umg)
+
+ for km in context.window_manager.keyconfigs.user.keymaps:
+ for kmi in km.keymap_items:
+ if kmi.idname == "wm.call_user_menu":
+ if kmi.properties.index == index:
+ umg.set_keymap(kmi=kmi)
+ if not umg.keymap:
+ km = context.window_manager.keyconfigs.user.keymaps['Window']
+ kmi = km.keymap_items.new("wm.call_user_menu",'RIGHTMOUSE', 'PRESS', shift=True, ctrl=True, alt=True)
+ kmi.properties.index = index
+ kmi.active = True
+ umg.set_keymap(kmi=kmi)
def draw_user_menus(context, layout):
@@ -168,6 +243,8 @@ def draw_user_menus(context, layout):
if not um.active_group:
um.active_group = um.menus[0]
+ if not um.active_group.keymap:
+ ensure_keymap(context)
split = layout.split(factor=0.4)
@@ -206,13 +283,3 @@ def draw_user_menus(context, layout):
layout.separator()
- #km = bpy.context.window_manager.keyconfigs.user.keymaps['Window']
- #for kmi in km.keymap_items:
- # if kmi.idname == "wm.call_menu":
- # if um.is_pie and kmi.properties.name == "SCREEN_MT_user_menu":
- # kmi.idname = "wm.call_menu_pie"
- # kmi.properties.name = "PIE_MT_user_menu"
- # if kmi.idname == "wm.call_menu_pie":
- # if kmi.properties.name == "PIE_MT_user_menu" and not um.is_pie:
- # kmi.idname = "wm.call_menu"
- # kmi.properties.name = "SCREEN_MT_user_menu"
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 7eb4c4d05bf..ba30c8f2d04 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -9806,6 +9806,7 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead)
LISTBASE_FOREACH (bUserMenusGroup *, umg, &user->user_menus) {
BLI_listbase_clear(&umg->menus);
+ umg->shortcut = NULL;
BLO_read_list(reader, &umg->menus);
LISTBASE_FOREACH (bUserMenu *, um, &umg->menus) {
BLI_listbase_clear(&um->items);
@@ -9834,7 +9835,6 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead)
user->runtime.um_context_select = 1;
user->runtime.um_item_select = NULL;
user->runtime.umg_select = user->user_menus.first;
- BLI_listbase_clear(&user->runtime.um_buttons);
/* free fd->datamap again */
oldnewmap_clear(fd->datamap);
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index afbcec0ff04..66c2fdcadb2 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -1126,6 +1126,11 @@ static void rna_UserDef_usermenus_set_group(UserDef *userdef, bUserMenusGroup *u
userdef->runtime.umg_select = umg;
}
+static void rna_UserDef_usermenus_set_keymap(bUserMenusGroup *umg, wmKeyMapItem *kmi)
+{
+ umg->shortcut = kmi;
+}
+
static void rna_UserDef_usermenus_add_group(UserDef *userdef)
{
bUserMenusGroup *umg = MEM_mallocN(sizeof(*umg), __func__);
@@ -1166,87 +1171,6 @@ static bool rna_UserDef_usermenus_has_item(UserDef *userdef)
return true;
}
-static void rna_UserDef_usermenus_buttons_delete(ListBase *lb, bUserMenuItem_But *umib)
-{
- BLI_remlink(lb, umib);
- MEM_freeN(umib);
-}
-
-static void rna_UserDef_usermenus_buttons_free_list(ListBase *lb)
-{
- bUserMenuItem_But *umib = lb->first;
-
- if (!umib)
- return;
- for (bUserMenuItem_But *next_umib; umib; umib = next_umib) {
- next_umib = umib->next;
- if (umib->item->type == USER_MENU_TYPE_MENU)
- rna_UserDef_usermenus_buttons_free_list(&umib->subbut);
- rna_UserDef_usermenus_buttons_delete(lb, umib);
- }
-}
-
-static void rna_UserDef_usermenus_buttons_refresh_list(UserDef *userdef,
- ListBase *list_umi,
- ListBase *list_umib);
-
-static void rna_UserDef_usermenus_refresh_submenu(UserDef *userdef, bUserMenuItem_But *umib)
-{
- bUserMenuItem *umi = umib->item;
- if (!umi || umi->type != USER_MENU_TYPE_SUBMENU)
- return;
- bUserMenuItem_SubMenu *umi_sm = (bUserMenuItem_SubMenu *)umi;
- rna_UserDef_usermenus_buttons_refresh_list(userdef, &umi_sm->items, &umib->subbut);
-}
-
-static void rna_UserDef_usermenus_buttons_refresh_list(UserDef *userdef,
- ListBase *list_umi,
- ListBase *list_umib)
-{
- int index = 0;
- bUserMenuItem_But *umib = list_umib->first;
- for (bUserMenuItem *umi = list_umi->first; umi; umi = umi->next, index++) {
- if (umib && umib->item == umi) {
- umib->pressed = (userdef->runtime.um_item_select == umi) ? true : false;
- umib->index = index;
- rna_UserDef_usermenus_refresh_submenu(userdef, umib);
- umib = umib->next;
- }
- else {
- bUserMenuItem_But *new_umib = MEM_callocN(sizeof(bUserMenuItem_But), __func__);
- new_umib->pressed = (userdef->runtime.um_item_select == umi) ? true : false;
- new_umib->item = umi;
- new_umib->index = index;
- BLI_listbase_clear(&new_umib->subbut);
- if (umib) {
- BLI_insertlinkafter(list_umib, umib, new_umib);
- rna_UserDef_usermenus_buttons_delete(list_umib, umib);
- }
- else {
- BLI_addtail(list_umib, new_umib);
- }
- rna_UserDef_usermenus_refresh_submenu(userdef, new_umib);
- umib = new_umib->next;
- }
- }
- for (bUserMenuItem_But *next_umib; umib; umib = next_umib) {
- next_umib = umib->next;
- rna_UserDef_usermenus_buttons_delete(list_umib, umib);
- }
-}
-
-static void rna_UserDef_usermenus_buttons_refresh(UserDef *userdef)
-{
- ListBase *buttons = &userdef->runtime.um_buttons;
-
- bUserMenu *um = rna_UserDef_usermenus_get_current(userdef, false);
- if (!um) {
- rna_UserDef_usermenus_buttons_free_list(buttons);
- return;
- }
- rna_UserDef_usermenus_buttons_refresh_list(userdef, &um->items, buttons);
-}
-
static int rna_UserDef_usermenus_items_length(UserDef *userdef)
{
bUserMenu *bum = rna_UserDef_usermenus_get_current(userdef, false);
@@ -1540,12 +1464,6 @@ static void rna_UserDef_usermenu_items_begin(CollectionPropertyIterator *iter, P
rna_iterator_listbase_begin(iter, &bum->items, NULL);
}
-static void rna_UserDef_usermenu_subbut_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
-{
- bUserMenuItem_But *umib = (bUserMenuItem_But *)ptr->data;
- rna_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list