Blender V5.0
sequencer_add_menu_scene.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2025 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "AS_asset_catalog.hh"
7#include "AS_asset_library.hh"
9
10#include "BLI_listbase.h"
12#include "BLI_string.h"
13
14#include "DNA_space_types.h"
15#include "DNA_workspace_types.h"
16
17#include "BKE_asset.hh"
18#include "BKE_idprop.hh"
19#include "BKE_main.hh"
20#include "BKE_scene.hh"
21#include "BKE_screen.hh"
22
23#include "BLT_translation.hh"
24
25#include "RNA_access.hh"
26
27#include "ED_asset.hh"
29#include "ED_sequencer.hh"
30
31#include "UI_interface.hh"
33
34#include "sequencer_intern.hh"
35
36namespace blender::ed::vse {
37
38static bool sequencer_add_menu_poll(const bContext *C, MenuType * /*mt*/)
39{
40 /* Add menu is not accessible from the VSE preview. */
43}
44
46{
48 return asset::list::is_loaded(&all_library_ref);
49}
50
59
61{
64 return;
65 }
66 if (!sseq->runtime->assets_for_menu) {
67 sseq->runtime->assets_for_menu = std::make_shared<asset::AssetItemTree>(
69 return;
70 }
72
73 const std::optional<blender::StringRefNull> menu_path = CTX_data_string_get(
74 C, "asset_catalog_path");
75 if (!menu_path) {
76 return;
77 }
78 const Span<asset_system::AssetRepresentation *> assets = tree.assets_per_path.lookup(
79 menu_path->c_str());
80 const asset_system::AssetCatalogTreeItem *catalog_item = tree.catalogs.find_item(
81 menu_path->c_str());
82 BLI_assert(catalog_item != nullptr);
83
84 if (assets.is_empty() && !catalog_item->has_children()) {
85 return;
86 }
87
88 uiLayout *layout = menu->layout;
89 bool add_separator = true;
90
91 for (const asset_system::AssetRepresentation *asset : assets) {
92 if (add_separator) {
93 layout->separator();
94 add_separator = false;
95 }
96 PointerRNA op_ptr = layout->op("SEQUENCER_OT_add_scene_strip_from_scene_asset",
97 IFACE_(asset->get_name()),
98 ICON_NONE,
102 }
103
104 catalog_item->foreach_child([&](const asset_system::AssetCatalogTreeItem &item) {
105 if (add_separator) {
106 layout->separator();
107 add_separator = false;
108 }
109 asset::draw_menu_for_catalog(item, "SEQUENCER_MT_scene_add_catalog_assets", *layout);
110 });
111}
112
114{
115 SpaceSeq *sseq = CTX_wm_space_seq(C);
116 if (!sseq || !ELEM(sseq->view, SEQ_VIEW_SEQUENCE, SEQ_VIEW_SEQUENCE_PREVIEW)) {
117 return;
118 }
119 if (!sseq->runtime->assets_for_menu) {
120 sseq->runtime->assets_for_menu = std::make_shared<asset::AssetItemTree>(
122 return;
123 }
125 for (const asset_system::AssetRepresentation *asset : tree.unassigned_assets) {
126 PointerRNA op_ptr = menu->layout->op("SEQUENCER_OT_add_scene_strip_from_scene_asset",
127 IFACE_(asset->get_name()),
128 ICON_NONE,
131 BLI_assert(op_ptr.data != nullptr);
133 }
134}
135
136static void sequencer_add_scene_draw(const bContext *C, Menu *menu)
137{
138 SpaceSeq *sseq = CTX_wm_space_seq(C);
139 if (!sseq || !ELEM(sseq->view, SEQ_VIEW_SEQUENCE, SEQ_VIEW_SEQUENCE_PREVIEW)) {
140 return;
141 }
142
143 uiLayout *layout = menu->layout;
145
146 /* New scene. */
147 {
148 PointerRNA op_ptr = layout->op(
149 "SEQUENCER_OT_scene_strip_add_new", IFACE_("Empty Scene"), ICON_ADD);
150 RNA_enum_set(&op_ptr, "type", SCE_COPY_NEW);
151 }
152
153 /* Handle the assets. */
154 sseq->runtime->assets_for_menu = std::make_shared<asset::AssetItemTree>(build_catalog_tree(*C));
155 const bool loading_finished = all_loading_finished();
156
158 const bool show_assets = !(tree.catalogs.is_empty() && loading_finished &&
159 tree.unassigned_assets.is_empty());
160
161 layout->separator();
162
163 layout->label(IFACE_("Assets"), ICON_ASSET_MANAGER);
164
165 if (show_assets) {
166 if (!loading_finished) {
167 layout->label(IFACE_("Loading Asset Libraries"), ICON_INFO);
168 }
169
170 tree.catalogs.foreach_root_item([&](const asset_system::AssetCatalogTreeItem &item) {
171 asset::draw_menu_for_catalog(item, "SEQUENCER_MT_scene_add_catalog_assets", *layout);
172 });
173
174 if (!tree.unassigned_assets.is_empty()) {
175 layout->menu_contents("SEQUENCER_MT_scene_add_unassigned_assets");
176 }
177 }
178 else {
179 layout->label(IFACE_("No scene assets."), ICON_NONE);
180 }
181
182 layout->separator();
183
184 /* Show existing scenes. */
185 Main *bmain = CTX_data_main(C);
186 const int scenes_len = BLI_listbase_count(&bmain->scenes);
187 if (scenes_len > 10) {
188 layout->op("SEQUENCER_OT_scene_strip_add",
189 IFACE_("Scene Strip..."),
190 ICON_SCENE_DATA,
193 }
194 else {
195 layout->label(IFACE_("Scene Strip"), ICON_SCENE_DATA);
196 const Scene *active_scene = CTX_data_sequencer_scene(C);
197 int i = 0;
198 LISTBASE_FOREACH_INDEX (Scene *, scene, &bmain->scenes, i) {
199 if (scene == active_scene) {
200 continue;
201 }
202 if (scene->id.asset_data) {
203 continue;
204 }
205 PointerRNA op_ptr = layout->op("SEQUENCER_OT_scene_strip_add",
206 scene->id.name + 2,
207 ICON_NONE,
210 RNA_enum_set(&op_ptr, "scene", i);
211 }
212 }
213}
214
216{
217 MenuType type{};
218 STRNCPY(type.idname, "SEQUENCER_MT_scene_add_catalog_assets");
223 return type;
224}
225
227{
228 MenuType type{};
229 STRNCPY(type.idname, "SEQUENCER_MT_scene_add_unassigned_assets");
234 type.description = N_(
235 "Scene assets not assigned to a catalog.\n"
236 "Catalogs can be assigned in the Asset Browser");
237 return type;
238}
239
241{
242 MenuType type{};
243 STRNCPY(type.idname, "SEQUENCER_MT_add_scene");
247 return type;
248}
249
250} // namespace blender::ed::vse
Main runtime representation of an asset.
SpaceSeq * CTX_wm_space_seq(const bContext *C)
Main * CTX_data_main(const bContext *C)
Scene * CTX_data_sequencer_scene(const bContext *C)
std::optional< blender::StringRefNull > CTX_data_string_get(const bContext *C, const char *member)
@ SCE_COPY_NEW
Definition BKE_scene.hh:33
#define BLI_assert(a)
Definition BLI_assert.h:46
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:524
char * STRNCPY(char(&dst)[N], const char *src)
Definition BLI_string.h:693
#define ELEM(...)
#define IFACE_(msgid)
#define FILTER_ID_SCE
Definition DNA_ID.h:1217
@ SEQ_VIEW_SEQUENCE_PREVIEW
@ SEQ_VIEW_SEQUENCE
#define C
Definition RandGen.cpp:29
#define UI_ITEM_NONE
constexpr bool is_empty() const
Definition BLI_span.hh:260
void foreach_child(ItemIterFn callback) const
KDTree_3d * tree
AssetLibraryReference all_library_reference()
void all_library_reload_catalogs_if_dirty()
bool is_loaded(const AssetLibraryReference *library_reference)
void asset_reading_region_listen_fn(const wmRegionListenerParams *params)
AssetItemTree build_filtered_all_catalog_tree(const AssetLibraryReference &library_ref, const bContext &C, const AssetFilterSettings &filter_settings, FunctionRef< bool(const AssetMetaData &)> meta_data_filter={})
void draw_menu_for_catalog(const asset_system::AssetCatalogTreeItem &item, const StringRefNull menu_name, uiLayout &layout)
void operator_asset_reference_props_set(const asset_system::AssetRepresentation &asset, PointerRNA &ptr)
static void sequencer_add_scene_draw(const bContext *C, Menu *menu)
static bool sequencer_add_menu_poll(const bContext *C, MenuType *)
static void sequencer_add_catalog_assets_draw(const bContext *C, Menu *menu)
static void sequencer_add_unassigned_assets_draw(const bContext *C, Menu *menu)
static asset::AssetItemTree build_catalog_tree(const bContext &C)
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
ListBase scenes
Definition BKE_main.hh:278
MenuTypeFlag flag
const char * description
bool(* poll)(const bContext *C, MenuType *mt)
char idname[BKE_ST_MAXNAME]
void(* draw)(const bContext *C, Menu *menu)
void(* listener)(const wmRegionListenerParams *params)
uiLayout * layout
void * data
Definition RNA_types.hh:53
SpaceSeq_Runtime * runtime
std::shared_ptr< asset::AssetItemTree > assets_for_menu
void operator_context_set(blender::wm::OpCallContext opcontext)
void label(blender::StringRef name, int icon)
void separator(float factor=1.0f, LayoutSeparatorType type=LayoutSeparatorType::Auto)
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, blender::wm::OpCallContext context, eUI_Item_Flag flag)
void menu_contents(blender::StringRef menuname)
i
Definition text_draw.cc:230
#define N_(msgid)