WIP: Brush assets project #106303

Draft
Julian Eisel wants to merge 357 commits from brush-assets-project into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
13 changed files with 213 additions and 55 deletions
Showing only changes of commit 2d7c804ebc - Show all commits

View File

@ -17,6 +17,7 @@ extern "C" {
struct UserDef;
struct bUserExtensionRepo;
struct bUserAssetLibrary;
struct bUserAssetShelfSettings;
/* -------------------------------------------------------------------- */
/** \name Assert Libraries
@ -105,6 +106,32 @@ int BKE_preferences_extension_repo_get_index(const UserDef *userdef,
/** \} */
/* -------------------------------------------------------------------- */
/** \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 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);
/** \} */
#ifdef __cplusplus
}
#endif
void BKE_preferences_asset_shelf_settings_clear_enabled_catalog_paths(const UserDef *userdef,
const char *shelf_idname);
void BKE_preferences_asset_shelf_settings_clear_enabled_catalog_paths(
bUserAssetShelfSettings *settings);

View File

@ -35,6 +35,7 @@
#include "BKE_layer.hh"
#include "BKE_main.hh"
#include "BKE_node.h"
#include "BKE_preferences.h"
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.hh"
@ -343,6 +344,12 @@ void BKE_blender_userdef_data_free(UserDef *userdef, bool clear_fonts)
BLI_freelistN(&userdef->script_directories);
BLI_freelistN(&userdef->asset_libraries);
BLI_freelistN(&userdef->extension_repos);
LISTBASE_FOREACH_MUTABLE (bUserAssetShelfSettings *, settings, &userdef->asset_shelves_settings)
{
BKE_preferences_asset_shelf_settings_clear_enabled_catalog_paths(settings);
MEM_freeN(settings);
}
BLI_listbase_clear(&userdef->asset_shelves_settings);
BLI_freelistN(&userdef->uistyles);
BLI_freelistN(&userdef->uifonts);

View File

