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.
13 changed files with 64 additions and 66 deletions
Showing only changes of commit 522aecd7b5 - Show all commits

View File

@ -311,21 +311,21 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain)
ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
&sl->regionbase;
if (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))
{
new_asset_shelf_footer->alignment = RGN_ALIGN_BOTTOM;
}
if (ARegion *new_asset_shelf = do_versions_add_region_if_not_found(
if (ARegion *new_shelf_region = do_versions_add_region_if_not_found(
regionbase,
RGN_TYPE_ASSET_SHELF,
"asset shelf for view3d (versioning)",
RGN_TYPE_ASSET_SHELF_FOOTER))
RGN_TYPE_UI))
{
new_asset_shelf->alignment = RGN_ALIGN_BOTTOM;
new_shelf_region->alignment = RGN_ALIGN_BOTTOM;
}
if (ARegion *new_settings_region = do_versions_add_region_if_not_found(
regionbase,
RGN_TYPE_ASSET_SHELF_SETTINGS,
"asset shelf settings region for view3d (versioning)",
RGN_TYPE_ASSET_SHELF))
{
new_settings_region->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV;
}
}
}

View File

@ -24,18 +24,16 @@ struct RegionPollParams;
*
* Naming conventions:
* - #ED_asset_shelf_regions_xxx(): Applies to both regions (#RGN_TYPE_ASSET_SHELF and
* #RGN_TYPE_ASSET_SHELF_FOOTER).
* #RGN_TYPE_ASSET_SHELF_SETTINGS).
* - #ED_asset_shelf_region_xxx(): Applies to the main shelf region (#RGN_TYPE_ASSET_SHELF).
* - #ED_asset_shelf_footer_region_xxx(): Applies to the shelf footer region
* (#RGN_TYPE_ASSET_SHELF_FOOTER).
* - #ED_asset_shelf_footer_xxx(): Applies to the shelf footer region-type
* (#RGN_TYPE_ASSET_SHELF_FOOTER).
* - #ED_asset_shelf_settings_region_xxx(): Applies to the shelf settings region
* (#RGN_TYPE_ASSET_SHELF_SETTINGS).
*
* \{ */
bool ED_asset_shelf_regions_poll(const struct RegionPollParams *params);
/** Only needed for #RGN_TYPE_ASSET_SHELF (not #RGN_TYPE_ASSET_SHELF_FOOTER). */
/** Only needed for #RGN_TYPE_ASSET_SHELF (not #RGN_TYPE_ASSET_SHELF_SETTINGS). */
void ED_asset_shelf_region_init(struct wmWindowManager *wm, struct ARegion *region);
int ED_asset_shelf_region_snap(const struct ARegion *region, int size, int axis);
void ED_asset_shelf_region_listen(const struct wmRegionListenerParams *params);
@ -45,11 +43,11 @@ void ED_asset_shelf_region_layout(const bContext *C,
void ED_asset_shelf_region_draw(const bContext *C, struct ARegion *region);
int ED_asset_shelf_region_prefsizey(void);
void ED_asset_shelf_footer_region_init(struct wmWindowManager *wm, struct ARegion *region);
void ED_asset_shelf_footer_region(const struct bContext *C, struct ARegion *region);
void ED_asset_shelf_footer_region_listen(const struct wmRegionListenerParams *params);
int ED_asset_shelf_footer_size(void);
void ED_asset_shelf_footer_register(struct ARegionType *region_type, const int space_type);
void ED_asset_shelf_settings_region_init(struct wmWindowManager *wm, struct ARegion *region);
void ED_asset_shelf_settings_region(const struct bContext *C, struct ARegion *region);
void ED_asset_shelf_settings_region_listen(const struct wmRegionListenerParams *params);
int ED_asset_shelf_settings_region_size(void);
void ED_asset_shelf_settings_regiontype_register(struct ARegionType *region_type, const int space_type);
/** \} */

View File

@ -384,22 +384,22 @@ void ED_asset_shelf_region_draw(const bContext *C, ARegion *region)
UI_view2d_scrollers_draw(&region->v2d, nullptr);
}
void ED_asset_shelf_footer_region_listen(const wmRegionListenerParams *params)
void ED_asset_shelf_settings_region_listen(const wmRegionListenerParams *params)
{
asset_shelf_region_listen(params);
}
void ED_asset_shelf_footer_region_init(wmWindowManager * /*wm*/, ARegion *region)
void ED_asset_shelf_settings_region_init(wmWindowManager * /*wm*/, ARegion *region)
{
ED_region_header_init(region);
}
void ED_asset_shelf_footer_region(const bContext *C, ARegion *region)
void ED_asset_shelf_settings_region(const bContext *C, ARegion *region)
{
ED_region_header(C, region);
}
int ED_asset_shelf_footer_size()
int ED_asset_shelf_settings_region_size()
{
/* A little smaller than a regular header. */
return ED_area_headersize() * 0.85f;
@ -513,7 +513,7 @@ static uiBut *add_tab_button(uiBlock &block, StringRefNull name)
0,
"Enable catalog, making contained assets visible in the asset shelf");
UI_but_drawflag_enable(but, UI_BUT_ALIGN_TOP);
UI_but_drawflag_enable(but, UI_BUT_ALIGN_DOWN);
UI_but_flag_disable(but, UI_BUT_UNDO);
return but;
@ -555,12 +555,12 @@ static void add_catalog_toggle_buttons(AssetShelfSettings &shelf_settings, uiLay
/** \} */
/* -------------------------------------------------------------------- */
/** \name Asset Shelf Footer
/** \name Asset Shelf Settings Region
*
* Implemented as HeaderType for #RGN_TYPE_ASSET_SHELF_FOOTER.
* Implemented as HeaderType for #RGN_TYPE_ASSET_SHELF_SETTINGS.
* \{ */
static void asset_shelf_footer_draw(const bContext *C, Header *header)
static void asset_shelf_settings_draw(const bContext *C, Header *header)
{
uiLayout *layout = header->layout;
uiBlock *block = uiLayoutGetBlock(layout);
@ -587,13 +587,13 @@ static void asset_shelf_footer_draw(const bContext *C, Header *header)
uiItemPopoverPanel(layout, C, "ASSETSHELF_PT_display", "", ICON_IMGDISPLAY);
}
void ED_asset_shelf_footer_register(ARegionType *region_type, const int space_type)
void ED_asset_shelf_settings_regiontype_register(ARegionType *region_type, const int space_type)
{
HeaderType *ht = MEM_cnew<HeaderType>(__func__);
STRNCPY(ht->idname, "ASSETSHELF_HT_footer");
STRNCPY(ht->idname, "ASSETSHELF_HT_settings");
ht->space_type = space_type;
ht->region_type = RGN_TYPE_ASSET_SHELF_FOOTER;
ht->draw = asset_shelf_footer_draw;
ht->region_type = RGN_TYPE_ASSET_SHELF_SETTINGS;
ht->draw = asset_shelf_settings_draw;
ht->poll = [](const bContext *C, HeaderType *) {
return asset_shelf_space_poll(C, CTX_wm_space_data(C));
};

View File

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

View File

@ -166,7 +166,7 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
else if (g_theme_state.regionid == RGN_TYPE_ASSET_SHELF) {
cp = ts->asset_shelf.back;
}
else if (g_theme_state.regionid == RGN_TYPE_ASSET_SHELF_FOOTER) {
else if (g_theme_state.regionid == RGN_TYPE_ASSET_SHELF_SETTINGS) {
cp = ts->asset_shelf.header_back;
}
else {
@ -197,7 +197,7 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
else if (ELEM(g_theme_state.regionid,
RGN_TYPE_HEADER,
RGN_TYPE_FOOTER,
RGN_TYPE_ASSET_SHELF_FOOTER))
RGN_TYPE_ASSET_SHELF_SETTINGS))
{
cp = ts->header_text;
}
@ -215,7 +215,7 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
else if (ELEM(g_theme_state.regionid,
RGN_TYPE_HEADER,
RGN_TYPE_FOOTER,
RGN_TYPE_ASSET_SHELF_FOOTER))
RGN_TYPE_ASSET_SHELF_SETTINGS))
{
cp = ts->header_text_hi;
}
@ -233,7 +233,7 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
else if (ELEM(g_theme_state.regionid,
RGN_TYPE_HEADER,
RGN_TYPE_FOOTER,
RGN_TYPE_ASSET_SHELF_FOOTER))
RGN_TYPE_ASSET_SHELF_SETTINGS))
{
cp = ts->header_title;
}

View File

@ -1246,7 +1246,7 @@ bool ED_region_is_overlap(int spacetype, int regiontype)
RGN_TYPE_FOOTER,
RGN_TYPE_TOOL_HEADER,
RGN_TYPE_ASSET_SHELF,
RGN_TYPE_ASSET_SHELF_FOOTER))
RGN_TYPE_ASSET_SHELF_SETTINGS))
{
return true;
}
@ -1326,8 +1326,8 @@ static void region_rect_recursive(
prefsizey = region->sizey > 1 ? (UI_SCALE_FAC * (region->sizey + 0.5f)) :
ED_asset_shelf_region_prefsizey();
}
else if (region->regiontype == RGN_TYPE_ASSET_SHELF_FOOTER) {
prefsizey = ED_asset_shelf_footer_size();
else if (region->regiontype == RGN_TYPE_ASSET_SHELF_SETTINGS) {
prefsizey = ED_asset_shelf_settings_region_size();
}
else if (ED_area_is_global(area)) {
prefsizey = ED_region_global_size_y();

View File

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

View File

@ -2678,7 +2678,7 @@ static int area_max_regionsize(ScrArea *area, ARegion *scale_region, AZEdge edge
RGN_TYPE_HEADER,
RGN_TYPE_TOOL_HEADER,
RGN_TYPE_FOOTER,
RGN_TYPE_ASSET_SHELF_FOOTER)))
RGN_TYPE_ASSET_SHELF_SETTINGS)))
{
dist -= region->winy;
}
@ -2687,7 +2687,7 @@ static int area_max_regionsize(ScrArea *area, ARegion *scale_region, AZEdge edge
RGN_TYPE_HEADER,
RGN_TYPE_TOOL_HEADER,
RGN_TYPE_FOOTER,
RGN_TYPE_ASSET_SHELF_FOOTER)))
RGN_TYPE_ASSET_SHELF_SETTINGS)))
{
dist -= region->winy;
}

View File

@ -296,12 +296,6 @@ 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;
/* asset shelf */
region = MEM_cnew<ARegion>("asset shelf for view3d");
@ -309,6 +303,12 @@ static SpaceLink *view3d_create(const ScrArea * /*area*/, const Scene *scene)
region->regiontype = RGN_TYPE_ASSET_SHELF;
region->alignment = RGN_ALIGN_BOTTOM;
/* asset shelf settings region */
region = MEM_cnew<ARegion>("asset shelf settings region for view3d");
BLI_addtail(&v3d->regionbase, region);
region->regiontype = RGN_TYPE_ASSET_SHELF_SETTINGS;
region->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV;
/* main region */
region = MEM_cnew<ARegion>("main region for view3d");
@ -2284,17 +2284,17 @@ void ED_spacetype_view3d()
art->draw = ED_asset_shelf_region_draw;
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;
/* regions: asset shelf settings */
art = MEM_cnew<ARegionType>("spacetype view3d asset shelf settings region");
art->regionid = RGN_TYPE_ASSET_SHELF_SETTINGS;
JulianEisel marked this conversation as resolved Outdated

It's unclear to me why this exists instead of using RGN_TYPE_TEMPORARY, or really just a regular popover like we have for e.g. shading and overlay settings in the 3D viewport.

Is it because you want list scrolling to be persistent or something like that?

It's a bit of a strange precedent to have a region specifically for a popover.

It's unclear to me why this exists instead of using `RGN_TYPE_TEMPORARY`, or really just a regular popover like we have for e.g. shading and overlay settings in the 3D viewport. Is it because you want list scrolling to be persistent or something like that? It's a bit of a strange precedent to have a region specifically for a popover.

This isn't for the popover, it's for the part of the shelf with the tabs, catalog selector, search button etc. This needs a different kind of root layout, and needs to be independently scrollable. That's why it's a separate region.

This isn't for the popover, it's for the part of the shelf with the tabs, catalog selector, search button etc. This needs a different kind of root layout, and needs to be independently scrollable. That's why it's a separate region.

Can you call it asset shelf header then? Since we don't normally call the things in this region "settings" in Blender.

Can you call it asset shelf header then? Since we don't normally call the things in this region "settings" in Blender.

I used to call it footer when it was still at the bottom, but thought it makes sense to make it position independent. But fair enough if we can avoid confusion this way.

I used to call it footer when it was still at the bottom, but thought it makes sense to make it position independent. But fair enough if we can avoid confusion this way.
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_ASSET_SHELF | ED_KEYMAP_VIEW2D | ED_KEYMAP_FOOTER;
art->init = ED_asset_shelf_footer_region_init;
art->init = ED_asset_shelf_settings_region_init;
art->poll = ED_asset_shelf_regions_poll;
art->draw = ED_asset_shelf_footer_region;
art->listener = ED_asset_shelf_footer_region_listen;
art->draw = ED_asset_shelf_settings_region;
art->listener = ED_asset_shelf_settings_region_listen;
art->context = view3d_asset_shelf_context;
BLI_addhead(&st->regiontypes, art);
ED_asset_shelf_footer_register(art, SPACE_VIEW3D);
ED_asset_shelf_settings_regiontype_register(art, SPACE_VIEW3D);
/* regions: hud */
art = ED_area_type_hud(st->spaceid);

View File

@ -665,9 +665,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,
RGN_TYPE_ASSET_SHELF_SETTINGS = 15,
#define RGN_TYPE_NUM (RGN_TYPE_ASSET_SHELF_FOOTER + 1)
#define RGN_TYPE_NUM (RGN_TYPE_ASSET_SHELF_SETTINGS + 1)
} eRegion_Type;
/* use for function args */
@ -679,7 +679,7 @@ 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) | (1 << RGN_TYPE_ASSET_SHELF_FOOTER))) != 0)
(1 << RGN_TYPE_FOOTER) | (1 << RGN_TYPE_ASSET_SHELF_SETTINGS))) != 0)
/** #ARegion.alignment */
enum {

View File

@ -29,7 +29,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_ASSET_SHELF_SETTINGS, "ASSET_SHELF_SETTINGS", 0, "Asset Shelf Settings", ""},
{RGN_TYPE_PREVIEW, "PREVIEW", 0, "Preview", ""},
{RGN_TYPE_HUD, "HUD", 0, "Floating Region", ""},
{RGN_TYPE_NAV_BAR, "NAVIGATION_BAR", 0, "Navigation Bar", ""},

View File

@ -868,7 +868,7 @@ static void rna_Space_show_regions_asset_shelf_set(PointerRNA *ptr, bool value)
{
rna_Space_bool_from_region_flag_set_by_type(ptr, RGN_TYPE_ASSET_SHELF, RGN_FLAG_HIDDEN, !value);
rna_Space_bool_from_region_flag_set_by_type(
ptr, RGN_TYPE_ASSET_SHELF_FOOTER, RGN_FLAG_HIDDEN, !value);
ptr, RGN_TYPE_ASSET_SHELF_SETTINGS, RGN_FLAG_HIDDEN, !value);
}
static void rna_Space_show_regions_asset_shelf_update(bContext *C, PointerRNA *ptr)
{
@ -3486,8 +3486,8 @@ static void rna_def_space_generic_show_region_toggles(StructRNA *srna, int regio
region_type_mask &= ~(1 << RGN_TYPE_HUD);
DEF_SHOW_REGION_PROPERTY(show_region_hud, "Adjust Last Operation", "");
}
if (region_type_mask & ((1 << RGN_TYPE_ASSET_SHELF) | (1 << RGN_TYPE_ASSET_SHELF_FOOTER))) {
region_type_mask &= ~((1 << RGN_TYPE_ASSET_SHELF) | (1 << RGN_TYPE_ASSET_SHELF_FOOTER));
if (region_type_mask & ((1 << RGN_TYPE_ASSET_SHELF) | (1 << RGN_TYPE_ASSET_SHELF_SETTINGS))) {
region_type_mask &= ~((1 << RGN_TYPE_ASSET_SHELF) | (1 << RGN_TYPE_ASSET_SHELF_SETTINGS));
DEF_SHOW_REGION_PROPERTY(show_regions_asset_shelf, "Asset Shelf", "");
}
BLI_assert(region_type_mask == 0);

View File

@ -6151,7 +6151,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_ASSET_SHELF_SETTINGS,
RGN_TYPE_TEMPORARY,
RGN_TYPE_HUD))
{