39#include <fmt/format.h>
72 void add_unassigned_item();
73 bool is_active_catalog(
CatalogID catalog_id)
const;
107 std::optional<eWM_DragDataType>
get_drag_type()
const override;
118 bool can_drop(
const wmDrag &drag,
const char **r_disabled_hint)
const override;
128 const char **r_disabled_hint);
140 const std::optional<CatalogID> drop_catalog_id = std::nullopt);
143 std::string drop_tooltip_asset_list(
const wmDrag &drag)
const;
144 std::string drop_tooltip_asset_catalog(
const wmDrag &drag)
const;
152 using BasicTreeViewItem::BasicTreeViewItem;
154 void build_row(
uiLayout &row)
override;
159 bool can_drop(
const wmDrag &drag,
const char **r_disabled_hint)
const override;
160 std::string drop_tooltip(
const ui::DragInfo &drag_info)
const override;
168 using BasicTreeViewItem::BasicTreeViewItem;
173 bool can_drop(
const wmDrag &drag,
const char **r_disabled_hint)
const override;
174 std::string drop_tooltip(
const ui::DragInfo &drag_info)
const override;
186 : asset_library_(library), params_(
params), space_file_(space_file)
192 catalog_tree_ =
nullptr;
204 build_catalog_items_recursive(all_item, item);
208 add_unassigned_item();
217 [
this, &catalog]() {
return is_active_catalog(catalog.
get_catalog_id()); });
220 build_catalog_items_recursive(view_item, child);
225AssetCatalogTreeViewAllItem &AssetCatalogTreeView::add_all_item()
234 item.set_is_active_fn(
239void AssetCatalogTreeView::add_unassigned_item()
244 IFACE_(
"Unassigned"), ICON_FILE_HIDDEN);
246 item.set_on_activate_fn([
params](bContext & , ui::BasicTreeViewItem & ) {
250 item.set_is_active_fn(
257 params_->catalog_id = catalog_id;
261bool AssetCatalogTreeView::is_active_catalog(
CatalogID catalog_id)
const
282 const std::string label_override = catalog_item_.has_unsaved_changes() ? (
label_ +
"*") :
label_;
294 RNA_string_set(props,
"parent_path", catalog_item_.catalog_path().c_str());
301 props = column.
op(
"ASSET_OT_catalog_new",
306 RNA_string_set(&props,
"parent_path", catalog_item_.catalog_path().c_str());
308 props = column.
op(
"ASSET_OT_catalog_delete",
313 RNA_string_set(&props,
"catalog_id", catalog_item_.get_catalog_id().str().c_str());
314 column.
op(
"UI_OT_view_item_rename",
IFACE_(
"Rename"), ICON_NONE);
336 BasicTreeViewItem::rename(C, new_name);
353 return std::make_unique<AssetCatalogDropTarget>(*
this, catalog_item_);
359 return std::make_unique<AssetCatalogDragController>(
383 if (catalog_item_.catalog_path().is_contained_in(drag_catalog->
path)) {
384 *r_disabled_hint =
RPT_(
"Catalog cannot be dropped into itself");
387 if (catalog_item_.catalog_path() == drag_catalog->
path.
parent()) {
388 *r_disabled_hint =
RPT_(
"Catalog is already placed inside this catalog");
403 return this->drop_tooltip_asset_catalog(drag_info.
drag_data);
405 return this->drop_tooltip_asset_list(drag_info.
drag_data);
408std::string AssetCatalogDropTarget::drop_tooltip_asset_catalog(
const wmDrag &drag)
const
413 return fmt::format(fmt::runtime(
TIP_(
"Move catalog {} into {}")),
418std::string AssetCatalogDropTarget::drop_tooltip_asset_list(
const wmDrag &drag)
const
427 std::string basic_tip = is_multiple_assets ?
TIP_(
"Move assets to catalog") :
428 TIP_(
"Move asset to catalog");
430 basic_tip +=
": " + catalog_item_.
get_name();
435 basic_tip +=
" (" + catalog_item_.catalog_path().str() +
")";
446 catalog_item_.get_catalog_id());
451 catalog_item_.get_catalog_id(),
452 catalog_item_.get_simple_name());
458 const std::optional<CatalogID> drop_catalog_id)
481 bool did_update =
false;
483 if (asset_item->is_external) {
490 asset_item->asset_data.local_id->asset_data, catalog_id, simple_name.
c_str());
521 *r_disabled_hint =
nullptr;
524 if (!asset_item->is_external) {
529 *r_disabled_hint =
RPT_(
"Only assets from this current file can be moved between catalogs");
534 const char **r_disabled_hint)
537 *r_disabled_hint =
RPT_(
"Catalogs cannot be edited in this asset library");
577void AssetCatalogTreeViewAllItem::build_row(
uiLayout &row)
584 "ASSET_OT_catalogs_save",
589 "ASSET_OT_catalog_new",
598 return std::make_unique<AssetCatalogTreeViewAllItem::DropTarget>(*
this);
601AssetCatalogTreeViewAllItem::DropTarget::DropTarget(AssetCatalogTreeViewAllItem &item)
602 :
ui::TreeViewItemDropTarget(item)
606bool AssetCatalogTreeViewAllItem::DropTarget::can_drop(
const wmDrag &drag,
607 const char **r_disabled_hint)
const
619 *r_disabled_hint =
RPT_(
"Catalog is already placed at the highest level");
626std::string AssetCatalogTreeViewAllItem::DropTarget::drop_tooltip(
627 const ui::DragInfo &drag_info)
const
631 drag_info.
drag_data, *this->get_view<AssetCatalogTreeView>().asset_library_);
633 return fmt::format(fmt::runtime(
TIP_(
"Move catalog {} to the top level of the tree")),
637bool AssetCatalogTreeViewAllItem::DropTarget::on_drop(bContext * ,
638 const ui::DragInfo &drag_info)
const
643 this->get_view<AssetCatalogTreeView>(),
653 return std::make_unique<AssetCatalogTreeViewUnassignedItem::DropTarget>(*
this);
656AssetCatalogTreeViewUnassignedItem::DropTarget::DropTarget(
657 AssetCatalogTreeViewUnassignedItem &item)
658 : ui::TreeViewItemDropTarget(item)
662bool AssetCatalogTreeViewUnassignedItem::DropTarget::can_drop(
const wmDrag &drag,
663 const char **r_disabled_hint)
const
671std::string AssetCatalogTreeViewUnassignedItem::DropTarget::drop_tooltip(
672 const ui::DragInfo &drag_info)
const
677 return is_multiple_assets ?
TIP_(
"Move assets out of any catalog") :
678 TIP_(
"Move asset out of any catalog");
681bool AssetCatalogTreeViewUnassignedItem::DropTarget::on_drop(bContext *
C,
682 const ui::DragInfo &drag_info)
const
701 return MEM_new<AssetCatalogFilterSettings>(__func__);
706 MEM_delete(*filter_settings);
707 *filter_settings =
nullptr;
713 const ::bUUID &catalog_id)
715 bool needs_update =
false;
738 filter_settings->
catalog_filter = std::make_unique<AssetCatalogFilter>(
774 "asset catalog tree view",
775 std::make_unique<ed::asset_browser::AssetCatalogTreeView>(
776 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, blender::wm::OpCallContext opcontext, int icon)
void UI_menutype_draw(bContext *C, MenuType *mt, 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
std::optional< eWM_DragDataType > get_drag_type() const override
void on_drag_start(bContext &C) override
AssetCatalogDragController(AssetCatalogTreeView &tree_view, const AssetCatalogTreeItem &catalog_item)
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
void delete_item(bContext *C) 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, 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)
void catalog_remove(asset_system::AssetLibrary *library, const asset_system::CatalogID &catalog_id)
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 block_layout_set_current(uiBlock *block, uiLayout *layout)
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, blender::wm::OpCallContext 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)