@ -269,5 +269,98 @@ int BKE_preferences_extension_repo_get_index(const UserDef *userdef,
{
return BLI_findindex(&userdef->extension_repos, repo);
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name #bUserAssetShelfSettings
* \{ */
bUserAssetShelfSettings *asset_shelf_settings_new(UserDef *userdef, const char *shelf_idname)
{
bUserAssetShelfSettings *settings = DNA_struct_default_alloc(bUserAssetShelfSettings);
BLI_addtail(&userdef->asset_shelves_settings, settings);
STRNCPY(settings->shelf_idname, shelf_idname);
BLI_assert(BLI_listbase_is_empty(&settings->enabled_catalog_paths));
return settings;
}
bUserAssetShelfSettings *BKE_preferences_asset_shelf_settings_ensure(UserDef *userdef,
const char *shelf_idname)
{
if (bUserAssetShelfSettings *settings = BKE_preferences_asset_shelf_settings_get(userdef,
shelf_idname))
{
return settings;
}
return asset_shelf_settings_new(userdef, shelf_idname);
}
bUserAssetShelfSettings *BKE_preferences_asset_shelf_settings_get(const UserDef *userdef,
const char *shelf_idname)
{
return static_cast<bUserAssetShelfSettings *>(
BLI_findstring(&userdef->asset_shelves_settings,
shelf_idname,
offsetof(bUserAssetShelfSettings, shelf_idname)));
}
bool asset_shelf_settings_is_catalog_path_enabled(const bUserAssetShelfSettings *settings,
const char *catalog_path)
{
return BLI_findstring_ptr(
&settings->enabled_catalog_paths, catalog_path, offsetof(LinkData, data)) != nullptr;
}
bool BKE_preferences_asset_shelf_settings_is_catalog_path_enabled(const UserDef *userdef,
const char *shelf_idname,
const char *catalog_path)
{
const bUserAssetShelfSettings *settings = BKE_preferences_asset_shelf_settings_get(userdef,
shelf_idname);
if (!settings) {
return false;
}
return asset_shelf_settings_is_catalog_path_enabled(settings, catalog_path);
}
bool BKE_preferences_asset_shelf_settings_ensure_catalog_path_enabled(UserDef *userdef,
const char *shelf_idname,
const char *catalog_path)
{
if (BKE_preferences_asset_shelf_settings_is_catalog_path_enabled(
userdef, shelf_idname, catalog_path))
{
return false;
}
bUserAssetShelfSettings *settings = BKE_preferences_asset_shelf_settings_ensure(userdef,
shelf_idname);
char *path_copy = BLI_strdup(catalog_path);
BLI_addtail(&settings->enabled_catalog_paths, BLI_genericNodeN(path_copy));
return true;
}
void BKE_preferences_asset_shelf_settings_clear_enabled_catalog_paths(
bUserAssetShelfSettings *settings)
{
LISTBASE_FOREACH_MUTABLE (LinkData *, path_link, &settings->enabled_catalog_paths) {
MEM_freeN(path_link->data);
BLI_freelinkN(&settings->enabled_catalog_paths, path_link);
}
BLI_assert(BLI_listbase_is_empty(&settings->enabled_catalog_paths));
}
void BKE_preferences_asset_shelf_settings_clear_enabled_catalog_paths(const UserDef *userdef,
const char *shelf_idname)
{
bUserAssetShelfSettings *settings = BKE_preferences_asset_shelf_settings_get(userdef,
shelf_idname);
if (!settings) {
return;
}
BKE_preferences_asset_shelf_settings_clear_enabled_catalog_paths(settings);
}
/** \} */

View File

@ -3439,6 +3439,7 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead)
BLO_read_list(reader, &user->script_directories);
BLO_read_list(reader, &user->asset_libraries);
BLO_read_list(reader, &user->extension_repos);
BLO_read_list(reader, &user->asset_shelves_settings);
LISTBASE_FOREACH (wmKeyMap *, keymap, &user->user_keymaps) {
keymap->modal_items = nullptr;
@ -3486,6 +3487,13 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead)
IDP_BlendDataRead(reader, &addon->prop);
}
LISTBASE_FOREACH (bUserAssetShelfSettings *, shelf_settings, &user->asset_shelves_settings) {
BLO_read_list(reader, &shelf_settings->enabled_catalog_paths);
LISTBASE_FOREACH (LinkData *, path_link, &shelf_settings->enabled_catalog_paths) {
BLO_read_data_address(reader, &path_link->data);
}
}
/* XXX */
user->uifonts.first = user->uifonts.last = nullptr;

View File

@ -933,6 +933,15 @@ static void write_userdef(BlendWriter *writer, const UserDef *userdef)
LISTBASE_FOREACH (const bUserExtensionRepo *, repo_ref, &userdef->extension_repos) {
BLO_write_struct(writer, bUserExtensionRepo, repo_ref);
}
LISTBASE_FOREACH (
const bUserAssetShelfSettings *, shelf_settings, &userdef->asset_shelves_settings)
{
BLO_write_struct(writer, bUserAssetShelfSettings, shelf_settings);
LISTBASE_FOREACH (const LinkData *, path_link, &shelf_settings->enabled_catalog_paths) {
BLO_write_struct(writer, LinkData, path_link);
BLO_write_string(writer, (const char *)path_link->data);
}
}
LISTBASE_FOREACH (const uiStyle *, style, &userdef->uistyles) {
BLO_write_struct(writer, uiStyle, style);

View File

@ -674,9 +674,10 @@ static uiBut *add_tab_button(uiBlock &block, StringRefNull name)
return but;
}
static void add_catalog_tabs(AssetShelfSettings &shelf_settings, uiLayout &layout)
static void add_catalog_tabs(AssetShelf &shelf, uiLayout &layout)
{
uiBlock *block = uiLayoutGetBlock(&layout);
AssetShelfSettings &shelf_settings = shelf.settings;
/* "All" tab. */
{
@ -694,7 +695,7 @@ static void add_catalog_tabs(AssetShelfSettings &shelf_settings, uiLayout &layou
/* Regular catalog tabs. */
settings_foreach_enabled_catalog_path(
shelf_settings, [&shelf_settings, block](const asset_system::AssetCatalogPath &path) {
shelf, [&shelf_settings, block](const asset_system::AssetCatalogPath &path) {
uiBut *but = add_tab_button(*block, path.name());
UI_but_func_set(but, [&shelf_settings, path](bContext &C) {
@ -730,9 +731,8 @@ static void asset_shelf_header_draw(const bContext *C, Header *header)
uiItemS(layout);
PointerRNA shelf_ptr = active_shelf_ptr_from_context(C);
AssetShelf *shelf = static_cast<AssetShelf *>(shelf_ptr.data);
if (shelf) {
add_catalog_tabs(shelf->settings, *layout);
if (AssetShelf *shelf = static_cast<AssetShelf *>(shelf_ptr.data)) {
add_catalog_tabs(*shelf, *layout);
}
uiItemSpacer(layout);

View File

@ -52,20 +52,20 @@ void regiondata_blend_read_data(BlendDataReader *reader, RegionAssetShelf **shel
void settings_blend_write(BlendWriter *writer, const AssetShelfSettings &settings);
void settings_blend_read_data(BlendDataReader *reader, AssetShelfSettings &settings);
void settings_clear_enabled_catalogs(AssetShelfSettings &settings);
void settings_set_active_catalog(AssetShelfSettings &settings,
const asset_system::AssetCatalogPath &path);
void settings_set_all_catalog_active(AssetShelfSettings &settings);
bool settings_is_active_catalog(const AssetShelfSettings &settings,
const asset_system::AssetCatalogPath &path);
bool settings_is_all_catalog_active(const AssetShelfSettings &settings);
bool settings_is_catalog_path_enabled(const AssetShelfSettings &settings,
void settings_clear_enabled_catalogs(const AssetShelf &shelf);
bool settings_is_catalog_path_enabled(const AssetShelf &shelf,
const asset_system::AssetCatalogPath &path);
void settings_set_catalog_path_enabled(AssetShelfSettings &settings,
void settings_set_catalog_path_enabled(const AssetShelf &shelf,
const asset_system::AssetCatalogPath &path);
void settings_foreach_enabled_catalog_path(
const AssetShelfSettings &settings,
const AssetShelf &shelf,
FunctionRef<void(const asset_system::AssetCatalogPath &catalog_path)> fn);
} // namespace blender::ed::asset::shelf

View File

@ -74,7 +74,7 @@ class AssetCatalogSelectorTree : public ui::AbstractTreeView {
Item &build_catalog_items_recursive(ui::TreeViewOrItem &parent_view_item,
asset_system::AssetCatalogTreeItem &catalog_item) const
{
Item &view_item = parent_view_item.add_tree_item<Item>(catalog_item, shelf_settings_);
Item &view_item = parent_view_item.add_tree_item<Item>(catalog_item, shelf_);
catalog_item.foreach_child([&view_item, this](asset_system::AssetCatalogTreeItem &child) {
build_catalog_items_recursive(view_item, child);
@ -92,11 +92,11 @@ class AssetCatalogSelectorTree : public ui::AbstractTreeView {
char catalog_path_enabled_ = false;
public:
Item(asset_system::AssetCatalogTreeItem &catalog_item, AssetShelfSettings &shelf_settings)
Item(asset_system::AssetCatalogTreeItem &catalog_item, AssetShelf &shelf)
: ui::BasicTreeViewItem(catalog_item.get_name()),
catalog_item_(catalog_item),
catalog_path_enabled_(
settings_is_catalog_path_enabled(shelf_settings, catalog_item.catalog_path()))
settings_is_catalog_path_enabled(shelf, catalog_item.catalog_path()))
{
disable_activatable();
}
@ -169,11 +169,11 @@ class AssetCatalogSelectorTree : public ui::AbstractTreeView {
void AssetCatalogSelectorTree::update_shelf_settings_from_enabled_catalogs()
{
settings_clear_enabled_catalogs(shelf_settings_);
settings_clear_enabled_catalogs(shelf_);
foreach_item([this](ui::AbstractTreeViewItem &view_item) {
const auto &selector_tree_item = dynamic_cast<AssetCatalogSelectorTree::Item &>(view_item);
if (selector_tree_item.is_catalog_path_enabled()) {
settings_set_catalog_path_enabled(shelf_settings_, selector_tree_item.catalog_path());
settings_set_catalog_path_enabled(shelf_, selector_tree_item.catalog_path());
}
});
}

View File

@ -20,6 +20,8 @@
#include "BLI_string.h"
#include "BLI_string_ref.hh"
#include "BKE_preferences.h"
#include "asset_shelf.hh"
using namespace blender;
@ -45,18 +47,11 @@ AssetShelfSettings &AssetShelfSettings::operator=(const AssetShelfSettings &othe
if (active_catalog_path) {
active_catalog_path = BLI_strdup(other.active_catalog_path);
}
BLI_listbase_clear(&enabled_catalog_paths);
LISTBASE_FOREACH (LinkData *, catalog_path_item, &other.enabled_catalog_paths) {
LinkData *new_path_item = BLI_genericNodeN(BLI_strdup((char *)catalog_path_item->data));
BLI_addtail(&enabled_catalog_paths, new_path_item);
}
return *this;
}
AssetShelfSettings::~AssetShelfSettings()
{
shelf::settings_clear_enabled_catalogs(*this);
MEM_delete(active_catalog_path);
}
@ -65,33 +60,14 @@ namespace blender::ed::asset::shelf {
void settings_blend_write(BlendWriter *writer, const AssetShelfSettings &settings)
{
BLO_write_struct(writer, AssetShelfSettings, &settings);
LISTBASE_FOREACH (LinkData *, catalog_path_item, &settings.enabled_catalog_paths) {
BLO_write_struct(writer, LinkData, catalog_path_item);
BLO_write_string(writer, (const char *)catalog_path_item->data);
}
BLO_write_string(writer, settings.active_catalog_path);
}
void settings_blend_read_data(BlendDataReader *reader, AssetShelfSettings &settings)
{
BLO_read_list(reader, &settings.enabled_catalog_paths);
LISTBASE_FOREACH (LinkData *, catalog_path_item, &settings.enabled_catalog_paths) {
BLO_read_data_address(reader, &catalog_path_item->data);
}
BLO_read_data_address(reader, &settings.active_catalog_path);
}
void settings_clear_enabled_catalogs(AssetShelfSettings &settings)
{
LISTBASE_FOREACH_MUTABLE (LinkData *, catalog_path_item, &settings.enabled_catalog_paths) {
MEM_freeN(catalog_path_item->data);
BLI_freelinkN(&settings.enabled_catalog_paths, catalog_path_item);
}
BLI_assert(BLI_listbase_is_empty(&settings.enabled_catalog_paths));
}
void settings_set_active_catalog(AssetShelfSettings &settings,
const asset_system::AssetCatalogPath &path)
{
@ -116,30 +92,40 @@ bool settings_is_all_catalog_active(const AssetShelfSettings &settings)
return !settings.active_catalog_path || !settings.active_catalog_path[0];
}
bool settings_is_catalog_path_enabled(const AssetShelfSettings &settings,
const asset_system::AssetCatalogPath &path)
void settings_clear_enabled_catalogs(const AssetShelf &shelf)
{
LISTBASE_FOREACH (LinkData *, catalog_path_item, &settings.enabled_catalog_paths) {
if (StringRef((const char *)catalog_path_item->data) == path.str()) {
return true;
}
}
return false;
BKE_preferences_asset_shelf_settings_clear_enabled_catalog_paths(&U, shelf.idname);
}
void settings_set_catalog_path_enabled(AssetShelfSettings &settings,
bool settings_is_catalog_path_enabled(const AssetShelf &shelf,
const asset_system::AssetCatalogPath &path)
{
return BKE_preferences_asset_shelf_settings_is_catalog_path_enabled(
&U, shelf.idname, path.c_str());
}
void settings_set_catalog_path_enabled(const AssetShelf &shelf,
const asset_system::AssetCatalogPath &path)
{
char *path_copy = BLI_strdupn(path.c_str(), path.length());
BLI_addtail(&settings.enabled_catalog_paths, BLI_genericNodeN(path_copy));
if (BKE_preferences_asset_shelf_settings_ensure_catalog_path_enabled(
&U, shelf.idname, path.c_str()))
{
U.runtime.is_dirty = true;
}
}
void settings_foreach_enabled_catalog_path(
const AssetShelfSettings &settings,
const AssetShelf &shelf,
FunctionRef<void(const asset_system::AssetCatalogPath &catalog_path)> fn)
{
LISTBASE_FOREACH (LinkData *, catalog_path_item, &settings.enabled_catalog_paths) {
fn(asset_system::AssetCatalogPath((char *)catalog_path_item->data));
const bUserAssetShelfSettings *pref_settings = BKE_preferences_asset_shelf_settings_get(
&U, shelf.idname);
if (!pref_settings) {
return;
}
LISTBASE_FOREACH (LinkData *, path_link, &pref_settings->enabled_catalog_paths) {
fn(asset_system::AssetCatalogPath((char *)path_link->data));
}
}

View File

@ -786,7 +786,6 @@ typedef struct AssetShelfSettings {
AssetLibraryReference asset_library_reference;
ListBase enabled_catalog_paths; /* #LinkData */
/** If not set (null or empty string), all assets will be displayed ("All" catalog behavior). */
const char *active_catalog_path;

View File

@ -40,4 +40,16 @@
/** \} */
/* -------------------------------------------------------------------- */
/** \name bUserExtensionRepo Struct
* \{ */
#define _DNA_DEFAULT_bUserAssetShelfSettings \
{ \
.shelf_idname = {'\0'}, \
.enabled_catalog_paths = {NULL, NULL}, \
}
/** \} */
/* clang-format on */

View File

@ -739,6 +739,20 @@ typedef struct bUserScriptDirectory {
char dir_path[768]; /* FILE_MAXDIR */
} bUserScriptDirectory;
/**
* Settings for an asset shelf, stored in the Preferences. Most settings are still stored in the
* asset shelf instance in #AssetShelfSettings. This is just for the options that should be shared
* as Preferences.
*/
typedef struct bUserAssetShelfSettings {
struct bUserAssetShelfSettings *next, *prev;
/** Identifier that matches the #AssetShelfType.idname of the shelf these settings apply to. */
char shelf_idname[64]; /* MAX_NAME */
ListBase enabled_catalog_paths; /* #LinkData */
} bUserAssetShelfSettings;
typedef struct UserDef {
DNA_DEFINE_CXX_METHODS(UserDef)
@ -861,6 +875,7 @@ typedef struct UserDef {
struct ListBase asset_libraries;
/** #bUserExtensionRepo */
struct ListBase extension_repos;
struct ListBase asset_shelves_settings; /* #bUserAssetShelfSettings */
char keyconfigstr[64];

View File

@ -224,6 +224,7 @@ SDNA_DEFAULT_DECL_STRUCT(Tex);
/* DNA_userdef_types.h */
SDNA_DEFAULT_DECL_STRUCT(bUserAssetLibrary);
SDNA_DEFAULT_DECL_STRUCT(bUserExtensionRepo);
SDNA_DEFAULT_DECL_STRUCT(bUserAssetShelfSettings);
/* DNA_view3d_defaults.h */
SDNA_DEFAULT_DECL_STRUCT(View3D);
@ -476,6 +477,7 @@ const void *DNA_default_table[SDNA_TYPE_MAX] = {
SDNA_DEFAULT_DECL_EX(WalkNavigation, UserDef.walk_navigation),
SDNA_DEFAULT_DECL(bUserAssetLibrary),
SDNA_DEFAULT_DECL(bUserExtensionRepo),
SDNA_DEFAULT_DECL(bUserAssetShelfSettings),
/* DNA_view3d_defaults.h */
SDNA_DEFAULT_DECL(View3D),