Blender  V3.3
asset_catalog_tree_view.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2007 Blender Foundation. All rights reserved. */
3 
8 #include "DNA_space_types.h"
9 
10 #include "BKE_asset.h"
11 #include "BKE_asset_catalog.hh"
12 #include "BKE_asset_library.hh"
13 
14 #include "BLI_string_ref.hh"
15 
16 #include "BLT_translation.h"
17 
18 #include "ED_asset.h"
19 #include "ED_fileselect.h"
20 #include "ED_undo.h"
21 
22 #include "RNA_access.h"
23 
24 #include "UI_interface.h"
25 #include "UI_interface.hh"
26 #include "UI_resources.h"
27 #include "UI_tree_view.hh"
28 
29 #include "WM_api.h"
30 #include "WM_types.h"
31 
32 #include "file_intern.h"
33 #include "filelist.h"
34 
35 using namespace blender;
36 using namespace blender::bke;
37 
39 
41 
43  ::AssetLibrary *asset_library_;
45  bke::AssetCatalogTree *catalog_tree_;
46  FileAssetSelectParams *params_;
47  SpaceFile &space_file_;
48 
52 
53  public:
56  SpaceFile &space_file);
57 
58  void build_tree() override;
59 
60  void activate_catalog_by_id(CatalogID catalog_id);
61 
62  private:
63  ui::BasicTreeViewItem &build_catalog_items_recursive(ui::TreeViewOrItem &view_parent_item,
64  AssetCatalogTreeItem &catalog);
65 
66  AssetCatalogTreeViewAllItem &add_all_item();
67  void add_unassigned_item();
68  bool is_active_catalog(CatalogID catalog_id) const;
69 };
70 
71 /* ---------------------------------------------------------------------- */
72 
75  AssetCatalogTreeItem &catalog_item_;
76 
77  public:
79 
80  void on_activate() override;
81 
82  void build_row(uiLayout &row) override;
83  void build_context_menu(bContext &C, uiLayout &column) const override;
84 
85  bool supports_renaming() const override;
86  bool rename(StringRefNull new_name) override;
87 
89  std::unique_ptr<ui::AbstractViewItemDragController> create_drag_controller() const override;
91  std::unique_ptr<ui::AbstractViewItemDropController> create_drop_controller() const override;
92 };
93 
95  AssetCatalogTreeItem &catalog_item_;
96 
97  public:
99  AssetCatalogTreeItem &catalog_item);
100 
101  int get_drag_type() const override;
102  void *create_drag_data() const override;
103  void on_drag_start() override;
104 };
105 
107  AssetCatalogTreeItem &catalog_item_;
108 
109  public:
111 
112  bool can_drop(const wmDrag &drag, const char **r_disabled_hint) const override;
113  std::string drop_tooltip(const wmDrag &drag) const override;
114  bool on_drop(struct bContext *C, const wmDrag &drag) override;
115 
116  ::AssetLibrary &get_asset_library() const;
117 
118  static AssetCatalog *get_drag_catalog(const wmDrag &drag, const ::AssetLibrary &asset_library);
119  static bool has_droppable_asset(const wmDrag &drag, const char **r_disabled_hint);
120  static bool drop_assets_into_catalog(struct bContext *C,
121  const AssetCatalogTreeView &tree_view,
122  const wmDrag &drag,
123  CatalogID catalog_id,
124  StringRefNull simple_name = "");
128  static bool drop_asset_catalog_into_catalog(
129  const wmDrag &drag,
130  AssetCatalogTreeView &tree_view,
131  const std::optional<CatalogID> drop_catalog_id = std::nullopt);
132 
133  private:
134  std::string drop_tooltip_asset_list(const wmDrag &drag) const;
135  std::string drop_tooltip_asset_catalog(const wmDrag &drag) const;
136 };
137 
141  using BasicTreeViewItem::BasicTreeViewItem;
142 
143  void build_row(uiLayout &row) override;
144 
145  struct DropController : public ui::AbstractViewItemDropController {
146  DropController(AssetCatalogTreeView &tree_view);
147 
148  bool can_drop(const wmDrag &drag, const char **r_disabled_hint) const override;
149  std::string drop_tooltip(const wmDrag &drag) const override;
150  bool on_drop(struct bContext *C, const wmDrag &drag) override;
151  };
152 
153  std::unique_ptr<ui::AbstractViewItemDropController> create_drop_controller() const override;
154 };
155 
157  using BasicTreeViewItem::BasicTreeViewItem;
158 
159  struct DropController : public ui::AbstractViewItemDropController {
160  DropController(AssetCatalogTreeView &tree_view);
161 
162  bool can_drop(const wmDrag &drag, const char **r_disabled_hint) const override;
163  std::string drop_tooltip(const wmDrag &drag) const override;
164  bool on_drop(struct bContext *C, const wmDrag &drag) override;
165  };
166 
167  std::unique_ptr<ui::AbstractViewItemDropController> create_drop_controller() const override;
168 };
169 
170 /* ---------------------------------------------------------------------- */
171 
172 AssetCatalogTreeView::AssetCatalogTreeView(::AssetLibrary *library,
174  SpaceFile &space_file)
175  : asset_library_(library),
177  params_(params),
178  space_file_(space_file)
179 {
180 }
181 
183 {
184  AssetCatalogTreeViewAllItem &all_item = add_all_item();
185  all_item.set_collapsed(false);
186 
187  if (catalog_tree_) {
188  /* Pass the "All" item on as parent of the actual catalog items. */
189  catalog_tree_->foreach_root_item([this, &all_item](AssetCatalogTreeItem &item) {
190  build_catalog_items_recursive(all_item, item);
191  });
192  }
193 
194  add_unassigned_item();
195 }
196 
197 ui::BasicTreeViewItem &AssetCatalogTreeView::build_catalog_items_recursive(
198  ui::TreeViewOrItem &view_parent_item, AssetCatalogTreeItem &catalog)
199 {
200  ui::BasicTreeViewItem &view_item = view_parent_item.add_tree_item<AssetCatalogTreeViewItem>(
201  &catalog);
202  view_item.set_is_active_fn(
203  [this, &catalog]() { return is_active_catalog(catalog.get_catalog_id()); });
204 
205  catalog.foreach_child([&view_item, this](AssetCatalogTreeItem &child) {
206  build_catalog_items_recursive(view_item, child);
207  });
208  return view_item;
209 }
210 
211 AssetCatalogTreeViewAllItem &AssetCatalogTreeView::add_all_item()
212 {
213  FileAssetSelectParams *params = params_;
214 
215  AssetCatalogTreeViewAllItem &item = add_tree_item<AssetCatalogTreeViewAllItem>(IFACE_("All"));
216  item.set_on_activate_fn([params](ui::BasicTreeViewItem & /*item*/) {
217  params->asset_catalog_visibility = FILE_SHOW_ASSETS_ALL_CATALOGS;
219  });
220  item.set_is_active_fn(
221  [params]() { return params->asset_catalog_visibility == FILE_SHOW_ASSETS_ALL_CATALOGS; });
222  return item;
223 }
224 
225 void AssetCatalogTreeView::add_unassigned_item()
226 {
227  FileAssetSelectParams *params = params_;
228 
229  AssetCatalogTreeViewUnassignedItem &item = add_tree_item<AssetCatalogTreeViewUnassignedItem>(
230  IFACE_("Unassigned"), ICON_FILE_HIDDEN);
231 
232  item.set_on_activate_fn([params](ui::BasicTreeViewItem & /*item*/) {
233  params->asset_catalog_visibility = FILE_SHOW_ASSETS_WITHOUT_CATALOG;
235  });
236  item.set_is_active_fn(
237  [params]() { return params->asset_catalog_visibility == FILE_SHOW_ASSETS_WITHOUT_CATALOG; });
238 }
239 
241 {
243  params_->catalog_id = catalog_id;
245 }
246 
247 bool AssetCatalogTreeView::is_active_catalog(CatalogID catalog_id) const
248 {
250  (params_->catalog_id == catalog_id);
251 }
252 
253 /* ---------------------------------------------------------------------- */
254 
256  : BasicTreeViewItem(catalog_item->get_name()), catalog_item_(*catalog_item)
257 {
258 }
259 
261 {
262  AssetCatalogTreeView &tree_view = static_cast<AssetCatalogTreeView &>(get_tree_view());
263  tree_view.activate_catalog_by_id(catalog_item_.get_catalog_id());
264 }
265 
267 {
268  const std::string label_override = catalog_item_.has_unsaved_changes() ? (label_ + "*") : label_;
269  add_label(row, label_override);
270 
271  if (!is_hovered()) {
272  return;
273  }
274 
275  uiButViewItem *view_item_but = view_item_button();
276  PointerRNA *props;
277 
279  (uiBut *)view_item_but, "ASSET_OT_catalog_new", WM_OP_INVOKE_DEFAULT, ICON_ADD);
280  RNA_string_set(props, "parent_path", catalog_item_.catalog_path().c_str());
281 }
282 
284 {
285  PointerRNA props;
286 
287  uiItemFullO(&column,
288  "ASSET_OT_catalog_new",
289  "New Catalog",
290  ICON_NONE,
291  nullptr,
293  0,
294  &props);
295  RNA_string_set(&props, "parent_path", catalog_item_.catalog_path().c_str());
296 
297  char catalog_id_str_buffer[UUID_STRING_LEN] = "";
298  BLI_uuid_format(catalog_id_str_buffer, catalog_item_.get_catalog_id());
299  uiItemFullO(&column,
300  "ASSET_OT_catalog_delete",
301  "Delete Catalog",
302  ICON_NONE,
303  nullptr,
305  0,
306  &props);
307  RNA_string_set(&props, "catalog_id", catalog_id_str_buffer);
308  uiItemO(&column, "Rename", ICON_NONE, "UI_OT_view_item_rename");
309 
310  /* Doesn't actually exist right now, but could be defined in Python. Reason that this isn't done
311  * in Python yet is that catalogs are not exposed in BPY, and we'd somehow pass the clicked on
312  * catalog to the menu draw callback (via context probably). */
313  MenuType *mt = WM_menutype_find("ASSETBROWSER_MT_catalog_context_menu", true);
314  if (!mt) {
315  return;
316  }
317  UI_menutype_draw(&C, mt, &column);
318 }
319 
321 {
322  return true;
323 }
324 
326 {
327  /* Important to keep state. */
328  BasicTreeViewItem::rename(new_name);
329 
330  const AssetCatalogTreeView &tree_view = static_cast<const AssetCatalogTreeView &>(
331  get_tree_view());
332  ED_asset_catalog_rename(tree_view.asset_library_, catalog_item_.get_catalog_id(), new_name);
333  return true;
334 }
335 
336 std::unique_ptr<ui::AbstractViewItemDropController> AssetCatalogTreeViewItem::
338 {
339  return std::make_unique<AssetCatalogDropController>(
340  static_cast<AssetCatalogTreeView &>(get_tree_view()), catalog_item_);
341 }
342 
343 std::unique_ptr<ui::AbstractViewItemDragController> AssetCatalogTreeViewItem::
345 {
346  return std::make_unique<AssetCatalogDragController>(
347  static_cast<AssetCatalogTreeView &>(get_tree_view()), catalog_item_);
348 }
349 
350 /* ---------------------------------------------------------------------- */
351 
353  AssetCatalogTreeItem &catalog_item)
354  : ui::AbstractViewItemDropController(tree_view), catalog_item_(catalog_item)
355 {
356 }
357 
358 bool AssetCatalogDropController::can_drop(const wmDrag &drag, const char **r_disabled_hint) const
359 {
360  if (drag.type == WM_DRAG_ASSET_CATALOG) {
361  const AssetCatalog *drag_catalog = get_drag_catalog(drag, get_asset_library());
362  /* NOTE: Technically it's not an issue to allow this (the catalog will just receive a new
363  * path and the catalog system will generate missing parents from the path). But it does
364  * appear broken to users, so disabling entirely. */
365  if (catalog_item_.catalog_path().is_contained_in(drag_catalog->path)) {
366  *r_disabled_hint = "Catalog cannot be dropped into itself";
367  return false;
368  }
369  if (catalog_item_.catalog_path() == drag_catalog->path.parent()) {
370  *r_disabled_hint = "Catalog is already placed inside this catalog";
371  return false;
372  }
373  return true;
374  }
375  if (drag.type == WM_DRAG_ASSET_LIST) {
376  return has_droppable_asset(drag, r_disabled_hint);
377  }
378  return false;
379 }
380 
381 std::string AssetCatalogDropController::drop_tooltip(const wmDrag &drag) const
382 {
383  if (drag.type == WM_DRAG_ASSET_CATALOG) {
384  return drop_tooltip_asset_catalog(drag);
385  }
386  return drop_tooltip_asset_list(drag);
387 }
388 
389 std::string AssetCatalogDropController::drop_tooltip_asset_catalog(const wmDrag &drag) const
390 {
392  const AssetCatalog *src_catalog = get_drag_catalog(drag, get_asset_library());
393 
394  return std::string(TIP_("Move Catalog")) + " '" + src_catalog->path.name() + "' " +
395  TIP_("into") + " '" + catalog_item_.get_name() + "'";
396 }
397 
398 std::string AssetCatalogDropController::drop_tooltip_asset_list(const wmDrag &drag) const
399 {
401 
402  const ListBase *asset_drags = WM_drag_asset_list_get(&drag);
403  const bool is_multiple_assets = !BLI_listbase_is_single(asset_drags);
404 
405  /* Don't try to be smart by dynamically adding the 's' for the plural. Just makes translation
406  * harder, so use full literals. */
407  std::string basic_tip = is_multiple_assets ? TIP_("Move assets to catalog") :
408  TIP_("Move asset to catalog");
409 
410  basic_tip += ": " + catalog_item_.get_name();
411 
412  /* Display the full catalog path, but only if it's not exactly the same as the already shown name
413  * (i.e. not a root level catalog with no parent). */
414  if (catalog_item_.get_name() != catalog_item_.catalog_path().str()) {
415  basic_tip += " (" + catalog_item_.catalog_path().str() + ")";
416  }
417 
418  return basic_tip;
419 }
420 
422 {
423  if (drag.type == WM_DRAG_ASSET_CATALOG) {
425  drag, get_view<AssetCatalogTreeView>(), catalog_item_.get_catalog_id());
426  }
428  get_view<AssetCatalogTreeView>(),
429  drag,
430  catalog_item_.get_catalog_id(),
431  catalog_item_.get_simple_name());
432 }
433 
435  const wmDrag &drag,
436  AssetCatalogTreeView &tree_view,
437  const std::optional<CatalogID> drop_catalog_id)
438 {
440  wmDragAssetCatalog *catalog_drag = WM_drag_get_asset_catalog_data(&drag);
441  ED_asset_catalog_move(tree_view.asset_library_, catalog_drag->drag_catalog_id, drop_catalog_id);
442  tree_view.activate_catalog_by_id(catalog_drag->drag_catalog_id);
443 
445  return true;
446 }
447 
449  const AssetCatalogTreeView &tree_view,
450  const wmDrag &drag,
451  CatalogID catalog_id,
452  StringRefNull simple_name)
453 {
455  const ListBase *asset_drags = WM_drag_asset_list_get(&drag);
456  if (!asset_drags) {
457  return false;
458  }
459 
460  bool did_update = false;
461  LISTBASE_FOREACH (wmDragAssetListItem *, asset_item, asset_drags) {
462  if (asset_item->is_external) {
463  /* Only internal assets can be modified! */
464  continue;
465  }
466 
467  did_update = true;
469  asset_item->asset_data.local_id->asset_data, catalog_id, simple_name.c_str());
470 
471  /* Trigger re-run of filtering to update visible assets. */
472  filelist_tag_needs_filtering(tree_view.space_file_.files);
475  }
476 
477  if (did_update) {
478  ED_undo_push(C, "Assign Asset Catalog");
479  }
480  return true;
481 }
482 
484  const ::AssetLibrary &asset_library)
485 {
486  if (drag.type != WM_DRAG_ASSET_CATALOG) {
487  return nullptr;
488  }
490  &asset_library);
491  const wmDragAssetCatalog *catalog_drag = WM_drag_get_asset_catalog_data(&drag);
492 
493  return catalog_service->find_catalog(catalog_drag->drag_catalog_id);
494 }
495 
497  const char **r_disabled_hint)
498 {
499  const ListBase *asset_drags = WM_drag_asset_list_get(&drag);
500 
501  *r_disabled_hint = nullptr;
502  /* There needs to be at least one asset from the current file. */
503  LISTBASE_FOREACH (const wmDragAssetListItem *, asset_item, asset_drags) {
504  if (!asset_item->is_external) {
505  return true;
506  }
507  }
508 
509  *r_disabled_hint = TIP_("Only assets from this current file can be moved between catalogs");
510  return false;
511 }
512 
514 {
515  return *get_view<AssetCatalogTreeView>().asset_library_;
516 }
517 
518 /* ---------------------------------------------------------------------- */
519 
521  AssetCatalogTreeItem &catalog_item)
522  : ui::AbstractViewItemDragController(tree_view), catalog_item_(catalog_item)
523 {
524 }
525 
527 {
528  return WM_DRAG_ASSET_CATALOG;
529 }
530 
532 {
533  wmDragAssetCatalog *drag_catalog = (wmDragAssetCatalog *)MEM_callocN(sizeof(*drag_catalog),
534  __func__);
535  drag_catalog->drag_catalog_id = catalog_item_.get_catalog_id();
536  return drag_catalog;
537 }
538 
540 {
541  AssetCatalogTreeView &tree_view_ = get_view<AssetCatalogTreeView>();
542  tree_view_.activate_catalog_by_id(catalog_item_.get_catalog_id());
543 }
544 
545 /* ---------------------------------------------------------------------- */
546 
547 void AssetCatalogTreeViewAllItem::build_row(uiLayout &row)
548 {
550 
551  PointerRNA *props;
552 
554  (uiBut *)view_item_button(), "ASSET_OT_catalogs_save", WM_OP_INVOKE_DEFAULT, ICON_FILE_TICK);
555 
557  (uiBut *)view_item_button(), "ASSET_OT_catalog_new", WM_OP_INVOKE_DEFAULT, ICON_ADD);
558  /* No parent path to use the root level. */
559  RNA_string_set(props, "parent_path", nullptr);
560 }
561 
562 std::unique_ptr<ui::AbstractViewItemDropController> AssetCatalogTreeViewAllItem::
563  create_drop_controller() const
564 {
565  return std::make_unique<AssetCatalogTreeViewAllItem::DropController>(
566  static_cast<AssetCatalogTreeView &>(get_tree_view()));
567 }
568 
569 AssetCatalogTreeViewAllItem::DropController::DropController(AssetCatalogTreeView &tree_view)
570  : ui::AbstractViewItemDropController(tree_view)
571 {
572 }
573 
574 bool AssetCatalogTreeViewAllItem::DropController::can_drop(const wmDrag &drag,
575  const char **r_disabled_hint) const
576 {
577  if (drag.type != WM_DRAG_ASSET_CATALOG) {
578  return false;
579  }
580 
582  drag, *get_view<AssetCatalogTreeView>().asset_library_);
583  if (drag_catalog->path.parent() == "") {
584  *r_disabled_hint = "Catalog is already placed at the highest level";
585  return false;
586  }
587 
588  return true;
589 }
590 
591 std::string AssetCatalogTreeViewAllItem::DropController::drop_tooltip(const wmDrag &drag) const
592 {
595  drag, *get_view<AssetCatalogTreeView>().asset_library_);
596 
597  return std::string(TIP_("Move Catalog")) + " '" + drag_catalog->path.name() + "' " +
598  TIP_("to the top level of the tree");
599 }
600 
601 bool AssetCatalogTreeViewAllItem::DropController::on_drop(struct bContext *UNUSED(C),
602  const wmDrag &drag)
603 {
606  drag,
607  get_view<AssetCatalogTreeView>(),
608  /* No value to drop into the root level. */
609  std::nullopt);
610 }
611 
612 /* ---------------------------------------------------------------------- */
613 
614 std::unique_ptr<ui::AbstractViewItemDropController> AssetCatalogTreeViewUnassignedItem::
615  create_drop_controller() const
616 {
617  return std::make_unique<AssetCatalogTreeViewUnassignedItem::DropController>(
618  static_cast<AssetCatalogTreeView &>(get_tree_view()));
619 }
620 
621 AssetCatalogTreeViewUnassignedItem::DropController::DropController(AssetCatalogTreeView &tree_view)
622  : ui::AbstractViewItemDropController(tree_view)
623 {
624 }
625 
626 bool AssetCatalogTreeViewUnassignedItem::DropController::can_drop(
627  const wmDrag &drag, const char **r_disabled_hint) const
628 {
629  if (drag.type != WM_DRAG_ASSET_LIST) {
630  return false;
631  }
632  return AssetCatalogDropController::has_droppable_asset(drag, r_disabled_hint);
633 }
634 
635 std::string AssetCatalogTreeViewUnassignedItem::DropController::drop_tooltip(
636  const wmDrag &drag) const
637 {
638  const ListBase *asset_drags = WM_drag_asset_list_get(&drag);
639  const bool is_multiple_assets = !BLI_listbase_is_single(asset_drags);
640 
641  return is_multiple_assets ? TIP_("Move assets out of any catalog") :
642  TIP_("Move asset out of any catalog");
643 }
644 
645 bool AssetCatalogTreeViewUnassignedItem::DropController::on_drop(struct bContext *C,
646  const wmDrag &drag)
647 {
648  /* Assign to nil catalog ID. */
650  C, get_view<AssetCatalogTreeView>(), drag, CatalogID{});
651 }
652 
653 } // namespace blender::ed::asset_browser
654 
655 /* ---------------------------------------------------------------------- */
656 
657 namespace blender::ed::asset_browser {
658 
660  public:
663 
664  std::unique_ptr<AssetCatalogFilter> catalog_filter;
665 };
666 
667 } // namespace blender::ed::asset_browser
668 
669 using namespace blender::ed::asset_browser;
670 
672 {
673  AssetCatalogFilterSettings *filter_settings = MEM_new<AssetCatalogFilterSettings>(__func__);
674  return reinterpret_cast<FileAssetCatalogFilterSettingsHandle *>(filter_settings);
675 }
676 
678  FileAssetCatalogFilterSettingsHandle **filter_settings_handle)
679 {
680  AssetCatalogFilterSettings **filter_settings = reinterpret_cast<AssetCatalogFilterSettings **>(
681  filter_settings_handle);
682  MEM_delete(*filter_settings);
683  *filter_settings = nullptr;
684 }
685 
687  FileAssetCatalogFilterSettingsHandle *filter_settings_handle,
688  eFileSel_Params_AssetCatalogVisibility catalog_visibility,
689  ::bUUID catalog_id)
690 {
691  AssetCatalogFilterSettings *filter_settings = reinterpret_cast<AssetCatalogFilterSettings *>(
692  filter_settings_handle);
693  bool needs_update = false;
694 
695  if (filter_settings->asset_catalog_visibility != catalog_visibility) {
696  filter_settings->asset_catalog_visibility = catalog_visibility;
697  needs_update = true;
698  }
699 
701  !BLI_uuid_equal(filter_settings->asset_catalog_id, catalog_id)) {
702  filter_settings->asset_catalog_id = catalog_id;
703  needs_update = true;
704  }
705 
706  return needs_update;
707 }
708 
710  FileAssetCatalogFilterSettingsHandle *filter_settings_handle,
711  const ::AssetLibrary *asset_library)
712 {
713  AssetCatalogFilterSettings *filter_settings = reinterpret_cast<AssetCatalogFilterSettings *>(
714  filter_settings_handle);
716  asset_library);
717 
719  filter_settings->catalog_filter = std::make_unique<AssetCatalogFilter>(
720  catalog_service->create_catalog_filter(filter_settings->asset_catalog_id));
721  }
722 }
723 
725  const FileAssetCatalogFilterSettingsHandle *filter_settings_handle,
726  const AssetMetaData *asset_data)
727 {
728  const AssetCatalogFilterSettings *filter_settings =
729  reinterpret_cast<const AssetCatalogFilterSettings *>(filter_settings_handle);
730 
731  switch (filter_settings->asset_catalog_visibility) {
733  return !filter_settings->catalog_filter->is_known(asset_data->catalog_id);
735  return filter_settings->catalog_filter->contains(asset_data->catalog_id);
737  /* All asset files should be visible. */
738  return true;
739  }
740 
742  return false;
743 }
744 
745 /* ---------------------------------------------------------------------- */
746 
748  uiLayout *layout,
749  SpaceFile *space_file,
751 {
752  uiBlock *block = uiLayoutGetBlock(layout);
753 
754  UI_block_layout_set_current(block, layout);
755 
757  *block,
758  "asset catalog tree view",
759  std::make_unique<ed::asset_browser::AssetCatalogTreeView>(
760  asset_library, params, *space_file));
761 
762  ui::TreeViewBuilder builder(*block);
763  builder.build_tree_view(*tree_view);
764 }
void BKE_asset_metadata_catalog_id_set(struct AssetMetaData *asset_data, bUUID catalog_id, const char *catalog_simple_name)
struct AssetLibrary AssetLibrary
blender::bke::AssetCatalogService * BKE_asset_library_get_catalog_service(const ::AssetLibrary *library)
blender::bke::AssetCatalogTree * BKE_asset_library_get_catalog_tree(const ::AssetLibrary *library)
#define BLI_assert_unreachable()
Definition: BLI_assert.h:93
#define BLI_assert(a)
Definition: BLI_assert.h:46
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:336
void void BLI_INLINE bool BLI_listbase_is_single(const struct ListBase *lb)
Definition: BLI_listbase.h:265
#define UNUSED(x)
bool BLI_uuid_equal(bUUID uuid1, bUUID uuid2)
Definition: uuid.cc:81
void BLI_uuid_format(char *buffer, bUUID uuid) ATTR_NONNULL()
Definition: uuid.cc:86
#define TIP_(msgid)
#define IFACE_(msgid)
eFileSel_Params_AssetCatalogVisibility
@ FILE_SHOW_ASSETS_ALL_CATALOGS
@ FILE_SHOW_ASSETS_WITHOUT_CATALOG
@ FILE_SHOW_ASSETS_FROM_CATALOG
@ FILE_SEL_HIGHLIGHTED
@ FILE_SEL_SELECTED
#define UUID_STRING_LEN
void ED_asset_catalog_move(AssetLibrary *library, blender::bke::CatalogID src_catalog_id, std::optional< blender::bke::CatalogID > dst_parent_catalog_id=std::nullopt)
void ED_asset_catalog_rename(AssetLibrary *library, blender::bke::CatalogID catalog_id, blender::StringRefNull new_name)
void ED_undo_push(struct bContext *C, const char *str)
Definition: ed_undo.c:100
#define C
Definition: RandGen.cpp:25
uiBlock * uiLayoutGetBlock(uiLayout *layout)
void UI_menutype_draw(struct bContext *C, struct MenuType *mt, struct uiLayout *layout)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
void uiItemFullO(uiLayout *layout, const char *opname, const char *name, int icon, struct IDProperty *properties, wmOperatorCallContext context, int flag, struct PointerRNA *r_opptr)
struct PointerRNA * UI_but_extra_operator_icon_add(uiBut *but, const char *opname, wmOperatorCallContext opcontext, int icon)
Definition: interface.cc:1682
void UI_block_layout_set_current(uiBlock *block, uiLayout *layout)
blender::ui::AbstractGridView * UI_block_add_view(uiBlock &block, blender::StringRef idname, std::unique_ptr< blender::ui::AbstractGridView > grid_view)
#define ND_SPACE_ASSET_PARAMS
Definition: WM_types.h:468
#define WM_DRAG_ASSET_LIST
Definition: WM_types.h:1048
#define WM_DRAG_ASSET_CATALOG
Definition: WM_types.h:1055
#define NC_ASSET
Definition: WM_types.h:354
@ WM_OP_INVOKE_DEFAULT
Definition: WM_types.h:201
#define ND_ASSET_CATALOGS
Definition: WM_types.h:495
#define NC_SPACE
Definition: WM_types.h:342
#define ND_SPACE_FILE_LIST
Definition: WM_types.h:467
void file_create_asset_catalog_tree_view_in_layout(::AssetLibrary *asset_library, uiLayout *layout, SpaceFile *space_file, FileAssetSelectParams *params)
void file_ensure_updated_catalog_filter_data(FileAssetCatalogFilterSettingsHandle *filter_settings_handle, const ::AssetLibrary *asset_library)
FileAssetCatalogFilterSettingsHandle * file_create_asset_catalog_filter_settings()
bool file_is_asset_visible_in_catalog_filter_settings(const FileAssetCatalogFilterSettingsHandle *filter_settings_handle, const AssetMetaData *asset_data)
void file_delete_asset_catalog_filter_settings(FileAssetCatalogFilterSettingsHandle **filter_settings_handle)
bool file_set_asset_catalog_filter_settings(FileAssetCatalogFilterSettingsHandle *filter_settings_handle, eFileSel_Params_AssetCatalogVisibility catalog_visibility, ::bUUID catalog_id)
constexpr const char * c_str() const
const std::string & str() const
bool is_contained_in(const AssetCatalogPath &other_path) const
AssetCatalogPath parent() const
AssetCatalogFilter create_catalog_filter(CatalogID active_catalog_id) const
AssetCatalog * find_catalog(CatalogID catalog_id) const
void foreach_root_item(const ItemIterFn callback)
AssetCatalogDragController(AssetCatalogTreeView &tree_view, AssetCatalogTreeItem &catalog_item)
AssetCatalogDropController(AssetCatalogTreeView &tree_view, AssetCatalogTreeItem &catalog_item)
static bool drop_asset_catalog_into_catalog(const wmDrag &drag, AssetCatalogTreeView &tree_view, const std::optional< CatalogID > drop_catalog_id=std::nullopt)
static bool has_droppable_asset(const wmDrag &drag, const char **r_disabled_hint)
bool can_drop(const wmDrag &drag, const char **r_disabled_hint) const override
bool on_drop(struct bContext *C, const wmDrag &drag) override
static AssetCatalog * get_drag_catalog(const wmDrag &drag, const ::AssetLibrary &asset_library)
std::string drop_tooltip(const wmDrag &drag) const override
static bool drop_assets_into_catalog(struct bContext *C, const AssetCatalogTreeView &tree_view, const wmDrag &drag, CatalogID catalog_id, StringRefNull simple_name="")
eFileSel_Params_AssetCatalogVisibility asset_catalog_visibility
void build_context_menu(bContext &C, uiLayout &column) const override
std::unique_ptr< ui::AbstractViewItemDropController > create_drop_controller() const override
AssetCatalogTreeViewItem(AssetCatalogTreeItem *catalog_item)
std::unique_ptr< ui::AbstractViewItemDragController > create_drag_controller() const override
uiButViewItem * view_item_button()
Definition: tree_view.cc:383
AbstractTreeView & get_tree_view() const
Definition: tree_view.cc:276
void set_collapsed(bool collapsed)
Definition: tree_view.cc:341
void set_is_active_fn(IsActiveFn fn)
Definition: tree_view.cc:542
void build_row(uiLayout &row) override
Definition: tree_view.cc:514
void add_label(uiLayout &layout, StringRefNull label_override="")
Definition: tree_view.cc:519
void set_on_activate_fn(ActivateFn fn)
Definition: tree_view.cc:537
void build_tree_view(AbstractTreeView &tree_view)
Definition: tree_view.cc:497
ItemT & add_tree_item(Args &&...args)
struct FileAssetCatalogFilterSettingsHandle FileAssetCatalogFilterSettingsHandle
Definition: file_intern.h:209
void file_select_deselect_all(SpaceFile *sfile, uint flag)
Definition: filesel.c:1111
void filelist_tag_needs_filtering(FileList *filelist)
Definition: filelist.c:1056
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
Definition: rna_access.c:5155
The meta-data of an asset. By creating and giving this for a data-block (ID.asset_data),...
struct bUUID catalog_id
struct FileList * files
Universally Unique Identifier according to RFC4122.
int type
Definition: WM_types.h:1148
static FT_Library library
const ListBase * WM_drag_asset_list_get(const wmDrag *drag)
Definition: wm_dragdrop.cc:748
wmDragAssetCatalog * WM_drag_get_asset_catalog_data(const wmDrag *drag)
Definition: wm_dragdrop.cc:710
void WM_main_add_notifier(unsigned int type, void *reference)
MenuType * WM_menutype_find(const char *idname, bool quiet)
Definition: wm_menu_type.c:30