Blender V4.3
asset_shelf_regiondata.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "BLI_listbase.h"
10
11#include "BLO_read_write.hh"
12
13#include "DNA_defs.h"
14#include "DNA_screen_types.h"
15
16#include "asset_shelf.hh"
17
18RegionAssetShelf *RegionAssetShelf::get_from_asset_shelf_region(const ARegion &region)
19{
20 if (region.regiontype != RGN_TYPE_ASSET_SHELF) {
21 /* Should only be called on main asset shelf region. */
23 return nullptr;
24 }
25 return static_cast<RegionAssetShelf *>(region.regiondata);
26}
27
28RegionAssetShelf *RegionAssetShelf::ensure_from_asset_shelf_region(ARegion &region)
29{
30 if (region.regiontype != RGN_TYPE_ASSET_SHELF) {
31 /* Should only be called on main asset shelf region. */
33 return nullptr;
34 }
35 if (!region.regiondata) {
36 region.regiondata = MEM_cnew<RegionAssetShelf>("RegionAssetShelf");
37 }
38 return static_cast<RegionAssetShelf *>(region.regiondata);
39}
40
42
44{
45 static_assert(std::is_trivial_v<RegionAssetShelf>,
46 "RegionAssetShelf needs to be trivial to allow freeing with MEM_freeN()");
47 RegionAssetShelf *new_shelf_regiondata = MEM_cnew<RegionAssetShelf>(__func__);
48 *new_shelf_regiondata = *shelf_regiondata;
49
50 BLI_listbase_clear(&new_shelf_regiondata->shelves);
51 LISTBASE_FOREACH (const AssetShelf *, shelf, &shelf_regiondata->shelves) {
52 AssetShelf *new_shelf = MEM_new<AssetShelf>("duplicate asset shelf",
53 blender::dna::shallow_copy(*shelf));
54 new_shelf->settings = shelf->settings;
55 BLI_addtail(&new_shelf_regiondata->shelves, new_shelf);
56 if (shelf_regiondata->active_shelf == shelf) {
57 new_shelf_regiondata->active_shelf = new_shelf;
58 }
59 }
60
61 return new_shelf_regiondata;
62}
63
64void regiondata_free(RegionAssetShelf *shelf_regiondata)
65{
66 LISTBASE_FOREACH_MUTABLE (AssetShelf *, shelf, &shelf_regiondata->shelves) {
67 MEM_delete(shelf);
68 }
69 MEM_freeN(shelf_regiondata);
70}
71
72void regiondata_blend_write(BlendWriter *writer, const RegionAssetShelf *shelf_regiondata)
73{
74 BLO_write_struct(writer, RegionAssetShelf, shelf_regiondata);
75 LISTBASE_FOREACH (const AssetShelf *, shelf, &shelf_regiondata->shelves) {
76 BLO_write_struct(writer, AssetShelf, shelf);
77 settings_blend_write(writer, shelf->settings);
78 }
79}
80
82{
83 if (!*shelf_regiondata) {
84 return;
85 }
86
87 BLO_read_struct(reader, RegionAssetShelf, shelf_regiondata);
88 if ((*shelf_regiondata)->active_shelf) {
89 BLO_read_struct(reader, AssetShelf, &(*shelf_regiondata)->active_shelf);
90 }
91
92 BLO_read_struct_list(reader, AssetShelf, &(*shelf_regiondata)->shelves);
93 LISTBASE_FOREACH (AssetShelf *, shelf, &(*shelf_regiondata)->shelves) {
94 shelf->type = nullptr;
95 settings_blend_read_data(reader, shelf->settings);
96 }
97}
98
99} // namespace blender::ed::asset::shelf
#define BLI_assert_unreachable()
Definition BLI_assert.h:97
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
#define BLO_write_struct(writer, struct_name, data_ptr)
#define BLO_read_struct_list(reader, struct_name, list)
#define BLO_read_struct(reader, struct_name, ptr_p)
@ RGN_TYPE_ASSET_SHELF
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
void settings_blend_read_data(BlendDataReader *reader, AssetShelfSettings &settings)
void regiondata_free(RegionAssetShelf *shelf_regiondata)
void regiondata_blend_write(BlendWriter *writer, const RegionAssetShelf *shelf_regiondata)
void settings_blend_write(BlendWriter *writer, const AssetShelfSettings &settings)
void regiondata_blend_read_data(BlendDataReader *reader, RegionAssetShelf **shelf_regiondata)
RegionAssetShelf * regiondata_duplicate(const RegionAssetShelf *shelf_regiondata)
AssetShelfSettings settings
AssetShelf * active_shelf