[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