[Bf-blender-cvs] [3229939eae9] soc-2020-custom-menus: Custom Menu: fix display error, operator editor

TempoDev noreply at git.blender.org
Sun Jun 14 23:36:51 CEST 2020


Commit: 3229939eae95b4b9d0c885d33ed5af29598360e4
Author: TempoDev
Date:   Sun Jun 14 23:36:27 2020 +0200
Branches: soc-2020-custom-menus
https://developer.blender.org/rB3229939eae95b4b9d0c885d33ed5af29598360e4

Custom Menu: fix display error, operator editor

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

M	release/scripts/modules/rna_custom_menu_ui.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 8814e7cdfb0..2c227c40eed 100644
--- a/release/scripts/modules/rna_custom_menu_ui.py
+++ b/release/scripts/modules/rna_custom_menu_ui.py
@@ -156,15 +156,15 @@ def draw_item_box(context, row):
     #    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)
+    box_col.prop(cm, "cm_item_selected", expand=True)
     
     row = row.split(factor=0.9, align=True)
     col = row.column(align=True)
 
     col.operator("preferences.menuitem_add", text="", icon='ADD')
     col.operator("preferences.menuitem_remove", text="", icon='REMOVE')
-    col.operator("wm.keyconfig_preset_add", text="", icon='TRIA_UP')
-    col.operator("wm.keyconfig_preset_add", text="", icon='TRIA_DOWN').remove_active = True
+    #col.operator("preferences.item_up", text="", icon='TRIA_UP')
+    #col.operator("preferences.item_down", text="", icon='TRIA_DOWN')
     row.separator()
 
 def draw_item_editor(context, row):
@@ -178,7 +178,10 @@ def draw_item_editor(context, row):
         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_type")
         col.prop(cm, "cm_item_name")
+        if (cm.item_type() == "OPERATOR"):
+            col.prop(cm, "cm_item_operator")
     else :
         col.label(text="No item selected.")
 
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index cb8ecc68ed4..1733186d0b5 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -881,10 +881,12 @@ typedef struct UserDef {
   struct WalkNavigation walk_navigation;
 
   /** custom menu **/
-  int cmspaceselect;
+  short cmspaceselect;
   short cmcontextselect;
   short cmitemselect;
+  short cmitemtype;
   char cmitemname[64];
+  char cmitemop[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 fb268578bb7..e994e56b2da 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -1280,6 +1280,32 @@ static int rna_UserDef_usermenu_item_selected(UserDef *userdef)
   return userdef->cmitemselect - 1;
 }
 
+static const char *rna_UserDef_usermenu_item_type(UserDef *userdef)
+{
+  int i = 0;
+  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) {
+        switch (umi->type) {
+          case USER_MENU_TYPE_OPERATOR : return "OPERATOR";
+          case USER_MENU_TYPE_SEP : return "SEPARATOR";
+          case USER_MENU_TYPE_MENU : return "MENU";
+          case USER_MENU_TYPE_PROP : return "PROPERTY";
+          return "";
+        }
+      }
+    }
+  }
+  return "";
+}
+
 /* usermenu item name */
 static void rna_UserDef_usermenu_name_get(PointerRNA *ptr, char *value)
 {
@@ -1300,6 +1326,7 @@ static void rna_UserDef_usermenu_name_get(PointerRNA *ptr, char *value)
       }
     }
   }
+  BLI_strncpy(value, "", FILE_MAX);
 }
 
 static void rna_UserDef_usermenu_name_set(PointerRNA *ptr, char *value)
@@ -1344,6 +1371,100 @@ static int rna_UserDef_usermenu_item_length(PointerRNA *ptr)
   return 0;
 }
 
