diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2014-02-21 13:29:08 +0400 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2014-02-22 13:41:30 +0400 |
commit | 907be3632c60646eb6e53b7230423ad53efbac48 (patch) | |
tree | 062487511dc9c2c34cb47f8ddbd79acc11ba998a /source/blender/blenloader | |
parent | 6b2d1d1493c773c2cf3d7eb5dcd504981f0d8f31 (diff) |
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.
Diffstat (limited to 'source/blender/blenloader')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 75 |
1 files changed, 41 insertions, 34 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index c14b34af0fe..61df5468057 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -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); } } } |