UI: Asset Shelf (Experimental Feature) #104831

Closed
Julian Eisel wants to merge 399 commits from asset-shelf into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
15 changed files with 170 additions and 37 deletions
Showing only changes of commit b3ee7ad2cc - Show all commits

View File

@ -3918,15 +3918,27 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain)
if (sl->spacetype == SPACE_VIEW3D) {
ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
&sl->regionbase;
ARegion *new_asset_shelf = do_versions_add_region_if_not_found(
regionbase,
RGN_TYPE_ASSET_SHELF,
"asset shelf for view3d (versioning)",
RGN_TYPE_UI);
if (new_asset_shelf != nullptr) {
new_asset_shelf->alignment = RGN_ALIGN_BOTTOM;
new_asset_shelf->flag |= RGN_FLAG_HIDDEN;
new_asset_shelf->flag = RGN_FLAG_HIDDEN | RGN_FLAG_DYNAMIC_SIZE;
{
ARegion *new_asset_shelf_footer = do_versions_add_region_if_not_found(
regionbase,
RGN_TYPE_ASSET_SHELF_FOOTER,
"asset shelf footer for view3d (versioning)",
RGN_TYPE_UI);
if (new_asset_shelf_footer != nullptr) {
new_asset_shelf_footer->alignment = RGN_ALIGN_BOTTOM;
new_asset_shelf_footer->flag |= RGN_FLAG_HIDDEN;
}
}
{
ARegion *new_asset_shelf = do_versions_add_region_if_not_found(
regionbase,
RGN_TYPE_ASSET_SHELF,
"asset shelf for view3d (versioning)",
RGN_TYPE_ASSET_SHELF_FOOTER);
if (new_asset_shelf != nullptr) {
new_asset_shelf->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV;
new_asset_shelf->flag |= RGN_FLAG_DYNAMIC_SIZE;
}
}
}
}

View File

