Revision: 59374
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59374
Author:   mont29
Date:     2013-08-21 21:35:45 +0000 (Wed, 21 Aug 2013)
Log Message:
-----------
Fix [#36530] Texture tab refreshing problem

That was not really a bug (code working as expected), but the way tex context 
was handled was a bit raw, now it is much smarter:
* Default fallback context (when current one is no more valid) will now choose 
"most specific" ones first (i.e. material/lamp/particules before world and 
"others").
* When using that default fallback context, previous one is stored and we try 
to revive it later, if possible. Thus e.g. object[mat tex ctxt] -> 
empty[default world ctxt] -> object[mat tex ctxt] is now working as expected.
* However, when user explicitely or implicitely (through e.g. going to Material 
context...) sets a tex context, previous one is not stored, so that only 
default fallback context switch may later automatically revive a previous 
(presumably user-set) context.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_buttons/buttons_texture.c
    trunk/blender/source/blender/makesdna/DNA_space_types.h
    trunk/blender/source/blender/makesrna/intern/rna_space.c

Modified: trunk/blender/source/blender/editors/space_buttons/buttons_texture.c
===================================================================
--- trunk/blender/source/blender/editors/space_buttons/buttons_texture.c        
2013-08-21 21:20:51 UTC (rev 59373)
+++ trunk/blender/source/blender/editors/space_buttons/buttons_texture.c        
2013-08-21 21:35:45 UTC (rev 59374)
@@ -150,21 +150,32 @@
                bool valid_particles = ED_texture_context_check_particles(C);
                bool valid_others = ED_texture_context_check_others(C);
 
+               /* this is similar to direct user action, no need to keep 
"better" ctxt in _prev */
                if ((sbuts->mainb == BCONTEXT_WORLD) && valid_world) {
-                       sbuts->texture_context = SB_TEXC_WORLD;
+                       sbuts->texture_context = sbuts->texture_context_prev = 
SB_TEXC_WORLD;
                }
                else if ((sbuts->mainb == BCONTEXT_MATERIAL) && valid_material) 
{
-                       sbuts->texture_context = SB_TEXC_MATERIAL;
+                       sbuts->texture_context = sbuts->texture_context_prev = 
SB_TEXC_MATERIAL;
                }
                else if ((sbuts->mainb == BCONTEXT_DATA) && valid_lamp) {
-                       sbuts->texture_context = SB_TEXC_LAMP;
+                       sbuts->texture_context = sbuts->texture_context_prev = 
SB_TEXC_LAMP;
                }
                else if ((sbuts->mainb == BCONTEXT_PARTICLE) && 
valid_particles) {
-                       sbuts->texture_context = SB_TEXC_PARTICLES;
+                       sbuts->texture_context = sbuts->texture_context_prev = 
SB_TEXC_PARTICLES;
                }
                else if ((ELEM(sbuts->mainb, BCONTEXT_MODIFIER, 
BCONTEXT_PHYSICS)) && valid_others) {
-                       sbuts->texture_context = SB_TEXC_OTHER;
+                       sbuts->texture_context = sbuts->texture_context_prev = 
SB_TEXC_OTHER;
                }
+               /* Else, try to revive a previous "better" ctxt... */
+               else if ((sbuts->texture_context_prev != 
sbuts->texture_context) &&
+                        (((sbuts->texture_context_prev == SB_TEXC_WORLD) && 
valid_world) ||
+                         ((sbuts->texture_context_prev == SB_TEXC_MATERIAL) && 
valid_material) ||
+                         ((sbuts->texture_context_prev == SB_TEXC_LAMP) && 
valid_lamp) ||
+                         ((sbuts->texture_context_prev == SB_TEXC_PARTICLES) 
&& valid_particles) ||
+                         ((sbuts->texture_context_prev == SB_TEXC_OTHER) && 
valid_others)))
+               {
+                       sbuts->texture_context = sbuts->texture_context_prev;
+               }
                /* Else, just be sure that current context is valid! */
                else if (((sbuts->texture_context == SB_TEXC_WORLD) && 
!valid_world) ||
                         ((sbuts->texture_context == SB_TEXC_MATERIAL) && 
!valid_material) ||
@@ -172,13 +183,9 @@
                         ((sbuts->texture_context == SB_TEXC_PARTICLES) && 
!valid_particles) ||
                         ((sbuts->texture_context == SB_TEXC_OTHER) && 
!valid_others))
                {
-                       if (valid_others) {
-                               sbuts->texture_context = SB_TEXC_OTHER;
-                       }
-                       else if (valid_world) {
-                               sbuts->texture_context = SB_TEXC_WORLD;
-                       }
-                       else if (valid_material) {
+                       /* this is default fallback, do keep "better" ctxt in 
_prev */
+                       sbuts->texture_context_prev = sbuts->texture_context;
+                       if (valid_material) {
                                sbuts->texture_context = SB_TEXC_MATERIAL;
                        }
                        else if (valid_lamp) {
@@ -187,6 +194,12 @@
                        else if (valid_particles) {
                                sbuts->texture_context = SB_TEXC_PARTICLES;
                        }
+                       else if (valid_world) {
+                               sbuts->texture_context = SB_TEXC_WORLD;
+                       }
+                       else if (valid_others) {
+                               sbuts->texture_context = SB_TEXC_OTHER;
+                       }
                }
        }
 }

Modified: trunk/blender/source/blender/makesdna/DNA_space_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_space_types.h     2013-08-21 
21:20:51 UTC (rev 59373)
+++ trunk/blender/source/blender/makesdna/DNA_space_types.h     2013-08-21 
21:35:45 UTC (rev 59374)
@@ -132,8 +132,9 @@
        short mainb, mainbo, mainbuser; /* context tabs */
        short re_align, align;          /* align for panels */
        short preview;                  /* preview is signal to refresh */
-       short texture_context;          /* texture context selector (material, 
world, brush)*/
-       char flag, pad;
+       /* texture context selector (material, lamp, particles, world, other)*/
+       short texture_context, texture_context_prev;
+       char flag, pad[7];
        
        void *path;                     /* runtime */
        int pathflag, dataicon;         /* runtime */

Modified: trunk/blender/source/blender/makesrna/intern/rna_space.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_space.c    2013-08-21 
21:20:51 UTC (rev 59373)
+++ trunk/blender/source/blender/makesrna/intern/rna_space.c    2013-08-21 
21:35:45 UTC (rev 59374)
@@ -959,6 +959,14 @@
        return item;
 }
 
+static void rna_SpaceProperties_texture_context_set(PointerRNA *ptr, int value)
+{
+       SpaceButs *sbuts = (SpaceButs *)(ptr->data);
+
+       /* User action, no need to keep "better" value in prev here! */
+       sbuts->texture_context = sbuts->texture_context_prev = value;
+}
+
 /* Space Console */
 static void rna_ConsoleLine_body_get(PointerRNA *ptr, char *value)
 {
@@ -2194,7 +2202,8 @@
 
        prop = RNA_def_property(srna, "texture_context", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, buttons_texture_context_items);
-       RNA_def_property_enum_funcs(prop, NULL, NULL, 
"rna_SpaceProperties_texture_context_itemf");
+       RNA_def_property_enum_funcs(prop, NULL, 
"rna_SpaceProperties_texture_context_set",
+                                   
"rna_SpaceProperties_texture_context_itemf");
        RNA_def_property_ui_text(prop, "Texture Context", "Type of texture data 
to display and edit");
        RNA_def_property_update(prop, NC_TEXTURE, NULL);
 

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to