[Bf-blender-cvs] [abb80ab] master: UI: check visible layers when reading context

Campbell Barton noreply at git.blender.org
Wed May 13 03:00:43 CEST 2015


Commit: abb80abf8add3e42d1edcce03c60e6e1eacdb14a
Author: Campbell Barton
Date:   Wed May 13 10:56:40 2015 +1000
Branches: master
https://developer.blender.org/rBabb80abf8add3e42d1edcce03c60e6e1eacdb14a

UI: check visible layers when reading context

This resolves a problem where selected items edited for multi-value-editig
could include objects not in any visible views (unlocked layers, local view... etc).

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

M	source/blender/blenkernel/BKE_screen.h
M	source/blender/blenkernel/intern/screen.c
M	source/blender/editors/screen/screen_context.c

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

diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index c584051..4861641 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -293,6 +293,8 @@ unsigned int BKE_screen_view3d_layer_active_ex(
 unsigned int BKE_screen_view3d_layer_active(
         const struct View3D *v3d, const struct Scene *scene) ATTR_NONNULL(2);
 
+unsigned int BKE_screen_view3d_layer_all(const struct bScreen *sc) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
+
 void BKE_screen_view3d_sync(struct View3D *v3d, struct Scene *scene);
 void BKE_screen_view3d_scene_sync(struct bScreen *sc);
 void BKE_screen_view3d_main_sync(ListBase *screen_lb, struct Scene *scene);
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 840e1f9..4125a35 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -518,6 +518,23 @@ unsigned int BKE_screen_view3d_layer_active(const struct View3D *v3d, const stru
 	return BKE_screen_view3d_layer_active_ex(v3d, scene, true);
 }
 
+/**
+ * Accumulate all visible layers on this screen.
+ */
+unsigned int BKE_screen_view3d_layer_all(const bScreen *sc)
+{
+	const ScrArea *sa;
+	unsigned int lay = 0;
+	for (sa = sc->areabase.first; sa; sa = sa->next) {
+		if (sa->spacetype == SPACE_VIEW3D) {
+			View3D *v3d = sa->spacedata.first;
+			lay |= v3d->lay;
+		}
+	}
+
+	return lay;
+}
+
 void BKE_screen_view3d_sync(View3D *v3d, struct Scene *scene)
 {
 	int bit;
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index fc4ee47..87c0ce3 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -47,6 +47,7 @@
 #include "BKE_action.h"
 #include "BKE_armature.h"
 #include "BKE_gpencil.h"
+#include "BKE_screen.h"
 #include "BKE_sequencer.h"
 
 #include "RNA_access.h"
@@ -59,6 +60,18 @@
 
 #include "screen_intern.h"
 
+static unsigned int context_layers(bScreen *sc, Scene *scene, ScrArea *sa_ctx)
+{
+	/* needed for 'USE_ALLSELECT' define, otherwise we end up editing off-screen layers. */
+	if (sc && sa_ctx && (sa_ctx->spacetype == SPACE_BUTS)) {
+		const unsigned int lay = BKE_screen_view3d_layer_all(sc);
+		if (lay) {
+			return lay;
+		}
+	}
+	return scene->lay;
+}
+
 const char *screen_context_dir[] = {
 	"scene", "visible_objects", "visible_bases", "selectable_objects", "selectable_bases",
 	"selected_objects", "selected_bases",
@@ -101,10 +114,11 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
 		return 1;
 	}
 	else if (CTX_data_equals(member, "visible_objects") || CTX_data_equals(member, "visible_bases")) {
+		const unsigned int lay = context_layers(sc, scene, sa);
 		int visible_objects = CTX_data_equals(member, "visible_objects");
 
 		for (base = scene->base.first; base; base = base->next) {
-			if (((base->object->restrictflag & OB_RESTRICT_VIEW) == 0) && (base->lay & scene->lay)) {
+			if (((base->object->restrictflag & OB_RESTRICT_VIEW) == 0) && (base->lay & lay)) {
 				if (visible_objects)
 					CTX_data_id_list_add(result, &base->object->id);
 				else
@@ -115,10 +129,11 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
 		return 1;
 	}
 	else if (CTX_data_equals(member, "selectable_objects") || CTX_data_equals(member, "selectable_bases")) {
+		const unsigned int lay = context_layers(sc, scene, sa);
 		int selectable_objects = CTX_data_equals(member, "selectable_objects");
 
 		for (base = scene->base.first; base; base = base->next) {
-			if (base->lay & scene->lay) {
+			if (base->lay & lay) {
 				if ((base->object->restrictflag & OB_RESTRICT_VIEW) == 0 && (base->object->restrictflag & OB_RESTRICT_SELECT) == 0) {
 					if (selectable_objects)
 						CTX_data_id_list_add(result, &base->object->id);
@@ -131,10 +146,11 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
 		return 1;
 	}
 	else if (CTX_data_equals(member, "selected_objects") || CTX_data_equals(member, "selected_bases")) {
+		const unsigned int lay = context_layers(sc, scene, sa);
 		int selected_objects = CTX_data_equals(member, "selected_objects");
 
 		for (base = scene->base.first; base; base = base->next) {
-			if ((base->flag & SELECT) && (base->lay & scene->lay)) {
+			if ((base->flag & SELECT) && (base->lay & lay)) {
 				if (selected_objects)
 					CTX_data_id_list_add(result, &base->object->id);
 				else
@@ -145,10 +161,11 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
 		return 1;
 	}
 	else if (CTX_data_equals(member, "selected_editable_objects") || CTX_data_equals(member, "selected_editable_bases")) {
+		const unsigned int lay = context_layers(sc, scene, sa);
 		int selected_editable_objects = CTX_data_equals(member, "selected_editable_objects");
 
 		for (base = scene->base.first; base; base = base->next) {
-			if ((base->flag & SELECT) && (base->lay & scene->lay)) {
+			if ((base->flag & SELECT) && (base->lay & lay)) {
 				if ((base->object->restrictflag & OB_RESTRICT_VIEW) == 0) {
 					if (0 == BKE_object_is_libdata(base->object)) {
 						if (selected_editable_objects)




More information about the Bf-blender-cvs mailing list