+/* usermenu item op */
+static void rna_UserDef_usermenu_op_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) {
+        if (umi->type != USER_MENU_TYPE_OPERATOR) return;
+        bUserMenuItem_Op *umi_op = (bUserMenuItem_Op *)umi;
+        BLI_strncpy(value, umi_op->op_idname, FILE_MAX);
+        return;
+      }
+    }
+  }
+  BLI_strncpy(value, "", FILE_MAX);
+}
+
+static void rna_UserDef_usermenu_op_set(PointerRNA *ptr, char *value)
+{
+  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;
+    int i = 0;
+    for (bUserMenuItem *umi = lb->first; umi; umi = umi->next, i++) {
+      if (i == userdef->cmitemselect - 1) {
+        if (umi->type != USER_MENU_TYPE_OPERATOR) return;
+
+        bUserMenuItem_Op *umi_op = (bUserMenuItem_Op *)umi;
+        wmOperatorType *origin_ot = WM_operatortype_find(umi_op->op_idname, true);
+        wmOperatorType *ot = WM_operatortype_find(value, false);
+        //if (umi_op->prop) {
+        //  IDP_print(umi_op->prop);
+        //  printf("%s\n", umi_op->prop->name);
+        //}
+        if (origin_ot == ot) return;
+        if (ot != NULL) {
+          struct PointerRNA *opptr = MEM_callocN(sizeof(PointerRNA), "uiButOpPtr");
+          WM_operator_properties_create_ptr(opptr, ot);
+          WM_operator_properties_default(opptr, false);
+          
+          IDProperty *properties = opptr->data;
+          //if (properties) {
+          // printf("%s\n", properties->name);
+          // IDP_print(properties);
+
+          //}
+          
+          //IDProperty *prop = ot->prop ? IDP_CopyProperty(ot->prop) : NULL;
+          umi_op->prop = opptr->data;
+          
+          BLI_strncpy(umi_op->op_idname, value, FILE_MAX);
+        }
+        return;
+      }
+    }
+  }
+}
+
+static int rna_UserDef_usermenu_op_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
 
 #  define USERDEF_TAG_DIRTY_PROPERTY_UPDATE_ENABLE \
@@ -6234,17 +6355,17 @@ static void rna_def_userdef_custom_menu(BlenderRNA *brna)
       prop, "rna_UserDef_usermenu_name_get", "rna_UserDef_usermenu_item_length", "rna_UserDef_usermenu_name_set");
   RNA_def_property_ui_text(prop, "Name", "The name to display");
 
-  //prop = RNA_def_property(srna, "cm_item_operator", PROP_STRING, PROP_NONE);
-  //RNA_def_property_string_sdna(prop, NULL, "cmitemop");
-  //RNA_def_property_string_funcs(
-  //    prop, "rna_UserDef_usermenu_name_get", "rna_UserDef_usermenu_item_length", "rna_UserDef_usermenu_name_set");
-  //RNA_def_property_ui_text(prop, "operator", "The operator to display");
+  prop = RNA_def_property(srna, "cm_item_operator", PROP_STRING, PROP_NONE);
+  RNA_def_property_string_sdna(prop, NULL, "cmitemop");
+  RNA_def_property_string_funcs(
+      prop, "rna_UserDef_usermenu_op_get", "rna_UserDef_usermenu_op_length", "rna_UserDef_usermenu_op_set");
+  RNA_def_property_ui_text(prop, "operator", "The operator to display");
 
-  //prop = RNA_def_property(srna, "cm_item_type", PROP_ENUM, PROP_NONE);
-  //RNA_def_property_enum_sdna(prop, NULL, "cmitemtype");
-  //RNA_def_property_enum_items(prop, custom_menu_type_items);
-  //RNA_def_property_ui_text(
-  //    prop, "type", "the type of item");
+  prop = RNA_def_property(srna, "cm_item_type", PROP_ENUM, PROP_NONE);
+  RNA_def_property_enum_sdna(prop, NULL, "cmitemtype");
+  RNA_def_property_enum_items(prop, custom_menu_type_items);
+  RNA_def_property_ui_text(
+      prop, "type", "the type of item");
 
   //functions
   func = RNA_def_function(srna, "item_selected", "rna_UserDef_usermenu_item_selected");
@@ -6256,6 +6377,16 @@ static void rna_def_userdef_custom_menu(BlenderRNA *brna)
                         "the item id", 0, 1000);
   RNA_def_function_return(func, parm);
 
+  func = RNA_def_function(srna, "item_type", "rna_UserDef_usermenu_item_type");
+  RNA_def_function_ui_description(func, "get item type");
+  parm = RNA_def_string(func,
+                        "type",
+                        NULL,
+                        0,
+                        "type",
+                        "type of the item");
+  RNA_def_function_return(func, parm);
+
   func = RNA_def_function(srna, "item_name_get", "rna_UserDef_usermenu_item_name_get");
   RNA_def_function_ui_description(func, "Refresh custom menu editor");
   parm = RNA_def_string(func,
@@ -6319,6 +6450,44 @@ static void rna_def_userdef_custom_menu(BlenderRNA *brna)
   parm = RNA_def_int(func, "index", 0, 0, 100, "Index", "index of the item in list", 0, 100);
   RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
 
+  func = RNA_def_function(srna, "item_up", "rna_UserDef_usermenu_item_remove");
+  RNA_def_function_ui_description(func, "add an item to a menu");
+  parm = RNA_def_string(func,
+                        "spacetype",
+                        NULL,
+                        0,
+                        "SpaceType",
+  

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list