getMarked return change to dict
[blender.git] / source / blender / python / api2_2x / sceneTimeLine.c
1 /* $Id$
2  *
3  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA        02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * This is a new part of Blender.
26  *
27  * Contributor(s): Joilnen Leite
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30 */
31
32 #include <BLI_blenlib.h>
33 #include "Scene.h"
34
35 #include <stdio.h>
36 #include <MEM_guardedalloc.h>   /* for MEM_callocN */
37
38 #include "gen_utils.h"
39 #include "sceneTimeLine.h"
40
41 // static PyObject *TimeLine_New (PyObject *self);
42 static PyObject *M_TimeLine_Get (PyObject *self, PyObject *args);
43
44 static char M_TimeLine_Get_doc[]= "Return the Scene.TimeLine.";
45
46 //----------------------Scene.TimeMarker subsubmodule method def----------------------------
47 struct PyMethodDef M_TimeLine_methods[]= {
48 //      {"New", (PyCFunction) M_TimeMarker_New, METH_NOVAR,
49 //       M_TimeLine_New_doc},
50         {"Get", (PyCFunction) M_TimeLine_Get, METH_VARARGS,
51          M_TimeLine_Get_doc},
52         {NULL, NULL, 0, NULL}
53 };
54
55 static PyObject *TimeLine_addMarker (BPy_TimeLine *self, PyObject *args);
56 static PyObject *TimeLine_delMarker (BPy_TimeLine *self, PyObject *args);
57 static PyObject *TimeLine_setNameMarker (BPy_TimeLine *self, PyObject *args);
58 static PyObject *TimeLine_getNameMarker (BPy_TimeLine *self, PyObject *args);
59 static PyObject *TimeLine_getFramesMarked (BPy_TimeLine *self, PyObject *args);
60
61 static void TimeLine_dealloc (PyObject *self) {
62         PyObject_DEL (self);
63 }
64
65 static PyObject *TimeLine_repr (BPy_TimeLine *self) {
66
67         return PyString_FromFormat ("TimeLine:)");
68 }
69
70 static PyMethodDef BPy_TimeLine_methods[] = {
71         {"add", (PyCFunction) TimeLine_addMarker,
72          METH_VARARGS,
73          "() - Add timemarker"},
74         {"delete", (PyCFunction) TimeLine_delMarker,
75          METH_VARARGS,
76          "() - delete timemarker"},
77         {"setName", (PyCFunction) TimeLine_setNameMarker,
78          METH_VARARGS,
79          "() - Get timemarker name"},
80         {"getName", (PyCFunction) TimeLine_getNameMarker,
81          METH_VARARGS,
82          "() - Set timemarker name"},
83         {"getMarked", (PyCFunction) TimeLine_getFramesMarked,
84          METH_VARARGS,
85          "() - Get frames timemarked"},
86         {NULL, NULL, 0, NULL}
87 };
88
89 /*-----------------------getattr----------------------------------------*/
90 static PyObject *TimeLine_getattr (BPy_TimeLine *self, char *name) {
91         return Py_FindMethod( BPy_TimeLine_methods, ( PyObject * ) self, name );
92 }
93
94 /*-----------------------setattr----------------------------------------*/
95 static int TimeLine_setattr (BPy_TimeLine *self, char *name, PyObject *value) {
96         PyObject *valtuple;
97         PyObject *error= NULL;
98
99         valtuple= Py_BuildValue ("(O)", value);
100
101         if (!valtuple)
102                 return EXPP_ReturnIntError( PyExc_MemoryError,
103                         "TimeLineSetAttr: couldn't create tuple" );
104         if( strcmp( name, "name" ) == 0 )
105                 error = TimeLine_setNameMarker (self, valtuple);
106         Py_DECREF (valtuple);
107         if (error != Py_None)
108                 return -1;
109
110         Py_DECREF (Py_None);
111         return 0;       
112 }
113
114 //-----------------------BPy_Scene method def------------------------------
115 PyTypeObject TimeLine_Type = {
116         PyObject_HEAD_INIT (NULL) 0,    /* ob_size */
117         "TimeLine",                     /* tp_name */
118         sizeof (BPy_TimeLine),  /* tp_basicsize */
119         0,                      /* tp_itemsize */
120         /* methods */
121         (destructor) TimeLine_dealloc,  /* tp_dealloc */
122         (printfunc) 0,  /* tp_print */
123         (getattrfunc) TimeLine_getattr, /* tp_getattr */
124         (setattrfunc) TimeLine_setattr, /* tp_setattr */
125         0,
126         (reprfunc) TimeLine_repr,       /* tp_repr */
127         0,                      /* tp_as_number */
128         0,                      /* tp_as_sequence */
129         0,                      /* tp_as_mapping */
130         0,                      /* tp_hash */
131         0,                      /* tp_as_number */
132         0,                      /* tp_as_sequence */
133         0,                      /* tp_as_mapping */
134         0,                      /* tp_hash */
135         0,0,0,0,0,0,0,0,0,
136         BPy_TimeLine_methods,
137         0,
138         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
139 };
140
141 PyObject *TimeLine_Init (void) 
142 {
143         PyObject *submodule;
144
145         if (PyType_Ready (&TimeLine_Type) < 0)
146                 return NULL;
147         submodule= Py_InitModule3 ("Blender.Scene.TimeLine", M_TimeLine_methods,
148                         "The Blender TimeLine subsubmodule");
149
150         return submodule;
151 }
152
153 PyObject *TimeLine_CreatePyObject (BPy_TimeLine *tl) {
154         BPy_TimeLine *bl_tl;
155
156         bl_tl= (BPy_TimeLine *) PyObject_NEW (BPy_TimeLine, &TimeLine_Type);
157
158         return (( PyObject * ) bl_tl);
159 }
160
161
162 PyObject *M_TimeLine_Get (PyObject *self, PyObject *args) {
163
164         return EXPP_incr_ret (Py_None);
165 }
166
167 static PyObject *TimeLine_getFramesMarked (BPy_TimeLine *self, PyObject *args) {
168
169         PyObject *marker_list= PyDict_New ();
170         TimeMarker *marker_it= NULL;
171         PyObject *tmarker= NULL;
172
173         if (!PyArg_ParseTuple( args, "|O", &tmarker ))
174                 return EXPP_ReturnPyObjError (PyExc_TypeError,
175                                               "expected nothing, or or two ints as arguments.");
176         if (tmarker) {
177                 int f;
178                 char s[64];
179                 f = PyInt_AsLong (tmarker);
180                 if (PyInt_Check (tmarker) && f != 0) {
181                         for (marker_it= self->marker_list->first; marker_it; marker_it= marker_it->next)
182                                 if (marker_it->frame==f) PyDict_SetItem (marker_list, PyInt_FromLong ((long int)marker_it->frame), PyString_FromString (marker_it->name));
183                 }
184                 else if (PyString_Check (tmarker) && (BLI_strncpy(s, PyString_AsString (tmarker), 64)) ) { 
185                         for (marker_it= self->marker_list->first; marker_it; marker_it= marker_it->next)
186                                 if (!strcmp (marker_it->name, s)) PyDict_SetItem (marker_list, PyInt_FromLong ((long int)marker_it->frame), PyString_FromString (marker_it->name));
187
188                 }
189         }
190         else
191                 for (marker_it= self->marker_list->first; marker_it; marker_it= marker_it->next) 
192                         PyDict_SetItem (marker_list, PyInt_FromLong ((long int)marker_it->frame), PyString_FromString (marker_it->name)); 
193         
194         return marker_list;
195 }
196
197 static PyObject *TimeLine_addMarker (BPy_TimeLine *self, PyObject *args) {
198         int frame= 0;
199         TimeMarker *marker= NULL, *marker_it= NULL;
200
201         if (!PyArg_ParseTuple( args, "i", &frame ))
202                 return EXPP_ReturnPyObjError (PyExc_TypeError,
203                       "expected int as argument.");
204         /* two markers can't be at the same place */
205         for (marker_it= self->marker_list->first; marker_it; marker_it= marker_it->next) {
206                 if (marker_it->frame==frame)
207                         return EXPP_incr_ret (Py_None);
208         }
209         if (frame<self->sfra || frame>self->efra)
210                 return EXPP_ReturnPyObjError (PyExc_TypeError, "frame out of range.");
211         marker= MEM_callocN (sizeof(TimeMarker), "TimeMarker");
212         if (!marker) return EXPP_incr_ret (Py_None); 
213         marker->frame= frame;
214         BLI_addtail (self->marker_list, marker);
215         return EXPP_incr_ret (Py_None);
216 }
217
218 static PyObject *TimeLine_delMarker (BPy_TimeLine *self, PyObject *args) {
219         int frame= 0;
220         TimeMarker *marker= NULL;
221         
222         if (!PyArg_ParseTuple (args, "|i", &frame))
223                 return EXPP_ReturnPyObjError (PyExc_TypeError,
224                                 "expected int as argument.");
225
226         for (marker= self->marker_list->first; marker; marker= marker->next) {
227                 if (!frame)
228                         BLI_freelinkN (self->marker_list, marker);
229                 else if (marker->frame == frame) {
230                         BLI_freelinkN (self->marker_list, marker);
231                         return EXPP_incr_ret (Py_None);
232                 }
233         }
234
235         return EXPP_incr_ret (Py_None);
236 }
237
238 static PyObject *TimeLine_setNameMarker (BPy_TimeLine *self, PyObject *args) {
239         char *buf;
240         char name[64];
241         int frame= 0;
242         TimeMarker *marker= NULL;
243         
244         if (!PyArg_ParseTuple( args, "is", &frame, &buf))
245                 return EXPP_ReturnPyObjError (PyExc_TypeError,
246                                               "expected int as argument.");
247         PyOS_snprintf (name, sizeof (name), "%s", buf);
248         for (marker= self->marker_list->first; marker; marker= marker->next) {
249                 if (marker->frame == frame) {
250                         BLI_strncpy(marker->name, name, sizeof(marker->name));
251                         return EXPP_incr_ret (Py_None);
252                 }
253         }
254
255         return EXPP_ReturnPyObjError (PyExc_TypeError, "frame not marked.");
256 }
257
258 static PyObject *TimeLine_getNameMarker (BPy_TimeLine *self, PyObject *args) {
259         int frame= 0;
260         TimeMarker *marker;
261
262         if (!PyArg_ParseTuple (args, "i", &frame))
263                 return EXPP_ReturnPyObjError (PyExc_TypeError, "expected int as argument.");
264         
265         for (marker= self->marker_list->first; marker; marker= marker->next) {
266                 if (marker->frame == frame)
267                         return PyString_FromString (marker->name);
268         }
269
270         return EXPP_ReturnPyObjError (PyExc_TypeError, "frame not marked.");
271 }
272
273