From 14dee6d7a59f16761201798f85e60d09bd353750 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 31 May 2018 21:39:48 +0200 Subject: UI: support drawing panels from multiple contexts --- source/blender/editors/include/ED_screen.h | 2 +- source/blender/editors/screen/area.c | 19 ++++- .../blender/editors/space_buttons/space_buttons.c | 83 ++++++++++++++-------- source/blender/editors/space_node/space_node.c | 1 - source/blender/editors/space_view3d/space_view3d.c | 2 +- 5 files changed, 72 insertions(+), 35 deletions(-) (limited to 'source/blender/editors') diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index 919c8d14db5..f2ab7318037 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -79,7 +79,7 @@ void ED_region_tag_refresh_ui(struct ARegion *ar); void ED_region_panels_init(struct wmWindowManager *wm, struct ARegion *ar); void ED_region_panels( const struct bContext *C, struct ARegion *ar, - const char *context, int contextnr, + const char *contexts[], int contextnr, const bool vertical); void ED_region_header_init(struct ARegion *ar); void ED_region_header(const struct bContext *C, struct ARegion *ar); diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index f2ecf3d5ea2..b05496fc349 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -1796,7 +1796,22 @@ static void region_clear_color(const bContext *C, const ARegion *ar, ThemeColorI } } -void ED_region_panels(const bContext *C, ARegion *ar, const char *context, int contextnr, const bool vertical) +BLI_INLINE bool streq_array_any(const char *s, const char *arr[]) +{ + for (uint i = 0; arr[i]; i++) { + if (STREQ(arr[i], s)) { + return true; + } + } + return false; +} + +/** + * \param contexts: A NULL terminated array of context strings to match against. + * Matching against any of these strings will draw the panel. + * Can be NULL to skip context checks. + */ +void ED_region_panels(const bContext *C, ARegion *ar, const char *contexts[], int contextnr, const bool vertical) { const WorkSpace *workspace = CTX_wm_workspace(C); ScrArea *sa = CTX_wm_area(C); @@ -1844,7 +1859,7 @@ void ED_region_panels(const bContext *C, ARegion *ar, const char *context, int c /* collect panels to draw */ for (pt = ar->type->paneltypes.last; pt; pt = pt->prev) { /* verify context */ - if (context && pt->context[0] && !STREQ(context, pt->context)) { + if (contexts && pt->context[0] && !streq_array_any(pt->context, contexts)) { continue; } diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c index 05304ecbf94..bb57875d8f8 100644 --- a/source/blender/editors/space_buttons/space_buttons.c +++ b/source/blender/editors/space_buttons/space_buttons.c @@ -146,36 +146,59 @@ static void buttons_main_region_draw(const bContext *C, ARegion *ar) buttons_context_compute(C, sbuts); - if (sbuts->mainb == BCONTEXT_SCENE) - ED_region_panels(C, ar, "scene", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_RENDER) - ED_region_panels(C, ar, "render", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_VIEW_LAYER) - ED_region_panels(C, ar, "view_layer", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_WORLD) - ED_region_panels(C, ar, "world", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_WORKSPACE) - ED_region_panels(C, ar, "workspace", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_OBJECT) - ED_region_panels(C, ar, "object", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_DATA) - ED_region_panels(C, ar, "data", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_MATERIAL) - ED_region_panels(C, ar, "material", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_TEXTURE) - ED_region_panels(C, ar, "texture", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_PARTICLE) - ED_region_panels(C, ar, "particle", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_PHYSICS) - ED_region_panels(C, ar, "physics", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_BONE) - ED_region_panels(C, ar, "bone", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_MODIFIER) - ED_region_panels(C, ar, "modifier", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_CONSTRAINT) - ED_region_panels(C, ar, "constraint", sbuts->mainb, vertical); - else if (sbuts->mainb == BCONTEXT_BONE_CONSTRAINT) - ED_region_panels(C, ar, "bone_constraint", sbuts->mainb, vertical); + const char *contexts[2] = {NULL, NULL}; + + switch (sbuts->mainb) { + case BCONTEXT_SCENE: + contexts[0] = "scene"; + break; + case BCONTEXT_RENDER: + contexts[0] = "render"; + break; + case BCONTEXT_VIEW_LAYER: + contexts[0] = "view_layer"; + break; + case BCONTEXT_WORLD: + contexts[0] = "world"; + break; + case BCONTEXT_WORKSPACE: + contexts[0] = "workspace"; + break; + case BCONTEXT_OBJECT: + contexts[0] = "object"; + break; + case BCONTEXT_DATA: + contexts[0] = "data"; + break; + case BCONTEXT_MATERIAL: + contexts[0] = "material"; + break; + case BCONTEXT_TEXTURE: + contexts[0] = "texture"; + break; + case BCONTEXT_PARTICLE: + contexts[0] = "particle"; + break; + case BCONTEXT_PHYSICS: + contexts[0] = "physics"; + break; + case BCONTEXT_BONE: + contexts[0] = "bone"; + break; + case BCONTEXT_MODIFIER: + contexts[0] = "modifier"; + break; + case BCONTEXT_CONSTRAINT: + contexts[0] = "constraint"; + break; + case BCONTEXT_BONE_CONSTRAINT: + contexts[0] = "bone_constraint"; + break; + } + + if (contexts[0]) { + ED_region_panels(C, ar, contexts, sbuts->mainb, vertical); + } sbuts->re_align = 0; sbuts->mainbo = sbuts->mainb; diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index 3b24500d044..ccac730c88f 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -991,7 +991,6 @@ void ED_spacetype_node(void) st->dropboxes = node_dropboxes; st->manipulators = node_widgets; st->id_remap = node_id_remap; - st->space_subtype_item_extend = node_space_subtype_item_extend; st->space_subtype_get = node_space_subtype_get; st->space_subtype_set = node_space_subtype_set; diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index 93226c9a200..fcea40d7f4c 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -1357,7 +1357,7 @@ static void view3d_tools_region_init(wmWindowManager *wm, ARegion *ar) static void view3d_tools_region_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, CTX_data_mode_string(C), -1, true); + ED_region_panels(C, ar, (const char * []){CTX_data_mode_string(C), NULL}, -1, true); } /* area (not region) level listener */ -- cgit v1.2.3