[Bf-blender-cvs] [9fe9eb5240b] soc-2020-custom-menus: Custom Menus: pie menus: pie menu editor

TempoDev noreply at git.blender.org
Mon Jul 6 02:00:56 CEST 2020


Commit: 9fe9eb5240b6ad07f14ec4ecbc2f0611a4456e36
Author: TempoDev
Date:   Mon Jul 6 02:00:48 2020 +0200
Branches: soc-2020-custom-menus
https://developer.blender.org/rB9fe9eb5240b6ad07f14ec4ecbc2f0611a4456e36

Custom Menus: pie menus: pie menu editor

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

M	release/scripts/modules/rna_user_menus_ui.py
M	release/scripts/startup/bl_operators/userpref.py
M	release/scripts/startup/bl_ui/space_userpref.py
M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/screen/screen_user_menu.c
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 7ab0d9060ec..07ad11d8335 100644
--- a/release/scripts/modules/rna_user_menus_ui.py
+++ b/release/scripts/modules/rna_user_menus_ui.py
@@ -27,20 +27,29 @@ 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):
+def draw_button(context, box, items):
     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 == "SUBMENU":
-            sub_box = box.box()
-            sub_box = sub_box.column(align=True)
-            draw_item(context, sub_box, items.subbut)
+    name = items.item.name
+    col = box.column(align=True)
+    row = col.row(align=True)
+    if items.item.type == "SEPARATOR":
+        name = "___________"
+    row.prop(items, "pressed", text=name, toggle=1)
+    if items.item.type == "SUBMENU":
+        if um.is_pie:
+            row.operator("preferences.menuitem_add", text="", icon='ADD')
+            row.operator("preferences.menuitem_remove", text="", icon='REMOVE')
+            row.operator("preferences.menuitem_up", text="", icon='TRIA_UP')
+            row.operator("preferences.menuitem_down", text="", icon='TRIA_DOWN')
+        sub_box = col.box()
+        sub_box = sub_box.column(align=True)
+        draw_item(context, sub_box, items.subbut)
 
+def draw_item(context, box, but_list):
+    for items in but_list:
+        draw_button(context, box, items)
 
 def draw_item_box(context, row):
     prefs = context.preferences
@@ -64,6 +73,31 @@ def draw_item_box(context, row):
     col.operator("preferences.menuitem_down", text="", icon='TRIA_DOWN')
     row.separator()
 
+def draw_pie_item(context, col, items, label):
+    prefs = context.preferences
+    um = prefs.user_menus
+
+    row = col.row()
+    #subrow = row.split(factor=0.1)
+    row.label(text=label)
+    draw_button(context, row, items)
+
+def draw_pie(context, row):
+    prefs = context.preferences
+    um = prefs.user_menus
+
+    col = row.column()
+    um.buttons_refresh()
+    draw_pie_item(context, col, um.buttons[0], "Left : ")
+    draw_pie_item(context, col, um.buttons[1], "Right : ")
+    draw_pie_item(context, col, um.buttons[2], "Down : ")
+    draw_pie_item(context, col, um.buttons[3], "Up : ")
+    draw_pie_item(context, col, um.buttons[4], "Upper left : ")
+    draw_pie_item(context, col, um.buttons[5], "Upper right : ")
+    draw_pie_item(context, col, um.buttons[6], "Lower left : ")
+    draw_pie_item(context, col, um.buttons[7], "Lower right : ")
+    row.separator()
+        
 
 def draw_item_editor(context, row):
     prefs = context.preferences
@@ -133,7 +167,10 @@ def draw_user_menus(context, layout):
     col = layout.column()
     row = layout.row()
 
-    draw_item_box(context=context, row=row)
+    if um.is_pie:
+        draw_pie(context=context, row=row)
+    else:
+        draw_item_box(context=context, row=row)
     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 9182f29b562..8869bf2da87 100644
--- a/release/scripts/startup/bl_operators/userpref.py
+++ b/release/scripts/startup/bl_operators/userpref.py
@@ -1278,7 +1278,6 @@ class PREFERENCES_OT_menuitem_down(Operator):
         context.preferences.is_dirty = True
         return {'FINISHED'}
 
