Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2010-08-28 11:07:02 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2010-08-28 11:07:02 +0400
commit0d530c3ddbff61ff0b566bc59b0f433961b38937 (patch)
treea3dfeb3b93b3e150cae0f5fc28d94509a193b5df /source/blender
parent5c23537daa5c669b672528b0ed2bcaef2038f766 (diff)
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
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/object/object_add.c5
-rw-r--r--source/blender/editors/object/object_relations.c2
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c37
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c5
-rw-r--r--source/blender/editors/util/undo.c2
-rw-r--r--source/blender/makesrna/intern/rna_object.c4
-rw-r--r--source/blender/windowmanager/WM_types.h1
7 files changed, 50 insertions, 6 deletions
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 4df3e0ee1de..924e72e264a 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -305,6 +305,8 @@ Object *ED_object_add_type(bContext *C, int type, float *loc, float *rot, int en
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 @@ static int object_delete_exec(bContext *C, wmOperator *op)
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;
}
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index b8eebd161dc..2aaabebdb29 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -1109,6 +1109,8 @@ static int move_to_layer_exec(bContext *C, wmOperator *op)
/* 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;
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index c49f4f48e10..1e035797bea 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -513,6 +513,37 @@ static void *view3d_main_area_duplicate(void *poin)
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 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
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 @@ static void view3d_header_area_listener(ARegion *ar, wmNotifier *wmn)
case ND_MODE:
case ND_LAYER:
case ND_TOOLSETTINGS:
+ case ND_LAYER_CONTENT:
ED_region_tag_redraw(ar);
break;
}
@@ -728,6 +764,7 @@ static void view3d_buttons_area_listener(ARegion *ar, wmNotifier *wmn)
case ND_OB_SELECT:
case ND_MODE:
case ND_LAYER:
+ case ND_LAYER_CONTENT:
ED_region_tag_redraw(ar);
break;
}
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index f0aa54248da..56e66e21a72 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2367,14 +2367,9 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
/* 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 */
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c
index 283e2b49f0d..e5128ea784a 100644
--- a/source/blender/editors/util/undo.c
+++ b/source/blender/editors/util/undo.c
@@ -163,6 +163,8 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
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));
}
}
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index 45407a8e375..17074c7ec83 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -257,6 +257,8 @@ static void rna_Object_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr)
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 @@ static void rna_Base_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr)
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)
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index c84a5e64889..807125765f7 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -184,6 +184,7 @@ typedef struct wmNotifier {
#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)