ad92b7d02ff027e9a3874a11c17eba3e1d856dfd
[blender-staging.git] / source / blender / python / api2_2x / Window.c
1 /* 
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): Willian P. Germano
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30 */
31
32 #include "Window.h"
33 #include "vector.h"
34
35 /* Many parts of the code here come from the older bpython implementation
36  * (file opy_window.c) */
37
38 /*****************************************************************************/
39 /* Function:              M_Window_Redraw                                    */
40 /* Python equivalent:     Blender.Window.Redraw                              */
41 /*****************************************************************************/
42 PyObject *M_Window_Redraw(PyObject *self, PyObject *args)
43 { /* not static so py_slider_update in Draw.[ch] can use it */
44   ScrArea *tempsa, *sa;
45   SpaceText *st;
46   int wintype = SPACE_VIEW3D;
47   short redraw_all = 0;
48
49   if (!PyArg_ParseTuple(args, "|i", &wintype))
50     return (EXPP_ReturnPyObjError (PyExc_AttributeError,
51             "expected int argument (or nothing)"));
52
53   if (wintype < 0)
54     redraw_all = 1;
55
56   if (!during_script()) { /* XXX check this */
57     tempsa= curarea;
58     sa = G.curscreen->areabase.first;
59
60     while (sa) {
61
62       if (sa->spacetype == wintype || redraw_all) {
63         /* don't force-redraw Text window (Python GUI) when
64            redraw is called out of a slider update */
65         if (sa->spacetype == SPACE_TEXT) {
66           st = sa->spacedata.first;
67           if (st->text->flags & TXT_FOLLOW) /* follow cursor display */
68             pop_space_text(st);
69           if (EXPP_disable_force_draw) { /* defined in Draw.[ch] ... */
70             scrarea_queue_redraw(sa);
71           }
72
73
74         } else {
75           scrarea_do_windraw(sa);
76           if (sa->headwin) scrarea_do_headdraw(sa);
77         }
78       }
79
80       sa= sa->next;
81     }
82
83     if (curarea != tempsa) areawinset (tempsa->win);
84
85     if (curarea->headwin) scrarea_do_headdraw (curarea);
86
87     screen_swapbuffers();
88   }
89
90   Py_INCREF(Py_None);
91   return Py_None;
92 }
93
94 /*****************************************************************************/
95 /* Function:              M_Window_RedrawAll                                 */
96 /* Python equivalent:     Blender.Window.RedrawAll                           */
97 /*****************************************************************************/
98 static PyObject *M_Window_RedrawAll(PyObject *self, PyObject *args)
99 {
100   return M_Window_Redraw(self, Py_BuildValue("(i)", -1));
101 }
102
103 /*****************************************************************************/
104 /* Function:              M_Window_QRedrawAll                                */
105 /* Python equivalent:     Blender.Window.QRedrawAll                          */
106 /*****************************************************************************/
107 static PyObject *M_Window_QRedrawAll(PyObject *self, PyObject *args)
108 {
109   allqueue(REDRAWALL, 0);
110
111   Py_INCREF(Py_None);
112   return Py_None;
113 }
114
115 /*****************************************************************************/
116 /* Function:              M_Window_FileSelector                              */
117 /* Python equivalent:     Blender.Window.FileSelector                        */
118 /*****************************************************************************/
119
120 /* This is the callback to "activate_fileselect" below.  It receives the
121  * selected filename and (using it as argument) calls the Python callback
122  * provided by the script writer and stored in EXPP_FS_PyCallback. */
123
124 static void getSelectedFile(char *name)
125 {
126   if (EXPP_FS_PyCallback) {
127     SpaceText *st= curarea->spacedata.first;
128
129     PyObject_CallFunction((PyObject *)EXPP_FS_PyCallback, "s", name);
130
131     EXPP_FS_PyCallback = NULL;
132     st->flags &= ST_CLEAR_NAMESPACE; /* global dict can be cleared */
133   }
134 }
135
136 static PyObject *M_Window_FileSelector(PyObject *self, PyObject *args)
137 {
138   char *title = "SELECT FILE";
139   SpaceText *st = curarea->spacedata.first;
140
141   if (!PyArg_ParseTuple(args, "O!|s",
142                         &PyFunction_Type, &EXPP_FS_PyCallback, &title))
143     return (EXPP_ReturnPyObjError (PyExc_AttributeError,
144     "\nexpected a callback function (and optionally a string) as argument(s)"));
145
146   st->flags &= ~ST_CLEAR_NAMESPACE; /* so global dict won't be cleared */
147
148   activate_fileselect(FILE_BLENDER, title, G.sce, getSelectedFile);
149
150   Py_INCREF(Py_None);
151   return Py_None;
152 }
153
154 static PyObject *M_Window_ImageSelector(PyObject *self, PyObject *args)
155 {
156   char *title = "SELECT IMAGE";
157   SpaceText *st = curarea->spacedata.first;
158
159   if (!PyArg_ParseTuple(args, "O!|s",
160                         &PyFunction_Type, &EXPP_FS_PyCallback, &title))
161     return (EXPP_ReturnPyObjError (PyExc_AttributeError,
162     "\nexpected a callback function (and optionally a string) as argument(s)"));
163
164   st->flags &= ~ST_CLEAR_NAMESPACE; /* hold global dictionary */
165
166   activate_imageselect(FILE_BLENDER, title, G.sce, getSelectedFile);
167
168   Py_INCREF(Py_None);
169   return Py_None;
170 }
171
172 /*****************************************************************************/
173 /* Function:              M_Window_DrawProgressBar                           */
174 /* Python equivalent:     Blender.Window.DrawProgressBar                     */
175 /*****************************************************************************/
176 static PyObject *M_Window_DrawProgressBar(PyObject *self, PyObject *args)
177 {
178   float done;
179   char *info = NULL;
180   int retval;
181
182   if(!PyArg_ParseTuple(args, "fs", &done, &info))
183     return (EXPP_ReturnPyObjError (PyExc_AttributeError,
184             "expected a float and a string as arguments"));
185
186   retval = progress_bar(done, info);
187
188   return Py_BuildValue("i", retval);
189 }
190
191 /*****************************************************************************/
192 /* Function:              M_Window_GetCursorPos                              */
193 /* Python equivalent:     Blender.Window.GetCursorPos                        */
194 /*****************************************************************************/
195 static PyObject *M_Window_GetCursorPos(PyObject *self)
196 {
197   float *cursor = NULL;
198   PyObject *pylist;
199
200   if (G.vd && G.vd->localview)
201     cursor = G.vd->cursor;
202   else cursor = G.scene->cursor;
203
204   pylist = Py_BuildValue("[fff]", cursor[0], cursor[1], cursor[2]);
205
206   if (!pylist)
207     return (EXPP_ReturnPyObjError (PyExc_MemoryError,
208             "GetCursorPos: couldn't create pylist"));
209
210   return pylist;
211 }
212
213 /*****************************************************************************/
214 /* Function:              M_Window_SetCursorPos                              */
215 /* Python equivalent:     Blender.Window.SetCursorPos                        */
216 /*****************************************************************************/
217 static PyObject *M_Window_SetCursorPos(PyObject *self, PyObject *args)
218 {
219         int ok = 0;
220   float val[3];
221
222         if (PyObject_Length (args) == 3)
223                 ok = PyArg_ParseTuple (args, "fff", &val[0], &val[1], &val[2]);
224         else
225                 ok = PyArg_ParseTuple(args, "(fff)", &val[0], &val[1], &val[2]);
226
227         if (!ok)
228                 return EXPP_ReturnPyObjError (PyExc_TypeError,
229                                                                         "expected [f,f,f] or f,f,f as arguments");
230
231   if (G.vd && G.vd->localview) {
232                 G.vd->cursor[0] = val[0];
233                 G.vd->cursor[1] = val[1];
234                 G.vd->cursor[2] = val[2];
235         }
236   else {
237                 G.scene->cursor[0] = val[0];
238                 G.scene->cursor[1] = val[1];
239                 G.scene->cursor[2] = val[2];
240         }
241
242         Py_INCREF (Py_None);
243         return Py_None;
244 }
245
246 /*****************************************************************************/
247 /* Function:              M_Window_GetViewVector                             */
248 /* Python equivalent:     Blender.Window.GetViewVector                       */
249 /*****************************************************************************/
250 static PyObject *M_Window_GetViewVector(PyObject *self)
251 {
252         float *vec = NULL;
253   PyObject *pylist;
254
255   if (!G.vd) {
256                 Py_INCREF (Py_None);
257                 return Py_None;
258         }
259
260         vec = G.vd->viewinv[2];
261
262   pylist = Py_BuildValue("[fff]", vec[0], vec[1], vec[2]);
263
264   if (!pylist)
265     return (EXPP_ReturnPyObjError (PyExc_MemoryError,
266             "GetViewVector: couldn't create pylist"));
267
268   return pylist;
269 }
270
271 /*****************************************************************************/
272 /* Function:              M_Window_GetViewMatrix                             */
273 /* Python equivalent:     Blender.Window.GetViewMatrix                       */
274 /*****************************************************************************/
275 static PyObject *M_Window_GetViewMatrix(PyObject *self)
276 {
277         PyObject *viewmat;
278
279   if (!G.vd) {
280                 Py_INCREF (Py_None);
281                 return Py_None;
282         }
283
284         viewmat = newMatrixObject (G.vd->viewmat);
285
286   if (!viewmat)
287     return (EXPP_ReturnPyObjError (PyExc_MemoryError,
288             "GetViewMatrix: couldn't create matrix pyobject"));
289
290   return viewmat;
291 }
292
293 /*****************************************************************************/
294 /* Function:              Window_Init                                        */
295 /*****************************************************************************/
296 PyObject *Window_Init (void)
297 {
298   PyObject  *submodule, *Types;
299
300   submodule = Py_InitModule3("Blender.Window", M_Window_methods, M_Window_doc);
301
302   Types = Py_BuildValue("{s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h}",
303                   "VIEW3D", SPACE_VIEW3D, "IPO", SPACE_IPO, "OOPS", SPACE_OOPS,
304                   "BUTS", SPACE_BUTS, "FILE", SPACE_FILE, "IMAGE", SPACE_IMAGE,
305                   "INFO", SPACE_INFO, "SEQ", SPACE_SEQ, "IMASEL", SPACE_IMASEL,
306                   "SOUND", SPACE_SOUND, "ACTION", SPACE_ACTION,
307                   "TEXT", SPACE_TEXT, "NLA", SPACE_NLA);
308
309   if (Types) PyModule_AddObject(submodule, "Types", Types);
310
311   return submodule;
312 }
313