38#include <fmt/format.h>
71 void add_unassigned_item();
72 bool is_active_catalog(
CatalogID catalog_id)
const;
116 bool can_drop(
const wmDrag &drag,
const char **r_disabled_hint)
const override;
126 const char **r_disabled_hint);
138 const std::optional<CatalogID> drop_catalog_id = std::nullopt);
141 std::string drop_tooltip_asset_list(
const wmDrag &drag)
const;
142 std::string drop_tooltip_asset_catalog(
const wmDrag &drag)
const;
150 using BasicTreeViewItem::BasicTreeViewItem;
152 void build_row(
uiLayout &row)
override;
157 bool can_drop(
const wmDrag &drag,
const char **r_disabled_hint)
const override;
158 std::string drop_tooltip(
const ui::DragInfo &drag_info)
const override;
166 using BasicTreeViewItem::BasicTreeViewItem;
171 bool can_drop(
const wmDrag &drag,
const char **r_disabled_hint)
const override;
172 std::string drop_tooltip(
const ui::DragInfo &drag_info)
const override;
184 : asset_library_(library), params_(
params), space_file_(space_file)
190 catalog_tree_ =
nullptr;
202 build_catalog_items_recursive(all_item, item);
206 add_unassigned_item();
215 [
this, &catalog]() {
return is_active_catalog(catalog.
get_catalog_id()); });
218 build_catalog_items_recursive(view_item, child);
223AssetCatalogTreeViewAllItem &AssetCatalogTreeView::add_all_item()
232 item.set_is_active_fn(
237void AssetCatalogTreeView::add_unassigned_item()
242 IFACE_(
"Unassigned"), ICON_FILE_HIDDEN);
244 item.set_on_activate_fn([
params](bContext & , ui::BasicTreeViewItem & ) {
248 item.set_is_active_fn(
255 params_->catalog_id = catalog_id;
259bool AssetCatalogTreeView::is_active_catalog(
CatalogID catalog_id)
const
280 const std::string label_override = catalog_item_.has_unsaved_changes() ? (
label_ +
"*") :
label_;
292 RNA_string_set(props,
"parent_path", catalog_item_.catalog_path().c_str());
299 props = column.
op(
"ASSET_OT_catalog_new",
304 RNA_string_set(&props,
"parent_path", catalog_item_.catalog_path().c_str());
306 props = column.
op(
"ASSET_OT_catalog_delete",
311 RNA_string_set(&props,
"catalog_id", catalog_item_.get_catalog_id().str().c_str());
312 column.
op(
"UI_OT_view_item_rename",
IFACE_(
"Rename"), ICON_NONE);
334 BasicTreeViewItem::rename(C, new_name);
344 return std::make_unique<AssetCatalogDropTarget>(*
this, catalog_item_);
350 return std::make_unique<AssetCatalogDragController>(
374 if (catalog_item_.catalog_path().is_contained_in(drag_catalog->
path)) {
375 *r_disabled_hint =
RPT_(
"Catalog cannot be dropped into itself");
378 if (catalog_item_.catalog_path() == drag_catalog->
path.
parent()) {
379 *r_disabled_hint =
RPT_(
"Catalog is already placed inside this catalog");
394 return this->drop_tooltip_asset_catalog(drag_info.
drag_data);
396 return this->drop_tooltip_asset_list(drag_info.
drag_data);
399std::string AssetCatalogDropTarget::drop_tooltip_asset_catalog(
const wmDrag &drag)
const
404 return fmt::format(fmt::runtime(
TIP_(
"Move catalog {} into {}")),
409std::string AssetCatalogDropTarget::drop_tooltip_asset_list(
const wmDrag &drag)
const
418 std::string basic_tip = is_multiple_assets ?
TIP_(
"Move assets to catalog") :
419 TIP_(
"Move asset to catalog");
421 basic_tip +=
": " + catalog_item_.
get_name();
426 basic_tip +=
" (" + catalog_item_.catalog_path().str() +
")";
437 catalog_item_.get_catalog_id());
442 catalog_item_.get_catalog_id(),
443 catalog_item_.get_simple_name());
449 const std::optional<CatalogID> drop_catalog_id)
472 bool did_update =
false;
474 if (asset_item->is_external) {
481 asset_item->asset_data.local_id->asset_data, catalog_id, simple_name.
c_str());
512 *r_disabled_hint =
nullptr;
515 if (!asset_item->is_external) {
520 *r_disabled_hint =
RPT_(
"Only assets from this current file can be moved between catalogs");
525 const char **r_disabled_hint)
528 *r_disabled_hint =
RPT_(
"Catalogs cannot be edited in this asset library");
568void AssetCatalogTreeViewAllItem::build_row(
uiLayout &row)
575 "ASSET_OT_catalogs_save",
580 "ASSET_OT_catalog_new",
589 return std::make_unique<AssetCatalogTreeViewAllItem::DropTarget>(*
this);
592AssetCatalogTreeViewAllItem::DropTarget::DropTarget(AssetCatalogTreeViewAllItem &item)
593 :
ui::TreeViewItemDropTarget(item)
597bool AssetCatalogTreeViewAllItem::DropTarget::can_drop(
const wmDrag &drag,
598 const char **r_disabled_hint)
const
610 *r_disabled_hint =
RPT_(
"Catalog is already placed at the highest level");
617std::string AssetCatalogTreeViewAllItem::DropTarget::drop_tooltip(
618 const ui::DragInfo &drag_info)
const
622 drag_info.
drag_data, *
this->get_view<AssetCatalogTreeView>().asset_library_);
624 return fmt::format(fmt::runtime(
TIP_(
"Move catalog {} to the top level of the tree")),
628bool AssetCatalogTreeViewAllItem::DropTarget::on_drop(bContext * ,
629 const ui::DragInfo &drag_info)
const
634 this->get_view<AssetCatalogTreeView>(),
644 return std::make_unique<AssetCatalogTreeViewUnassignedItem::DropTarget>(*
this);
647AssetCatalogTreeViewUnassignedItem::DropTarget::DropTarget(
648 AssetCatalogTreeViewUnassignedItem &item)
649 : ui::TreeViewItemDropTarget(item)
653bool AssetCatalogTreeViewUnassignedItem::DropTarget::can_drop(
const wmDrag &drag,
654 const char **r_disabled_hint)
const
662std::string AssetCatalogTreeViewUnassignedItem::DropTarget::drop_tooltip(
663 const ui::DragInfo &drag_info)
const
668 return is_multiple_assets ?
TIP_(
"Move assets out of any catalog") :
669 TIP_(
"Move asset out of any catalog");
672bool AssetCatalogTreeViewUnassignedItem::DropTarget::on_drop(bContext *
C,
673 const ui::DragInfo &drag_info)
const
692 return MEM_new<AssetCatalogFilterSettings>(__func__);
697 MEM_delete(*filter_settings);
698 *filter_settings =
nullptr;
704 const ::bUUID &catalog_id)
706 bool needs_update =
false;
729 filter_settings->
catalog_filter = std::make_unique<AssetCatalogFilter>(
765 "asset catalog tree view",
766 std::make_unique<ed::asset_browser::AssetCatalogTreeView>(
767 asset_library,
params, *space_file));
void BKE_asset_metadata_catalog_id_set(AssetMetaData *asset_data, bUUID catalog_id, const char *catalog_simple_name)
#define BLI_assert_unreachable()
#define LISTBASE_FOREACH(type, var, list)
void void BLI_INLINE bool BLI_listbase_is_single(const ListBase *lb)
bool BLI_uuid_equal(bUUID uuid1, bUUID uuid2)
eFileSel_Params_AssetCatalogVisibility
@ FILE_SHOW_ASSETS_ALL_CATALOGS
@ FILE_SHOW_ASSETS_WITHOUT_CATALOG
@ FILE_SHOW_ASSETS_FROM_CATALOG
struct FileAssetSelectParams FileAssetSelectParams
void ED_undo_push(bContext *C, const char *str)
blender::ui::AbstractGridView * UI_block_add_view(uiBlock &block, blender::StringRef idname, std::unique_ptr< blender::ui::AbstractGridView > grid_view)
PointerRNA * UI_but_extra_operator_icon_add(uiBut *but, blender::StringRefNull opname, wmOperatorCallContext opcontext, int icon)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
void UI_menutype_draw(bContext *C, MenuType *mt, uiLayout *layout)
void UI_block_layout_set_current(uiBlock *block, uiLayout *layout)
#define ND_SPACE_ASSET_PARAMS
#define ND_ASSET_CATALOGS
#define ND_SPACE_FILE_LIST
constexpr const char * c_str() const
AssetCatalogPath parent() const
const std::string & str() const
StringRefNull name() const
AssetCatalogFilter create_catalog_filter(CatalogID active_catalog_id) const
AssetCatalog * find_catalog(CatalogID catalog_id) const
const AssetCatalogTree & catalog_tree()
void foreach_child(ItemIterFn callback) const
AssetCatalogPath catalog_path() const
CatalogID get_catalog_id() const
StringRefNull get_name() const
AssetCatalogService & catalog_service() const
void * create_drag_data() const override
eWM_DragDataType get_drag_type() const override
AssetCatalogDragController(AssetCatalogTreeView &tree_view, const AssetCatalogTreeItem &catalog_item)
void on_drag_start() override
bool can_drop(const wmDrag &drag, const char **r_disabled_hint) const override
static bool drop_asset_catalog_into_catalog(const wmDrag &drag, AssetCatalogTreeView &tree_view, const std::optional< CatalogID > drop_catalog_id=std::nullopt)
static AssetCatalog * get_drag_catalog(const wmDrag &drag, const asset_system::AssetLibrary &asset_library)
static bool has_droppable_asset(const wmDrag &drag, const char **r_disabled_hint)
static bool drop_assets_into_catalog(bContext *C, const AssetCatalogTreeView &tree_view, const wmDrag &drag, CatalogID catalog_id, StringRefNull simple_name="")
std::string drop_tooltip(const ui::DragInfo &drag_info) const override
static bool can_modify_catalogs(const asset_system::AssetLibrary &asset_library, const char **r_disabled_hint)
bool on_drop(bContext *C, const ui::DragInfo &drag_info) const override
AssetCatalogDropTarget(AssetCatalogTreeViewItem &item, const AssetCatalogTreeItem &catalog_item)
asset_system::AssetLibrary & get_asset_library() const
eFileSel_Params_AssetCatalogVisibility asset_catalog_visibility
std::unique_ptr< AssetCatalogFilter > catalog_filter
void on_activate(bContext &C) override
void build_context_menu(bContext &C, uiLayout &column) const override
AssetCatalogTreeViewItem(const AssetCatalogTreeItem &catalog_item)
void build_row(uiLayout &row) override
bool supports_renaming() const override
bool rename(const bContext &C, StringRefNull new_name) override
std::unique_ptr< ui::AbstractViewItemDragController > create_drag_controller() const override
std::unique_ptr< ui::TreeViewItemDropTarget > create_drop_target() override
friend class AssetCatalogTreeViewAllItem
void build_tree() override
friend class AssetCatalogTreeViewItem
friend class AssetCatalogDropTarget
void activate_catalog_by_id(CatalogID catalog_id)
AssetCatalogTreeView(asset_system::AssetLibrary *library, FileAssetSelectParams *params, SpaceFile &space_file)
AbstractTreeView & get_tree_view() const
virtual std::unique_ptr< TreeViewItemDropTarget > create_drop_target()
void uncollapse_by_default()
ViewType & get_view() const
AbstractViewItemDragController(AbstractView &view)
AbstractView & get_view() const
uiButViewItem * view_item_button() const
void set_context_menu_title(const std::string &title)
BasicTreeViewItem(StringRef label, BIFIconID icon=ICON_NONE)
void build_row(uiLayout &row) override
void add_label(uiLayout &layout, StringRefNull label_override="")
void set_is_active_fn(IsActiveFn is_active_fn)
static void build_tree_view(const bContext &C, AbstractTreeView &tree_view, uiLayout &layout, std::optional< StringRef > search_string={}, bool add_box=true)
ItemT & add_tree_item(Args &&...args)
TreeViewItemDropTarget(AbstractTreeViewItem &view_item, DropBehavior behavior=DropBehavior::Insert)
ViewType & get_view() const
void file_select_deselect_all(SpaceFile *sfile, eDirEntry_SelectFlag flag)
void filelist_tag_needs_filtering(FileList *filelist)
void * MEM_callocN(size_t len, const char *str)
void file_ensure_updated_catalog_filter_data(AssetCatalogFilterSettings *filter_settings, const asset_system::AssetLibrary *asset_library)
AssetCatalogFilterSettings * file_create_asset_catalog_filter_settings()
bool file_is_asset_visible_in_catalog_filter_settings(const AssetCatalogFilterSettings *filter_settings, const AssetMetaData *asset_data)
void file_delete_asset_catalog_filter_settings(AssetCatalogFilterSettings **filter_settings)
bool file_set_asset_catalog_filter_settings(AssetCatalogFilterSettings *filter_settings, eFileSel_Params_AssetCatalogVisibility catalog_visibility, const ::bUUID &catalog_id)
void file_create_asset_catalog_tree_view_in_layout(const bContext *C, asset_system::AssetLibrary *asset_library, uiLayout *layout, SpaceFile *space_file, FileAssetSelectParams *params)
bool catalogs_read_only(const asset_system::AssetLibrary &library)
void catalog_move(asset_system::AssetLibrary *library, asset_system::CatalogID src_catalog_id, std::optional< asset_system::CatalogID > dst_parent_catalog_id=std::nullopt)
void catalog_rename(asset_system::AssetLibrary *library, asset_system::CatalogID catalog_id, StringRefNull new_name)
TreeViewItemContainer TreeViewOrItem
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
short asset_catalog_visibility
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, wmOperatorCallContext context, eUI_Item_Flag flag)
wmDragAssetCatalog * WM_drag_get_asset_catalog_data(const wmDrag *drag)
const ListBase * WM_drag_asset_list_get(const wmDrag *drag)
void WM_main_add_notifier(uint type, void *reference)