Revision: 20616
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20616
Author:   blendix
Date:     2009-06-04 01:33:56 +0200 (Thu, 04 Jun 2009)

Log Message:
-----------
UI:
* First step for buttons context browsing, read-only still.
* Drawn in a panel now, though this should become a separate region.
* Path of the context is constructed as an array of RNA pointers and
  then used for drawing and context lookups from python.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    
branches/blender2.5/blender/source/blender/editors/interface/interface_panel.c
    branches/blender2.5/blender/source/blender/editors/preview/previewrender.c
    branches/blender2.5/blender/source/blender/editors/screen/area.c
    
branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_context.c
    
branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_intern.h
    
branches/blender2.5/blender/source/blender/editors/space_buttons/space_buttons.c
    branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_space_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_texture.c

Modified: 
branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c     
2009-06-03 23:22:43 UTC (rev 20615)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c     
2009-06-03 23:33:56 UTC (rev 20616)
@@ -4190,6 +4190,7 @@
                                                SpaceButs *sbuts= (SpaceButs 
*)sl;
                                                sbuts->lockpoin= NULL;
                                                sbuts->ri= NULL;
+                                               sbuts->pinid= newlibadr(fd, 
sc->id.lib, sbuts->pinid);
                                                if(main->versionfile<132)
                                                        
butspace_version_132(sbuts);
                                        }
@@ -4391,6 +4392,7 @@
                                else if(sl->spacetype==SPACE_BUTS) {
                                        SpaceButs *sbuts= (SpaceButs *)sl;
                                        sbuts->lockpoin= NULL;
+                                       sbuts->pinid = 
restore_pointer_by_name(newmain, sbuts->pinid, 0);
                                        //XXX if (sbuts->ri) sbuts->ri->curtile 
= 0;
                                }
                                else if(sl->spacetype==SPACE_FILE) {
@@ -4674,6 +4676,10 @@
                                        direct_link_gpencil(fd, sseq->gpd);
                                }
                        }
+                       else if(sl->spacetype==SPACE_BUTS) {
+                               SpaceButs *sbuts= (SpaceButs *)sl;
+                               sbuts->path= NULL;
+                       }
                }
                
                sa->actionzones.first= sa->actionzones.last= NULL;
@@ -6744,26 +6750,26 @@
                                        
                                                if(sbuts->mainb==BUTS_LAMP) {
                                                        sbuts->mainb= 
CONTEXT_SHADING;
-                                                       
sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_LAMP;
+                                                       
//sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_LAMP;
                                                }
                                                else if(sbuts->mainb==BUTS_MAT) 
{
                                                        sbuts->mainb= 
CONTEXT_SHADING;
-                                                       
sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_MAT;
+                                                       
//sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_MAT;
                                                }
                                                else if(sbuts->mainb==BUTS_TEX) 
{
                                                        sbuts->mainb= 
CONTEXT_SHADING;
-                                                       
sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_TEX;
+                                                       
//sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_TEX;
                                                }
                                                else 
if(sbuts->mainb==BUTS_ANIM) {
                                                        sbuts->mainb= 
CONTEXT_OBJECT;
                                                }
                                                else 
if(sbuts->mainb==BUTS_WORLD) {
                                                        sbuts->mainb= 
CONTEXT_SCENE;
-                                                       
sbuts->tab[CONTEXT_SCENE]= TAB_SCENE_WORLD;
+                                                       
//sbuts->tab[CONTEXT_SCENE]= TAB_SCENE_WORLD;
                                                }
                                                else 
if(sbuts->mainb==BUTS_RENDER) {
                                                        sbuts->mainb= 
CONTEXT_SCENE;
-                                                       
sbuts->tab[CONTEXT_SCENE]= TAB_SCENE_RENDER;
+                                                       
//sbuts->tab[CONTEXT_SCENE]= TAB_SCENE_RENDER;
                                                }
                                                else 
if(sbuts->mainb==BUTS_GAME) {
                                                        sbuts->mainb= 
CONTEXT_LOGIC;
@@ -6773,7 +6779,7 @@
                                                }
                                                else 
if(sbuts->mainb==BUTS_RADIO) {
                                                        sbuts->mainb= 
CONTEXT_SHADING;
-                                                       
sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_RAD;
+                                                       
//sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_RAD;
                                                }
                                                else 
