diff options
author | Julian Eisel <julian@blender.org> | 2021-11-24 20:02:56 +0300 |
---|---|---|
committer | Julian Eisel <julian@blender.org> | 2021-11-24 20:05:08 +0300 |
commit | 71c39a9e2ef300a1ca451f1080cf59dda94ef4a4 (patch) | |
tree | c21c9204bab13ee40241b1de1e5687ce2cc9fe89 /source | |
parent | cae3b581b05e6c1001b82773229246d48899e3d6 (diff) |
Asset Browser: Activate a catalog when dragging
Without this it's easy to loose track of which catalog you are dragging.
Things feel generally quite jumpy/disconnected, activating the catalog
makes things feel far less like that.
I consider this an important usability fix, therefore I'm adding it to
the release branch.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/include/UI_tree_view.hh | 14 | ||||
-rw-r--r-- | source/blender/editors/interface/tree_view.cc | 15 | ||||
-rw-r--r-- | source/blender/editors/space_file/asset_catalog_tree_view.cc | 18 |
3 files changed, 43 insertions, 4 deletions
diff --git a/source/blender/editors/include/UI_tree_view.hh b/source/blender/editors/include/UI_tree_view.hh index 0d18eedeac9..5acee02a8cc 100644 --- a/source/blender/editors/include/UI_tree_view.hh +++ b/source/blender/editors/include/UI_tree_view.hh @@ -358,11 +358,18 @@ class AbstractTreeViewItem : public TreeViewItemContainer { * custom implementation of #AbstractTreeViewItem::create_drag_controller(). */ class AbstractTreeViewItemDragController { + protected: + AbstractTreeView &tree_view_; + public: + AbstractTreeViewItemDragController(AbstractTreeView &tree_view); virtual ~AbstractTreeViewItemDragController() = default; virtual int get_drag_type() const = 0; virtual void *create_drag_data() const = 0; + virtual void on_drag_start(); + + template<class TreeViewType> inline TreeViewType &tree_view() const; }; /** @@ -453,6 +460,13 @@ inline ItemT &TreeViewItemContainer::add_tree_item(Args &&...args) add_tree_item(std::make_unique<ItemT>(std::forward<Args>(args)...))); } +template<class TreeViewType> TreeViewType &AbstractTreeViewItemDragController::tree_view() const +{ + static_assert(std::is_base_of<AbstractTreeView, TreeViewType>::value, + "Type must derive from and implement the AbstractTreeView interface"); + return static_cast<TreeViewType &>(tree_view_); +} + template<class TreeViewType> TreeViewType &AbstractTreeViewItemDropController::tree_view() const { static_assert(std::is_base_of<AbstractTreeView, TreeViewType>::value, diff --git a/source/blender/editors/interface/tree_view.cc b/source/blender/editors/interface/tree_view.cc index fcc878c440c..488b3bbb726 100644 --- a/source/blender/editors/interface/tree_view.cc +++ b/source/blender/editors/interface/tree_view.cc @@ -550,6 +550,19 @@ void AbstractTreeViewItem::change_state_delayed() activate(); } } + +/* ---------------------------------------------------------------------- */ + +AbstractTreeViewItemDragController::AbstractTreeViewItemDragController(AbstractTreeView &tree_view) + : tree_view_(tree_view) +{ +} + +void AbstractTreeViewItemDragController::on_drag_start() +{ + /* Do nothing by default. */ +} + /* ---------------------------------------------------------------------- */ AbstractTreeViewItemDropController::AbstractTreeViewItemDropController(AbstractTreeView &tree_view) @@ -714,6 +727,8 @@ bool UI_tree_view_item_drag_start(bContext *C, uiTreeViewItemHandle *item_) drag_controller->create_drag_data(), 0, WM_DRAG_FREE_DATA); + drag_controller->on_drag_start(); + return true; } 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 5c880c15a53..d2d95a10c2a 100644 --- a/source/blender/editors/space_file/asset_catalog_tree_view.cc +++ b/source/blender/editors/space_file/asset_catalog_tree_view.cc @@ -110,10 +110,12 @@ class AssetCatalogDragController : public ui::AbstractTreeViewItemDragController AssetCatalogTreeItem &catalog_item_; public: - explicit AssetCatalogDragController(AssetCatalogTreeItem &catalog_item); + explicit AssetCatalogDragController(AssetCatalogTreeView &tree_view, + AssetCatalogTreeItem &catalog_item); int get_drag_type() const override; void *create_drag_data() const override; + void on_drag_start() override; }; class AssetCatalogDropController : public ui::AbstractTreeViewItemDropController { @@ -355,7 +357,8 @@ std::unique_ptr<ui::AbstractTreeViewItemDropController> AssetCatalogTreeViewItem std::unique_ptr<ui::AbstractTreeViewItemDragController> AssetCatalogTreeViewItem:: create_drag_controller() const { - return std::make_unique<AssetCatalogDragController>(catalog_item_); + return std::make_unique<AssetCatalogDragController>( + static_cast<AssetCatalogTreeView &>(get_tree_view()), catalog_item_); } /* ---------------------------------------------------------------------- */ @@ -513,8 +516,9 @@ bool AssetCatalogDropController::has_droppable_asset(const wmDrag &drag, /* ---------------------------------------------------------------------- */ -AssetCatalogDragController::AssetCatalogDragController(AssetCatalogTreeItem &catalog_item) - : catalog_item_(catalog_item) +AssetCatalogDragController::AssetCatalogDragController(AssetCatalogTreeView &tree_view, + AssetCatalogTreeItem &catalog_item) + : ui::AbstractTreeViewItemDragController(tree_view), catalog_item_(catalog_item) { } @@ -531,6 +535,12 @@ void *AssetCatalogDragController::create_drag_data() const return drag_catalog; } +void AssetCatalogDragController::on_drag_start() +{ + AssetCatalogTreeView &tree_view_ = tree_view<AssetCatalogTreeView>(); + tree_view_.activate_catalog_by_id(catalog_item_.get_catalog_id()); +} + /* ---------------------------------------------------------------------- */ void AssetCatalogTreeViewAllItem::build_row(uiLayout &row) |