154 lines
5.3 KiB
C++
154 lines
5.3 KiB
C++
/*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
/** \file
|
|
* \ingroup edfile
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "BLO_readfile.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* File indexing for the file/asset browser.
|
|
*
|
|
* This file contains an API to create indexing functionality when listing blend files in
|
|
* the file browser.
|
|
*
|
|
* To implement a custom indexer a `FileIndexerType` struct should be made and passed to the
|
|
* `filelist_setindexer` function.
|
|
*/
|
|
|
|
struct AssetLibraryReference;
|
|
struct LinkNode;
|
|
|
|
/**
|
|
* Result code of the `read_index` callback.
|
|
*/
|
|
typedef enum eFileIndexerResult {
|
|
/**
|
|
* File listing entries are loaded from the index. Reading entries from the blend file itself
|
|
* should be skipped.
|
|
*/
|
|
FILE_INDEXER_ENTRIES_LOADED,
|
|
|
|
/**
|
|
* Index isn't available or not up to date. Entries should be read from the blend file and
|
|
* `update_index` must be called to update the index.
|
|
*/
|
|
FILE_INDEXER_NEEDS_UPDATE,
|
|
} eFileIndexerResult;
|
|
|
|
/**
|
|
* FileIndexerEntry contains all data that is required to create a file listing entry.
|
|
*/
|
|
typedef struct FileIndexerEntry {
|
|
struct BLODataBlockInfo datablock_info;
|
|
short idcode;
|
|
} FileIndexerEntry;
|
|
|
|
/**
|
|
* Contains all entries of a blend file.
|
|
*/
|
|
typedef struct FileIndexerEntries {
|
|
struct LinkNode /* FileIndexerEntry */ *entries;
|
|
} FileIndexerEntries;
|
|
|
|
typedef void *(*FileIndexerInitUserDataFunc)(const char *root_directory,
|
|
size_t root_directory_maxlen);
|
|
typedef void (*FileIndexerFreeUserDataFunc)(void *);
|
|
typedef void (*FileIndexerFinishedFunc)(void *);
|
|
typedef eFileIndexerResult (*FileIndexerReadIndexFunc)(const char *file_name,
|
|
FileIndexerEntries *entries,
|
|
int *r_read_entries_len,
|
|
void *user_data);
|
|
typedef void (*FileIndexerUpdateIndexFunc)(const char *file_name,
|
|
FileIndexerEntries *entries,
|
|
void *user_data);
|
|
|
|
typedef struct FileIndexerType {
|
|
/**
|
|
* Is called at the beginning of the file listing process. An indexer can
|
|
* setup needed data. The result of this function will be passed around as `user_data` parameter.
|
|
*
|
|
* This is an optional callback.
|
|
*/
|
|
FileIndexerInitUserDataFunc init_user_data;
|
|
|
|
/**
|
|
* Is called at the end of the file listing process. An indexer can free the data that it created
|
|
* during the file listing process.
|
|
*
|
|
* This is an optional callback */
|
|
FileIndexerFreeUserDataFunc free_user_data;
|
|
|
|
/**
|
|
* Is called at the end of the file listing process (before the `free_user_data`) where indexes
|
|
* can perform clean-ups.
|
|
*
|
|
* This is an optional callback. Called when listing files completed.
|
|
*/
|
|
FileIndexerFinishedFunc filelist_finished;
|
|
|
|
/**
|
|
* Is called for each blend file being listed to read data from the index.
|
|
*
|
|
* Read entries should be added to given `entries` parameter (type: `FileIndexerEntries`).
|
|
* `*r_read_entries_len` must be set to the number of read entries.
|
|
* and the function must return `eFileIndexerResult::FILE_INDEXER_ENTRIES_LOADED`.
|
|
* In this case the blend file will not be opened and the FileIndexerEntry added to `entries`
|
|
* will be used as the content of the file.
|
|
*
|
|
* When the index isn't available or could not be used no entries must be added to the
|
|
* entries field, `r_read_entries_len` must be set to `0` and the function must return
|
|
* `eFileIndexerResult::FILE_INDEXER_NEEDS_UPDATE`. In this case the blend file will read from
|
|
* the blend file and the `update_index` function will be called.
|
|
*/
|
|
FileIndexerReadIndexFunc read_index;
|
|
|
|
/**
|
|
* Update an index of a blend file.
|
|
*
|
|
* Is called after reading entries from the file when the result of `read_index` was
|
|
* `eFileIndexerResult::FILE_INDEXER_NEED_UPDATE`. The callback should update the index so the
|
|
* next time that read_index is called it will read the entries from the index.
|
|
*/
|
|
FileIndexerUpdateIndexFunc update_index;
|
|
} FileIndexerType;
|
|
|
|
/* file_indexer.cc */
|
|
|
|
/** Removes all entries inside the given `indexer_entries`. */
|
|
void ED_file_indexer_entries_clear(FileIndexerEntries *indexer_entries);
|
|
|
|
/**
|
|
* Adds all entries from the given `datablock_infos` to the `indexer_entries`.
|
|
* The datablock_infos must only contain data for a single IDType. The specific IDType must be
|
|
* passed in the `idcode` parameter.
|
|
*/
|
|
void ED_file_indexer_entries_extend_from_datablock_infos(
|
|
FileIndexerEntries *indexer_entries,
|
|
const LinkNode * /* BLODataBlockInfo */ datablock_infos,
|
|
const int idcode);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|