From c91d1961596eb3ac0905010b63551951fc1fece7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 25 Nov 2021 15:01:32 +0100 Subject: Fix T93274: Assigning asset catalog doesn't mark file as modified Assigning a catalog to an asset via drag-and-drop in the asset browser now creates an undo step. Not only does this allow undoing the action, it also tags the blend file as modified. Reviewed by: Severin Differential Revision: https://developer.blender.org/D13370 --- source/blender/editors/include/UI_interface.h | 4 ++- source/blender/editors/include/UI_tree_view.hh | 2 +- source/blender/editors/interface/interface_ops.c | 2 +- source/blender/editors/interface/tree_view.cc | 6 +++-- .../editors/space_file/asset_catalog_tree_view.cc | 31 +++++++++++++++------- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 1ed10f37de3..d9f6c89e03b 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -2786,7 +2786,9 @@ bool UI_tree_view_item_can_drop(const uiTreeViewItemHandle *item_, const struct wmDrag *drag, const char **r_disabled_hint); char *UI_tree_view_item_drop_tooltip(const uiTreeViewItemHandle *item, const struct wmDrag *drag); -bool UI_tree_view_item_drop_handle(uiTreeViewItemHandle *item_, const struct ListBase *drags); +bool UI_tree_view_item_drop_handle(struct bContext *C, + uiTreeViewItemHandle *item_, + const struct ListBase *drags); bool UI_tree_view_item_can_rename(const uiTreeViewItemHandle *item_handle); void UI_tree_view_item_begin_rename(uiTreeViewItemHandle *item_handle); diff --git a/source/blender/editors/include/UI_tree_view.hh b/source/blender/editors/include/UI_tree_view.hh index 5acee02a8cc..70d0f3b21b2 100644 --- a/source/blender/editors/include/UI_tree_view.hh +++ b/source/blender/editors/include/UI_tree_view.hh @@ -405,7 +405,7 @@ class AbstractTreeViewItemDropController { * Execute the logic to apply a drop of the data dragged with \a drag onto/into the item this * controller is for. */ - virtual bool on_drop(const wmDrag &drag) = 0; + virtual bool on_drop(struct bContext *C, const wmDrag &drag) = 0; template inline TreeViewType &tree_view() const; }; diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c index c962a1107ae..c0a69d81c26 100644 --- a/source/blender/editors/interface/interface_ops.c +++ b/source/blender/editors/interface/interface_ops.c @@ -1977,7 +1977,7 @@ static int ui_tree_view_drop_invoke(bContext *C, wmOperator *UNUSED(op), const w const ARegion *region = CTX_wm_region(C); uiTreeViewItemHandle *hovered_tree_item = UI_block_tree_view_find_item_at(region, event->xy); - if (!UI_tree_view_item_drop_handle(hovered_tree_item, event->customdata)) { + if (!UI_tree_view_item_drop_handle(C, hovered_tree_item, event->customdata)) { return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH; } diff --git a/source/blender/editors/interface/tree_view.cc b/source/blender/editors/interface/tree_view.cc index 488b3bbb726..f031c6eb8b7 100644 --- a/source/blender/editors/interface/tree_view.cc +++ b/source/blender/editors/interface/tree_view.cc @@ -762,7 +762,9 @@ char *UI_tree_view_item_drop_tooltip(const uiTreeViewItemHandle *item_, const wm * Let a tree-view item handle a drop event. * \return True if the drop was handled by the tree-view item. */ -bool UI_tree_view_item_drop_handle(uiTreeViewItemHandle *item_, const ListBase *drags) +bool UI_tree_view_item_drop_handle(struct bContext *C, + uiTreeViewItemHandle *item_, + const ListBase *drags) { AbstractTreeViewItem &item = reinterpret_cast(*item_); std::unique_ptr drop_controller = @@ -771,7 +773,7 @@ bool UI_tree_view_item_drop_handle(uiTreeViewItemHandle *item_, const ListBase * const char *disabled_hint_dummy = nullptr; LISTBASE_FOREACH (const wmDrag *, drag, drags) { if (drop_controller->can_drop(*drag, &disabled_hint_dummy)) { - return drop_controller->on_drop(*drag); + return drop_controller->on_drop(C, *drag); } } 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 d2d95a10c2a..654278cd990 100644 --- a/source/blender/editors/space_file/asset_catalog_tree_view.cc +++ b/source/blender/editors/space_file/asset_catalog_tree_view.cc @@ -33,6 +33,7 @@ #include "ED_asset.h" #include "ED_fileselect.h" +#include "ED_undo.h" #include "RNA_access.h" @@ -126,13 +127,14 @@ class AssetCatalogDropController : public ui::AbstractTreeViewItemDropController bool can_drop(const wmDrag &drag, const char **r_disabled_hint) const override; std::string drop_tooltip(const wmDrag &drag) const override; - bool on_drop(const wmDrag &drag) override; + bool on_drop(struct bContext *C, const wmDrag &drag) override; ::AssetLibrary &get_asset_library() const; static AssetCatalog *get_drag_catalog(const wmDrag &drag, const ::AssetLibrary &asset_library); static bool has_droppable_asset(const wmDrag &drag, const char **r_disabled_hint); - static bool drop_assets_into_catalog(const AssetCatalogTreeView &tree_view, + static bool drop_assets_into_catalog(struct bContext *C, + const AssetCatalogTreeView &tree_view, const wmDrag &drag, CatalogID catalog_id, StringRefNull simple_name = ""); @@ -161,7 +163,7 @@ class AssetCatalogTreeViewAllItem : public ui::BasicTreeViewItem { bool can_drop(const wmDrag &drag, const char **r_disabled_hint) const override; std::string drop_tooltip(const wmDrag &drag) const override; - bool on_drop(const wmDrag &drag) override; + bool on_drop(struct bContext *C, const wmDrag &drag) override; }; std::unique_ptr create_drop_controller() const override; @@ -175,7 +177,7 @@ class AssetCatalogTreeViewUnassignedItem : public ui::BasicTreeViewItem { bool can_drop(const wmDrag &drag, const char **r_disabled_hint) const override; std::string drop_tooltip(const wmDrag &drag) const override; - bool on_drop(const wmDrag &drag) override; + bool on_drop(struct bContext *C, const wmDrag &drag) override; }; std::unique_ptr create_drop_controller() const override; @@ -425,13 +427,14 @@ std::string AssetCatalogDropController::drop_tooltip_asset_list(const wmDrag &dr ")"; } -bool AssetCatalogDropController::on_drop(const wmDrag &drag) +bool AssetCatalogDropController::on_drop(struct bContext *C, const wmDrag &drag) { if (drag.type == WM_DRAG_ASSET_CATALOG) { return drop_asset_catalog_into_catalog( drag, tree_view(), catalog_item_.get_catalog_id()); } - return drop_assets_into_catalog(tree_view(), + return drop_assets_into_catalog(C, + tree_view(), drag, catalog_item_.get_catalog_id(), catalog_item_.get_simple_name()); @@ -451,7 +454,8 @@ bool AssetCatalogDropController::drop_asset_catalog_into_catalog( return true; } -bool AssetCatalogDropController::drop_assets_into_catalog(const AssetCatalogTreeView &tree_view, +bool AssetCatalogDropController::drop_assets_into_catalog(struct bContext *C, + const AssetCatalogTreeView &tree_view, const wmDrag &drag, CatalogID catalog_id, StringRefNull simple_name) @@ -462,11 +466,14 @@ bool AssetCatalogDropController::drop_assets_into_catalog(const AssetCatalogTree return false; } + bool did_update = false; LISTBASE_FOREACH (wmDragAssetListItem *, asset_item, asset_drags) { if (asset_item->is_external) { /* Only internal assets can be modified! */ continue; } + + did_update = true; BKE_asset_metadata_catalog_id_set( asset_item->asset_data.local_id->asset_data, catalog_id, simple_name.c_str()); @@ -476,6 +483,9 @@ bool AssetCatalogDropController::drop_assets_into_catalog(const AssetCatalogTree WM_main_add_notifier(NC_SPACE | ND_SPACE_FILE_LIST, nullptr); } + if (did_update) { + ED_undo_push(C, "Assign Asset Catalog"); + } return true; } @@ -597,7 +607,7 @@ std::string AssetCatalogTreeViewAllItem::DropController::drop_tooltip(const wmDr TIP_("to the top level of the tree"); } -bool AssetCatalogTreeViewAllItem::DropController::on_drop(const wmDrag &drag) +bool AssetCatalogTreeViewAllItem::DropController::on_drop(struct bContext *, const wmDrag &drag) { BLI_assert(drag.type == WM_DRAG_ASSET_CATALOG); return AssetCatalogDropController::drop_asset_catalog_into_catalog( @@ -640,11 +650,12 @@ std::string AssetCatalogTreeViewUnassignedItem::DropController::drop_tooltip( TIP_("Move asset out of any catalog"); } -bool AssetCatalogTreeViewUnassignedItem::DropController::on_drop(const wmDrag &drag) +bool AssetCatalogTreeViewUnassignedItem::DropController::on_drop(struct bContext *C, + const wmDrag &drag) { /* Assign to nil catalog ID. */ return AssetCatalogDropController::drop_assets_into_catalog( - tree_view(), drag, CatalogID{}); + C, tree_view(), drag, CatalogID{}); } } // namespace blender::ed::asset_browser -- cgit v1.2.3