Merge branch 'master' into blender2.8
authorCampbell Barton <ideasman42@gmail.com>
Tue, 12 Jun 2018 15:36:24 +0000 (17:36 +0200)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 12 Jun 2018 15:36:24 +0000 (17:36 +0200)
source/blender/blenkernel/BKE_screen.h
source/blender/blenkernel/intern/screen.c
source/blender/editors/screen/area.c
source/blender/python/intern/bpy_rna_callback.c

index 0b95152ad8ea1448db2b0d9c7c5cf0f9bdb49672..4270e6eb1b408e1ba4b56795a4a178190876def0 100644 (file)
@@ -305,6 +305,7 @@ typedef struct Menu {
 
 /* spacetypes */
 struct SpaceType *BKE_spacetype_from_id(int spaceid);
+struct ARegionType *BKE_regiontype_from_id_or_first(struct SpaceType *st, int regionid);
 struct ARegionType *BKE_regiontype_from_id(struct SpaceType *st, int regionid);
 const struct ListBase *BKE_spacetypes_list(void);
 void BKE_spacetype_register(struct SpaceType *st);
index 8cff10902ef0b859a50c05f5d06d377b6b901cc7..b6b49a49de3d16095fbd4e66a90d6f070721fb60 100644 (file)
@@ -114,7 +114,7 @@ SpaceType *BKE_spacetype_from_id(int spaceid)
        return NULL;
 }
 
-ARegionType *BKE_regiontype_from_id(SpaceType *st, int regionid)
+ARegionType *BKE_regiontype_from_id_or_first(SpaceType *st, int regionid)
 {
        ARegionType *art;
        
@@ -126,6 +126,18 @@ ARegionType *BKE_regiontype_from_id(SpaceType *st, int regionid)
        return st->regiontypes.first;
 }
 
+ARegionType *BKE_regiontype_from_id(SpaceType *st, int regionid)
+{
+       ARegionType *art;
+       
+       for (art = st->regiontypes.first; art; art = art->next) {
+               if (art->regionid == regionid) {
+                       return art;
+               }
+       }
+       return NULL;
+}
+
 
 const ListBase *BKE_spacetypes_list(void)
 {
index d2301fa74d46c3886eab8be7e44429322fa36572..6f2c443f16be1bb4a0fc1c7c266289d850117b2d 100644 (file)
@@ -1455,7 +1455,7 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
        }
 
        for (ar = sa->regionbase.first; ar; ar = ar->next)
-               ar->type = BKE_regiontype_from_id(sa->type, ar->regiontype);
+               ar->type = BKE_regiontype_from_id_or_first(sa->type, ar->regiontype);
 
        /* area sizes */
        area_calc_totrct(sa, &window_rect);
index 45d556d68e9932496f1c1519de1ddc4dddf8a79f..7adb1d40fcc973d447842c50cd75d40bf765e952 100644 (file)
@@ -101,7 +101,10 @@ PyObject *pyrna_callback_add(BPy_StructRNA *self, PyObject *args)
 
        if (RNA_struct_is_a(self->ptr.type, &RNA_Region)) {
                if (cb_event_str) {
-                       if (pyrna_enum_value_from_id(region_draw_mode_items, cb_event_str, &cb_event, "bpy_struct.callback_add()") == -1) {
+                       if (pyrna_enum_value_from_id(
+                                   region_draw_mode_items, cb_event_str,
+                                   &cb_event, "bpy_struct.callback_add()") == -1)
+                       {
                                return NULL;
                        }
                }
@@ -210,10 +213,16 @@ PyObject *pyrna_callback_classmethod_add(PyObject *UNUSED(self), PyObject *args)
                        return NULL;
                }
 
-               if (pyrna_enum_value_from_id(region_draw_mode_items, cb_event_str, &cb_event, "bpy_struct.callback_add()") == -1) {
+               if (pyrna_enum_value_from_id(
+                           region_draw_mode_items, cb_event_str,
+                           &cb_event, "bpy_struct.callback_add()") == -1)
+               {
                        return NULL;
                }
-               else if (pyrna_enum_value_from_id(rna_enum_region_type_items, cb_regiontype_str, &cb_regiontype, "bpy_struct.callback_add()") == -1) {
+               else if (pyrna_enum_value_from_id(
+                                rna_enum_region_type_items, cb_regiontype_str,
+                                &cb_regiontype, "bpy_struct.callback_add()") == -1)
+               {
                        return NULL;
                }
                else {
@@ -225,7 +234,10 @@ PyObject *pyrna_callback_classmethod_add(PyObject *UNUSED(self), PyObject *args)
                        else {
                                SpaceType *st = BKE_spacetype_from_id(spaceid);
                                ARegionType *art = BKE_regiontype_from_id(st, cb_regiontype);
-
+                               if (art == NULL) {
+                                       PyErr_Format(PyExc_TypeError, "region type '%.200s' not in space", cb_regiontype_str);
+                                       return NULL;
+                               }
                                handle = ED_region_draw_cb_activate(art, cb_region_draw, (void *)args, cb_event);
                                Py_INCREF(args);
                        }
@@ -276,7 +288,10 @@ PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *ar
                customdata = ED_region_draw_cb_customdata(handle);
                Py_DECREF((PyObject *)customdata);
 
-               if (pyrna_enum_value_from_id(rna_enum_region_type_items, cb_regiontype_str, &cb_regiontype, "bpy_struct.callback_remove()") == -1) {
+               if (pyrna_enum_value_from_id(
+                           rna_enum_region_type_items, cb_regiontype_str,
+                           &cb_regiontype, "bpy_struct.callback_remove()") == -1)
+               {
                        return NULL;
                }
                else {
@@ -288,7 +303,10 @@ PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *ar
                        else {
                                SpaceType *st = BKE_spacetype_from_id(spaceid);
                                ARegionType *art = BKE_regiontype_from_id(st, cb_regiontype);
-
+                               if (art == NULL) {
+                                       PyErr_Format(PyExc_TypeError, "region type '%.200s' not in space", cb_regiontype_str);
+                                       return NULL;
+                               }
                                ED_region_draw_cb_exit(art, handle);
                        }
                }