diff options
author | Julian Eisel <julian@blender.org> | 2021-10-04 15:58:52 +0300 |
---|---|---|
committer | Julian Eisel <julian@blender.org> | 2021-10-04 16:29:39 +0300 |
commit | 48822086331c1913a4980a87ee82f14904068213 (patch) | |
tree | d9191b880aa6ecb667db05aeefe371891f818383 /source/blender/editors/space_file | |
parent | cc636db8f2ff2e14b912e8c3998b5042f59c5a42 (diff) |
Cleanup: Separate interface & implementation for asset catalog tree-view
Should make the code a bit more organized and help getting an overview
of the interfaces more quickly.
Diffstat (limited to 'source/blender/editors/space_file')
-rw-r--r-- | source/blender/editors/space_file/asset_catalog_tree_view.cc | 251 |
1 files changed, 137 insertions, 114 deletions
diff --git a/source/blender/editors/space_file/asset_catalog_tree_view.cc b/source/blender/editors/space_file/asset_catalog_tree_view.cc index 92e4e668885..35107340cdb 100644 --- a/source/blender/editors/space_file/asset_catalog_tree_view.cc +++ b/source/blender/editors/space_file/asset_catalog_tree_view.cc @@ -74,6 +74,7 @@ class AssetCatalogTreeView : public ui::AbstractTreeView { void add_unassigned_item(); bool is_active_catalog(CatalogID catalog_id) const; }; + /* ---------------------------------------------------------------------- */ class AssetCatalogTreeViewItem : public ui::BasicTreeViewItem { @@ -81,111 +82,19 @@ class AssetCatalogTreeViewItem : public ui::BasicTreeViewItem { AssetCatalogTreeItem &catalog_item_; public: - AssetCatalogTreeViewItem(AssetCatalogTreeItem *catalog_item) - : BasicTreeViewItem(catalog_item->get_name()), catalog_item_(*catalog_item) - { - } - - void on_activate() override - { - const AssetCatalogTreeView &tree_view = static_cast<const AssetCatalogTreeView &>( - get_tree_view()); - tree_view.params_->asset_catalog_visibility = FILE_SHOW_ASSETS_FROM_CATALOG; - tree_view.params_->catalog_id = catalog_item_.get_catalog_id(); - WM_main_add_notifier(NC_SPACE | ND_SPACE_ASSET_PARAMS, nullptr); - } - - void build_row(uiLayout &row) override - { - ui::BasicTreeViewItem::build_row(row); - - if (!is_active()) { - return; - } - - PointerRNA *props; - const CatalogID catalog_id = catalog_item_.get_catalog_id(); - - props = UI_but_extra_operator_icon_add( - button(), "ASSET_OT_catalog_new", WM_OP_INVOKE_DEFAULT, ICON_ADD); - RNA_string_set(props, "parent_path", catalog_item_.catalog_path().c_str()); - - /* Tree items without a catalog ID represent components of catalog paths that are not - * associated with an actual catalog. They exist merely by the presence of a child catalog, and - * thus cannot be deleted themselves. */ - if (!BLI_uuid_is_nil(catalog_id)) { - char catalog_id_str_buffer[UUID_STRING_LEN] = ""; - BLI_uuid_format(catalog_id_str_buffer, catalog_id); - - props = UI_but_extra_operator_icon_add( - button(), "ASSET_OT_catalog_delete", WM_OP_INVOKE_DEFAULT, ICON_X); - RNA_string_set(props, "catalog_id", catalog_id_str_buffer); - } - } + AssetCatalogTreeViewItem(AssetCatalogTreeItem *catalog_item); - bool has_droppable_item(const wmDrag &drag) const - { - const ListBase *asset_drags = WM_drag_asset_list_get(&drag); + void on_activate() override; - /* There needs to be at least one asset from the current file. */ - LISTBASE_FOREACH (const wmDragAssetListItem *, asset_item, asset_drags) { - if (!asset_item->is_external) { - return true; - } - } - return false; - } + void build_row(uiLayout &row) override; - bool can_drop(const wmDrag &drag) const override - { - if (drag.type != WM_DRAG_ASSET_LIST) { - return false; - } - return has_droppable_item(drag); - } + bool has_droppable_item(const wmDrag &drag) const; - std::string drop_tooltip(const bContext & /*C*/, + bool can_drop(const wmDrag &drag) const override; + std::string drop_tooltip(const bContext &C, const wmDrag &drag, - const wmEvent & /*event*/) const override - { - const ListBase *asset_drags = WM_drag_asset_list_get(&drag); - const bool is_multiple_assets = !BLI_listbase_is_single(asset_drags); - - /* Don't try to be smart by dynamically adding the 's' for the plural. Just makes translation - * harder, so use full literals. */ - std::string basic_tip = is_multiple_assets ? TIP_("Move assets to catalog") : - TIP_("Move asset to catalog"); - - return basic_tip + ": " + catalog_item_.get_name() + " (" + - catalog_item_.catalog_path().str() + ")"; - } - - bool on_drop(const wmDrag &drag) override - { - const ListBase *asset_drags = WM_drag_asset_list_get(&drag); - if (!asset_drags) { - return false; - } - - const AssetCatalogTreeView &tree_view = static_cast<const AssetCatalogTreeView &>( - get_tree_view()); - - LISTBASE_FOREACH (wmDragAssetListItem *, asset_item, asset_drags) { - if (asset_item->is_external) { - /* Only internal assets can be modified! */ - continue; - } - BKE_asset_metadata_catalog_id_set(asset_item->asset_data.local_id->asset_data, - catalog_item_.get_catalog_id(), - catalog_item_.get_simple_name().c_str()); - - /* Trigger re-run of filtering to update visible assets. */ - filelist_tag_needs_filtering(tree_view.space_file_.files); - file_select_deselect_all(&tree_view.space_file_, FILE_SEL_SELECTED | FILE_SEL_HIGHLIGHTED); - } - - return true; - } + const wmEvent &event) const override; + bool on_drop(const wmDrag &drag) override; }; /** Only reason this isn't just `BasicTreeViewItem` is to add a '+' icon for adding a root level @@ -193,22 +102,11 @@ class AssetCatalogTreeViewItem : public ui::BasicTreeViewItem { class AssetCatalogTreeViewAllItem : public ui::BasicTreeViewItem { using BasicTreeViewItem::BasicTreeViewItem; - void build_row(uiLayout &row) override - { - ui::BasicTreeViewItem::build_row(row); - - if (!is_active()) { - return; - } - - PointerRNA *props; - props = UI_but_extra_operator_icon_add( - button(), "ASSET_OT_catalog_new", WM_OP_INVOKE_DEFAULT, ICON_ADD); - /* No parent path to use the root level. */ - RNA_string_set(props, "parent_path", nullptr); - } + void build_row(uiLayout &row) override; }; +/* ---------------------------------------------------------------------- */ + AssetCatalogTreeView::AssetCatalogTreeView(::AssetLibrary *library, FileAssetSelectParams *params, SpaceFile &space_file) @@ -283,6 +181,131 @@ bool AssetCatalogTreeView::is_active_catalog(CatalogID catalog_id) const (params_->catalog_id == catalog_id); } +/* ---------------------------------------------------------------------- */ + +AssetCatalogTreeViewItem::AssetCatalogTreeViewItem(AssetCatalogTreeItem *catalog_item) + : BasicTreeViewItem(catalog_item->get_name()), catalog_item_(*catalog_item) +{ +} + +void AssetCatalogTreeViewItem::on_activate() +{ + const AssetCatalogTreeView &tree_view = static_cast<const AssetCatalogTreeView &>( + get_tree_view()); + tree_view.params_->asset_catalog_visibility = FILE_SHOW_ASSETS_FROM_CATALOG; + tree_view.params_->catalog_id = catalog_item_.get_catalog_id(); + WM_main_add_notifier(NC_SPACE | ND_SPACE_ASSET_PARAMS, nullptr); +} + +void AssetCatalogTreeViewItem::build_row(uiLayout &row) +{ + ui::BasicTreeViewItem::build_row(row); + + if (!is_active()) { + return; + } + + PointerRNA *props; + const CatalogID catalog_id = catalog_item_.get_catalog_id(); + + props = UI_but_extra_operator_icon_add( + button(), "ASSET_OT_catalog_new", WM_OP_INVOKE_DEFAULT, ICON_ADD); + RNA_string_set(props, "parent_path", catalog_item_.catalog_path().c_str()); + + /* Tree items without a catalog ID represent components of catalog paths that are not + * associated with an actual catalog. They exist merely by the presence of a child catalog, and + * thus cannot be deleted themselves. */ + if (!BLI_uuid_is_nil(catalog_id)) { + char catalog_id_str_buffer[UUID_STRING_LEN] = ""; + BLI_uuid_format(catalog_id_str_buffer, catalog_id); + + props = UI_but_extra_operator_icon_add( + button(), "ASSET_OT_catalog_delete", WM_OP_INVOKE_DEFAULT, ICON_X); + RNA_string_set(props, "catalog_id", catalog_id_str_buffer); + } +} + +bool AssetCatalogTreeViewItem::has_droppable_item(const wmDrag &drag) const +{ + const ListBase *asset_drags = WM_drag_asset_list_get(&drag); + + /* There needs to be at least one asset from the current file. */ + LISTBASE_FOREACH (const wmDragAssetListItem *, asset_item, asset_drags) { + if (!asset_item->is_external) { + return true; + } + } + return false; +} + +bool AssetCatalogTreeViewItem::can_drop(const wmDrag &drag) const +{ + if (drag.type != WM_DRAG_ASSET_LIST) { + return false; + } + return has_droppable_item(drag); +} + +std::string AssetCatalogTreeViewItem::drop_tooltip(const bContext & /*C*/, + const wmDrag &drag, + const wmEvent & /*event*/) const +{ + const ListBase *asset_drags = WM_drag_asset_list_get(&drag); + const bool is_multiple_assets = !BLI_listbase_is_single(asset_drags); + + /* Don't try to be smart by dynamically adding the 's' for the plural. Just makes translation + * harder, so use full literals. */ + std::string basic_tip = is_multiple_assets ? TIP_("Move assets to catalog") : + TIP_("Move asset to catalog"); + + return basic_tip + ": " + catalog_item_.get_name() + " (" + catalog_item_.catalog_path().str() + + ")"; +} + +bool AssetCatalogTreeViewItem::on_drop(const wmDrag &drag) +{ + const ListBase *asset_drags = WM_drag_asset_list_get(&drag); + if (!asset_drags) { + return false; + } + + const AssetCatalogTreeView &tree_view = static_cast<const AssetCatalogTreeView &>( + get_tree_view()); + + LISTBASE_FOREACH (wmDragAssetListItem *, asset_item, asset_drags) { + if (asset_item->is_external) { + /* Only internal assets can be modified! */ + continue; + } + BKE_asset_metadata_catalog_id_set(asset_item->asset_data.local_id->asset_data, + catalog_item_.get_catalog_id(), + catalog_item_.get_simple_name().c_str()); + + /* Trigger re-run of filtering to update visible assets. */ + filelist_tag_needs_filtering(tree_view.space_file_.files); + file_select_deselect_all(&tree_view.space_file_, FILE_SEL_SELECTED | FILE_SEL_HIGHLIGHTED); + } + + return true; +} + +/* ---------------------------------------------------------------------- */ + +void AssetCatalogTreeViewAllItem::build_row(uiLayout &row) +{ + ui::BasicTreeViewItem::build_row(row); + + if (!is_active()) { + return; + } + + PointerRNA *props; + props = UI_but_extra_operator_icon_add( + button(), "ASSET_OT_catalog_new", WM_OP_INVOKE_DEFAULT, ICON_ADD); + /* No parent path to use the root level. */ + RNA_string_set(props, "parent_path", nullptr); +} + } // namespace blender::ed::asset_browser /* ---------------------------------------------------------------------- */ |