Merge branch 'master' into blender2.8
[blender.git] / source / blender / makesrna / intern / rna_access.c
index 89348bb8f6ce4c78baebccd50502b9a5040bdebf..9a7fd9589b05dbf334fb80ad8567bf8aaa3f261d 100644 (file)
@@ -54,6 +54,8 @@
 #include "BKE_main.h"
 #include "BKE_report.h"
 
+#include "DEG_depsgraph.h"
+
 #include "RNA_access.h"
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
@@ -62,7 +64,6 @@
 
 /* flush updates */
 #include "DNA_object_types.h"
-#include "BKE_depsgraph.h"
 #include "WM_types.h"
 
 #include "rna_internal.h"
@@ -559,7 +560,7 @@ const char *RNA_struct_translation_context(const StructRNA *type)
        return type->translation_context;
 }
 
-PropertyRNA *RNA_struct_name_property(StructRNA *type)
+PropertyRNA *RNA_struct_name_property(const StructRNA *type)
 {
        return type->nameproperty;
 }
@@ -574,6 +575,22 @@ StructRNA *RNA_struct_base(StructRNA *type)
        return type->base;
 }
 
+/**
+ * Use to find the subtype directly below a base-type.
+ *
+ * So if type were `RNA_SpotLamp`, `RNA_struct_base_of(type, &RNA_ID)` would return `&RNA_Lamp`.
+ */
+const StructRNA *RNA_struct_base_child_of(const StructRNA *type, const StructRNA *parent_type)
+{
+       while (type) {
+               if (type->base == parent_type) {
+                       return type;
+               }
+               type = type->base;
+       }
+       return NULL;
+}
+
 bool RNA_struct_is_ID(const StructRNA *type)
 {
        return (type->flag & STRUCT_ID) != 0;
@@ -1798,7 +1815,7 @@ static void rna_property_update(bContext *C, Main *bmain, Scene *scene, PointerR
                         * parts of the code that need it still, so we have this exception */
                        if (prop->flag & PROP_CONTEXT_UPDATE) {
                                if (C) {
-                                       if (prop->flag & PROP_CONTEXT_PROPERTY_UPDATE) {
+                                       if ((prop->flag & PROP_CONTEXT_PROPERTY_UPDATE) == PROP_CONTEXT_PROPERTY_UPDATE) {
                                                ((ContextPropUpdateFunc)prop->update)(C, ptr, prop);
                                        }
                                        else {
@@ -1816,7 +1833,7 @@ static void rna_property_update(bContext *C, Main *bmain, Scene *scene, PointerR
        if (!is_rna || (prop->flag & PROP_IDPROPERTY)) {
                /* WARNING! This is so property drivers update the display!
                 * not especially nice  */
-               DAG_id_tag_update(ptr->id.data, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
+               DEG_id_tag_update(ptr->id.data, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
                WM_main_add_notifier(NC_WINDOW, NULL);
                /* Not nice as well, but the only way to make sure material preview
                 * is updated with custom nodes.
@@ -2764,6 +2781,9 @@ char *RNA_property_string_get_alloc(PointerRNA *ptr, PropertyRNA *prop,
        int length;
 
        BLI_assert(RNA_property_type(prop) == PROP_STRING);
+       if (!ptr->data) {
+               return NULL;
+       }
 
        length = RNA_property_string_length(ptr, prop);
 
@@ -6699,6 +6719,13 @@ int RNA_function_call_direct_va_lookup(bContext *C, ReportList *reports, Pointer
        return 0;
 }
 
+const char *RNA_translate_ui_text(
+        const char *text, const char *text_ctxt, StructRNA *type, PropertyRNA *prop,
+        int translate)
+{
+       return rna_translate_ui_text(text, text_ctxt, type, prop, translate);
+}
+
 bool RNA_property_reset(PointerRNA *ptr, PropertyRNA *prop, int index)
 {
        int len;