Merge branch 'master' into blender2.8
authorCampbell Barton <ideasman42@gmail.com>
Fri, 24 Aug 2018 01:54:12 +0000 (11:54 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 24 Aug 2018 01:54:12 +0000 (11:54 +1000)
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface_layout.c
source/blender/makesrna/intern/rna_ui_api.c

index c88470bd323247652b76cbd42d869d1a3003c53a..e739308bd1ec0860608d054b162df391658747a8 100644 (file)
@@ -1154,8 +1154,10 @@ void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int
 void uiItemFullR(uiLayout *layout, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int flag, const char *name, int icon);
 void uiItemEnumR_prop(uiLayout *layout, const char *name, int icon, struct PointerRNA *ptr, PropertyRNA *prop, int value);
 void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA *ptr, const char *propname, int value);
+void uiItemEnumR_string_prop(uiLayout *layout, struct PointerRNA *ptr, PropertyRNA *prop, const char *value, const char *name, int icon);
 void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *value, const char *name, int icon);
 void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
+void uiItemPointerR_prop(uiLayout *layout, struct PointerRNA *ptr, PropertyRNA *prop, struct PointerRNA *searchptr, PropertyRNA *searchprop, const char *name, int icon);
 void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon);
 void uiItemsFullEnumO(
         uiLayout *layout, const char *opname, const char *propname,
index f3f08b102577e956125ec272ff9fb039e0bcd4a1..ec35325416a53e8b15ff34f4ded658434e45a48e 100644 (file)
@@ -1831,22 +1831,26 @@ void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA
        uiItemFullR(layout, ptr, prop, RNA_ENUM_VALUE, value, 0, name, icon);
 }
 
