Commit: 0929283ddc7946c906a49043db9e8649841acf64
Author: Bastien Montagne
Date:   Tue May 24 15:48:55 2016 +0200
Branches: asset-experiments
https://developer.blender.org/rB0929283ddc7946c906a49043db9e8649841acf64

Merge branch 'master' into asset-experiments

===================================================================



===================================================================

diff --cc source/blender/blenkernel/BKE_library.h
index 7dec790,2215fbf..8048c1c
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@@ -151,25 -119,12 +151,26 @@@ void BKE_main_lib_objects_recalc_all(st
  /* (MAX_ID_NAME - 2) + 3 */
  void BKE_id_ui_prefix(char name[66 + 1], const struct ID *id);
  
- void BKE_library_make_local(struct Main *bmain, struct Library *lib, bool 
untagged_only, bool set_fake);
+ void BKE_library_make_local(
+         struct Main *bmain, const struct Library *lib, const bool 
untagged_only, const bool set_fake);
  
 +void BKE_library_asset_repository_init(struct Library *lib, const struct 
AssetEngineType *aet, const char *repo_root);
 +void BKE_library_asset_repository_clear(struct Library *lib);
 +void BKE_library_asset_repository_free(struct Library *lib);
 +struct AssetRef *BKE_library_asset_repository_asset_add(struct Library *lib, 
const void *idv);
 +void BKE_library_asset_repository_asset_remove(struct Library *lib, const 
void *idv);
 +struct AssetRef *BKE_library_asset_repository_asset_find(struct Library *lib, 
const void *idv);
 +void BKE_library_asset_repository_subdata_add(struct AssetRef *aref, const 
void *idv);
 +void BKE_library_asset_repository_subdata_remove(struct AssetRef *aref, const 
void *idv);
 +
 +void BKE_libraries_asset_subdata_remove(struct Main *bmain, const void *idv);
 +void BKE_libraries_asset_repositories_clear(struct Main *bmain);
 +void BKE_libraries_asset_repositories_rebuild(struct Main *bmain);
 +struct AssetRef *BKE_libraries_asset_repository_uuid_find(struct Main *bmain, 
const struct AssetUUID *uuid);
 +
  typedef void (*BKE_library_free_window_manager_cb)(struct bContext *, struct 
wmWindowManager *);
  typedef void (*BKE_library_free_notifier_reference_cb)(const void *);
 -typedef void (*BKE_library_free_editor_id_reference_cb)(const struct ID *);
 +typedef void (*BKE_library_remap_editor_id_reference_cb)(struct ID *, struct 
ID *);
  
  void 
BKE_library_callback_free_window_manager_set(BKE_library_free_window_manager_cb 
func);
  void 
BKE_library_callback_free_notifier_reference_set(BKE_library_free_notifier_reference_cb
 func);
diff --cc source/blender/editors/space_file/filelist.c
index 26762cd,8e1f781..3d0270e
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@@ -1513,50 -1419,39 +1513,50 @@@ bool filelist_pending(struct FileList *
   * Limited version of full update done by space_file's file_refresh(), to be 
used by operators and such.
   * Ensures given filelist is ready to be used (i.e. it is filtered and 
sorted), unless it is tagged for a full refresh.
   */
 -int filelist_files_ensure(FileList *filelist)
 +int filelist_files_ensure(FileList *filelist, FileSelectParams *params)
  {
        if (!filelist_force_reset(filelist) || !filelist_empty(filelist)) {
 -              filelist_sort(filelist);
 -              filelist_filter(filelist);
 +              filelist_sort_filter(filelist, params);
        }
  
-       return filelist->filelist.nbr_entries_filtered;;
+       return filelist->filelist.nbr_entries_filtered;
  }
  
 +
 +static FileDirEntry *filelist_file_create_entries_block(FileList *filelist, 
const int index, const int size);
 +
  static FileDirEntry *filelist_file_create_entry(FileList *filelist, const int 
index)
  {
 -      FileListInternEntry *entry = filelist->filelist_intern.filtered[index];
        FileListEntryCache *cache = &filelist->filelist_cache;
        FileDirEntry *ret;
 -      FileDirEntryRevision *rev;
  
 -      ret = MEM_callocN(sizeof(*ret), __func__);
 -      rev = MEM_callocN(sizeof(*rev), __func__);
 +      if (filelist->ae) {
 +              ret = filelist_file_create_entries_block(filelist, index, 1);
  
 -      rev->size = (uint64_t)entry->st.st_size;
 +              BLI_assert(!ret || !ret->next);
 +      }
 +      else {
 +              FileListInternEntry *entry = 
filelist->filelist_intern.filtered[index];
 +              FileDirEntryRevision *rev;
 +
 +              ret = MEM_callocN(sizeof(*ret), __func__);
 +              rev = MEM_callocN(sizeof(*rev), __func__);
  
 -      rev->time = (int64_t)entry->st.st_mtime;
 +              rev->size = (uint64_t)entry->st.st_size;
  
 -      ret->entry = rev;
 -      ret->relpath = BLI_strdup(entry->relpath);
 -      ret->name = BLI_strdup(entry->name);
 -      ret->description = BLI_strdupcat(filelist->filelist.root, 
entry->relpath);
 -      memcpy(ret->uuid, entry->uuid, sizeof(ret->uuid));
 -      ret->blentype = entry->blentype;
 -      ret->typeflag = entry->typeflag;
 +              rev->time = (int64_t)entry->st.st_mtime;
 +
 +              ret->entry = rev;
 +              ret->relpath = BLI_strdup(entry->relpath);
 +              ret->name = BLI_strdup(entry->name);
 +              ret->description = BLI_strdupcat(filelist->filelist.root, 
entry->relpath);
 +              memcpy(ret->uuid, entry->uuid, sizeof(ret->uuid));
 +              ret->blentype = entry->blentype;
 +              ret->typeflag = entry->typeflag;
 +
 +              BLI_addtail(&cache->cached_entries, ret);
 +      }
  
 -      BLI_addtail(&cache->cached_entries, ret);
        return ret;
  }
  
diff --cc source/blender/windowmanager/intern/wm_files_link.c
index ed5b380,2e4a4b6..8901d26
--- a/source/blender/windowmanager/intern/wm_files_link.c
+++ b/source/blender/windowmanager/intern/wm_files_link.c
@@@ -527,798 -513,8 +547,801 @@@ void WM_OT_append(wmOperatorType *ot
                FILE_DEFAULTDISPLAY, FILE_SORT_ALPHA);
  
        wm_link_append_properties_common(ot, false);
-       RNA_def_boolean(ot->srna, "set_fake", false, "Fake User", "Set Fake 
User for appended items (except Objects and Groups)");
+       RNA_def_boolean(ot->srna, "set_fake", false, "Fake User",
+                       "Set Fake User for appended items (except Objects and 
Groups)");
+       RNA_def_boolean(ot->srna, "use_recursive", true, "Localize All",
+                       "Localize all appended data, including those indirectly 
linked from other libraries");
  }
 +
 +/** \name Reload/relocate libraries.
 + *
 + * \{ */
 +
 +static int wm_lib_relocate_invoke(bContext *C, wmOperator *op, const wmEvent 
*UNUSED(event))
 +{
 +      Library *lib;
 +      char lib_name[MAX_NAME];
 +
 +      RNA_string_get(op->ptr, "library", lib_name);
 +      lib = (Library *)BKE_libblock_find_name_ex(CTX_data_main(C), ID_LI, 
lib_name);
 +
 +      if (lib) {
 +              if (lib->parent) {
 +                      BKE_reportf(op->reports, RPT_ERROR_INVALID_INPUT,
 +                                  "Cannot relocate indirectly linked library 
'%s'", lib->filepath);
 +                      return OPERATOR_CANCELLED;
 +              }
 +              RNA_string_set(op->ptr, "filepath", lib->filepath);
 +
 +              WM_event_add_fileselect(C, op);
 +
 +              return OPERATOR_RUNNING_MODAL;
 +      }
 +
 +      return OPERATOR_CANCELLED;
 +}
 +
 +/* Note that IDs listed in lapp_data items *must* have been removed from 
bmain by caller. */
 +static void lib_relocate_do(Main *bmain, WMLinkAppendData *lapp_data, 
ReportList *reports, const bool do_reload)
 +{
 +      ListBase *lbarray[MAX_LIBARRAY];
 +      int lba_idx;
 +
 +      LinkNode *itemlink;
 +      int item_idx;
 +
 +      BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, true);
 +
 +      /* We do not want any instanciation here! */
 +      wm_link_do(lapp_data, reports, bmain, NULL, NULL, NULL, do_reload, 
do_reload);
 +
 +      BKE_main_lock(bmain);
 +
 +      /* We add back old id to bmain.
 +       * We need to do this in a first, separated loop, otherwise some of 
those may not be handled by
 +       * ID remapping, which means they would still reference old data to be 
deleted... */
 +      for (item_idx = 0, itemlink = lapp_data->items.list; itemlink; 
item_idx++, itemlink = itemlink->next) {
 +              WMLinkAppendDataItem *item = itemlink->link;
 +              ID *old_id = item->customdata;
 +
 +              BLI_assert(old_id);
 +              BLI_addtail(which_libbase(bmain, GS(old_id->name)), old_id);
 +      }
 +
 +      /* Note that in reload case, we also want to replace indirect usages. */
 +      const short remap_flags = ID_REMAP_SKIP_NEVER_NULL_USAGE | (do_reload ? 
0 : ID_REMAP_SKIP_INDIRECT_USAGE);
 +      for (item_idx = 0, itemlink = lapp_data->items.list; itemlink; 
item_idx++, itemlink = itemlink->next) {
 +              WMLinkAppendDataItem *item = itemlink->link;
 +              ID *old_id = item->customdata;
 +              ID *new_id = item->new_id;
 +
 +              BLI_assert(old_id);
 +              if (do_reload) {
 +                      /* Since we asked for placeholders in case of missing 
IDs, we expect to always get a valid one. */
 +                      BLI_assert(new_id);
 +              }
 +              if (new_id) {
 +//                                    printf("before remap, old_id users: %d, 
new_id users: %d\n", old_id->us, new_id->us);
 +                      BKE_libblock_remap_locked(bmain, old_id, new_id, 
remap_flags);
 +
 +                      if (old_id->flag & LIB_FAKEUSER) {
 +                              id_fake_user_clear(old_id);
 +                              id_fake_user_set(new_id);
 +                      }
 +
 +//                                    printf("after remap, old_id users: %d, 
new_id users: %d\n", old_id->us, new_id->us);
 +
 +                      /* In some cases, new_id might become direct link, 
remove parent of library in this case. */
 +                      if (new_id->lib->parent && (new_id->tag & 
LIB_TAG_INDIRECT) == 0) {
 +                              if (do_reload) {
 +                                      BLI_assert(0);  /* Should not happen in 
'pure' reload case... */
 +                              }
 +                              new_id->lib->parent = NULL;
 +                      }
 +              }
 +
 +              if (old_id->us > 0 && new_id && old_id->lib == new_id->lib) {
 +                      size_t len = strlen(old_id->name);
 +
 +                      /* XXX TODO This is utterly weak!!! */
 +                      if (len > MAX_ID_NAME - 3 && old_id->name[len - 4] == 
'.') {
 +                              old_id->name[len - 6] = '.';
 +                              old_id->name[len - 5] = 'P';
 +                      }
 +                      else {
 +                              len = MIN2(len, MAX_ID_NAME - 3);
 +                              old_id->name[len] = '.';
 +                              old_id->name[len + 1] = 'P';
 +                              old_id->name[len + 2] = '\0';
 +                      }
 +
 +                      id_sort_by_name(which_libbase(bmain, GS(old_id->name)), 
old_id);
 +
 +                      BKE_reportf(reports, RPT_WARNING,
 +                                  "Lib Reload: Replacing all references to 
old datablock '%s' by reloaded one failed, "
 +                                  "old one (%d remaining users) had to be 
kept and was renamed to '%s'",
 +                                  new_id->name, old_id->us, old_id->name);
 +              }
 +      }
 +
 +      BKE_main_unlock(bmain);
 +
 +      for (item_idx = 0, itemlink = lapp_data->items.list; itemlink; 
item_idx++, itemlink = itemlink->next) {
 +              WMLinkAppendDataItem *item = itemlink->link;
 +              ID *old_id = item->customdata;
 +
 +              if (old_id->us == 0) {
 +                      BKE_libblock_free(bmain, old_id);
 +              }
 +      }
 +
 +      /* Some datablocks can get reloaded/replaced 'silently' because they 
are not linkable (shape keys e.g.),
 +       * so we need another loop here to clear old ones if possible. */
 +      lba_idx = set_listbasepointers(bmain, lbarray);
 +      while (lba_idx--) {
 +              ID *id, *id_next;
 +              for (id  = lbarray[lba_idx]->first; id; i

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to