/* called to assign images to UV faces */ void ED_space_image_set(SpaceImage *sima, Scene *scene, Object *obedit, Image *ima) { /* context may be NULL, so use global */ ED_uvedit_assign_image(G.main, scene, obedit, ima, sima->image); /* change the space ima after because uvedit_face_visible_test uses the space ima * to check if the face is displayed in UV-localview */ sima->image = ima; if (ima == NULL || ima->type == IMA_TYPE_R_RESULT || ima->type == IMA_TYPE_COMPOSITE) { if (sima->mode == SI_MODE_PAINT) { sima->mode = SI_MODE_VIEW; } } if (sima->image) BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE); id_us_ensure_real((ID *)sima->image); if (obedit) WM_main_add_notifier(NC_GEOM | ND_DATA, obedit->data); WM_main_add_notifier(NC_SPACE | ND_SPACE_IMAGE, NULL); }
void ED_space_clip_set_mask(bContext *C, SpaceClip *sc, Mask *mask) { sc->mask_info.mask = mask; id_us_ensure_real((ID *)sc->mask_info.mask); if (C) { WM_event_add_notifier(C, NC_MASK | NA_SELECTED, mask); } }
void ED_space_image_set_mask(bContext *C, SpaceImage *sima, Mask *mask) { sima->mask_info.mask = mask; /* weak, but same as image/space */ id_us_ensure_real((ID *)sima->mask_info.mask); if (C) { WM_event_add_notifier(C, NC_MASK | NA_SELECTED, mask); } }
void ED_space_clip_set_clip(bContext *C, bScreen *screen, SpaceClip *sc, MovieClip *clip) { MovieClip *old_clip; bool old_clip_visible = false; if (!screen && C) screen = CTX_wm_screen(C); old_clip = sc->clip; sc->clip = clip; id_us_ensure_real((ID *)sc->clip); if (screen && sc->view == SC_VIEW_CLIP) { ScrArea *area; SpaceLink *sl; for (area = screen->areabase.first; area; area = area->next) { for (sl = area->spacedata.first; sl; sl = sl->next) { if (sl->spacetype == SPACE_CLIP) { SpaceClip *cur_sc = (SpaceClip *) sl; if (cur_sc != sc) { if (cur_sc->view == SC_VIEW_CLIP) { if (cur_sc->clip == old_clip) old_clip_visible = true; } else { if (cur_sc->clip == old_clip || cur_sc->clip == NULL) { cur_sc->clip = clip; } } } } } } } /* If clip is no longer visible on screen, free memory used by it's cache */ if (old_clip && old_clip != clip && !old_clip_visible) { BKE_movieclip_clear_cache(old_clip); } if (C) WM_event_add_notifier(C, NC_MOVIECLIP | NA_SELECTED, sc->clip); }
static int editsource_text_edit(bContext *C, wmOperator *op, const char filepath[FILE_MAX], const int line) { struct Main *bmain = CTX_data_main(C); Text *text; /* Developers may wish to copy-paste to an external editor. */ printf("%s:%d\n", filepath, line); for (text = bmain->texts.first; text; text = text->id.next) { if (text->name && BLI_path_cmp(text->name, filepath) == 0) { break; } } if (text == NULL) { text = BKE_text_load(bmain, filepath, BKE_main_blendfile_path(bmain)); id_us_ensure_real(&text->id); } if (text == NULL) { BKE_reportf(op->reports, RPT_WARNING, "File '%s' cannot be opened", filepath); return OPERATOR_CANCELLED; } else { /* naughty!, find text area to set, not good behavior * but since this is a dev tool lets allow it - campbell */ ScrArea *sa = BKE_screen_find_big_area(CTX_wm_screen(C), SPACE_TEXT, 0); if (sa) { SpaceText *st = sa->spacedata.first; st->text = text; } else { BKE_reportf(op->reports, RPT_INFO, "See '%s' in the text editor", text->id.name + 2); } txt_move_toline(text, line - 1, false); WM_event_add_notifier(C, NC_TEXT | ND_CURSOR, text); } return OPERATOR_FINISHED; }
static int foreach_libblock_remap_callback(void *user_data, ID *id_self, ID **id_p, int cb_flag) { IDRemap *id_remap_data = user_data; ID *old_id = id_remap_data->old_id; ID *new_id = id_remap_data->new_id; ID *id = id_remap_data->id; if (!old_id) { /* Used to cleanup all IDs used by a specific one. */ BLI_assert(!new_id); old_id = *id_p; } if (*id_p && (*id_p == old_id)) { const bool is_indirect = (cb_flag & IDWALK_INDIRECT_USAGE) != 0; const bool skip_indirect = (id_remap_data->flag & ID_REMAP_SKIP_INDIRECT_USAGE) != 0; /* Note: proxy usage implies LIB_TAG_EXTERN, so on this aspect it is direct, * on the other hand since they get reset to lib data on file open/reload it is indirect too... * Edit Mode is also a 'skip direct' case. */ const bool is_obj = (GS(id->name) == ID_OB); const bool is_obj_editmode = (is_obj && BKE_object_is_in_editmode((Object *)id)); const bool is_never_null = ((cb_flag & IDWALK_NEVER_NULL) && (new_id == NULL) && (id_remap_data->flag & ID_REMAP_FORCE_NEVER_NULL_USAGE) == 0); const bool skip_never_null = (id_remap_data->flag & ID_REMAP_SKIP_NEVER_NULL_USAGE) != 0; #ifdef DEBUG_PRINT printf("In %s: Remapping %s (%p) to %s (%p) (skip_indirect: %d)\n", id->name, old_id->name, old_id, new_id ? new_id->name : "<NONE>", new_id, skip_indirect); #endif if ((id_remap_data->flag & ID_REMAP_FLAG_NEVER_NULL_USAGE) && (cb_flag & IDWALK_NEVER_NULL)) { id->tag |= LIB_TAG_DOIT; } /* Special hack in case it's Object->data and we are in edit mode (skipped_direct too). */ if ((is_never_null && skip_never_null) || (is_obj_editmode && (((Object *)id)->data == *id_p)) || (skip_indirect && is_indirect)) { if (is_indirect) { id_remap_data->skipped_indirect++; } else if (is_never_null || is_obj_editmode) { id_remap_data->skipped_direct++; } else { BLI_assert(0); } if (cb_flag & IDWALK_USER) { id_remap_data->skipped_refcounted++; } else if (cb_flag & IDWALK_USER_ONE) { /* No need to count number of times this happens, just a flag is enough. */ id_remap_data->status |= ID_REMAP_IS_USER_ONE_SKIPPED; } } else { if (!is_never_null) { *id_p = new_id; DAG_id_tag_update_ex(id_remap_data->bmain, id_self, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME); } if (cb_flag & IDWALK_USER) { id_us_min(old_id); /* We do not want to handle LIB_TAG_INDIRECT/LIB_TAG_EXTERN here. */ if (new_id) new_id->us++; } else if (cb_flag & IDWALK_USER_ONE) { id_us_ensure_real(new_id); /* We cannot affect old_id->us directly, LIB_TAG_EXTRAUSER(_SET) are assumed to be set as needed, * that extra user is processed in final handling... */ } if (!is_indirect) { id_remap_data->status |= ID_REMAP_IS_LINKED_DIRECT; } } } return IDWALK_RET_NOP; }