@ -30,6 +30,7 @@ set(SRC
intern/asset_list.cc
intern/asset_mark_clear.cc
intern/asset_ops.cc
intern/asset_shelf.cc
intern/asset_temp_id_consumer.cc
intern/asset_type.cc
@ -42,6 +43,7 @@ set(SRC
ED_asset_list.h
ED_asset_list.hh
ED_asset_mark_clear.h
ED_asset_shelf.h
ED_asset_temp_id_consumer.h
ED_asset_type.h
intern/asset_library_reference.hh

View File

@ -0,0 +1,28 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup edasset
*/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
struct ARegionType;
struct bContext;
struct wmWindowManager;
void ED_region_asset_shelf_footer_init(struct wmWindowManager *wm, struct ARegion *region);
void ED_region_asset_shelf_footer(const struct bContext *C, struct ARegion *region);
void ED_region_asset_shelf_listen(const struct wmRegionListenerParams *params);
void ED_asset_shelf_footer_register(struct ARegionType *region_type,
const char *idname,
const int space_type);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,52 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
JulianEisel marked this conversation as resolved Outdated

Use updated copyright format

/* SPDX-FileCopyrightText: 2023 Blender Foundation
 *
 * SPDX-License-Identifier: GPL-2.0-or-later */
Use updated copyright format ``` /* SPDX-FileCopyrightText: 2023 Blender Foundation * * SPDX-License-Identifier: GPL-2.0-or-later */ ```
/** \file
* \ingroup edasset
*/
#include "BKE_screen.h"
#include "DNA_screen_types.h"
#include "ED_asset_list.h"
#include "ED_screen.h"
#include "UI_interface.h"
#include "UI_resources.h"
#include "ED_asset_shelf.h"
static void asset_shelf_draw(const bContext * /*C*/, Header *header)
{
uiLayout *layout = header->layout;
uiItemL(layout, "Fooo\n", ICON_ASSET_MANAGER);
}
void ED_region_asset_shelf_listen(const wmRegionListenerParams *params)
{
if (ED_assetlist_listen(params->notifier)) {
ED_region_tag_redraw_no_rebuild(params->region);
}
}
void ED_region_asset_shelf_footer_init(wmWindowManager * /*wm*/, ARegion *region)
{
ED_region_header_init(region);
}
void ED_region_asset_shelf_footer(const bContext *C, ARegion *region)
{
ED_region_header(C, region);
}
void ED_asset_shelf_footer_register(ARegionType *region_type,
const char *idname,
const int space_type)
{
HeaderType *ht = MEM_cnew<HeaderType>(__func__);
strcpy(ht->idname, idname);
ht->space_type = space_type;
ht->region_type = RGN_TYPE_ASSET_SHELF_FOOTER;
ht->draw = asset_shelf_draw;
BLI_addtail(&region_type->headertypes, ht);
}

View File

@ -122,8 +122,6 @@ void ED_region_header(const struct bContext *C, struct ARegion *region);
void ED_region_header_layout(const struct bContext *C, struct ARegion *region);
void ED_region_header_draw(const struct bContext *C, struct ARegion *region);
void ED_region_asset_shelf_listen(const struct wmRegionListenerParams *params);
void ED_region_cursor_set(struct wmWindow *win, struct ScrArea *area, struct ARegion *region);
/**
* Exported to all editors, uses fading default.
@ -703,6 +701,7 @@ enum {
ED_KEYMAP_FOOTER = (1 << 9),
ED_KEYMAP_GPENCIL = (1 << 10),
ED_KEYMAP_NAVBAR = (1 << 11),
ED_KEYMAP_ASSET_SHELF_FOOTER = (1 << 12),
};
/** #SCREEN_OT_space_context_cycle direction. */

View File

@ -2085,7 +2085,8 @@ static bool ui_but_drag_init(bContext *C,
RGN_TYPE_NAV_BAR,
RGN_TYPE_HEADER,
RGN_TYPE_TOOL_HEADER,
RGN_TYPE_FOOTER)) {
RGN_TYPE_FOOTER,
RGN_TYPE_ASSET_SHELF_FOOTER)) {
const int region_alignment = RGN_ALIGN_ENUM_FROM_MASK(data->region->alignment);
int lock_axis = -1;

View File

@ -153,7 +153,10 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
else if (g_theme_state.regionid == RGN_TYPE_CHANNELS) {
cp = ts->list;
}
else if (ELEM(g_theme_state.regionid, RGN_TYPE_HEADER, RGN_TYPE_FOOTER)) {
else if (ELEM(g_theme_state.regionid,
RGN_TYPE_HEADER,
RGN_TYPE_FOOTER,
RGN_TYPE_ASSET_SHELF_FOOTER)) {
cp = ts->header;
}
else if (g_theme_state.regionid == RGN_TYPE_NAV_BAR) {
@ -187,7 +190,10 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
else if (g_theme_state.regionid == RGN_TYPE_CHANNELS) {
cp = ts->list_text;
}
else if (ELEM(g_theme_state.regionid, RGN_TYPE_HEADER, RGN_TYPE_FOOTER)) {
else if (ELEM(g_theme_state.regionid,
RGN_TYPE_HEADER,
RGN_TYPE_FOOTER,
RGN_TYPE_ASSET_SHELF_FOOTER)) {
cp = ts->header_text;
}
else {
@ -201,7 +207,10 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
else if (g_theme_state.regionid == RGN_TYPE_CHANNELS) {
cp = ts->list_text_hi;
}
else if (ELEM(g_theme_state.regionid, RGN_TYPE_HEADER, RGN_TYPE_FOOTER)) {
else if (ELEM(g_theme_state.regionid,
RGN_TYPE_HEADER,
RGN_TYPE_FOOTER,
RGN_TYPE_ASSET_SHELF_FOOTER)) {
cp = ts->header_text_hi;
}
else {
@ -215,7 +224,10 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
else if (g_theme_state.regionid == RGN_TYPE_CHANNELS) {
cp = ts->list_title;
}
else if (ELEM(g_theme_state.regionid, RGN_TYPE_HEADER, RGN_TYPE_FOOTER)) {
else if (ELEM(g_theme_state.regionid,
RGN_TYPE_HEADER,
RGN_TYPE_FOOTER,
RGN_TYPE_ASSET_SHELF_FOOTER)) {
cp = ts->header_title;
}
else {

View File

@ -1264,7 +1264,8 @@ bool ED_region_is_overlap(int spacetype, int regiontype)
RGN_TYPE_TOOL_PROPS,
RGN_TYPE_FOOTER,
RGN_TYPE_TOOL_HEADER,
RGN_TYPE_ASSET_SHELF)) {
RGN_TYPE_ASSET_SHELF,
RGN_TYPE_ASSET_SHELF_FOOTER)) {
return true;
}
}
@ -1339,6 +1340,9 @@ static void region_rect_recursive(
else if (region->regiontype == RGN_TYPE_FOOTER) {
prefsizey = ED_area_footersize();
}
else if (region->regiontype == RGN_TYPE_ASSET_SHELF_FOOTER) {
prefsizey = ED_area_footersize();
}
else if (ED_area_is_global(area)) {
prefsizey = ED_region_global_size_y();
}
@ -1746,6 +1750,11 @@ static void ed_default_handlers(
wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Region Context Menu", 0, 0);
WM_event_add_keymap_handler(&region->handlers, keymap);
}
if (flag & ED_KEYMAP_ASSET_SHELF_FOOTER) {
/* standard keymap for Navigation bar regions */
wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Region Context Menu", 0, 0);
WM_event_add_keymap_handler(&region->handlers, keymap);
}
/* Keep last because of LMB/RMB handling, see: T57527. */
if (flag & ED_KEYMAP_GPENCIL) {
@ -3425,14 +3434,6 @@ void ED_region_header_init(ARegion *region)
{
UI_view2d_region_reinit(&region->v2d, V2D_COMMONVIEW_HEADER, region->winx, region->winy);
}
void ED_region_asset_shelf_listen(const wmRegionListenerParams *params)
{
if (ED_assetlist_listen(params->notifier)) {
ED_region_tag_redraw_no_rebuild(params->region);
}
}
int ED_area_headersize(void)
{
/* Accommodate widget and padding. */

View File

@ -1436,7 +1436,8 @@ static bScreen *screen_state_to_nonnormal(bContext *C,
RGN_TYPE_TOOLS,
RGN_TYPE_NAV_BAR,
RGN_TYPE_EXECUTE,
RGN_TYPE_ASSET_SHELF)) {
RGN_TYPE_ASSET_SHELF,
RGN_TYPE_ASSET_SHELF_FOOTER)) {
region->flag |= RGN_FLAG_HIDDEN;
}
}

View File

@ -2625,15 +2625,19 @@ static int area_max_regionsize(ScrArea *area, ARegion *scale_region, AZEdge edge
dist -= region->winx;
}
else if (scale_region->alignment == RGN_ALIGN_TOP &&
(region->alignment == RGN_ALIGN_BOTTOM ||
ELEM(
region->regiontype, RGN_TYPE_HEADER, RGN_TYPE_TOOL_HEADER, RGN_TYPE_FOOTER))) {
(region->alignment == RGN_ALIGN_BOTTOM || ELEM(region->regiontype,
RGN_TYPE_HEADER,
RGN_TYPE_TOOL_HEADER,
RGN_TYPE_FOOTER,
RGN_TYPE_ASSET_SHELF_FOOTER))) {
dist -= region->winy;
}
else if (scale_region->alignment == RGN_ALIGN_BOTTOM &&
(region->alignment == RGN_ALIGN_TOP ||
ELEM(
region->regiontype, RGN_TYPE_HEADER, RGN_TYPE_TOOL_HEADER, RGN_TYPE_FOOTER))) {
(region->alignment == RGN_ALIGN_TOP || ELEM(region->regiontype,
RGN_TYPE_HEADER,
RGN_TYPE_TOOL_HEADER,
RGN_TYPE_FOOTER,
RGN_TYPE_ASSET_SHELF_FOOTER))) {
dist -= region->winy;
}
}

View File

@ -2,6 +2,7 @@
set(INC
../include
../asset
../../blenfont
../../blenkernel
../../blenlib

View File

@ -47,6 +47,7 @@
#include "BKE_viewer_path.h"
#include "BKE_workspace.h"
#include "ED_asset_shelf.h"
#include "ED_object.h"
#include "ED_outliner.h"
#include "ED_render.h"
@ -289,13 +290,20 @@ static SpaceLink *view3d_create(const ScrArea * /*area*/, const Scene *scene)
region->alignment = RGN_ALIGN_RIGHT;
region->flag = RGN_FLAG_HIDDEN;
/* asset shelf footer */
region = MEM_cnew<ARegion>("asset shelf footer for view3d");
BLI_addtail(&v3d->regionbase, region);
region->regiontype = RGN_TYPE_ASSET_SHELF_FOOTER;
region->alignment = RGN_ALIGN_BOTTOM;
region->flag = RGN_FLAG_HIDDEN;
/* asset shelf */
region = MEM_cnew<ARegion>("asset shelf for view3d");
BLI_addtail(&v3d->regionbase, region);
region->regiontype = RGN_TYPE_ASSET_SHELF;
region->alignment = RGN_ALIGN_BOTTOM;
region->flag = RGN_FLAG_HIDDEN;
region->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV;
region->flag |= RGN_FLAG_DYNAMIC_SIZE;
/* main region */
region = MEM_cnew<ARegion>("main region for view3d");
@ -2154,6 +2162,15 @@ void ED_spacetype_view3d()
art->init = view3d_header_region_init;
art->draw = ED_region_header;
BLI_addhead(&st->regiontypes, art);
/* regions: asset shelf footer */
art = MEM_cnew<ARegionType>("spacetype view3d asset shelf footer region");
art->regionid = RGN_TYPE_ASSET_SHELF_FOOTER;
art->prefsizey = HEADERY;
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_FOOTER;
art->init = ED_region_asset_shelf_footer_init;
art->draw = ED_region_asset_shelf_footer;
BLI_addhead(&st->regiontypes, art);
ED_asset_shelf_footer_register(art, "VIEW3D_HT_asset_shelf", SPACE_VIEW3D);
/* regions: hud */
art = ED_area_type_hud(st->spaceid);

View File

@ -658,8 +658,9 @@ typedef enum eRegion_Type {
* context (surface, mirror view). Does not represent any real region. */
RGN_TYPE_XR = 13,
RGN_TYPE_ASSET_SHELF = 14,
RGN_TYPE_ASSET_SHELF_FOOTER = 15,
#define RGN_TYPE_NUM (RGN_TYPE_ASSET_SHELF + 1)
#define RGN_TYPE_NUM (RGN_TYPE_ASSET_SHELF_FOOTER + 1)
} eRegion_Type;
/* use for function args */
@ -670,8 +671,8 @@ typedef enum eRegion_Type {
/* Check for any kind of header region. */
#define RGN_TYPE_IS_HEADER_ANY(regiontype) \
(((1 << (regiontype)) & \
((1 << RGN_TYPE_HEADER) | 1 << (RGN_TYPE_TOOL_HEADER) | (1 << RGN_TYPE_FOOTER))) != 0)
(((1 << (regiontype)) & ((1 << RGN_TYPE_HEADER) | 1 << (RGN_TYPE_TOOL_HEADER) | \
(1 << RGN_TYPE_FOOTER) | (1 << RGN_TYPE_ASSET_SHELF_FOOTER))) != 0)
/** #ARegion.alignment */
enum {

View File

@ -27,6 +27,7 @@ const EnumPropertyItem rna_enum_region_type_items[] = {
{RGN_TYPE_TOOLS, "TOOLS", 0, "Tools", ""},
{RGN_TYPE_TOOL_PROPS, "TOOL_PROPS", 0, "Tool Properties", ""},
{RGN_TYPE_ASSET_SHELF, "ASSET_SHELF", 0, "Asset Shelf", ""},
{RGN_TYPE_ASSET_SHELF_FOOTER, "ASSET_SHELF_FOOTER", 0, "Asset Shelf Footer", ""},
{RGN_TYPE_PREVIEW, "PREVIEW", 0, "Preview", ""},
{RGN_TYPE_HUD, "HUD", 0, "Floating Region", ""},
{RGN_TYPE_NAV_BAR, "NAVIGATION_BAR", 0, "Navigation Bar", ""},

View File

@ -5982,6 +5982,7 @@ void WM_window_cursor_keymap_status_refresh(bContext *C, wmWindow *win)
RGN_TYPE_HEADER,
RGN_TYPE_TOOL_HEADER,
RGN_TYPE_FOOTER,
RGN_TYPE_ASSET_SHELF_FOOTER,
RGN_TYPE_TEMPORARY,
RGN_TYPE_HUD)) {
return;