[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31627] trunk/blender/source/blender: Fix #23363: Layer buttons do not update when last object deleted

Sergey Sharybin g.ulairi at gmail.com
Sat Aug 28 09:07:02 CEST 2010


Revision: 31627
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31627
Author:   nazgul
Date:     2010-08-28 09:07:02 +0200 (Sat, 28 Aug 2010)

Log Message:
-----------
Fix #23363: Layer buttons do not update when last object deleted

This happend because of incorrect order of calculating used layer mask and drawing
header. Added layer content changed notifier to recalc used layers when needed.
This also fixes header redrawing in "Move to layer" operator and when user
changes Object.layers in properties view

Modified Paths:
--------------
    trunk/blender/source/blender/editors/object/object_add.c
    trunk/blender/source/blender/editors/object/object_relations.c
    trunk/blender/source/blender/editors/space_view3d/space_view3d.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/editors/util/undo.c
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/blender/windowmanager/WM_types.h

Modified: trunk/blender/source/blender/editors/object/object_add.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_add.c	2010-08-28 02:07:55 UTC (rev 31626)
+++ trunk/blender/source/blender/editors/object/object_add.c	2010-08-28 07:07:02 UTC (rev 31627)
@@ -305,6 +305,8 @@
 	if(enter_editmode)
 		ED_object_enter_editmode(C, EM_IGNORE_LAYER);
 
+	WM_event_add_notifier(C, NC_SCENE|ND_LAYER_CONTENT, scene);
+
 	return ob;
 }
 
@@ -825,7 +827,8 @@
 	DAG_scene_sort(bmain, scene);
 	DAG_ids_flush_update(bmain, 0);
 	
-	WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, CTX_data_scene(C));
+	WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
+	WM_event_add_notifier(C, NC_SCENE|ND_LAYER_CONTENT, scene);
 	
 	return OPERATOR_FINISHED;
 }

Modified: trunk/blender/source/blender/editors/object/object_relations.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_relations.c	2010-08-28 02:07:55 UTC (rev 31626)
+++ trunk/blender/source/blender/editors/object/object_relations.c	2010-08-28 07:07:02 UTC (rev 31627)
@@ -1109,6 +1109,8 @@
 	/* warning, active object may be hidden now */
 	
 	WM_event_add_notifier(C, NC_SCENE|NC_OBJECT|ND_DRAW, scene); /* is NC_SCENE needed ? */
+	WM_event_add_notifier(C, NC_SCENE|ND_LAYER_CONTENT, scene);
+
 	DAG_scene_sort(bmain, scene);
 
 	return OPERATOR_FINISHED;

Modified: trunk/blender/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2010-08-28 02:07:55 UTC (rev 31626)
+++ trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2010-08-28 07:07:02 UTC (rev 31627)
@@ -513,6 +513,37 @@
 	return NULL;
 }
 
+static void view3d_recalc_used_layers(ARegion *ar, wmNotifier *wmn)
+{
+	wmWindow *win= wmn->wm->winactive;
+	ScrArea *sa;
+
+	if (!win) return;
+
+	sa= win->screen->areabase.first;
+
+	while(sa) {
+		if(sa->spacetype == SPACE_VIEW3D)
+			if(BLI_findindex(&sa->regionbase, ar) >= 0) {
+				View3D *v3d= sa->spacedata.first;
+				Scene *scene= wmn->reference;
+				Base *base;
+
+				v3d->lay_used= 0;
+				base= scene->base.first;
+				while(base) {
+					v3d->lay_used|= base->lay;
+
+					base= base->next;
+				}
+
+				break;
+			}
+
+		sa= sa->next;
+	}
+}
+
 static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
 {
 	/* context changes */
@@ -536,6 +567,10 @@
 			break;
 		case NC_SCENE:
 			switch(wmn->data) {
+				case ND_LAYER_CONTENT:
+					view3d_recalc_used_layers(ar, wmn);
+					ED_region_tag_redraw(ar);
+					break;
 				case ND_FRAME:
 				case ND_TRANSFORM:
 				case ND_OB_ACTIVE:
@@ -677,6 +712,7 @@
 				case ND_MODE:
 				case ND_LAYER:
 				case ND_TOOLSETTINGS:
+				case ND_LAYER_CONTENT:
 					ED_region_tag_redraw(ar);
 					break;
 			}
@@ -728,6 +764,7 @@
 				case ND_OB_SELECT:
 				case ND_MODE:
 				case ND_LAYER:
+				case ND_LAYER_CONTENT:
 					ED_region_tag_redraw(ar);
 					break;
 			}

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2010-08-28 02:07:55 UTC (rev 31626)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2010-08-28 07:07:02 UTC (rev 31627)
@@ -2367,14 +2367,9 @@
 		
 		/* Transp and X-ray afterdraw stuff for sets is done later */
 	}
-	
-	/* extra service in layerbuttons, showing used layers */
-	v3d->lay_used = 0;
 
 	/* then draw not selected and the duplis, but skip editmode object */
 	for(base= scene->base.first; base; base= base->next) {
-		v3d->lay_used |= base->lay;
-		
 		if(v3d->lay & base->lay) {
 			
 			/* dupli drawing */

Modified: trunk/blender/source/blender/editors/util/undo.c
===================================================================
--- trunk/blender/source/blender/editors/util/undo.c	2010-08-28 02:07:55 UTC (rev 31626)
+++ trunk/blender/source/blender/editors/util/undo.c	2010-08-28 07:07:02 UTC (rev 31627)
@@ -163,6 +163,8 @@
 					BKE_undo_name(C, undoname);
 				else
 					BKE_undo_step(C, step);
+
+				WM_event_add_notifier(C, NC_SCENE|ND_LAYER_CONTENT, CTX_data_scene(C));
 			}
 			
 		}

Modified: trunk/blender/source/blender/makesrna/intern/rna_object.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_object.c	2010-08-28 02:07:55 UTC (rev 31626)
+++ trunk/blender/source/blender/makesrna/intern/rna_object.c	2010-08-28 07:07:02 UTC (rev 31627)
@@ -257,6 +257,8 @@
 
 	rna_Object_layer_update__internal(bmain, scene, base, ob);
 	ob->lay= base->lay;
+
+	WM_main_add_notifier(NC_SCENE|ND_LAYER_CONTENT, scene);
 }
 
 static void rna_Base_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -266,6 +268,8 @@
 
 	rna_Object_layer_update__internal(bmain, scene, base, ob);
 	ob->lay= base->lay;
+
+	WM_main_add_notifier(NC_SCENE|ND_LAYER_CONTENT, scene);
 }
 
 static int rna_Object_data_editable(PointerRNA *ptr)

Modified: trunk/blender/source/blender/windowmanager/WM_types.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_types.h	2010-08-28 02:07:55 UTC (rev 31626)
+++ trunk/blender/source/blender/windowmanager/WM_types.h	2010-08-28 07:07:02 UTC (rev 31627)
@@ -184,6 +184,7 @@
 #define ND_TOOLSETTINGS		(13<<16)
 #define ND_LAYER			(14<<16)
 #define ND_FRAME_RANGE		(15<<16)
+#define ND_LAYER_CONTENT	(101<<16)
 
 	/* NC_OBJECT Object */
 #define	ND_TRANSFORM		(16<<16)





More information about the Bf-blender-cvs mailing list