Merged changes in the trunk up to revision 27752.
[blender.git] / source / blender / makesrna / intern / rna_scene.c
index 02e56e92a8d67cf3e7df378de1451cfd9e14f449..1f5d47dbfbc678c8e6d3bbabb8113fbefce7e1ae 100644 (file)
@@ -25,7 +25,6 @@
 #include <stdlib.h>
 
 #include "RNA_define.h"
-#include "RNA_types.h"
 #include "RNA_enum_types.h"
 
 #include "rna_internal.h"
@@ -167,6 +166,7 @@ EnumPropertyItem image_type_items[] = {
 #include "ED_view3d.h"
 #include "ED_object.h"
 #include "ED_mesh.h"
+#include "ED_keyframing.h"
 
 #include "RE_pipeline.h"
 
@@ -359,46 +359,60 @@ static void rna_Scene_frame_update(bContext *C, PointerRNA *ptr)
        sound_seek_scene(C);
 }
 
-static int rna_Scene_active_keying_set_editable(PointerRNA *ptr)
-{
-       Scene *scene= (Scene *)ptr->data;
-       
-       /* only editable if there are some Keying Sets to change to */
-       return (scene->keyingsets.first != NULL);
-}
-
 static PointerRNA rna_Scene_active_keying_set_get(PointerRNA *ptr)
 {
        Scene *scene= (Scene *)ptr->data;
-       return rna_pointer_inherit_refine(ptr, &RNA_KeyingSet, BLI_findlink(&scene->keyingsets, scene->active_keyingset-1));
+       return rna_pointer_inherit_refine(ptr, &RNA_KeyingSet, ANIM_scene_get_active_keyingset(scene));
 }
 
 static void rna_Scene_active_keying_set_set(PointerRNA *ptr, PointerRNA value)
 {
        Scene *scene= (Scene *)ptr->data;
        KeyingSet *ks= (KeyingSet*)value.data;
-       scene->active_keyingset= BLI_findindex(&scene->keyingsets, ks) + 1;
+       
+       scene->active_keyingset= ANIM_scene_get_keyingset_index(scene, ks);
 }
 
-static int rna_Scene_active_keying_set_index_get(PointerRNA *ptr)
+#if 0 // XXX: these need to be fixed up first...
+static void rna_Scene_active_keying_set_index_range(PointerRNA *ptr, int *min, int *max)
 {
        Scene *scene= (Scene *)ptr->data;
-       return MAX2(scene->active_keyingset-1, 0);
+       
+       // FIXME: would need access to builtin keyingsets list to count min...
+       *min= 0;
+       *max= 0;
 }
+#endif
+
+// XXX: evil... builtin_keyingsets is defined in keyingsets.c!
+// TODO: make API function to retrieve this...
+extern ListBase builtin_keyingsets;
 
-static void rna_Scene_active_keying_set_index_set(PointerRNA *ptr, int value)
+static void rna_Scene_all_keyingsets_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
 {
-       Scene *scene= (Scene *)ptr->data;
-       scene->active_keyingset= value+1;
+       Scene *scene= (Scene*)ptr->data;
+       
+       /* start going over the scene KeyingSets first, while we still have pointer to it 
+        * but only if we have any Keying Sets to use...
+        */
+       if (scene->keyingsets.first)
+               rna_iterator_listbase_begin(iter, &scene->keyingsets, NULL);
+       else
+               rna_iterator_listbase_begin(iter, &builtin_keyingsets, NULL);
 }
 
-static void rna_Scene_active_keying_set_index_range(PointerRNA *ptr, int *min, int *max)
+static void rna_Scene_all_keyingsets_next(CollectionPropertyIterator *iter)
 {
-       Scene *scene= (Scene *)ptr->data;
-
-       *min= 0;
-       *max= BLI_countlist(&scene->keyingsets)-1;
-       *max= MAX2(0, *max);
+       ListBaseIterator *internal= iter->internal;
+       KeyingSet *ks= (KeyingSet*)internal->link;
+       
+       /* if we've run out of links in Scene list, jump over to the builtins list unless we're there already */
+       if ((ks->next == NULL) && (ks != builtin_keyingsets.last))
+               internal->link= (Link*)builtin_keyingsets.first;
+       else
+               internal->link= (Link*)ks->next;
+               
+       iter->valid= (internal->link != NULL);
 }
 
 
