diff --git a/release/datafiles/userdef/userdef_default_theme.c b/release/datafiles/userdef/userdef_default_theme.c index a114f33b088..8d02d0f51a3 100644 --- a/release/datafiles/userdef/userdef_default_theme.c +++ b/release/datafiles/userdef/userdef_default_theme.c @@ -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), diff --git a/scripts/startup/bl_ui/space_image.py b/scripts/startup/bl_ui/space_image.py index e7136d8fa0c..5de208286a9 100644 --- a/scripts/startup/bl_ui/space_image.py +++ b/scripts/startup/bl_ui/space_image.py @@ -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() diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index a5d0ee90faf..483196b8aa8 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -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 diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index 23f0ce6fffe..4aa28590bbb 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -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(__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. diff --git a/source/blender/blenloader/intern/versioning_userdef.cc b/source/blender/blenloader/intern/versioning_userdef.cc index af83aa415d5..389d1a6a70c 100644 --- a/source/blender/blenloader/intern/versioning_userdef.cc +++ b/source/blender/blenloader/intern/versioning_userdef.cc @@ -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. diff --git a/source/blender/editors/screen/area.cc b/source/blender/editors/screen/area.cc index 891833bbff8..d2992ee0fb4 100644 --- a/source/blender/editors/screen/area.cc +++ b/source/blender/editors/screen/area.cc @@ -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; } diff --git a/source/blender/editors/space_image/CMakeLists.txt b/source/blender/editors/space_image/CMakeLists.txt index 6315c85f29b..95f93ab3ae6 100644 --- a/source/blender/editors/space_image/CMakeLists.txt +++ b/source/blender/editors/space_image/CMakeLists.txt @@ -3,6 +3,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later set(INC + ../asset ../include ../../blenkernel ../../blenloader diff --git a/source/blender/editors/space_image/space_image.cc b/source/blender/editors/space_image/space_image.cc index de28b866934..008b34e28a0 100644 --- a/source/blender/editors/space_image/space_image.cc +++ b/source/blender/editors/space_image/space_image.cc @@ -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("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("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(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(®ion->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 st = std::make_unique(); ARegionType *art; @@ -1195,6 +1221,34 @@ void ED_spacetype_image() BLI_addhead(&st->regiontypes, art); + /* regions: asset shelf */ + art = MEM_cnew("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("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); diff --git a/source/blender/makesrna/intern/rna_space.cc b/source/blender/makesrna/intern/rna_space.cc index c64bd8d896a..e3bb0ea8f92 100644 --- a/source/blender/makesrna/intern/rna_space.cc +++ b/source/blender/makesrna/intern/rna_space.cc @@ -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); diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index 6e90eece3bb..cd8787da1a9 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -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)