Files
workinf_Blender_Wasm/blender-5.2.0/source/blender/blenkernel/BKE_preferences.h
2026-08-12 04:47:48 -04:00

226 lines
9.9 KiB
C++

/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup bke
*/
#pragma once
#include "BLI_compiler_attrs.h"
#include "BLI_sys_types.h"
namespace blender {
struct BlendWriter;
struct UserDef;
struct bUserExtensionRepo;
struct bUserAssetLibrary;
struct bUserAssetShelfSettings;
class StringRef;
struct EnumPropertyItem;
/* -------------------------------------------------------------------- */
/** \name Preferences File
* \{ */
namespace bke::preferences {
/**
* Return true if a preferences file exists for this Blender version.
*/
bool exists();
} // namespace bke::preferences
/** \} */
/* -------------------------------------------------------------------- */
/** \name Assert Libraries
* \{ */
/** Name of the asset library added by default. Needs translation with `DATA_()` still. */
#define BKE_PREFS_ASSET_LIBRARY_DEFAULT_NAME N_("User Library")
/**
* \note For remote asset libraries, use #BKE_preferences_remote_asset_library_add().
*/
struct bUserAssetLibrary *BKE_preferences_asset_library_add(struct UserDef *userdef,
const char *name,
const char *dirpath) ATTR_NONNULL(1);
struct bUserAssetLibrary *BKE_preferences_remote_asset_library_add(struct UserDef *userdef,
const char *name,
const char *remote_url)
ATTR_NONNULL(1, 3);
/**
* \brief Update the remote URL and the cache directory derived from the URL.
*
* - Copies \a remote_url into #bUserAssetLibrary.remote_url, shortening to #FILE_MAX bytes if
* necessary.
* - Adds a trailing slash if not present, and if the URL doesn't point directly to the
* `/_asset-library-meta.json` already.
* - Updates #bUserAssetLibrary.dirpath to the cache path derived from the new URL. See
* #asset_system::remote_library_cache_directory_path_from_url() (or
* #asset_system::online_essentials_cache_directory_path() in case of the online essentials URL).
*/
void BKE_preferences_remote_asset_library_url_set(bUserAssetLibrary *library,
StringRef remote_url);
/**
* Unlink and free a library preference member.
* \note Free's \a library itself.
*/
void BKE_preferences_asset_library_remove(struct UserDef *userdef,
struct bUserAssetLibrary *library) ATTR_NONNULL();
void BKE_preferences_asset_library_name_set(struct UserDef *userdef,
struct bUserAssetLibrary *library,
const char *name) ATTR_NONNULL();
/**
* Set the library path, ensuring it is pointing to a directory.
* Single blend files can only act as "Current File" library; libraries on disk
* should always be directories. If the path does not exist, that's fine; it can
* created as directory if necessary later.
*/
void BKE_preferences_asset_library_path_set(struct bUserAssetLibrary *library, const char *path)
ATTR_NONNULL();
struct bUserAssetLibrary *BKE_preferences_asset_library_find_index(const struct UserDef *userdef,
int index)
ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
struct bUserAssetLibrary *BKE_preferences_asset_library_find_by_name(const struct UserDef *userdef,
const char *name)
ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
/**
* Return the bUserAssetLibrary that contains the given file/directory path. The given path can be
* the library's top-level directory, or any path inside that directory.
*
* When more than one asset libraries match, the first matching one is returned (no smartness when
* there nested asset libraries).
*
* Return NULL when no such asset library is found.
*/
struct bUserAssetLibrary *BKE_preferences_asset_library_containing_path(
const struct UserDef *userdef, const char *path) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
int BKE_preferences_asset_library_get_index(const struct UserDef *userdef,
const struct bUserAssetLibrary *library)
ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
/**
* Check if the asset library defined in \a library has enough data to be loadable.
* \param check_directory_exists: When true, a library is required to point to a valid path on disk
* as its root, otherwise the library is considered invalid.
*/
bool BKE_preferences_asset_library_is_valid(const UserDef *userdef,
const struct bUserAssetLibrary *library,
const bool check_directory_exists) ATTR_NONNULL();
void BKE_preferences_asset_library_default_add(struct UserDef *userdef) ATTR_NONNULL();
/** \} */
/* -------------------------------------------------------------------- */
/** \name Extension Repositories
* \{ */
bUserExtensionRepo *BKE_preferences_extension_repo_add(UserDef *userdef,
const char *name,
const char *module,
const char *custom_dirpath);
void BKE_preferences_extension_repo_remove(UserDef *userdef, bUserExtensionRepo *repo);
bUserExtensionRepo *BKE_preferences_extension_repo_add_default_remote(UserDef *userdef);
bUserExtensionRepo *BKE_preferences_extension_repo_add_default_user(UserDef *userdef);
bUserExtensionRepo *BKE_preferences_extension_repo_add_default_system(UserDef *userdef);
/** Create all default repositories, only use when repositories are empty. */
void BKE_preferences_extension_repo_add_defaults_all(UserDef *userdef);
void BKE_preferences_extension_repo_name_set(UserDef *userdef,
bUserExtensionRepo *repo,
const char *name);
void BKE_preferences_extension_repo_module_set(UserDef *userdef,
bUserExtensionRepo *repo,
const char *module);
void BKE_preferences_extension_repo_custom_dirpath_set(bUserExtensionRepo *repo, const char *path);
size_t BKE_preferences_extension_repo_dirpath_get(const bUserExtensionRepo *repo,
char *dirpath,
int dirpath_maxncpy);
/**
* Returns a user editable directory associated with this repository.
* Needed so extensions may have local data.
*/
size_t BKE_preferences_extension_repo_user_dirpath_get(const bUserExtensionRepo *repo,
char *dirpath,
const int dirpath_maxncpy);
/**
* Check the module name is valid, while this should always be the case,
* use this as an additional safely check before performing destructive operations
* such as recursive file removal to prevent file/memory corruption causing user data loss.
*/
bool BKE_preferences_extension_repo_module_is_valid(const bUserExtensionRepo *repo);
bUserExtensionRepo *BKE_preferences_extension_repo_find_index(const UserDef *userdef, int index);
bUserExtensionRepo *BKE_preferences_extension_repo_find_by_module(const UserDef *userdef,
const char *module);
/**
* Using a full URL/remote path to find a repository that shares its prefix.
*/
bUserExtensionRepo *BKE_preferences_extension_repo_find_by_remote_url_prefix(
const UserDef *userdef, const char *remote_url_full, const bool only_enabled);
int BKE_preferences_extension_repo_get_index(const UserDef *userdef,
const bUserExtensionRepo *repo);
void BKE_preferences_extension_repo_read_data(struct BlendDataReader *reader,
bUserExtensionRepo *repo);
void BKE_preferences_extension_repo_write_data(struct BlendWriter *writer,
const bUserExtensionRepo *repo);
/** \} */
/* -------------------------------------------------------------------- */
/** \name Web/remote utilities
*
* For extension and online asset library remotes.
* \{ */
/**
* Skip the `https` or `http` part of a URL `https://`, return zero if none is found.
*/
int BKE_preferences_remote_scheme_end(const char *url);
/**
* Set a name based on a URL, e.g. `https://www.example.com/path` -> `example.com`.
*/
void BKE_preferences_remote_to_name(const char *remote_url, char name[64 /*MAX_NAME*/]);
/** \} */
/* -------------------------------------------------------------------- */
/** \name #bUserAssetShelvesSettings
* \{ */
bUserAssetShelfSettings *BKE_preferences_asset_shelf_settings_get(const UserDef *userdef,
const char *shelf_idname);
bool BKE_preferences_asset_shelf_settings_is_catalog_path_enabled(const UserDef *userdef,
const char *shelf_idname,
const char *catalog_path);
/**
* Enable a catalog path for a asset shelf identified by \a shelf_idname. Will create the shelf
* settings in the Preferences if necessary.
* \return true if the catalog was newly enabled. The Preferences should be tagged as dirty then.
*/
bool BKE_preferences_asset_shelf_settings_ensure_catalog_path_enabled(UserDef *userdef,
const char *shelf_idname,
const char *catalog_path);
const EnumPropertyItem *BKE_preferences_active_section_itemf(const UserDef *userdef, bool *r_free);
/** \} */
} // namespace blender