-void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *value, const char *name, int icon)
+
+void uiItemEnumR_string_prop(
+        uiLayout *layout, struct PointerRNA *ptr, PropertyRNA *prop,
+        const char *value, const char *name, int icon)
 {
-       PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
        const EnumPropertyItem *item;
        int ivalue, a;
        bool free;
 
-       if (!prop || RNA_property_type(prop) != PROP_ENUM) {
+       if (UNLIKELY(RNA_property_type(prop) != PROP_ENUM)) {
+               const char *propname = RNA_property_identifier(prop);
                ui_item_disabled(layout, propname);
-               RNA_warning("enum property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
+               RNA_warning("not an enum property: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
        RNA_property_enum_items(layout->root->block->evil_C, ptr, prop, &item, NULL, &free);
 
        if (!RNA_enum_value_from_id(item, value, &ivalue)) {
+               const char *propname = RNA_property_identifier(prop);
                if (free) {
                        MEM_freeN((void *)item);
                }
@@ -1870,6 +1874,19 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *pr
        }
 }
 
+void uiItemEnumR_string(
+        uiLayout *layout, struct PointerRNA *ptr, const char *propname,
+        const char *value, const char *name, int icon)
+{
+       PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
+       if (UNLIKELY(prop == NULL)) {
+               ui_item_disabled(layout, propname);
+               RNA_warning("enum property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
+               return;
+       }
+       uiItemEnumR_string_prop(layout, ptr, prop, value, name, icon);
+}
+
 void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname)
 {
        PropertyRNA *prop;
@@ -2008,9 +2025,12 @@ void ui_but_add_search(uiBut *but, PointerRNA *ptr, PropertyRNA *prop, PointerRN
        }
 }
 
-void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
+void uiItemPointerR_prop(
+        uiLayout *layout,
+        PointerRNA *ptr, PropertyRNA *prop,
+        PointerRNA *searchptr, PropertyRNA *searchprop,
+        const char *name, int icon)
 {
-       PropertyRNA *prop, *searchprop;
        PropertyType type;
        uiBut *but;
        uiBlock *block;
@@ -2019,32 +2039,15 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propna
        char namestr[UI_MAX_NAME_STR];
        const bool use_prop_sep = ((layout->item.flag & UI_ITEM_PROP_SEP) != 0);
 
-       /* validate arguments */
-       prop = RNA_struct_find_property(ptr, propname);
-
-       if (!prop) {
-               RNA_warning("property not found: %s.%s",
-                           RNA_struct_identifier(ptr->type), propname);
-               return;
-       }
-
        type = RNA_property_type(prop);
        if (!ELEM(type, PROP_POINTER, PROP_STRING, PROP_ENUM)) {
-               RNA_warning("Property %s must be a pointer, string or enum", propname);
-               return;
-       }
-
-       searchprop = RNA_struct_find_property(searchptr, searchpropname);
-
-
-       if (!searchprop) {
-               RNA_warning("search collection property not found: %s.%s",
-                           RNA_struct_identifier(searchptr->type), searchpropname);
+               RNA_warning("Property %s.%s must be a pointer, string or enum",
+                           RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
                return;
        }
-       else if (RNA_property_type(searchprop) != PROP_COLLECTION) {
+       if (RNA_property_type(searchprop) != PROP_COLLECTION) {
                RNA_warning("search collection property is not a collection type: %s.%s",
-                           RNA_struct_identifier(searchptr->type), searchpropname);
+                           RNA_struct_identifier(searchptr->type), RNA_property_identifier(searchprop));
                return;
        }
 
@@ -2074,6 +2077,31 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propna
        ui_but_add_search(but, ptr, prop, searchptr, searchprop);
 }
 
+void uiItemPointerR(
+        uiLayout *layout,
+        PointerRNA *ptr, const char *propname,
+        PointerRNA *searchptr, const char *searchpropname,
+        const char *name, int icon)
+{
+       PropertyRNA *prop, *searchprop;
+
+       /* validate arguments */
+       prop = RNA_struct_find_property(ptr, propname);
+       if (!prop) {
+               RNA_warning("property not found: %s.%s",
+                           RNA_struct_identifier(ptr->type), propname);
+               return;
+       }
+       searchprop = RNA_struct_find_property(searchptr, searchpropname);
+       if (!searchprop) {
+               RNA_warning("search collection property not found: %s.%s",
+                           RNA_struct_identifier(searchptr->type), searchpropname);
+               return;
+       }
+
+       uiItemPointerR_prop(layout, ptr, prop, searchptr, searchprop, name, icon);
+}
+
 /* menu item */
 static void ui_item_menutype_func(bContext *C, uiLayout *layout, void *arg_mt)
 {
index f4c4d8a7a44990ed31585a05511afcf04ffa6b73..5001f6337270a57730c5d254452b2ddff28d16ce 100644 (file)
@@ -156,8 +156,7 @@ static void rna_uiItemEnumR_string(
        /* Get translated name (label). */
        name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate);
 
-       /* XXX This will search property again :( */
-       uiItemEnumR_string(layout, ptr, propname, value, name, icon);
+       uiItemEnumR_string_prop(layout, ptr, prop, value, name, icon);
 }
 
 static void rna_uiItemPointerR(
@@ -166,17 +165,20 @@ static void rna_uiItemPointerR(
         const char *name, const char *text_ctxt, bool translate, int icon)
 {
        PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
-
        if (!prop) {
                RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
                return;
        }
+       PropertyRNA *searchprop = RNA_struct_find_property(searchptr, searchpropname);
+       if (!searchprop) {
+               RNA_warning("property not found: %s.%s", RNA_struct_identifier(searchptr->type), searchpropname);
+               return;
+       }
 
        /* Get translated name (label). */
        name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate);
 
-       /* XXX This will search property again :( */
-       uiItemPointerR(layout, ptr, propname, searchptr, searchpropname, name, icon);
+       uiItemPointerR_prop(layout, ptr, prop, searchptr, searchprop, name, icon);
 }
 
 static PointerRNA rna_uiItemO(