Fix crash accessing image space properties without an active window

This commit is contained in:
Campbell Barton 2020-09-02 12:44:37 +10:00 committed by Jeroen Bakker
parent c4b9e2da8c
commit 006ff64538
Notes: blender-bot 2023-02-14 06:00:49 +01:00
Referenced by issue #77348, Blender LTS: Maintenance Task 2.83
6 changed files with 31 additions and 22 deletions

View File

@ -106,7 +106,7 @@ bool ED_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit);
bool ED_space_image_paint_curve(const struct bContext *C);
bool ED_space_image_check_show_maskedit(struct SpaceImage *sima, struct ViewLayer *view_layer);
bool ED_space_image_check_show_maskedit(struct SpaceImage *sima, struct Object *obedit);
bool ED_space_image_maskedit_poll(struct bContext *C);
bool ED_space_image_maskedit_mask_poll(struct bContext *C);
bool ED_space_image_cursor_poll(struct bContext *C);

View File

@ -610,7 +610,8 @@ bool ED_operator_mask(bContext *C)
case SPACE_IMAGE: {
SpaceImage *sima = area->spacedata.first;
ViewLayer *view_layer = CTX_data_view_layer(C);
return ED_space_image_check_show_maskedit(sima, view_layer);
Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
return ED_space_image_check_show_maskedit(sima, obedit);
}
}
}

View File

@ -475,11 +475,10 @@ bool ED_space_image_show_uvedit(SpaceImage *sima, Object *obedit)
}
/* matches clip function */
bool ED_space_image_check_show_maskedit(SpaceImage *sima, ViewLayer *view_layer)
bool ED_space_image_check_show_maskedit(SpaceImage *sima, Object *obedit)
{
/* check editmode - this is reserved for UV editing */
Object *ob = OBACT(view_layer);
if (ob && ob->mode & OB_MODE_EDIT && ED_space_image_show_uvedit(sima, ob)) {
if (obedit && ED_space_image_show_uvedit(sima, obedit)) {
return false;
}
@ -492,7 +491,8 @@ bool ED_space_image_maskedit_poll(bContext *C)
if (sima) {
ViewLayer *view_layer = CTX_data_view_layer(C);
return ED_space_image_check_show_maskedit(sima, view_layer);
Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
return ED_space_image_check_show_maskedit(sima, obedit);
}
return false;

View File

@ -905,7 +905,7 @@ static int image_view_selected_exec(bContext *C, wmOperator *UNUSED(op))
return OPERATOR_CANCELLED;
}
}
else if (ED_space_image_check_show_maskedit(sima, view_layer)) {
else if (ED_space_image_check_show_maskedit(sima, obedit)) {
if (!ED_mask_selected_minmax(C, min, max)) {
return OPERATOR_CANCELLED;
}

View File

@ -368,10 +368,9 @@ static void image_listener(wmWindow *win, ScrArea *area, wmNotifier *wmn, Scene
}
break;
case NC_MASK: {
// Scene *scene = wmn->window->screen->scene;
/* ideally would check for: ED_space_image_check_show_maskedit(scene, sima)
* but we cant get the scene */
if (sima->mode == SI_MODE_MASK) {
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
if (ED_space_image_check_show_maskedit(sima, obedit)) {
switch (wmn->data) {
case ND_SELECT:
ED_area_tag_redraw(area);

View File

@ -1455,11 +1455,14 @@ static bool rna_SpaceImageEditor_show_paint_get(PointerRNA *ptr)
static bool rna_SpaceImageEditor_show_uvedit_get(PointerRNA *ptr)
{
SpaceImage *sima = (SpaceImage *)(ptr->data);
SpaceImage *sima = ptr->data;
bScreen *screen = (bScreen *)ptr->owner_id;
Object *obedit = NULL;
wmWindow *win = ED_screen_window_find(screen, G_MAIN->wm.first);
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
if (win != NULL) {
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
}
return ED_space_image_show_uvedit(sima, obedit);
}
@ -1467,22 +1470,28 @@ static bool rna_SpaceImageEditor_show_maskedit_get(PointerRNA *ptr)
{
SpaceImage *sima = (SpaceImage *)(ptr->data);
bScreen *screen = (bScreen *)ptr->owner_id;
Object *obedit = NULL;
wmWindow *win = ED_screen_window_find(screen, G_MAIN->wm.first);
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
return ED_space_image_check_show_maskedit(sima, view_layer);
if (win != NULL) {
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
}
return ED_space_image_check_show_maskedit(sima, obedit);
}
static void rna_SpaceImageEditor_image_set(PointerRNA *ptr,
PointerRNA value,
struct ReportList *UNUSED(reports))
{
SpaceImage *sima = (SpaceImage *)(ptr->data);
bScreen *screen = (bScreen *)ptr->owner_id;
wmWindow *win = ED_screen_window_find(screen, G_MAIN->wm.first);
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
BLI_assert(BKE_id_is_in_global_main(value.data));
SpaceImage *sima = ptr->data;
bScreen *screen = (bScreen *)ptr->owner_id;
Object *obedit = NULL;
wmWindow *win = ED_screen_window_find(screen, G_MAIN->wm.first);
if (win != NULL) {
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
}
ED_space_image_set(G_MAIN, sima, obedit, (Image *)value.data, false);
}