diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2010-10-02 13:28:41 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2010-10-02 13:28:41 +0400 |
commit | 1410df2f143fda0e21eef3e778ca5b6572d301cd (patch) | |
tree | f5d56e2fe77e173beaee91889cd7eaf5866579df /source/blender/editors/space_view3d/space_view3d.c | |
parent | b6bdf681fbe7f223a3f469490514501a580aedd5 (diff) |
Fix #23629: Layers doesn't sign there are objects on them, only if the object is selected
Also fixed layer buttons update when changing scene/screen
Diffstat (limited to 'source/blender/editors/space_view3d/space_view3d.c')
-rw-r--r-- | source/blender/editors/space_view3d/space_view3d.c | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index a49ada8a4c9..4c9d8f88dd1 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -529,30 +529,30 @@ static void *view3d_main_area_duplicate(void *poin) return NULL; } -static void view3d_recalc_used_layers(ARegion *ar, wmNotifier *wmn) +static void view3d_recalc_used_layers(ARegion *ar, wmNotifier *wmn, Scene *scene) { wmWindow *win= wmn->wm->winactive; ScrArea *sa; + int lay_used= 0; + Base *base; if (!win) return; - sa= win->screen->areabase.first; + base= scene->base.first; + while(base) { + lay_used|= base->lay; + + if (lay_used & (1<<20-1)) break; + + base= base->next; + } + 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; - } - + v3d->lay_used= lay_used; break; } @@ -562,6 +562,8 @@ static void view3d_recalc_used_layers(ARegion *ar, wmNotifier *wmn) static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn) { + bScreen *sc; + /* context changes */ switch(wmn->category) { case NC_ANIMATION: @@ -584,7 +586,7 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn) case NC_SCENE: switch(wmn->data) { case ND_LAYER_CONTENT: - view3d_recalc_used_layers(ar, wmn); + view3d_recalc_used_layers(ar, wmn, wmn->reference); ED_region_tag_redraw(ar); break; case ND_FRAME: @@ -681,10 +683,22 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn) ED_region_tag_redraw(ar); break; case NC_SCREEN: - if(wmn->data == ND_GPENCIL) - ED_region_tag_redraw(ar); - else if(wmn->data==ND_ANIMPLAY) - ED_region_tag_redraw(ar); + switch(wmn->data) { + case ND_GPENCIL: + case ND_ANIMPLAY: + ED_region_tag_redraw(ar); + break; + case ND_SCREENBROWSE: + case ND_SCREENDELETE: + case ND_SCREENSET: + /* screen was changed, need to update used layers due to NC_SCENE|ND_LAYER_CONTENT */ + /* updates used layers only for View3D in active screen */ + sc= wmn->reference; + view3d_recalc_used_layers(ar, wmn, sc->scene); + ED_region_tag_redraw(ar); + break; + } + break; } } |