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:
Lukas Tönne 2014-02-21 10:29:08 +01:00
parent 6b2d1d1493
commit 907be3632c
1 changed files with 41 additions and 34 deletions

View File

@ -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);
}
}
}