-
 classes = (
     PREFERENCES_OT_addon_disable,
     PREFERENCES_OT_addon_enable,
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index c4713227e3e..5bf2960500d 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -1696,25 +1696,7 @@ class PIE_MT_user_menu(Menu):
         layout = self.layout
         pie = layout.menu_pie()
         pie.scale_y = 1.2
-        index = 0
-        for item in menu.menu_items:
-            if index > 8:
-                break
-            if item.type == "OPERATOR":
-                op = item.get_operator()
-                pie.operator(op.operator, text=item.name)
-            if item.type == "MENU":
-                pm = item.get_menu()
-                pie.menu(pm.id_name, text=item.name)
-            if item.type == "SUBMENU":
-                sm = item.get_submenu()
-                index = index - 1
-            if item.type == "PROPERTY":
-                sm = item.get_property()
-                index = index - 1
-            if item.type == "SEPARATOR":
-                index = index - 1
-            index = index + 1
+        menu.draw(context=context, layout=pie)
 
 class USERPREF_PT_user_menus(UserMenusPanel, Panel):
     bl_label = "user_menus"
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index e231293c7fe..41919312572 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -408,6 +408,10 @@ void ED_screen_user_menu_item_add_prop(struct bContext *C,
 
 void ED_screen_user_menu_item_remove(struct ListBase *lb, struct bUserMenuItem *umi);
 void ED_screen_user_menu_register(void);
+bool screen_user_menu_draw_items(struct bContext *C,
+                                 struct uiLayout *layout,
+                                 struct ListBase *lb,
+                                 bool is_pie);
 
 /* Cache display helpers */
 
diff --git a/source/blender/editors/screen/screen_user_menu.c b/source/blender/editors/screen/screen_user_menu.c
index eafc3b73f0e..494b824aab9 100644
--- a/source/blender/editors/screen/screen_user_menu.c
+++ b/source/blender/editors/screen/screen_user_menu.c
@@ -241,24 +241,26 @@ void ED_screen_user_menu_item_remove(ListBase *lb, bUserMenuItem *umi)
 /* -------------------------------------------------------------------- */
 /** \name Menu Definition
  * \{ */
-static bool screen_user_menu_draw_items(bContext *C, uiLayout *layout, ListBase *lb);
 
 static void screen_user_menu_draw_submenu(bContext *C, uiLayout *layout, void *arg)
 {
   ListBase *lb = (ListBase *)arg;
 
-  screen_user_menu_draw_items(C, layout, lb);
+  screen_user_menu_draw_items(C, layout, lb, false);
 }
 
-static bool screen_user_menu_draw_items(bContext *C, uiLayout *layout, ListBase *lb)
+bool screen_user_menu_draw_items(bContext *C, uiLayout *layout, ListBase *lb, bool is_pie)
 {
   /* Enable when we have the ability to edit menus. */
   char label[512];
-  const bool show_missing = true;
-
+  const bool show_missing = is_pie;
   bool is_empty = true;
 
+  int i = 0;
+
   LISTBASE_FOREACH (bUserMenuItem *, umi, lb) {
+    if (is_pie && i > 7)
+      return is_empty;
     const char *ui_name = umi->ui_name[0] ? umi->ui_name : NULL;
     if (umi->type == USER_MENU_TYPE_OPERATOR) {
       bUserMenuItem_Op *umi_op = (bUserMenuItem_Op *)umi;
@@ -273,6 +275,7 @@ static bool screen_user_menu_draw_items(bContext *C, uiLayout *layout, ListBase
           SNPRINTF(label, "Missing: %s", umi_op->op_idname);
           uiItemL(layout, label, ICON_NONE);
         }
+        i--;
       }
     }
     else if (umi->type == USER_MENU_TYPE_MENU) {
@@ -287,6 +290,7 @@ static bool screen_user_menu_draw_items(bContext *C, uiLayout *layout, ListBase
           SNPRINTF(label, "Missing: %s", umi_mt->mt_idname);
           uiItemL(layout, label, ICON_NONE);
         }
+        i--;
       }
     }
     else if (umi->type == USER_MENU_TYPE_SUBMENU) {
@@ -334,11 +338,13 @@ static bool screen_user_menu_draw_items(bContext *C, uiLayout *layout, ListBase
           SNPRINTF(label, "Missing: %s.%s", umi_pr->context_data_path, umi_pr->prop_id);
           uiItemL(layout, label, ICON_NONE);
         }
+        i--;
       }
     }
     else if (umi->type == USER_MENU_TYPE_SEP) {
       uiItemS(layout);
     }
+    i++;
   }
   return is_empty;
 }
@@ -353,7 +359,7 @@ static void screen_user_menu_draw(const bContext *C, Menu *menu)
     if (um == NULL) {
       continue;
     }
-    is_empty = screen_user_menu_draw_items(C, menu->layout, &um->items);
+    is_empty = screen_user_menu_draw_items(C, menu->layout, &um->items, true);
   }
   if (um_array) {
     MEM_freeN(um_array);
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index f3bb6fc8515..f5f958611df 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -1451,6 +1451,21 @@ static int rna_UserDef_usermenus_item_type_get(PointerRNA *ptr)
   return 0;
 }
 
+static void rna_UserDef_usermenus_pie_set(PointerRNA *ptr, int value)
+{
+  UserDef *userdef = (UserDef *)ptr->data;
+
+  LISTBASE_FOREACH (bUserMenu *, um, &userdef->user_menus) {
+    ListBase *lb = &um->items;
+    BKE_blender_user_menu_item_free_list(lb);
+    if (value)
+      for (int i = 0; i < 8; i++) {
+        bUserMenuItem *new_umi = BKE_blender_user_menu_item_add(lb, USER_MENU_TYPE_SEP);
+      }
+  }
+  userdef->runtime.um_is_pie = value;
+}
+
 static void rna_UserDef_usermenus_item_op_set(PointerRNA *ptr, const char *value)
 {
   bUserMenuItem_Op *umi_op = (bUserMenuItem_Op *)ptr->data;
@@ -1471,6 +1486,11 @@ static void rna_UserDef_usermenus_item_op_set(PointerRNA *ptr, const char *value
   free(opptr);
 }
 
+static void rna_UserDef_usermenu_draw(bUserMenu *um, bContext *C, uiLayout *layout)
+{
+  screen_user_menu_draw_items(C, layout, &um->items, true);
+}
+
 /* UserMenu.menu_items */
 
 static void rna_UserDef_usermenu_items_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
@@ -6369,6 +6389,11 @@ static void rna_def_userdef_usermenus_items_subtypes(BlenderRNA *brna)
   RNA_def_property_string_funcs(prop, NULL, NULL, "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

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list