@@ -634,7 +648,7 @@ static void rna_SceneRenderLayer_name_set(PointerRNA *ptr, const char *value)
        Scene *scene= (Scene*)ptr->id.data;
        SceneRenderLayer *rl= (SceneRenderLayer*)ptr->data;
 
-    BLI_strncpy(rl->name, value, sizeof(rl->name));
+       BLI_strncpy(rl->name, value, sizeof(rl->name));
 
        if(scene->nodetree) {
                bNode *node;
@@ -1447,7 +1461,7 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
                {DOME_PANORAM_SPH, "PANORAM_SPH", 0, "Spherical Panoramic", ""},
                {0, NULL, 0, NULL, NULL}};
                
-       static EnumPropertyItem stereo_modes_items[] ={
+        static EnumPropertyItem stereo_modes_items[] ={
                {STEREO_QUADBUFFERED, "QUADBUFFERED", 0, "Quad-Buffer", ""},
                {STEREO_ABOVEBELOW, "ABOVEBELOW", 0, "Above-Below", ""},
                {STEREO_INTERLACED, "INTERLACED", 0, "Interlaced", ""},
@@ -1456,7 +1470,7 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
                {STEREO_VINTERLACE, "VINTERLACE", 0, "Vinterlace", ""},
                {0, NULL, 0, NULL, NULL}};
                
-       static EnumPropertyItem stereo_items[] ={
+        static EnumPropertyItem stereo_items[] ={
                {STEREO_NOSTEREO, "NONE", 0, "None", "Disable Stereo and Dome environments"},
                {STEREO_ENABLED, "STEREO", 0, "Stereo", "Enable Stereo environment"},
                {STEREO_DOME, "DOME", 0, "Dome", "Enable Dome environment"},
@@ -2422,7 +2436,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
        
        prop= RNA_def_property(srna, "full_sample", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_FULL_SAMPLE);
-       RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_full_sample_get", NULL);
+        RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_full_sample_get", NULL);
        RNA_def_property_ui_text(prop, "Full Sample","Save for every anti-aliasing sample the entire RenderLayer results. This solves anti-aliasing issues with compositing");
        RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
        
@@ -2909,21 +2923,26 @@ void RNA_def_scene(BlenderRNA *brna)
        prop= RNA_def_property(srna, "keying_sets", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "keyingsets", NULL);
        RNA_def_property_struct_type(prop, "KeyingSet");
-       RNA_def_property_ui_text(prop, "Keying Sets", "Keying Sets for this Scene");
+       RNA_def_property_ui_text(prop, "Absolute Keying Sets", "Absolute Keying Sets for this Scene");
+       RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL);
+       
+       prop= RNA_def_property(srna, "all_keying_sets", PROP_COLLECTION, PROP_NONE);
+       RNA_def_property_collection_funcs(prop, "rna_Scene_all_keyingsets_begin", "rna_Scene_all_keyingsets_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0);
+       RNA_def_property_struct_type(prop, "KeyingSet");
+       RNA_def_property_ui_text(prop, "All Keying Sets", "All Keying Sets available for use (builtins and Absolute Keying Sets for this Scene)");
        RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL);
        
        prop= RNA_def_property(srna, "active_keying_set", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "KeyingSet");
        RNA_def_property_flag(prop, PROP_EDITABLE);
-       RNA_def_property_editable_func(prop, "rna_Scene_active_keying_set_editable");
        RNA_def_property_pointer_funcs(prop, "rna_Scene_active_keying_set_get", "rna_Scene_active_keying_set_set", NULL);
        RNA_def_property_ui_text(prop, "Active Keying Set", "Active Keying Set used to insert/delete keyframes");
        RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL);
        
        prop= RNA_def_property(srna, "active_keying_set_index", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "active_keyingset");
-       RNA_def_property_int_funcs(prop, "rna_Scene_active_keying_set_index_get", "rna_Scene_active_keying_set_index_set", "rna_Scene_active_keying_set_index_range");
-       RNA_def_property_ui_text(prop, "Active Keying Set Index", "Current Keying Set index");
+       //RNA_def_property_int_funcs(prop, NULL, NULL, "rna_Scene_active_keying_set_index_range"); // XXX
+       RNA_def_property_ui_text(prop, "Active Keying Set Index", "Current Keying Set index (negative for 'builtin' and positive for 'absolute')");
        RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL);
        
        /* Tool Settings */