[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