[Bf-blender-cvs] [7f7a7efc626] soc-2020-custom-menus: Custom Menu: restruct rna and change enum button to button collection

TempoDev noreply at git.blender.org
Tue Jun 23 12:38:36 CEST 2020


Commit: 7f7a7efc626a01421400a86f5bbeb25b4bbb1266
Author: TempoDev
Date:   Tue Jun 23 12:27:22 2020 +0200
Branches: soc-2020-custom-menus
https://developer.blender.org/rB7f7a7efc626a01421400a86f5bbeb25b4bbb1266

Custom Menu: restruct rna and change enum button to button collection

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

M	release/datafiles/userdef/userdef_default.c
M	release/scripts/modules/rna_user_menus_ui.py
M	release/scripts/startup/bl_operators/userpref.py
M	source/blender/blenloader/intern/readfile.c
M	source/blender/makesdna/DNA_userdef_types.h
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 31d0eb8e923..cdbaff555be 100644
--- a/release/datafiles/userdef/userdef_default.c
+++ b/release/datafiles/userdef/userdef_default.c
@@ -232,5 +232,10 @@ const UserDef U_default = {
     .runtime =
         {
             .is_dirty = 0,
+
+            .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 879cf8858af..400f7e867d0 100644
--- a/release/scripts/modules/rna_user_menus_ui.py
+++ b/release/scripts/modules/rna_user_menus_ui.py
@@ -26,6 +26,19 @@ import bpy
 from bpy.app.translations import pgettext_iface as iface_
 from bpy.app.translations import contexts as i18n_contexts
 
+def draw_item(context, box, but_list):
+    prefs = context.preferences
+    um = prefs.user_menus
+
+    for items in but_list:
+        name = items.item.name
+        if items.item.type == "SEPARATOR":
+            name = "___________"
+        box.prop(items, "pressed", text=name, toggle=1)
+        if items.item.type == "MENU":
+            sub_box = box.box()
+            draw_item(context, sub_box, items.subbut)
+
 def draw_item_box(context, row):
     prefs = context.preferences
     um = prefs.user_menus
@@ -36,7 +49,15 @@ def draw_item_box(context, row):
     has_item = um.has_item()
     if not has_item :
         box_col.label(text="none")
-    box_col.prop(um, "item_selected", expand=True)
+    #box_col.prop(um, "item_selected", expand=True)
+    um.buttons_refresh()
+    for items in um.buttons:
+        name = items.item.name
+        if items.item.type == "SEPARATOR":
+            name = "___________"
+        box_col.prop(items, "pressed", text=name, toggle=1)
+        if items.item.type == "MENU":
+            sub_box = box_col.box()
     
     row = row.split(factor=0.9, align=True)
     col = row.column(align=True)
@@ -54,16 +75,17 @@ def draw_item_editor(context, row):
     col = row.column()
 
     has_item = um.has_item()
+    current = um.active_item
     if not has_item :
         col.label(text="No item in this list.")
         col.label(text="Add one or choose another list to get started")
-    elif (um.sitem_id() >= 0):
-        type = um.sitem_type()
-        col.prop(um, "item_type")
-        if (type != "SEPARATOR"):
-            col.prop(um, "item_name")
-        if (type == "OPERATOR"):
-            col.prop(um, "item_operator")
+    elif current:
+        col.prop(current, "type")
+        if (current.type != "SEPARATOR"):
+            col.prop(current, "name")
+        if (current.type == "OPERATOR"):
+            umi_op = current.get_operator()
+            col.prop(umi_op, "operator")
     else :
         col.label(text="No item selected.")
 
@@ -105,7 +127,7 @@ def draw_user_menus(context, layout):
 
     col = layout.column()
     row = layout.row()
-       
+
     draw_item_box(context=context, row=row)
     draw_item_editor(context=context, row=row)
 
diff --git a/release/scripts/startup/bl_operators/userpref.py b/release/scripts/startup/bl_operators/userpref.py
index 5eca40aeb7b..9c5e7210a54 100644
--- a/release/scripts/startup/bl_operators/userpref.py
+++ b/release/scripts/startup/bl_operators/userpref.py
@@ -1184,7 +1184,7 @@ class PREFERENCES_OT_menuitem_remove(Operator):
     def poll(cls, context):
         prefs = context.preferences
         um = prefs.user_menus
-        can_remove = um.sitem_id() >= 0
+        can_remove = um.active_item
         return can_remove
 
     def execute(self, context):
@@ -1208,8 +1208,13 @@ class PREFERENCES_OT_menuitem_up(Operator):
     def poll(cls, context):
         prefs = context.preferences
         um = prefs.user_menus
-        can_move_up = um.sitem_id() > 0
-        return can_move_up
+        current = um.active_item
+        if not current:
+            return False
+        prev_item = current.prev
+        if prev_item:
+            return True
+        return False
 
     def execute(self, context):
         prefs = context.preferences
@@ -1232,9 +1237,13 @@ class PREFERENCES_OT_menuitem_down(Operator):
     def poll(cls, context):
         prefs = context.preferences
         um = prefs.user_menus
-        id = um.sitem_id()
-        can_move_down = id >= 0 and id + 1 < um.items_len()
-        return can_move_down
+        current = um.active_item
+        if not current:
+            return False
+        next_item = current.next
+        if next_item:
+            return True
+        return False
 
     def execute(self, context):
         prefs = context.preferences
@@ -1243,7 +1252,6 @@ class PREFERENCES_OT_menuitem_down(Operator):
         context.preferences.is_dirty = True
         return {'FINISHED'}
 
-
 classes = (
     PREFERENCES_OT_addon_disable,
     PREFERENCES_OT_addon_enable,
@@ -1274,4 +1282,4 @@ classes = (
     PREFERENCES_OT_menuitem_remove,
     PREFERENCES_OT_menuitem_up,
     PREFERENCES_OT_menuitem_down,
-)
+)
\ No newline at end of file
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index d3c391a1595..934be16ccaf 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -10330,6 +10330,10 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead)
   /* Clear runtime data. */
   user->runtime.is_dirty = false;
   user->edit_studio_light = 0;
+  user->runtime.um_space_select = 1;
+  user->runtime.um_context_select = 1;
+  user->runtime.um_item_select = NULL;
+  BLI_listbase_clear(&user->runtime.um_buttons);
 
   /* free fd->datamap again */
   oldnewmap_clear(fd->datamap);
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 635eb683cf2..72bbc4f4dd7 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -518,6 +518,13 @@ typedef struct bPathCompare {
   char _pad0[7];
 } bPathCompare;
 
+typedef struct bUserMenusGroup {
+  struct bUserMenuGroup *next, *prev;
+  char name[64];
+  /* bUserMenu */
+  ListBase menus;
+} bUserMenusGroup;
+
 typedef struct bUserMenu {
   struct bUserMenu *next, *prev;
   char space_type;
@@ -556,6 +563,15 @@ typedef struct bUserMenuItem_Prop {
   char _pad0[4];
 } bUserMenuItem_Prop;
 
+typedef struct bUserMenuItem_But {
+  struct bUserMenuItem_But *next, *prev;
+  struct bUserMenuItem *item;
+  int index;
+  unsigned char pressed;
+  char _pad0[3];
+  struct ListBase subbut;
+} bUserMenuItem_But;
+
 enum {
   USER_MENU_TYPE_SEP = 1,
   USER_MENU_TYPE_OPERATOR = 2,
@@ -585,7 +601,14 @@ typedef struct WalkNavigation {
 
 typedef struct UserDef_Runtime {
   char is_dirty;
-  char _pad0[7];
+
+  /* User menu editor runtime datas */
+  char um_space_select;
+  char um_context_select;
+  char _pad0[5];
+  struct bUserMenuItem *um_item_select;
+  /** #bUserMenuItem_But. */
+  struct ListBase um_buttons;
 } UserDef_Runtime;
 
 /**
@@ -880,14 +903,6 @@ typedef struct UserDef {
 
   struct WalkNavigation walk_navigation;
 
-  /** custom menu **/
-  short um_space_select;
-  short um_context_select;
-  short um_item_select;
-  short um_item_type;
-  char um_item_name[64];
-  char um_item_op[64];
-
   /** The UI for the user preferences. */
   UserDef_SpaceData space_data;
   UserDef_FileSpaceData file_space_data;
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index b7740e5e476..fe345650961 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -1080,41 +1080,22 @@ static bUserMenu *rna_UserDef_usermenus_get_current(UserDef *userdef, bool ensur
   const char **contexts_list = CTX_data_list_mode_string();
   bUserMenu *bum = NULL;
   
-  if (userdef->um_space_select > 0 && userdef->um_context_select >= 0) {
+  if (userdef->runtime.um_space_select > 0 && userdef->runtime.um_context_select >= 0) {
     if (ensure)
       bum = BKE_blender_user_menu_ensure(&userdef->user_menus,
-                                        userdef->um_space_select,
-                                        contexts_list[userdef->um_context_select]);
+                                        userdef->runtime.um_space_select,
+                                        contexts_list[userdef->runtime.um_context_select]);
     else
       bum = BKE_blender_user_menu_find(&userdef->user_menus,
-                                      userdef->um_space_select,
-                                      contexts_list[userdef->um_context_select]);
+                                      userdef->runtime.um_space_select,
+                                      contexts_list[userdef->runtime.um_context_select]);
   }
   return bum;
 }
 
-static int rna_UserDef_usermenus_item_selected(UserDef *userdef)
+/*static bUserMenuItem *rna_UserDef_usermenus_get_current_item(UserDef *userdef)
 {
-  int id = userdef->um_item_select - 1;
-  if (id < 0) return -1;
-
-  bUserMenu *bum = rna_UserDef_usermenus_get_current(userdef, false);
-  if (bum) {
-
-    ListBase *lb = &bum->items;
-    int i = 0;
-    for (bUserMenuItem *umi = lb->first; umi; umi = umi->next, i++) {
-      if (i == id)
-        return id;
-    }
-  }
-
-  return -1;
-}
-
-static bUserMenuItem *rna_UserDef_usermenus_get_current_item(UserDef *userdef)
-{
-  int id = userdef->um_item_select - 1;
+  int id = userdef->runtime.um_item_select - 1;
   if (id < 0) return NULL;
 
   bUserMenu *bum = rna_UserDef_usermenus_get_current(userdef, false);
@@ -1129,7 +1110,7 @@ static bUserMenuItem *rna_UserDef_usermenus_get_current_item(UserDef *userdef)
   }
 
   return NULL;
-}
+}*/
 
 static bool rna_UserDef_usermenus_has_item(UserDef *userdef)
 {
@@ -1142,6 +1123,62 @@ 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_B

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list