Commit: 3df2e4e888648166905737658d89fcfeff60dcf4 Author: Julian Eisel Date: Thu Feb 3 15:30:55 2022 +0100 Branches: asset-browser-grid-view https://developer.blender.org/rB3df2e4e888648166905737658d89fcfeff60dcf4
Display a basic list of assets, set up scrolling and notifier listening * Display a non-interactive list of assets, updates as assets get loaded. * Notifier listening happens via the view, so the grid-view supports listening to notifiers. This is what triggers regular redraws as assets get loaded. * Scrolling may need more fine tuning, so that scroll-bars are hidden if they don't apply (e.g. don't show horizontal scroll-bar for the vertically expanding grid-view layout). =================================================================== A source/blender/editors/include/UI_grid_view.hh M source/blender/editors/include/UI_interface.h M source/blender/editors/include/UI_interface.hh M source/blender/editors/interface/CMakeLists.txt A source/blender/editors/interface/grid_view.cc M source/blender/editors/interface/interface_view.cc M source/blender/editors/screen/area.c M source/blender/editors/space_assets/asset_browser_draw.cc M source/blender/editors/space_assets/asset_view.cc M source/blender/editors/space_assets/asset_view.hh M source/blender/editors/space_assets/space_assets.cc M source/blender/editors/util/CMakeLists.txt =================================================================== diff --git a/source/blender/editors/space_assets/asset_view.hh b/source/blender/editors/include/UI_grid_view.hh similarity index 56% copy from source/blender/editors/space_assets/asset_view.hh copy to source/blender/editors/include/UI_grid_view.hh index 80ae99f2884..945c9444db7 100644 --- a/source/blender/editors/space_assets/asset_view.hh +++ b/source/blender/editors/include/UI_grid_view.hh @@ -15,28 +15,35 @@ */ /** \file - * \ingroup spassets + * \ingroup editorui + * + * API for simple creation of grid UIs, supporting typically needed features. + * https://wiki.blender.org/wiki/Source/Interface/Views/Grid_Views */ #pragma once -struct bContext; -struct AssetLibraryReference; -struct uiLayout; - -namespace blender::ed::asset_browser { +struct wmNotifier; -class AssetGridView { - AssetLibraryReference asset_library_ref_; +namespace blender::ui { +class AbstractGridViewItem { public: - AssetGridView(const AssetLibraryReference &); + virtual ~AbstractGridViewItem() = default; - void build(); + protected: + AbstractGridViewItem() = default; }; -void asset_view_create_in_layout(const bContext &C, - const AssetLibraryReference &asset_library_ref, - uiLayout &layout); +class AbstractGridView { + public: + virtual ~AbstractGridView() = default; + + /** Listen to a notifier, returning true if a redraw is needed. */ + virtual bool listen(const wmNotifier &) const; + + // protected: + virtual void build() = 0; +}; -} // namespace blender::ed::asset_browser +} // namespace blender::ui diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index ae4c2ff16fd..cdc7eb25b4c 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -80,6 +80,7 @@ struct wmKeyMapItem; struct wmMsgBus; struct wmOperator; struct wmOperatorType; +struct wmRegionListenerParams; struct wmWindow; typedef struct uiBlock uiBlock; @@ -91,6 +92,8 @@ typedef struct uiPopupBlockHandle uiPopupBlockHandle; typedef struct uiTreeViewHandle uiTreeViewHandle; /* C handle for C++ #ui::AbstractTreeViewItem type. */ typedef struct uiTreeViewItemHandle uiTreeViewItemHandle; +/* C handle for C++ #ui::AbstractGridView type. */ +typedef struct uiGridViewHandle uiGridViewHandle; /* Defines */ @@ -3163,6 +3166,9 @@ void UI_interface_tag_script_reload(void); /* Support click-drag motion which presses the button and closes a popover (like a menu). */ #define USE_UI_POPOVER_ONCE +void UI_block_views_listen(const uiBlock *block, + const struct wmRegionListenerParams *listener_params); + bool UI_tree_view_item_is_active(const uiTreeViewItemHandle *item); bool UI_tree_view_item_matches(const uiTreeViewItemHandle *a, const uiTreeViewItemHandle *b); /** @@ -3201,6 +3207,11 @@ uiTreeViewItemHandle *UI_block_tree_view_find_item_at(const struct ARegion *regi const int xy[2]) ATTR_NONNULL(1, 2); uiTreeViewItemHandle *UI_block_tree_view_find_active_item(const struct ARegion *region); +/** + * Listen to \a notifier, returning true if the region should redraw. + */ +bool UI_grid_view_listen_should_redraw(const uiGridViewHandle *view, const wmNotifier *notifier); + #ifdef __cplusplus } #endif diff --git a/source/blender/editors/include/UI_interface.hh b/source/blender/editors/include/UI_interface.hh index 8d1ca54b7a1..37858adafae 100644 --- a/source/blender/editors/include/UI_interface.hh +++ b/source/blender/editors/include/UI_interface.hh @@ -37,6 +37,7 @@ struct uiSearchItems; namespace blender::ui { +class AbstractGridView; class AbstractTreeView; /** @@ -69,6 +70,10 @@ void attribute_search_add_items( /** * Override this for all available tree types. */ +blender::ui::AbstractGridView *UI_block_add_view( + uiBlock &block, + blender::StringRef idname, + std::unique_ptr<blender::ui::AbstractGridView> tree_view); blender::ui::AbstractTreeView *UI_block_add_view( uiBlock &block, blender::StringRef idname, diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt index 95c9f7cc8b2..db7d53e2e0d 100644 --- a/source/blender/editors/interface/CMakeLists.txt +++ b/source/blender/editors/interface/CMakeLists.txt @@ -38,6 +38,7 @@ set(INC ) set(SRC + grid_view.cc interface.c interface_align.c interface_anim.c diff --git a/source/blender/editors/space_assets/asset_view.hh b/source/blender/editors/interface/grid_view.cc similarity index 51% copy from source/blender/editors/space_assets/asset_view.hh copy to source/blender/editors/interface/grid_view.cc index 80ae99f2884..5315bd1447e 100644 --- a/source/blender/editors/space_assets/asset_view.hh +++ b/source/blender/editors/interface/grid_view.cc @@ -15,28 +15,34 @@ */ /** \file - * \ingroup spassets + * \ingroup edinterface */ -#pragma once +#include "WM_types.h" -struct bContext; -struct AssetLibraryReference; -struct uiLayout; +#include "UI_interface.h" -namespace blender::ed::asset_browser { +#include "UI_grid_view.hh" -class AssetGridView { - AssetLibraryReference asset_library_ref_; +namespace blender::ui { - public: - AssetGridView(const AssetLibraryReference &); +/* ---------------------------------------------------------------------- */ - void build(); -}; +bool AbstractGridView::listen(const wmNotifier &) const +{ + /* Nothing by default. */ + return false; +} -void asset_view_create_in_layout(const bContext &C, - const AssetLibraryReference &asset_library_ref, - uiLayout &layout); +} // namespace blender::ui -} // namespace blender::ed::asset_browser +using namespace blender::ui; + +/* ---------------------------------------------------------------------- */ + +bool UI_grid_view_listen_should_redraw(const uiGridViewHandle *view_handle, + const wmNotifier *notifier) +{ + const AbstractGridView &view = *reinterpret_cast<const AbstractGridView *>(view_handle); + return view.listen(*notifier); +} diff --git a/source/blender/editors/interface/interface_view.cc b/source/blender/editors/interface/interface_view.cc index 81b24c75020..96b9d974ae7 100644 --- a/source/blender/editors/interface/interface_view.cc +++ b/source/blender/editors/interface/interface_view.cc @@ -24,15 +24,22 @@ */ #include <memory> +#include <type_traits> #include <variant> #include "DNA_screen_types.h" +#include "BKE_screen.h" + #include "BLI_listbase.h" +#include "ED_screen.h" + #include "interface_intern.h" #include "UI_interface.hh" + +#include "UI_grid_view.hh" #include "UI_tree_view.hh" using namespace blender; @@ -44,10 +51,11 @@ using namespace blender::ui; */ struct ViewLink : public Link { using TreeViewPtr = std::unique_ptr<AbstractTreeView>; + using GridViewPtr = std::unique_ptr<AbstractGridView>; std::string idname; /* NOTE: Can't use std::get() on this until minimum macOS deployment target is 10.14. */ - std::variant<TreeViewPtr> view; + std::variant<TreeViewPtr, GridViewPtr> view; }; template<class T> T *get_view_from_link(ViewLink &link) @@ -56,17 +64,32 @@ template<class T> T *get_view_from_link(ViewLink &link) return t_uptr ? t_uptr->get() : nullptr; } -AbstractTreeView *UI_block_add_view(uiBlock &block, - StringRef idname, - std::unique_ptr<AbstractTreeView> tree_view) +template<class T> +static T *ui_block_add_view_impl(uiBlock &block, StringRef idname, std::unique_ptr<T> view) { + static_assert(std::is_same_v<T, AbstractTreeView> || std::is_same_v<T, AbstractGridView>, + "Unsupported view type"); ViewLink *view_link = MEM_new<ViewLink>(__func__); BLI_addtail(&block.views, view_link); - view_link->view = std::move(tree_view); + view_link->view = std::move(view); view_link->idname = idname; - return get_view_from_link<AbstractTreeView>(*view_link); + return get_view_from_link<T>(*view_link); +} + +AbstractGridView *UI_block_add_view(uiBlock &block, + StringRef idname, + std::unique_ptr<AbstractGridView> tree_view) +{ + return ui_block_add_view_impl<AbstractGridView>(block, idname, std::move(tree_view)); +} + +AbstractTreeView *UI_block_add_view(uiBlock &block, + StringRef idname, + std::unique_ptr<AbstractTreeView> tree_view) +{ + return ui_block_add_view_impl<AbstractTreeView>(block, idname, std::move(tree_view)); } void ui_block_free_views(uiBlock *block) @@ -76,6 +99,19 @@ void ui_block_free_views(uiBlock *block) } } +void UI_block_views_listen(const uiBlock *block, const wmRegionListenerParams *listener_params) +{ + LISTBASE_FOREACH (ViewLink *, view_link, &block->views) { + /* TODO only grid views, should this be supported by all views? */ + if (AbstractGridView *grid_view = get_view_from_link<AbstractGridView>(*view_link)) { + if (UI_grid_view_listen_should_redraw(reinterpret_cast<uiGridViewHandle *>(grid_view), + listener_params->notifier)) { + ED_region_tag_redraw(listener_params->region); + } + } + } +} + uiTreeViewItemHandle *UI_block_tree_view_find_item_at(const ARegion *region, const int xy[2]) { uiButTreeRow *tree_row_but = (uiButTreeRow *)ui_tree_row_find_mouse_over(region, xy); diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index c6834c84794..b98ea274d07 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -161,6 +161,10 @@ void ED_region_do_listen(wmRegionListenerParams *params) region->type->listener(params); } + LISTBASE_FOREACH (uiBlock *, block, ®ion->uiblocks) { + UI_block_views_listen(block, params); + } + LISTBASE_FOREACH (uiList *, list, ®ion->ui_lists) { if (list->type && list->type->listener) { list->type->listener(list, par @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
