Replace the int argument for user count mode when restoring pointers on
undo with a nicer enum. This is more transparent about what happens with the user count. Also added comments to make certain the meaning of these values is easily understandable.
This commit is contained in:
parent
6b2d1d1493
commit
907be3632c
|
@ -5796,16 +5796,23 @@ static void lib_link_screen(FileData *fd, Main *main)
|
|||
}
|
||||
}
|
||||
|
||||
static bool restore_pointer(ID *id, ID *newid, int user)
|
||||
/* how to handle user count on pointer restore */
|
||||
typedef enum ePointerUserMode {
|
||||
USER_IGNORE, /* ignore user count */
|
||||
USER_ONE, /* ensure at least one user (fake also counts) */
|
||||
USER_REAL /* ensure at least one real user (fake user ignored) */
|
||||
} ePointerUserMode;
|
||||
|
||||
static bool restore_pointer(ID *id, ID *newid, ePointerUserMode user)
|
||||
{
|
||||
if (strcmp(newid->name + 2, id->name + 2) == 0) {
|
||||
if (newid->lib == id->lib) {
|
||||
if (user == 1) {
|
||||
if (user == USER_ONE) {
|
||||
if (newid->us == 0) {
|
||||
newid->us++;
|
||||
}
|
||||
}
|
||||
else if (user == 2) {
|
||||
else if (user == USER_REAL) {
|
||||
id_us_ensure_real(newid);
|
||||
}
|
||||
return true;
|
||||
|
@ -5822,7 +5829,7 @@ static bool restore_pointer(ID *id, ID *newid, int user)
|
|||
* - 1: ensure a user
|
||||
* - 2: ensure a real user (even if a fake one is set)
|
||||
*/
|
||||
static void *restore_pointer_by_name(Main *mainp, ID *id, int user)
|
||||
static void *restore_pointer_by_name(Main *mainp, ID *id, ePointerUserMode user)
|
||||
{
|
||||
if (id) {
|
||||
ListBase *lb = which_libbase(mainp, GS(id->name));
|
||||
|
@ -5845,7 +5852,7 @@ static void lib_link_seq_clipboard_pt_restore(ID *id, Main *newmain)
|
|||
if (id) {
|
||||
/* clipboard must ensure this */
|
||||
BLI_assert(id->newid != NULL);
|
||||
id->newid = restore_pointer_by_name(newmain, (ID *)id->newid, 1);
|
||||
id->newid = restore_pointer_by_name(newmain, (ID *)id->newid, USER_ONE);
|
||||
}
|
||||
}
|
||||
static int lib_link_seq_clipboard_cb(Sequence *seq, void *arg_pt)
|
||||
|
@ -5879,7 +5886,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
/* first windowmanager */
|
||||
for (wm = newmain->wm.first; wm; wm = wm->id.next) {
|
||||
for (win= wm->windows.first; win; win= win->next) {
|
||||
win->screen = restore_pointer_by_name(newmain, (ID *)win->screen, 1);
|
||||
win->screen = restore_pointer_by_name(newmain, (ID *)win->screen, USER_ONE);
|
||||
|
||||
if (win->screen == NULL)
|
||||
win->screen = curscreen;
|
||||
|
@ -5892,7 +5899,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
for (sc = newmain->screen.first; sc; sc = sc->id.next) {
|
||||
Scene *oldscene = sc->scene;
|
||||
|
||||
sc->scene= restore_pointer_by_name(newmain, (ID *)sc->scene, 1);
|
||||
sc->scene= restore_pointer_by_name(newmain, (ID *)sc->scene, USER_ONE);
|
||||
if (sc->scene == NULL)
|
||||
sc->scene = curscene;
|
||||
|
||||
|
@ -5911,14 +5918,14 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
if (v3d->scenelock)
|
||||
v3d->camera = NULL; /* always get from scene */
|
||||
else
|
||||
v3d->camera = restore_pointer_by_name(newmain, (ID *)v3d->camera, 1);
|
||||
v3d->camera = restore_pointer_by_name(newmain, (ID *)v3d->camera, USER_ONE);
|
||||
if (v3d->camera == NULL)
|
||||
v3d->camera = sc->scene->camera;
|
||||
v3d->ob_centre = restore_pointer_by_name(newmain, (ID *)v3d->ob_centre, 1);
|
||||
v3d->ob_centre = restore_pointer_by_name(newmain, (ID *)v3d->ob_centre, USER_ONE);
|
||||
|
||||
for (bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next) {
|
||||
bgpic->ima = restore_pointer_by_name(newmain, (ID *)bgpic->ima, 1);
|
||||
bgpic->clip = restore_pointer_by_name(newmain, (ID *)bgpic->clip, 1);
|
||||
bgpic->ima = restore_pointer_by_name(newmain, (ID *)bgpic->ima, USER_ONE);
|
||||
bgpic->clip = restore_pointer_by_name(newmain, (ID *)bgpic->clip, USER_ONE);
|
||||
}
|
||||
if (v3d->localvd) {
|
||||
/*Base *base;*/
|
||||
|
@ -5960,10 +5967,10 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
bDopeSheet *ads = sipo->ads;
|
||||
|
||||
if (ads) {
|
||||
ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, 1);
|
||||
ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, USER_ONE);
|
||||
|
||||
if (ads->filter_grp)
|
||||
ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, 0);
|
||||
ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, USER_IGNORE);
|
||||
}
|
||||
|
||||
/* force recalc of list of channels (i.e. includes calculating F-Curve colors)
|
||||
|
@ -5973,7 +5980,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
}
|
||||
else if (sl->spacetype == SPACE_BUTS) {
|
||||
SpaceButs *sbuts = (SpaceButs *)sl;
|
||||
sbuts->pinid = restore_pointer_by_name(newmain, sbuts->pinid, 0);
|
||||
sbuts->pinid = restore_pointer_by_name(newmain, sbuts->pinid, USER_IGNORE);
|
||||
//XXX if (sbuts->ri) sbuts->ri->curtile = 0;
|
||||
}
|
||||
else if (sl->spacetype == SPACE_FILE) {
|
||||
|
@ -5983,11 +5990,11 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
else if (sl->spacetype == SPACE_ACTION) {
|
||||
SpaceAction *saction = (SpaceAction *)sl;
|
||||
|
||||
saction->action = restore_pointer_by_name(newmain, (ID *)saction->action, 1);
|
||||
saction->ads.source = restore_pointer_by_name(newmain, (ID *)saction->ads.source, 1);
|
||||
saction->action = restore_pointer_by_name(newmain, (ID *)saction->action, USER_ONE);
|
||||
saction->ads.source = restore_pointer_by_name(newmain, (ID *)saction->ads.source, USER_ONE);
|
||||
|
||||
if (saction->ads.filter_grp)
|
||||
saction->ads.filter_grp = restore_pointer_by_name(newmain, (ID *)saction->ads.filter_grp, 0);
|
||||
saction->ads.filter_grp = restore_pointer_by_name(newmain, (ID *)saction->ads.filter_grp, USER_IGNORE);
|
||||
|
||||
|
||||
/* force recalc of list of channels, potentially updating the active action
|
||||
|
@ -5998,7 +6005,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
else if (sl->spacetype == SPACE_IMAGE) {
|
||||
SpaceImage *sima = (SpaceImage *)sl;
|
||||
|
||||
sima->image = restore_pointer_by_name(newmain, (ID *)sima->image, 2);
|
||||
sima->image = restore_pointer_by_name(newmain, (ID *)sima->image, USER_REAL);
|
||||
|
||||
/* this will be freed, not worth attempting to find same scene,
|
||||
* since it gets initialized later */
|
||||
|
@ -6013,8 +6020,8 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
/* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data
|
||||
* so assume that here we're doing for undo only...
|
||||
*/
|
||||
sima->gpd = restore_pointer_by_name(newmain, (ID *)sima->gpd, 1);
|
||||
sima->mask_info.mask = restore_pointer_by_name(newmain, (ID *)sima->mask_info.mask, 2);
|
||||
sima->gpd = restore_pointer_by_name(newmain, (ID *)sima->gpd, USER_ONE);
|
||||
sima->mask_info.mask = restore_pointer_by_name(newmain, (ID *)sima->mask_info.mask, USER_REAL);
|
||||
}
|
||||
else if (sl->spacetype == SPACE_SEQ) {
|
||||
SpaceSeq *sseq = (SpaceSeq *)sl;
|
||||
|
@ -6022,29 +6029,29 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
/* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data
|
||||
* so assume that here we're doing for undo only...
|
||||
*/
|
||||
sseq->gpd = restore_pointer_by_name(newmain, (ID *)sseq->gpd, 1);
|
||||
sseq->gpd = restore_pointer_by_name(newmain, (ID *)sseq->gpd, USER_ONE);
|
||||
}
|
||||
else if (sl->spacetype == SPACE_NLA) {
|
||||
SpaceNla *snla = (SpaceNla *)sl;
|
||||
bDopeSheet *ads = snla->ads;
|
||||
|
||||
if (ads) {
|
||||
ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, 1);
|
||||
ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, USER_ONE);
|
||||
|
||||
if (ads->filter_grp)
|
||||
ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, 0);
|
||||
ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, USER_IGNORE);
|
||||
}
|
||||
}
|
||||
else if (sl->spacetype == SPACE_TEXT) {
|
||||
SpaceText *st = (SpaceText *)sl;
|
||||
|
||||
st->text = restore_pointer_by_name(newmain, (ID *)st->text, 1);
|
||||
st->text = restore_pointer_by_name(newmain, (ID *)st->text, USER_ONE);
|
||||
if (st->text == NULL) st->text = newmain->text.first;
|
||||
}
|
||||
else if (sl->spacetype == SPACE_SCRIPT) {
|
||||
SpaceScript *scpt = (SpaceScript *)sl;
|
||||
|
||||
scpt->script = restore_pointer_by_name(newmain, (ID *)scpt->script, 1);
|
||||
scpt->script = restore_pointer_by_name(newmain, (ID *)scpt->script, USER_ONE);
|
||||
|
||||
/*sc->script = NULL; - 2.45 set to null, better re-run the script */
|
||||
if (scpt->script) {
|
||||
|
@ -6054,7 +6061,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
else if (sl->spacetype == SPACE_OUTLINER) {
|
||||
SpaceOops *so= (SpaceOops *)sl;
|
||||
|
||||
so->search_tse.id = restore_pointer_by_name(newmain, so->search_tse.id, 0);
|
||||
so->search_tse.id = restore_pointer_by_name(newmain, so->search_tse.id, USER_IGNORE);
|
||||
|
||||
if (so->treestore) {
|
||||
TreeStoreElem *tselem;
|
||||
|
@ -6062,7 +6069,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
|
||||
BLI_mempool_iternew(so->treestore, &iter);
|
||||
while ((tselem = BLI_mempool_iterstep(&iter))) {
|
||||
tselem->id = restore_pointer_by_name(newmain, tselem->id, 0);
|
||||
tselem->id = restore_pointer_by_name(newmain, tselem->id, USER_IGNORE);
|
||||
}
|
||||
if (so->treehash) {
|
||||
/* rebuild hash table, because it depends on ids too */
|
||||
|
@ -6076,14 +6083,14 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
bNodeTree *ntree;
|
||||
|
||||
/* node tree can be stored locally in id too, link this first */
|
||||
snode->id = restore_pointer_by_name(newmain, snode->id, 1);
|
||||
snode->from = restore_pointer_by_name(newmain, snode->from, 0);
|
||||
snode->id = restore_pointer_by_name(newmain, snode->id, USER_ONE);
|
||||
snode->from = restore_pointer_by_name(newmain, snode->from, USER_IGNORE);
|
||||
|
||||
ntree = nodetree_from_id(snode->id);
|
||||
if (ntree)
|
||||
snode->nodetree = ntree;
|
||||
else
|
||||
snode->nodetree = restore_pointer_by_name(newmain, (ID*)snode->nodetree, 2);
|
||||
snode->nodetree = restore_pointer_by_name(newmain, (ID*)snode->nodetree, USER_REAL);
|
||||
|
||||
for (path = snode->treepath.first; path; path = path->next) {
|
||||
if (path == snode->treepath.first) {
|
||||
|
@ -6091,7 +6098,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
path->nodetree = snode->nodetree;
|
||||
}
|
||||
else
|
||||
path->nodetree= restore_pointer_by_name(newmain, (ID*)path->nodetree, 2);
|
||||
path->nodetree= restore_pointer_by_name(newmain, (ID*)path->nodetree, USER_REAL);
|
||||
|
||||
if (!path->nodetree)
|
||||
break;
|
||||
|
@ -6117,15 +6124,15 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
|
|||
else if (sl->spacetype == SPACE_CLIP) {
|
||||
SpaceClip *sclip = (SpaceClip *)sl;
|
||||
|
||||
sclip->clip = restore_pointer_by_name(newmain, (ID *)sclip->clip, 2);
|
||||
sclip->mask_info.mask = restore_pointer_by_name(newmain, (ID *)sclip->mask_info.mask, 2);
|
||||
sclip->clip = restore_pointer_by_name(newmain, (ID *)sclip->clip, USER_REAL);
|
||||
sclip->mask_info.mask = restore_pointer_by_name(newmain, (ID *)sclip->mask_info.mask, USER_REAL);
|
||||
|
||||
sclip->scopes.ok = 0;
|
||||
}
|
||||
else if (sl->spacetype == SPACE_LOGIC) {
|
||||
SpaceLogic *slogic = (SpaceLogic *)sl;
|
||||
|
||||
slogic->gpd = restore_pointer_by_name(newmain, (ID *)slogic->gpd, 1);
|
||||
slogic->gpd = restore_pointer_by_name(newmain, (ID *)slogic->gpd, USER_ONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue