Asset Shelf: Add asset shelf region to image editor

As part of the brush assets project, the image editor needs an asset
shelf to display brush assets for texture paint mode. This commit adds
the unused asset shelf region, similar to the 3D viewport's region that
is currently just used for the pose library. For now, users will just
see an "Asset Shelf" toggle in the view menu.

Pull Request: https://projects.blender.org/blender/blender/pulls/121034
This commit is contained in:
Hans Goudey 2024-04-24 17:55:37 +02:00 committed by Hans Goudey
parent 13ae2e613e
commit c60a1006e5
10 changed files with 105 additions and 3 deletions

@ -717,6 +717,10 @@ const bTheme U_theme_default = {
.back = RGBA(0x3d3d3dff),
.sub_back = RGBA(0x0000001f),
},
.asset_shelf = {
.header_back = RGBA(0x1d1d1dff),
.back = RGBA(0x303030ff),
},
.grid = RGBA(0x303030ff),
.wire_edit = RGBA(0xc0c0c0ff),
.vertex_select = RGBA(0xff8500ff),

@ -75,6 +75,7 @@ class IMAGE_MT_view(Menu):
layout.prop(sima, "show_region_toolbar")
layout.prop(sima, "show_region_ui")
layout.prop(sima, "show_region_tool_header")
layout.prop(sima, "show_region_asset_shelf")
layout.prop(sima, "show_region_hud")
layout.separator()

@ -29,7 +29,7 @@ extern "C" {
/* Blender file format version. */
#define BLENDER_FILE_VERSION BLENDER_VERSION
#define BLENDER_FILE_SUBVERSION 20
#define BLENDER_FILE_SUBVERSION 21
/* Minimum Blender version that supports reading file written with the current
* version. Older Blender versions will test this and cancel loading the file, showing a warning to

@ -2061,6 +2061,34 @@ static void versioning_node_hue_correct_set_wrappng(bNodeTree *ntree)
}
}
static void add_image_editor_asset_shelf(Main &bmain)
{
LISTBASE_FOREACH (bScreen *, screen, &bmain.screens) {
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
if (sl->spacetype != SPACE_IMAGE) {
continue;
}
ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase : &sl->regionbase;
if (ARegion *new_shelf_region = do_versions_add_region_if_not_found(
regionbase, RGN_TYPE_ASSET_SHELF, __func__, RGN_TYPE_TOOL_HEADER))
{
new_shelf_region->regiondata = MEM_cnew<RegionAssetShelf>(__func__);
new_shelf_region->alignment = RGN_ALIGN_BOTTOM;
new_shelf_region->flag |= RGN_FLAG_HIDDEN;
}
if (ARegion *new_shelf_header = do_versions_add_region_if_not_found(
regionbase, RGN_TYPE_ASSET_SHELF_HEADER, __func__, RGN_TYPE_ASSET_SHELF))
{
new_shelf_header->alignment = RGN_ALIGN_BOTTOM | RGN_ALIGN_HIDE_WITH_PREV;
}
}
}
}
}
void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain)
{
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 1)) {
@ -3193,6 +3221,10 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain)
}
}
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 402, 21)) {
add_image_editor_asset_shelf(*bmain);
}
/**
* Always bump subversion in BKE_blender_version.h when adding versioning
* code here, and wrap it inside a MAIN_VERSION_FILE_ATLEAST check.

@ -155,6 +155,11 @@ static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
FROM_DEFAULT_V4_UCHAR(space_action.keytype_generated_select);
}
if (!USER_VERSION_ATLEAST(402, 21)) {
FROM_DEFAULT_V4_UCHAR(space_image.asset_shelf.back);
FROM_DEFAULT_V4_UCHAR(space_image.asset_shelf.header_back);
}
/**
* Always bump subversion in BKE_blender_version.h when adding versioning
* code here, and wrap it inside a USER_VERSION_ATLEAST check.

@ -1331,7 +1331,9 @@ bool ED_region_is_overlap(int spacetype, int regiontype)
RGN_TYPE_UI,
RGN_TYPE_TOOL_PROPS,
RGN_TYPE_FOOTER,
RGN_TYPE_TOOL_HEADER))
RGN_TYPE_TOOL_HEADER,
RGN_TYPE_ASSET_SHELF,
RGN_TYPE_ASSET_SHELF_HEADER))
{
return true;
}

@ -3,6 +3,7 @@
# SPDX-License-Identifier: GPL-2.0-or-later
set(INC
../asset
../include
../../blenkernel
../../blenloader

@ -32,6 +32,7 @@
#include "IMB_imbuf_types.hh"
#include "ED_asset_shelf.hh"
#include "ED_image.hh"
#include "ED_mask.hh"
#include "ED_node.hh"
@ -125,6 +126,19 @@ static SpaceLink *image_create(const ScrArea * /*area*/, const Scene * /*scene*/
region->regiontype = RGN_TYPE_HEADER;
region->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_BOTTOM : RGN_ALIGN_TOP;
/* asset shelf */
region = MEM_cnew<ARegion>("asset shelf for view3d");
BLI_addtail(&simage->regionbase, region);
region->regiontype = RGN_TYPE_ASSET_SHELF;
region->alignment = RGN_ALIGN_BOTTOM;
region->flag |= RGN_FLAG_HIDDEN;
/* asset shelf header */
region = MEM_cnew<ARegion>("asset shelf header for view3d");
BLI_addtail(&simage->regionbase, region);
region->regiontype = RGN_TYPE_ASSET_SHELF_HEADER;
region->alignment = RGN_ALIGN_BOTTOM | RGN_ALIGN_HIDE_WITH_PREV;
/* tool header */
region = static_cast<ARegion *>(MEM_callocN(sizeof(ARegion), "tool header for image"));
@ -1015,6 +1029,17 @@ static void image_header_region_listener(const wmRegionListenerParams *params)
}
}
/* add handlers, stuff you only do once or on area/region changes */
static void image_asset_shelf_region_init(wmWindowManager *wm, ARegion *region)
{
using namespace blender::ed;
wmKeyMap *keymap = WM_keymap_ensure(
wm->defaultconf, "Image Generic", SPACE_IMAGE, RGN_TYPE_WINDOW);
WM_event_add_keymap_handler(&region->handlers, keymap);
asset::shelf::region_init(wm, region);
}
static void image_id_remap(ScrArea * /*area*/,
SpaceLink *slink,
const blender::bke::id::IDRemapper &mappings)
@ -1109,6 +1134,7 @@ static void image_space_blend_write(BlendWriter *writer, SpaceLink *sl)
void ED_spacetype_image()
{
using namespace blender::ed;
std::unique_ptr<SpaceType> st = std::make_unique<SpaceType>();
ARegionType *art;
@ -1195,6 +1221,34 @@ void ED_spacetype_image()
BLI_addhead(&st->regiontypes, art);
/* regions: asset shelf */
art = MEM_cnew<ARegionType>("spacetype image asset shelf region");
art->regionid = RGN_TYPE_ASSET_SHELF;
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_ASSET_SHELF | ED_KEYMAP_FRAMES;
art->duplicate = asset::shelf::region_duplicate;
art->free = asset::shelf::region_free;
art->listener = asset::shelf::region_listen;
art->poll = asset::shelf::regions_poll;
art->snap_size = asset::shelf::region_snap;
art->on_user_resize = asset::shelf::region_on_user_resize;
art->context = asset::shelf::context;
art->init = image_asset_shelf_region_init;
art->layout = asset::shelf::region_layout;
art->draw = asset::shelf::region_draw;
BLI_addhead(&st->regiontypes, art);
/* regions: asset shelf header */
art = MEM_cnew<ARegionType>("spacetype image asset shelf header region");
art->regionid = RGN_TYPE_ASSET_SHELF_HEADER;
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_ASSET_SHELF | ED_KEYMAP_VIEW2D | ED_KEYMAP_FOOTER;
art->init = asset::shelf::header_region_init;
art->poll = asset::shelf::regions_poll;
art->draw = asset::shelf::header_region;
art->listener = asset::shelf::header_region_listen;
art->context = asset::shelf::context;
BLI_addhead(&st->regiontypes, art);
asset::shelf::header_regiontype_register(art, SPACE_IMAGE);
/* regions: hud */
art = ED_area_type_hud(st->spaceid);
BLI_addhead(&st->regiontypes, art);

@ -5568,7 +5568,8 @@ static void rna_def_space_image(BlenderRNA *brna)
rna_def_space_generic_show_region_toggles(srna,
((1 << RGN_TYPE_TOOL_HEADER) | (1 << RGN_TYPE_TOOLS) |
(1 << RGN_TYPE_UI) | (1 << RGN_TYPE_HUD)));
(1 << RGN_TYPE_UI) | (1 << RGN_TYPE_HUD) |
(1 << RGN_TYPE_ASSET_SHELF)));
/* image */
prop = RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);

@ -3440,6 +3440,8 @@ static void rna_def_userdef_theme_space_image(BlenderRNA *brna)
rna_def_userdef_theme_spaces_curves(srna, false, false, false, true);
rna_def_userdef_theme_spaces_paint_curves(srna);
rna_def_userdef_theme_spaces_asset_shelf_main(srna);
}
static void rna_def_userdef_theme_space_seq(BlenderRNA *brna)