From 3da834e83ce9d7056c033148dab04885a6d3b1b7 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Mon, 30 Jan 2017 14:14:27 +0100 Subject: Collection Editor based on patch by Julian Eisel This is extracted from the layer-manager branch. With the following changes: * Renamed references of layer manager to collections manager * I didn't include the editors/space_collections/ draw and util files. I still need to bring the drawing code here, so we see something. --- source/blender/blenkernel/BKE_context.h | 1 + source/blender/blenkernel/intern/context.c | 8 + source/blender/blenloader/intern/readfile.c | 14 ++ source/blender/blenloader/intern/writefile.c | 3 + source/blender/editors/CMakeLists.txt | 1 + source/blender/editors/include/BIF_glutil.h | 1 + source/blender/editors/include/ED_object.h | 1 + source/blender/editors/include/ED_screen.h | 1 + source/blender/editors/include/ED_space_api.h | 1 + source/blender/editors/include/UI_interface.h | 3 + .../blender/editors/include/UI_interface_icons.h | 1 + source/blender/editors/interface/interface_icons.c | 8 + .../blender/editors/interface/interface_widgets.c | 5 +- source/blender/editors/interface/resources.c | 14 +- source/blender/editors/screen/glutil.c | 12 ++ source/blender/editors/screen/screen_ops.c | 4 + source/blender/editors/space_api/spacetypes.c | 1 + .../editors/space_collections/CMakeLists.txt | 45 +++++ .../editors/space_collections/collections_intern.h | 35 ++++ .../editors/space_collections/collections_ops.c | 37 +++++ .../editors/space_collections/space_collections.c | 182 +++++++++++++++++++++ source/blender/makesdna/DNA_space_types.h | 19 ++- source/blender/makesdna/DNA_userdef_types.h | 3 +- source/blender/makesrna/RNA_access.h | 2 + source/blender/makesrna/intern/rna_space.c | 13 ++ source/blender/makesrna/intern/rna_userdef.c | 28 ++++ source/blender/python/intern/bpy_rna_callback.c | 1 + source/blender/windowmanager/WM_types.h | 1 + source/blender/windowmanager/intern/wm_keymap.c | 4 + 29 files changed, 444 insertions(+), 5 deletions(-) create mode 100644 source/blender/editors/space_collections/CMakeLists.txt create mode 100644 source/blender/editors/space_collections/collections_intern.h create mode 100644 source/blender/editors/space_collections/collections_ops.c create mode 100644 source/blender/editors/space_collections/space_collections.c (limited to 'source') diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index 649d142d1cd..3f131050694 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -169,6 +169,7 @@ struct SpaceAction *CTX_wm_space_action(const bContext *C); struct SpaceInfo *CTX_wm_space_info(const bContext *C); struct SpaceUserPref *CTX_wm_space_userpref(const bContext *C); struct SpaceClip *CTX_wm_space_clip(const bContext *C); +struct SpaceCollections *CTX_wm_space_collections(const bContext *C); void CTX_wm_manager_set(bContext *C, struct wmWindowManager *wm); void CTX_wm_window_set(bContext *C, struct wmWindow *win); diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index 8025732efe5..85fa57f788b 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -815,6 +815,14 @@ struct SpaceClip *CTX_wm_space_clip(const bContext *C) return NULL; } +struct SpaceCollections *CTX_wm_space_collections(const bContext *C) +{ + ScrArea *sa = CTX_wm_area(C); + if (sa && sa->spacetype == SPACE_COLLECTIONS) + return sa->spacedata.first; + return NULL; +} + void CTX_wm_manager_set(bContext *C, wmWindowManager *wm) { C->wm.manager = wm; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index cec886b4ce3..90f7ddc5f6d 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -103,6 +103,8 @@ #include "DNA_movieclip_types.h" #include "DNA_mask_types.h" +#include "RNA_access.h" + #include "MEM_guardedalloc.h" #include "BLI_endian_switch.h" @@ -6552,6 +6554,10 @@ static void lib_link_screen(FileData *fd, Main *main) slogic->gpd = newlibadr_us(fd, sc->id.lib, slogic->gpd); } + else if (sl->spacetype == SPACE_COLLECTIONS) { + SpaceCollections *slayer = (SpaceCollections *)sl; + slayer->flag |= SC_COLLECTION_DATA_REFRESH; + } } } sc->id.tag &= ~LIB_TAG_NEED_LINK; @@ -6937,6 +6943,10 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc slogic->gpd = restore_pointer_by_name(id_map, (ID *)slogic->gpd, USER_REAL); } + else if (sl->spacetype == SPACE_COLLECTIONS) { + SpaceCollections *slayer = (SpaceCollections *)sl; + slayer->flag |= SC_COLLECTION_DATA_REFRESH; + } } } } @@ -7331,6 +7341,10 @@ static bool direct_link_screen(FileData *fd, bScreen *sc) sclip->scopes.track_preview = NULL; sclip->scopes.ok = 0; } + else if (sl->spacetype == SPACE_COLLECTIONS) { + SpaceCollections *slayer = (SpaceCollections *)sl; + slayer->flag |= SC_COLLECTION_DATA_REFRESH; + } } BLI_listbase_clear(&sa->actionzones); diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 1621bb78432..c22acf2f758 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -3200,6 +3200,9 @@ static void write_screens(WriteData *wd, ListBase *scrbase) else if (sl->spacetype == SPACE_INFO) { writestruct(wd, DATA, SpaceInfo, 1, sl); } + else if (sl->spacetype == SPACE_COLLECTIONS) { + writestruct(wd, DATA, SpaceCollections, 1, sl); + } sl = sl->next; } diff --git a/source/blender/editors/CMakeLists.txt b/source/blender/editors/CMakeLists.txt index 1559512d713..7e804a5bbfc 100644 --- a/source/blender/editors/CMakeLists.txt +++ b/source/blender/editors/CMakeLists.txt @@ -47,6 +47,7 @@ if(WITH_BLENDER) add_subdirectory(space_graph) add_subdirectory(space_image) add_subdirectory(space_info) + add_subdirectory(space_collections) add_subdirectory(space_logic) add_subdirectory(space_nla) add_subdirectory(space_node) diff --git a/source/blender/editors/include/BIF_glutil.h b/source/blender/editors/include/BIF_glutil.h index 35d38bf4ca1..96532f748e4 100644 --- a/source/blender/editors/include/BIF_glutil.h +++ b/source/blender/editors/include/BIF_glutil.h @@ -49,6 +49,7 @@ struct ColorManagedDisplaySettings; void fdrawline(float x1, float y1, float x2, float y2); /* DEPRECATED */ void fdrawbox(float x1, float y1, float x2, float y2); /* DEPRECATED */ +void fdrawbox_filled(float x1, float y1, float x2, float y2); void sdrawline(int x1, int y1, int x2, int y2); /* DEPRECATED */ void sdrawbox(int x1, int y1, int x2, int y2); /* DEPRECATED */ diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index 40112bc20fc..c1c0463ee5a 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -55,6 +55,7 @@ struct wmOperatorType; struct PointerRNA; struct PropertyRNA; struct EnumPropertyItem; +struct LayerTree; /* object_edit.c */ struct Object *ED_object_context(struct bContext *C); /* context.object */ diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index f5f66a07aea..01be63919be 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -162,6 +162,7 @@ int ED_operator_image_active(struct bContext *C); int ED_operator_nla_active(struct bContext *C); int ED_operator_logic_active(struct bContext *C); int ED_operator_info_active(struct bContext *C); +int ED_operator_collections_active(struct bContext *C); int ED_operator_console_active(struct bContext *C); diff --git a/source/blender/editors/include/ED_space_api.h b/source/blender/editors/include/ED_space_api.h index d268c578cf2..b754e1ba20f 100644 --- a/source/blender/editors/include/ED_space_api.h +++ b/source/blender/editors/include/ED_space_api.h @@ -58,6 +58,7 @@ void ED_spacetype_logic(void); void ED_spacetype_console(void); void ED_spacetype_userpref(void); void ED_spacetype_clip(void); +void ED_spacetype_collections(void); /* calls for instancing and freeing spacetype static data * called in WM_init_exit */ diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index d48cfbee413..55f11b94eb2 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -212,6 +212,9 @@ enum { UI_BUT_ALIGN_STITCH_TOP = (1 << 18), UI_BUT_ALIGN_STITCH_LEFT = (1 << 19), UI_BUT_ALIGN_ALL = (UI_BUT_ALIGN | UI_BUT_ALIGN_STITCH_TOP | UI_BUT_ALIGN_STITCH_LEFT), + + /* Another hack, in some rare cases we don't want any text margin */ + UI_BUT_TEXT_NO_MARGIN = (1 << 20), }; /* scale fixed button widths by this to account for DPI */ diff --git a/source/blender/editors/include/UI_interface_icons.h b/source/blender/editors/include/UI_interface_icons.h index 945ac1b6db9..f08c46af8a6 100644 --- a/source/blender/editors/include/UI_interface_icons.h +++ b/source/blender/editors/include/UI_interface_icons.h @@ -83,5 +83,6 @@ struct PreviewImage *UI_icon_to_preview(int icon_id); int UI_rnaptr_icon_get(struct bContext *C, struct PointerRNA *ptr, int rnaicon, const bool big); int UI_idcode_icon_get(const int idcode); +int UI_colorset_icon_get(const int set_idx); #endif /* __UI_INTERFACE_ICONS_H__ */ diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c index 0573e8d9c94..70bfd30c2d8 100644 --- a/source/blender/editors/interface/interface_icons.c +++ b/source/blender/editors/interface/interface_icons.c @@ -1385,6 +1385,14 @@ int UI_idcode_icon_get(const int idcode) } } +/** + * \param set_idx: A value from #rna_enum_color_sets_items. + */ +int UI_colorset_icon_get(const int set_idx) +{ + return (set_idx < 1) ? ICON_NONE : VICO_COLORSET_01_VEC - 1 + set_idx; +} + static void icon_draw_at_size( float x, float y, int icon_id, float aspect, float alpha, enum eIconSizes size, const bool nocreate) diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index b75ecf68136..9dd6c670da8 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -1575,7 +1575,10 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB } } - if (but->editstr || (but->drawflag & UI_BUT_TEXT_LEFT)) { + if (but->drawflag & UI_BUT_TEXT_NO_MARGIN) { + /* skip */ + } + else if (but->editstr || (but->drawflag & UI_BUT_TEXT_LEFT)) { rect->xmin += (UI_TEXT_MARGIN_X * U.widget_unit) / but->block->aspect; } else if ((but->drawflag & UI_BUT_TEXT_RIGHT)) { diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 999556025db..ea72a4aa25b 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -165,6 +165,9 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo case SPACE_CLIP: ts = &btheme->tclip; break; + case SPACE_COLLECTIONS: + ts = &btheme->tcollections; + break; default: ts = &btheme->tv3d; break; @@ -1206,6 +1209,11 @@ void ui_theme_init_default(void) rgba_char_args_set(btheme->tclip.strip_select, 0xff, 0x8c, 0x00, 0xff); btheme->tclip.handle_vertex_size = 5; ui_theme_space_init_handles_color(&btheme->tclip); + + /* space collection manager */ + btheme->tcollections = btheme->tv3d; + rgba_char_args_set_fl(btheme->tcollections.back, 0.42, 0.42, 0.42, 1.0); + rgba_char_args_set(btheme->tcollections.hilite, 255, 140, 25, 255); /* selected files */ } void ui_style_init_default(void) @@ -2834,7 +2842,11 @@ void init_userdef_do_versions(void) * (keep this block even if it becomes empty). */ { - + for (bTheme *btheme = U.themes.first; btheme; btheme = btheme->next) { + btheme->tcollections = btheme->tv3d; + rgba_char_args_set_fl(btheme->tcollections.back, 0.42, 0.42, 0.42, 1.0); + rgba_char_args_set(btheme->tcollections.hilite, 255, 140, 25, 255); /* selected files */ + } } if (U.pixelsize == 0.0f) diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c index ef514dd5e84..f2933cfa935 100644 --- a/source/blender/editors/screen/glutil.c +++ b/source/blender/editors/screen/glutil.c @@ -75,6 +75,18 @@ void fdrawbox(float x1, float y1, float x2, float y2) glEnd(); } +void fdrawbox_filled(float x1, float y1, float x2, float y2) +{ + glBegin(GL_POLYGON); + + glVertex2f(x1, y1); + glVertex2f(x1, y2); + glVertex2f(x2, y2); + glVertex2f(x2, y1); + + glEnd(); +} + void fdrawcheckerboard(float x1, float y1, float x2, float y2) /* DEPRECATED */ { unsigned char col1[4] = {40, 40, 40}, col2[4] = {50, 50, 50}; diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 32b63aca34c..a55d6c2143f 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -321,6 +321,10 @@ int ED_operator_info_active(bContext *C) return ed_spacetype_test(C, SPACE_INFO); } +int ED_operator_collections_active(bContext *C) +{ + return ed_spacetype_test(C, SPACE_COLLECTIONS); +} int ED_operator_console_active(bContext *C) { diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c index 5ff1d758563..8c278c0b3ae 100644 --- a/source/blender/editors/space_api/spacetypes.c +++ b/source/blender/editors/space_api/spacetypes.c @@ -96,6 +96,7 @@ void ED_spacetypes_init(void) ED_spacetype_console(); ED_spacetype_userpref(); ED_spacetype_clip(); + ED_spacetype_collections(); // ... /* register operator types for screen and all spaces */ diff --git a/source/blender/editors/space_collections/CMakeLists.txt b/source/blender/editors/space_collections/CMakeLists.txt new file mode 100644 index 00000000000..1cc4a40d657 --- /dev/null +++ b/source/blender/editors/space_collections/CMakeLists.txt @@ -0,0 +1,45 @@ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +set(INC + ../include + ../../blenkernel + ../../blenlib + ../../blentranslation + ../../gpu + ../../makesdna + ../../makesrna + ../../windowmanager + ../../../../intern/guardedalloc + ../../../../intern/glew-mx +) + +set(INC_SYS + ${GLEW_INCLUDE_PATH} +) + +set(SRC + collections_ops.c + space_collections.c + + collections_intern.h +) + +blender_add_lib(bf_editor_space_collections "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/editors/space_collections/collections_intern.h b/source/blender/editors/space_collections/collections_intern.h new file mode 100644 index 00000000000..866f59659c3 --- /dev/null +++ b/source/blender/editors/space_collections/collections_intern.h @@ -0,0 +1,35 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/editors/space_collections/collections_intern.h + * \ingroup spcollections + */ + +#ifndef __COLLECTIONS_INTERN_H__ +#define __COLLECTIONS_INTERN_H__ + +struct wmKeyConfig; + +/* collections_ops.c */ +void collections_operatortypes(void); +void collections_keymap(struct wmKeyConfig *keyconf); + +#endif /* __COLLECTIONS_INTERN_H__ */ + diff --git a/source/blender/editors/space_collections/collections_ops.c b/source/blender/editors/space_collections/collections_ops.c new file mode 100644 index 00000000000..c822ac1e824 --- /dev/null +++ b/source/blender/editors/space_collections/collections_ops.c @@ -0,0 +1,37 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/editors/space_collections/collections_ops.c + * \ingroup spcollections + */ + +#include "WM_api.h" +#include "collections_intern.h" /* own include */ + + +/* ************************** registration - operator types **********************************/ + +void collections_operatortypes(void) +{ +} + +void collections_keymap(wmKeyConfig *UNUSED(keyconf)) +{ +} diff --git a/source/blender/editors/space_collections/space_collections.c b/source/blender/editors/space_collections/space_collections.c new file mode 100644 index 00000000000..7dd50e5cbac --- /dev/null +++ b/source/blender/editors/space_collections/space_collections.c @@ -0,0 +1,182 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/editors/space_collections/space_collections.c + * \ingroup spcollections + */ + +#include + +#include "MEM_guardedalloc.h" + +#include "BIF_gl.h" + +#include "BKE_context.h" +#include "BKE_screen.h" + +#include "BLI_ghash.h" +#include "BLI_listbase.h" + +#include "ED_screen.h" +#include "ED_space_api.h" + +#include "UI_resources.h" +#include "UI_view2d.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "collections_intern.h" /* own include */ + +/* ******************** default callbacks for collection manager space ***************** */ + +static SpaceLink *collections_new(const bContext *UNUSED(C)) +{ + ARegion *ar; + SpaceCollections *scollection; /* hmm, that's actually a good band name... */ + + scollection = MEM_callocN(sizeof(SpaceCollections), __func__); + scollection->spacetype = SPACE_COLLECTIONS; + + /* header */ + ar = MEM_callocN(sizeof(ARegion), "header for collection manager"); + BLI_addtail(&scollection->regionbase, ar); + ar->regiontype = RGN_TYPE_HEADER; + ar->alignment = RGN_ALIGN_BOTTOM; + + /* main region */ + ar = MEM_callocN(sizeof(ARegion), "main region for collection manager"); + BLI_addtail(&scollection->regionbase, ar); + ar->regiontype = RGN_TYPE_WINDOW; + ar->v2d.scroll = (V2D_SCROLL_RIGHT | V2D_SCROLL_BOTTOM | V2D_SCROLL_HORIZONTAL_HIDE | V2D_SCROLL_VERTICAL_HIDE); + ar->v2d.align = (V2D_ALIGN_NO_NEG_X | V2D_ALIGN_NO_POS_Y); + + return (SpaceLink *)scollection; +} + +static void collections_free(SpaceLink *UNUSED(sl)) +{ +} + +static SpaceLink *collections_duplicate(SpaceLink *sl) +{ + SpaceCollections *scollection = MEM_dupallocN(sl); + + /* clear or remove stuff from old */ + + return (SpaceLink *)scollection; +} + +/* add handlers, stuff you only do once or on area/region changes */ +static void collection_main_region_init(wmWindowManager *wm, ARegion *ar) +{ + UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy); + ar->v2d.scroll |= (V2D_SCROLL_VERTICAL_FULLR | V2D_SCROLL_HORIZONTAL_FULLR); + + /* own keymap */ + wmKeyMap *keymap = WM_keymap_find(wm->defaultconf, "Layer Manager", SPACE_COLLECTIONS, 0); + WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); +} + +static void collections_main_region_draw(const bContext *C, ARegion *ar) +{ + SpaceCollections *spc = CTX_wm_space_collections(C); + View2D *v2d = &ar->v2d; + + if (spc->flag & SC_COLLECTION_DATA_REFRESH) { + } + + /* v2d has initialized flag, so this call will only set the mask correct */ + UI_view2d_region_reinit(v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy); + + UI_ThemeClearColor(TH_BACK); + glClear(GL_COLOR_BUFFER_BIT); + + /* reset view matrix */ + UI_view2d_view_restore(C); + + /* scrollers */ + View2DScrollers *scrollers; + scrollers = UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY); + UI_view2d_scrollers_draw(C, v2d, scrollers); + UI_view2d_scrollers_free(scrollers); +} + +/* add handlers, stuff you only do once or on area/region changes */ +static void collections_header_region_init(wmWindowManager *UNUSED(wm), ARegion *ar) +{ + ED_region_header_init(ar); +} + +static void collections_header_region_draw(const bContext *C, ARegion *ar) +{ + ED_region_header(C, ar); +} + +static void collections_main_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn) +{ + switch (wmn->category) { + case NC_SCENE: + if (wmn->data == ND_LAYER) { + ED_region_tag_redraw(ar); + } + break; + case NC_SPACE: + if (wmn->data == ND_SPACE_COLLECTIONS) { + ED_region_tag_redraw(ar); + } + } +} + +/* only called once, from space/spacetypes.c */ +void ED_spacetype_collections(void) +{ + SpaceType *st = MEM_callocN(sizeof(SpaceType), "spacetype collections"); + ARegionType *art; + + st->spaceid = SPACE_COLLECTIONS; + strncpy(st->name, "LayerManager", BKE_ST_MAXNAME); + + st->new = collections_new; + st->free = collections_free; + st->duplicate = collections_duplicate; + st->operatortypes = collections_operatortypes; + st->keymap = collections_keymap; + + /* regions: main window */ + art = MEM_callocN(sizeof(ARegionType), "spacetype collections region"); + art->regionid = RGN_TYPE_WINDOW; + art->init = collection_main_region_init; + art->draw = collections_main_region_draw; + art->listener = collections_main_region_listener; + art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D; + BLI_addhead(&st->regiontypes, art); + + /* regions: header */ + art = MEM_callocN(sizeof(ARegionType), "spacetype collections header"); + art->regionid = RGN_TYPE_HEADER; + art->prefsizey = HEADERY; + art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_HEADER; + art->init = collections_header_region_init; + art->draw = collections_header_region_draw; + BLI_addhead(&st->regiontypes, art); + + BKE_spacetype_register(st); +} diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 5e015544dc9..00d4f6444dd 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -1343,6 +1343,20 @@ typedef enum eSpaceClip_GPencil_Source { SC_GPENCIL_SRC_TRACK = 1, } eSpaceClip_GPencil_Source; +/* Collection Manager ======================================= */ + +typedef struct SpaceCollections { + SpaceLink *next, *prev; + ListBase regionbase; /* storage of regions for inactive spaces */ + int spacetype; + int flag; /* eSpaceCollections_Flag */ +} SpaceCollections; + +/* SpaceClip->flag */ +typedef enum eSpaceCollections_Flag { + SC_COLLECTION_DATA_REFRESH = (1 << 0), /* recreate/update SpaceCollections layer data, needed for undo/read/write */ +} eSpaceCollections_Flag; + /* **************** SPACE DEFINES ********************* */ /* space types, moved from DNA_screen_types.h */ @@ -1372,8 +1386,9 @@ typedef enum eSpace_Type { SPACE_CONSOLE = 18, SPACE_USERPREF = 19, SPACE_CLIP = 20, - - SPACEICONMAX = SPACE_CLIP + SPACE_COLLECTIONS = 21, + + SPACEICONMAX = SPACE_COLLECTIONS } eSpace_Type; /* use for function args */ diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 1dc6c7ab578..6cc24f74cee 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -390,7 +390,8 @@ typedef struct bTheme { ThemeSpace tuserpref; ThemeSpace tconsole; ThemeSpace tclip; - + ThemeSpace tcollections; + /* 20 sets of bone colors for this theme */ ThemeWireColor tarm[20]; /*ThemeWireColor tobj[20];*/ diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 448e5901ec8..48e20e72528 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -574,6 +574,7 @@ extern StructRNA RNA_SpaceFileBrowser; extern StructRNA RNA_SpaceGraphEditor; extern StructRNA RNA_SpaceImageEditor; extern StructRNA RNA_SpaceInfo; +extern StructRNA RNA_SpaceCollectionManager; extern StructRNA RNA_SpaceLogicEditor; extern StructRNA RNA_SpaceNLA; extern StructRNA RNA_SpaceNodeEditor; @@ -642,6 +643,7 @@ extern StructRNA RNA_ThemeFontStyle; extern StructRNA RNA_ThemeGraphEditor; extern StructRNA RNA_ThemeImageEditor; extern StructRNA RNA_ThemeInfo; +extern StructRNA RNA_ThemeCollectionManager; extern StructRNA RNA_ThemeLogicEditor; extern StructRNA RNA_ThemeNLAEditor; extern StructRNA RNA_ThemeNodeEditor; diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index af4fb9d0d8a..14b8410e738 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -79,6 +79,7 @@ EnumPropertyItem rna_enum_space_type_items[] = { {0, "", ICON_NONE, NULL, NULL}, {SPACE_BUTS, "PROPERTIES", ICON_BUTS, "Properties", "Edit properties of active object and related data-blocks"}, {SPACE_OUTLINER, "OUTLINER", ICON_OOPS, "Outliner", "Overview of scene graph and all available data-blocks"}, + {SPACE_COLLECTIONS, "COLLECTION_MANAGER", ICON_COLLAPSEMENU, "Collections", "Edit collections of active render layer"}, {SPACE_USERPREF, "USER_PREFERENCES", ICON_PREFERENCES, "User Preferences", "Edit persistent configuration settings"}, {SPACE_INFO, "INFO", ICON_INFO, "Info", "Main menu bar and list of error messages (drag down to expand and display)"}, {0, "", ICON_NONE, NULL, NULL}, @@ -315,6 +316,8 @@ static StructRNA *rna_Space_refine(struct PointerRNA *ptr) return &RNA_SpaceUserPreferences; case SPACE_CLIP: return &RNA_SpaceClipEditor; + case SPACE_COLLECTIONS: + return &RNA_SpaceCollectionManager; default: return &RNA_Space; } @@ -4812,6 +4815,15 @@ static void rna_def_space_clip(BlenderRNA *brna) RNA_def_property_update(prop, NC_SPACE | ND_SPACE_CLIP, NULL); } +static void rna_def_space_collections(BlenderRNA *brna) +{ + StructRNA *srna; + + srna = RNA_def_struct(brna, "SpaceCollectionManager", "Space"); + RNA_def_struct_sdna(srna, "SpaceCollections"); + RNA_def_struct_ui_text(srna, "Space Collection Manager", "Layer Collection space data"); +} + void RNA_def_space(BlenderRNA *brna) { @@ -4838,6 +4850,7 @@ void RNA_def_space(BlenderRNA *brna) rna_def_space_node(brna); rna_def_space_logic(brna); rna_def_space_clip(brna); + rna_def_space_collections(brna); } #endif diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 0eab38faca8..dbf6e636c65 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -2956,6 +2956,26 @@ static void rna_def_userdef_theme_space_clip(BlenderRNA *brna) rna_def_userdef_theme_spaces_curves(srna, false, false, false, true); } +static void rna_def_userdef_theme_space_collections(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "ThemeCollectionManager", NULL); + RNA_def_struct_sdna(srna, "ThemeSpace"); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); + RNA_def_struct_ui_text(srna, "Theme Collection Manager", "Theme settings for the Collection Manager"); + + rna_def_userdef_theme_spaces_main(srna); + rna_def_userdef_theme_spaces_list_main(srna); + + prop = RNA_def_property(srna, "selected_collection", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "hilite"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Selected Collection", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); +} + static void rna_def_userdef_themes(BlenderRNA *brna) { StructRNA *srna; @@ -2982,6 +3002,7 @@ static void rna_def_userdef_themes(BlenderRNA *brna) {16, "FILE_BROWSER", ICON_FILESEL, "File Browser", ""}, {17, "CONSOLE", ICON_CONSOLE, "Python Console", ""}, {20, "CLIP_EDITOR", ICON_CLIP, "Movie Clip Editor", ""}, + {21, "COLLECTION_MANAGER", ICON_COLLAPSEMENU, "Collection Manager", ""}, {0, NULL, 0, NULL, NULL} }; @@ -3115,6 +3136,12 @@ static void rna_def_userdef_themes(BlenderRNA *brna) RNA_def_property_pointer_sdna(prop, NULL, "tclip"); RNA_def_property_struct_type(prop, "ThemeClipEditor"); RNA_def_property_ui_text(prop, "Clip Editor", ""); + + prop = RNA_def_property(srna, "collection_manager", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_NEVER_NULL); + RNA_def_property_pointer_sdna(prop, NULL, "tcollections"); + RNA_def_property_struct_type(prop, "ThemeCollectionManager"); + RNA_def_property_ui_text(prop, "Collection Manager", ""); } static void rna_def_userdef_addon(BlenderRNA *brna) @@ -3205,6 +3232,7 @@ static void rna_def_userdef_dothemes(BlenderRNA *brna) rna_def_userdef_theme_space_console(brna); rna_def_userdef_theme_space_logic(brna); rna_def_userdef_theme_space_clip(brna); + rna_def_userdef_theme_space_collections(brna); rna_def_userdef_theme_colorset(brna); rna_def_userdef_themes(brna); } diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c index df1c4155a6d..b8c9b3ff9e9 100644 --- a/source/blender/python/intern/bpy_rna_callback.c +++ b/source/blender/python/intern/bpy_rna_callback.c @@ -174,6 +174,7 @@ static eSpace_Type rna_Space_refine_reverse(StructRNA *srna) if (srna == &RNA_SpaceConsole) return SPACE_CONSOLE; if (srna == &RNA_SpaceUserPreferences) return SPACE_USERPREF; if (srna == &RNA_SpaceClipEditor) return SPACE_CLIP; + if (srna == &RNA_SpaceCollectionManager) return SPACE_COLLECTIONS; return SPACE_EMPTY; } diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 3bed4dac2cf..49e70b4f200 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -364,6 +364,7 @@ typedef struct wmNotifier { #define ND_SPACE_CHANGED (18<<16) /*sent to a new editor type after it's replaced an old one*/ #define ND_SPACE_CLIP (19<<16) #define ND_SPACE_FILE_PREVIEW (20<<16) +#define ND_SPACE_COLLECTIONS (21<<16) /* subtype, 256 entries too */ #define NOTE_SUBTYPE 0x0000FF00 diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index e201fa433d4..4179ac7f993 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -1861,6 +1861,10 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname) else if (STRPREFIX(opname, "OUTLINER_OT")) { km = WM_keymap_find_all(C, "Outliner", sl->spacetype, 0); } + /* Layer Manager */ + else if (STRPREFIX(opname, "COLLECTIONS_OT")) { + km = WM_keymap_find_all(C, "Collection Manager", sl->spacetype, 0); + } /* Transform */ else if (STRPREFIX(opname, "TRANSFORM_OT")) { /* check for relevant editor */ -- cgit v1.2.3