[Bf-blender-cvs] [14dee6d7a59] blender2.8: UI: support drawing panels from multiple contexts

Campbell Barton noreply at git.blender.org
Thu May 31 21:42:40 CEST 2018


Commit: 14dee6d7a59f16761201798f85e60d09bd353750
Author: Campbell Barton
Date:   Thu May 31 21:39:48 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB14dee6d7a59f16761201798f85e60d09bd353750

UI: support drawing panels from multiple contexts

===================================================================

M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/screen/area.c
M	source/blender/editors/space_buttons/space_buttons.c
M	source/blender/editors/space_node/space_node.c
M	source/blender/editors/space_view3d/space_view3d.c

===================================================================

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 */



More information about the Bf-blender-cvs mailing list