if(sbuts->mainb==BUTS_CONSTRAINT) {
                                                        sbuts->mainb= 
CONTEXT_OBJECT;

Modified: 
branches/blender2.5/blender/source/blender/editors/interface/interface_panel.c
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/interface/interface_panel.c  
    2009-06-03 23:22:43 UTC (rev 20615)
+++ 
branches/blender2.5/blender/source/blender/editors/interface/interface_panel.c  
    2009-06-03 23:33:56 UTC (rev 20616)
@@ -119,7 +119,7 @@
                SpaceButs *sbuts= sa->spacedata.first;
 
                if(sbuts->align)
-                       if(sbuts->re_align || sbuts->mainbo!=sbuts->mainb || 
sbuts->tabo!=sbuts->tab[sbuts->mainb])
+                       if(sbuts->re_align || sbuts->mainbo!=sbuts->mainb)
                                return 1;
        }
        else if(ar->regiontype==RGN_TYPE_UI)

Modified: 
branches/blender2.5/blender/source/blender/editors/preview/previewrender.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/preview/previewrender.c  
2009-06-03 23:22:43 UTC (rev 20615)
+++ branches/blender2.5/blender/source/blender/editors/preview/previewrender.c  
2009-06-03 23:33:56 UTC (rev 20616)
@@ -586,7 +586,7 @@
        sbuts->lockpoin= id;
        
        if(sbuts->mainb==CONTEXT_SHADING) {
-               int tab= sbuts->tab[CONTEXT_SHADING];
+               int tab= TAB_SHADING_MAT; // XXX sbuts->tab[CONTEXT_SHADING];
                
                if(tab==TAB_SHADING_MAT) 
                        idshow = sbuts->lockpoin;

Modified: branches/blender2.5/blender/source/blender/editors/screen/area.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/area.c    
2009-06-03 23:22:43 UTC (rev 20615)
+++ branches/blender2.5/blender/source/blender/editors/screen/area.c    
2009-06-03 23:33:56 UTC (rev 20616)
@@ -1137,7 +1137,7 @@
        for(pt= ar->type->paneltypes.first; pt; pt= pt->next) {
                /* verify context */
                if(context)
-                       if(!pt->context || strcmp(context, pt->context) != 0)
+                       if(pt->context[0] && strcmp(context, pt->context) != 0)
                                continue;
 
                /* draw panel */

Modified: 
branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_context.c
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_context.c
  2009-06-03 23:22:43 UTC (rev 20615)
+++ 
branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_context.c
  2009-06-03 23:33:56 UTC (rev 20616)
@@ -26,154 +26,455 @@
  */
 
 #include <stdlib.h>
+#include <string.h>
 
+#include "MEM_guardedalloc.h"
+
 #include "DNA_armature_types.h"
-#include "DNA_object_types.h"
+#include "DNA_lamp_types.h"
 #include "DNA_material_types.h"
 #include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
 #include "DNA_particle_types.h"
 #include "DNA_texture_types.h"
 #include "DNA_world_types.h"
 
+#include "BLI_listbase.h"
+
 #include "BKE_context.h"
 #include "BKE_material.h"
 #include "BKE_modifier.h"
 #include "BKE_particle.h"
+#include "BKE_screen.h"
+#include "BKE_utildefines.h"
 
 #include "RNA_access.h"
 
+#include "UI_interface.h"
+#include "UI_resources.h"
+
 #include "buttons_intern.h"    // own include
 
-int buttons_context(const bContext *C, const char *member, bContextDataResult 
*result)
+typedef struct ButsContextPath {
+       PointerRNA ptr[8];
+       int len;
+} ButsContextPath;
+
+/************************* Creating the Path ************************/
+
+static int buttons_context_path_scene(ButsContextPath *path)
 {
-       Scene *scene= CTX_data_scene(C);
-       Object *ob= (scene->basact)? scene->basact->object: NULL;
+       PointerRNA *ptr= &path->ptr[path->len-1];
 
-       if(CTX_data_equals(member, "scene")) {
-               CTX_data_pointer_set(result, &scene->id, &RNA_Scene, scene);
+       /* this one just verifies */
+       return RNA_struct_is_a(ptr->type, &RNA_Scene);
+}
+
+static int buttons_context_path_world(ButsContextPath *path)
+{
+       Scene *scene;
+       PointerRNA *ptr= &path->ptr[path->len-1];
+
+       /* if we already have a (pinned) world, we're done */
+       if(RNA_struct_is_a(ptr->type, &RNA_World)) {
                return 1;
        }
-       else if(CTX_data_equals(member, "world")) {
-               CTX_data_pointer_set(result, &scene->world->id, &RNA_World, 
scene->world);
+       /* if we have a scene, use the scene's world */
+       else if(buttons_context_path_scene(path)) {
+               scene= path->ptr[path->len-1].data;
+
+               RNA_id_pointer_create(&scene->world->id, &path->ptr[path->len]);
+               path->len++;
+
                return 1;
        }
-       else if(CTX_data_equals(member, "object")) {
-               CTX_data_pointer_set(result, &ob->id, &RNA_Object, ob);
+
+       /* no path to a world possible */
+       return 0;
+}
+
+static int buttons_context_path_object(ButsContextPath *path)
+{
+       Scene *scene;
+       Object *ob;
+       PointerRNA *ptr= &path->ptr[path->len-1];
+
+       /* if we already have a (pinned) object, we're done */
+       if(RNA_struct_is_a(ptr->type, &RNA_Object)) {
                return 1;
        }
-       else if(CTX_data_equals(member, "mesh")) {
-               if(ob && ob->type == OB_MESH) {
-                       CTX_data_pointer_set(result, ob->data, &RNA_Mesh, 
ob->data);
+       /* if we have a scene, use the scene's active object */
+       else if(buttons_context_path_scene(path)) {
+               scene= path->ptr[path->len-1].data;
+               ob= (scene->basact)? scene->basact->object: NULL;
+
+               if(ob) {
+                       RNA_id_pointer_create(&ob->id, &path->ptr[path->len]);
+                       path->len++;
+
                        return 1;
                }
        }
-       else if(CTX_data_equals(member, "armature")) {
-               if(ob && ob->type == OB_ARMATURE) {
-                       CTX_data_pointer_set(result, ob->data, &RNA_Armature, 
ob->data);
+
+       /* no path to a object possible */
+       return 0;
+}
+
+static int buttons_context_path_data(ButsContextPath *path, int type)
+{
+       Object *ob;
+
+       /* try to get an object in the path, no pinning supported here */
+       if(buttons_context_path_object(path)) {
+               ob= path->ptr[path->len-1].data;
+
+               if(type == -1 || type == ob->type) {
+                       RNA_id_pointer_create(ob->data, &path->ptr[path->len]);
+                       path->len++;
+
                        return 1;
                }
        }
-       else if(CTX_data_equals(member, "lattice")) {
-               if(ob && ob->type == OB_LATTICE) {
-                       CTX_data_pointer_set(result, ob->data, &RNA_Lattice, 
ob->data);
+
+       /* no path to data possible */
+       return 0;
+}
+
+static int buttons_context_path_material(ButsContextPath *path)
+{
+       Object *ob;
+       PointerRNA *ptr= &path->ptr[path->len-1];
+
+       /* if we already have a (pinned) material, we're done */
+       if(RNA_struct_is_a(ptr->type, &RNA_Material)) {
+               return 1;
+       }
+       /* if we have an object, use the object material slot */
+       else if(buttons_context_path_object(path)) {
+               ob= path->ptr[path->len-1].data;
+
+               if(ob && ob->type && (ob->type<OB_LAMP)) {
+                       RNA_pointer_create(&ob->id, &RNA_MaterialSlot, 
ob->mat+ob->actcol-1, &path->ptr[path->len]);
+                       path->len++;
                        return 1;
                }
        }
-       else if(CTX_data_equals(member, "curve")) {
-               if(ob && ob->type == OB_CURVE) {
-                       CTX_data_pointer_set(result, ob->data, &RNA_Curve, 
ob->data);
+
+       /* no path to a material possible */
+       return 0;
+}
+
+static Bone *find_active_bone(Bone *bone)
+{
+       Bone *active;
+
+       for(; bone; bone=bone->next) {
+               if(bone->flag & BONE_ACTIVE)
+                       return bone;
+
+               active= find_active_bone(bone->childbase.first);
+               if(active)
+                       return active;
+       }
+
+       return NULL;
+}
+
+static int buttons_context_path_bone(ButsContextPath *path)
+{
+       bArmature *arm;
+       Bone *bone;
+
+       /* if we have an armature, get the active bone */
+       if(buttons_context_path_data(path, OB_ARMATURE)) {
+               arm= path->ptr[path->len-1].data;
+               bone= find_active_bone(arm->bonebase.first);
+
+               if(bone) {
+                       RNA_pointer_create(&arm->id, &RNA_Bone, bone, 
&path->ptr[path->len]);
+                       path->len++;
                        return 1;
                }
        }
-       else if(CTX_data_equals(member, "meta_ball")) {
-               if(ob && ob->type == OB_MBALL) {
-                       CTX_data_pointer_set(result, ob->data, &RNA_MetaBall, 
ob->data);
+
+       /* no path to a bone possible */
+       return 0;
+}
+
+static int buttons_context_path_particle(ButsContextPath *path)
+{
+       Object *ob;

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to