Extend asset shelf region with a region for the catalogs & options

The new region is empty, except of a dummy button.
This commit is contained in:
Julian Eisel 2023-01-17 16:24:03 +01:00
parent 8ddf492e7c
commit b3ee7ad2cc
15 changed files with 170 additions and 37 deletions

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 */
/** \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;