Manipulator: add read-only matrix_world
[blender.git] / source / blender / makesrna / intern / rna_wm_manipulator.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 /** \file blender/makesrna/intern/rna_wm_manipulator.c
22  *  \ingroup RNA
23  */
24
25 #include <stdlib.h>
26
27 #include "DNA_screen_types.h"
28 #include "DNA_space_types.h"
29 #include "DNA_userdef_types.h"
30 #include "DNA_view3d_types.h"
31 #include "DNA_windowmanager_types.h"
32
33 #include "BLI_utildefines.h"
34
35 #include "BLT_translation.h"
36
37 #include "RNA_access.h"
38 #include "RNA_define.h"
39 #include "RNA_enum_types.h"
40
41 #include "rna_internal.h"
42
43 #include "WM_api.h"
44 #include "WM_types.h"
45
46 #ifdef RNA_RUNTIME
47 /* enum definitions */
48 #endif /* RNA_RUNTIME */
49
50 #ifdef RNA_RUNTIME
51
52 #include <assert.h>
53
54 #include "WM_api.h"
55 #include "WM_types.h"
56
57 #include "DNA_workspace_types.h"
58
59 #include "ED_screen.h"
60
61 #include "UI_interface.h"
62
63 #include "BKE_global.h"
64 #include "BKE_idprop.h"
65 #include "BKE_workspace.h"
66 #include "BKE_utildefines.h"
67
68 #include "MEM_guardedalloc.h"
69
70 #ifdef WITH_PYTHON
71 #  include "BPY_extern.h"
72 #endif
73
74 /* -------------------------------------------------------------------- */
75
76 /** \name Manipulator API
77  * \{ */
78
79 static void rna_manipulator_draw_cb(
80         const struct bContext *C, struct wmManipulator *mpr)
81 {
82         extern FunctionRNA rna_Manipulator_draw_func;
83         wmManipulatorGroup *mgroup = mpr->parent_mgroup;
84         PointerRNA mpr_ptr;
85         ParameterList list;
86         FunctionRNA *func;
87         RNA_pointer_create(NULL, mpr->type->ext.srna, mpr, &mpr_ptr);
88         /* RNA_struct_find_function(&mpr_ptr, "draw"); */
89         func = &rna_Manipulator_draw_func;
90         RNA_parameter_list_create(&list, &mpr_ptr, func);
91         RNA_parameter_set_lookup(&list, "context", &C);
92         mgroup->type->ext.call((bContext *)C, &mpr_ptr, func, &list);
93         RNA_parameter_list_free(&list);
94 }
95
96 static void rna_manipulator_draw_select_cb(
97         const struct bContext *C, struct wmManipulator *mpr, int select_id)
98 {
99         extern FunctionRNA rna_Manipulator_draw_select_func;
100         wmManipulatorGroup *mgroup = mpr->parent_mgroup;
101         PointerRNA mpr_ptr;
102         ParameterList list;
103         FunctionRNA *func;
104         RNA_pointer_create(NULL, mpr->type->ext.srna, mpr, &mpr_ptr);
105         /* RNA_struct_find_function(&mpr_ptr, "draw_select"); */
106         func = &rna_Manipulator_draw_select_func;
107         RNA_parameter_list_create(&list, &mpr_ptr, func);
108         RNA_parameter_set_lookup(&list, "context", &C);
109         RNA_parameter_set_lookup(&list, "select_id", &select_id);
110         mgroup->type->ext.call((bContext *)C, &mpr_ptr, func, &list);
111         RNA_parameter_list_free(&list);
112 }
113
114 static int rna_manipulator_test_select_cb(
115         struct bContext *C, struct wmManipulator *mpr, const struct wmEvent *event)
116 {
117         extern FunctionRNA rna_Manipulator_test_select_func;
118         wmManipulatorGroup *mgroup = mpr->parent_mgroup;
119         PointerRNA mpr_ptr;
120         ParameterList list;
121         FunctionRNA *func;
122         RNA_pointer_create(NULL, mpr->type->ext.srna, mpr, &mpr_ptr);
123         /* RNA_struct_find_function(&mpr_ptr, "test_select"); */
124         func = &rna_Manipulator_test_select_func;
125         RNA_parameter_list_create(&list, &mpr_ptr, func);
126         RNA_parameter_set_lookup(&list, "context", &C);
127         RNA_parameter_set_lookup(&list, "event", &event);
128         mgroup->type->ext.call((bContext *)C, &mpr_ptr, func, &list);
129
130         void *ret;
131         RNA_parameter_get_lookup(&list, "intersect_id", &ret);
132         int intersect_id = *(int *)ret;
133
134         RNA_parameter_list_free(&list);
135         return intersect_id;
136 }
137
138 static void rna_manipulator_modal_cb(
139         struct bContext *C, struct wmManipulator *mpr, const struct wmEvent *event,
140         eWM_ManipulatorTweak tweak_flag)
141 {
142         extern FunctionRNA rna_Manipulator_modal_func;
143         wmManipulatorGroup *mgroup = mpr->parent_mgroup;
144         PointerRNA mpr_ptr;
145         ParameterList list;
146         FunctionRNA *func;
147         const int tweak_flag_int = tweak_flag;
148         RNA_pointer_create(NULL, mpr->type->ext.srna, mpr, &mpr_ptr);
149         /* RNA_struct_find_function(&mpr_ptr, "modal"); */
150         func = &rna_Manipulator_modal_func;
151         RNA_parameter_list_create(&list, &mpr_ptr, func);
152         RNA_parameter_set_lookup(&list, "context", &C);
153         RNA_parameter_set_lookup(&list, "event", &event);
154         RNA_parameter_set_lookup(&list, "tweak", &tweak_flag_int);
155         mgroup->type->ext.call((bContext *)C, &mpr_ptr, func, &list);
156         RNA_parameter_list_free(&list);
157 }
158
159 static void rna_manipulator_setup_cb(
160         struct wmManipulator *mpr)
161 {
162         extern FunctionRNA rna_Manipulator_setup_func;
163         wmManipulatorGroup *mgroup = mpr->parent_mgroup;
164         PointerRNA mpr_ptr;
165         ParameterList list;
166         FunctionRNA *func;
167         RNA_pointer_create(NULL, mpr->type->ext.srna, mpr, &mpr_ptr);
168         /* RNA_struct_find_function(&mpr_ptr, "setup"); */
169         func = &rna_Manipulator_setup_func;
170         RNA_parameter_list_create(&list, &mpr_ptr, func);
171         mgroup->type->ext.call((bContext *)NULL, &mpr_ptr, func, &list);
172         RNA_parameter_list_free(&list);
173 }
174
175
176 static void rna_manipulator_invoke_cb(
177         struct bContext *C, struct wmManipulator *mpr, const struct wmEvent *event)
178 {
179         extern FunctionRNA rna_Manipulator_invoke_func;
180         wmManipulatorGroup *mgroup = mpr->parent_mgroup;
181         PointerRNA mpr_ptr;
182         ParameterList list;
183         FunctionRNA *func;
184         RNA_pointer_create(NULL, mpr->type->ext.srna, mpr, &mpr_ptr);
185         /* RNA_struct_find_function(&mpr_ptr, "invoke"); */
186         func = &rna_Manipulator_invoke_func;
187         RNA_parameter_list_create(&list, &mpr_ptr, func);
188         RNA_parameter_set_lookup(&list, "context", &C);
189         RNA_parameter_set_lookup(&list, "event", &event);
190         mgroup->type->ext.call((bContext *)C, &mpr_ptr, func, &list);
191         RNA_parameter_list_free(&list);
192 }
193
194 static void rna_manipulator_exit_cb(
195         struct bContext *C, struct wmManipulator *mpr, bool cancel)
196 {
197         extern FunctionRNA rna_Manipulator_exit_func;
198         wmManipulatorGroup *mgroup = mpr->parent_mgroup;
199         PointerRNA mpr_ptr;
200         ParameterList list;
201         FunctionRNA *func;
202         RNA_pointer_create(NULL, mpr->type->ext.srna, mpr, &mpr_ptr);
203         /* RNA_struct_find_function(&mpr_ptr, "exit"); */
204         func = &rna_Manipulator_exit_func;
205         RNA_parameter_list_create(&list, &mpr_ptr, func);
206         RNA_parameter_set_lookup(&list, "context", &C);
207         {
208                 int cancel_i = cancel;
209                 RNA_parameter_set_lookup(&list, "cancel", &cancel_i);
210         }
211         mgroup->type->ext.call((bContext *)C, &mpr_ptr, func, &list);
212         RNA_parameter_list_free(&list);
213 }
214
215 static void rna_manipulator_select_refresh_cb(
216         struct wmManipulator *mpr)
217 {
218         extern FunctionRNA rna_Manipulator_select_refresh_func;
219         wmManipulatorGroup *mgroup = mpr->parent_mgroup;
220         PointerRNA mpr_ptr;
221         ParameterList list;
222         FunctionRNA *func;
223         RNA_pointer_create(NULL, mpr->type->ext.srna, mpr, &mpr_ptr);
224         /* RNA_struct_find_function(&mpr_ptr, "select_refresh"); */
225         func = &rna_Manipulator_select_refresh_func;
226         RNA_parameter_list_create(&list, &mpr_ptr, func);
227         mgroup->type->ext.call((bContext *)NULL, &mpr_ptr, func, &list);
228         RNA_parameter_list_free(&list);
229 }
230
231 /* just to work around 'const char *' warning and to ensure this is a python op */
232 static void rna_Manipulator_bl_idname_set(PointerRNA *ptr, const char *value)
233 {
234         wmManipulator *data = ptr->data;
235         char *str = (char *)data->type->idname;
236         if (!str[0]) {
237                 BLI_strncpy(str, value, MAX_NAME);    /* utf8 already ensured */
238         }
239         else {
240                 assert(!"setting the bl_idname on a non-builtin operator");
241         }
242 }
243
244 static wmManipulator *rna_ManipulatorProperties_find_operator(PointerRNA *ptr)
245 {
246 #if 0
247         wmWindowManager *wm = ptr->id.data;
248 #endif
249
250         /* We could try workaruond this lookup, but not trivial. */
251         for (bScreen *screen = G.main->screen.first; screen; screen = screen->id.next) {
252                 IDProperty *properties = ptr->data;
253                 for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
254                         for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) {
255                                 if (ar->manipulator_map) {
256                                         wmManipulatorMap *mmap = ar->manipulator_map;
257                                         for (wmManipulatorGroup *mgroup = WM_manipulatormap_group_list(mmap)->first;
258                                              mgroup;
259                                              mgroup = mgroup->next)
260                                         {
261                                                 for (wmManipulator *mpr = mgroup->manipulators.first; mpr; mpr = mpr->next) {
262                                                         if (mpr->properties == properties) {
263                                                                 return mpr;
264                                                         }
265                                                 }
266                                         }
267                                 }
268                         }
269                 }
270         }
271         return NULL;
272 }
273
274 static StructRNA *rna_ManipulatorProperties_refine(PointerRNA *ptr)
275 {
276         wmManipulator *mpr = rna_ManipulatorProperties_find_operator(ptr);
277
278         if (mpr)
279                 return mpr->type->srna;
280         else
281                 return ptr->type;
282 }
283
284 static IDProperty *rna_ManipulatorProperties_idprops(PointerRNA *ptr, bool create)
285 {
286         if (create && !ptr->data) {
287                 IDPropertyTemplate val = {0};
288                 ptr->data = IDP_New(IDP_GROUP, &val, "RNA_ManipulatorProperties group");
289         }
290
291         return ptr->data;
292 }
293
294 static PointerRNA rna_Manipulator_properties_get(PointerRNA *ptr)
295 {
296         wmManipulator *mpr = ptr->data;
297         return rna_pointer_inherit_refine(ptr, mpr->type->srna, mpr->properties);
298 }
299
300 /* wmManipulator.float */
301 #define RNA_MANIPULATOR_GENERIC_FLOAT_RW_DEF(func_id, member_id) \
302 static float rna_Manipulator_##func_id##_get(PointerRNA *ptr) \
303 { \
304         wmManipulator *mpr = ptr->data; \
305         return mpr->member_id; \
306 } \
307 static void rna_Manipulator_##func_id##_set(PointerRNA *ptr, float value) \
308 { \
309         wmManipulator *mpr = ptr->data; \
310         mpr->member_id = value; \
311 }
312 #define RNA_MANIPULATOR_GENERIC_FLOAT_ARRAY_INDEX_RW_DEF(func_id, member_id, index) \
313 static float rna_Manipulator_##func_id##_get(PointerRNA *ptr) \
314 { \
315         wmManipulator *mpr = ptr->data; \
316         return mpr->member_id[index]; \
317 } \
318 static void rna_Manipulator_##func_id##_set(PointerRNA *ptr, float value) \
319 { \
320         wmManipulator *mpr = ptr->data; \
321         mpr->member_id[index] = value; \
322 }
323 /* wmManipulator.float[len] */
324 #define RNA_MANIPULATOR_GENERIC_FLOAT_ARRAY_RW_DEF(func_id, member_id, len) \
325 static void rna_Manipulator_##func_id##_get(PointerRNA *ptr, float value[len]) \
326 { \
327         wmManipulator *mpr = ptr->data; \
328         memcpy(value, mpr->member_id, sizeof(float[len])); \
329 } \
330 static void rna_Manipulator_##func_id##_set(PointerRNA *ptr, const float value[len]) \
331 { \
332         wmManipulator *mpr = ptr->data; \
333         memcpy(mpr->member_id, value, sizeof(float[len])); \
334 }
335
336 /* wmManipulator.flag */
337 #define RNA_MANIPULATOR_GENERIC_FLAG_RW_DEF(func_id, member_id, flag_value) \
338 static int rna_Manipulator_##func_id##_get(PointerRNA *ptr) \
339 { \
340         wmManipulator *mpr = ptr->data; \
341         return (mpr->member_id & flag_value) != 0; \
342 } \
343 static void rna_Manipulator_##func_id##_set(PointerRNA *ptr, int value) \
344 { \
345         wmManipulator *mpr = ptr->data; \
346         BKE_BIT_TEST_SET(mpr->member_id, value, flag_value); \
347 }
348
349 #define RNA_MANIPULATOR_FLAG_RO_DEF(func_id, member_id, flag_value) \
350 static int rna_Manipulator_##func_id##_get(PointerRNA *ptr) \
351 { \
352         wmManipulator *mpr = ptr->data; \
353         return (mpr->member_id & flag_value) != 0; \
354 }
355
356 RNA_MANIPULATOR_GENERIC_FLOAT_ARRAY_RW_DEF(color, color, 3);
357 RNA_MANIPULATOR_GENERIC_FLOAT_ARRAY_RW_DEF(color_hi, color_hi, 3);
358
359 RNA_MANIPULATOR_GENERIC_FLOAT_ARRAY_INDEX_RW_DEF(alpha, color, 3);
360 RNA_MANIPULATOR_GENERIC_FLOAT_ARRAY_INDEX_RW_DEF(alpha_hi, color_hi, 3);
361
362 RNA_MANIPULATOR_GENERIC_FLOAT_ARRAY_RW_DEF(matrix_space, matrix_space, 16);
363 RNA_MANIPULATOR_GENERIC_FLOAT_ARRAY_RW_DEF(matrix_basis, matrix_basis, 16);
364 RNA_MANIPULATOR_GENERIC_FLOAT_ARRAY_RW_DEF(matrix_offset, matrix_offset, 16);
365
366 static void rna_Manipulator_matrix_world_get(PointerRNA *ptr, float value[16])
367 {
368         wmManipulator *mpr = ptr->data;
369         WM_manipulator_calc_matrix_final(mpr, (float (*)[4])value);
370 }
371
372 RNA_MANIPULATOR_GENERIC_FLOAT_RW_DEF(scale_basis, scale_basis);
373 RNA_MANIPULATOR_GENERIC_FLOAT_RW_DEF(line_width, line_width);
374
375 RNA_MANIPULATOR_GENERIC_FLAG_RW_DEF(flag_use_draw_hover, flag, WM_MANIPULATOR_DRAW_HOVER);
376 RNA_MANIPULATOR_GENERIC_FLAG_RW_DEF(flag_use_draw_modal, flag, WM_MANIPULATOR_DRAW_MODAL);
377 RNA_MANIPULATOR_GENERIC_FLAG_RW_DEF(flag_use_draw_value, flag, WM_MANIPULATOR_DRAW_VALUE);
378 RNA_MANIPULATOR_GENERIC_FLAG_RW_DEF(flag_use_draw_offset_scale, flag, WM_MANIPULATOR_DRAW_OFFSET_SCALE);
379 RNA_MANIPULATOR_GENERIC_FLAG_RW_DEF(flag_hide, flag, WM_MANIPULATOR_HIDDEN);
380
381 /* wmManipulator.state */
382 RNA_MANIPULATOR_FLAG_RO_DEF(state_is_highlight, state, WM_MANIPULATOR_STATE_HIGHLIGHT);
383 RNA_MANIPULATOR_FLAG_RO_DEF(state_is_modal, state, WM_MANIPULATOR_STATE_MODAL);
384 RNA_MANIPULATOR_FLAG_RO_DEF(state_select, state, WM_MANIPULATOR_STATE_SELECT);
385
386 static void rna_Manipulator_state_select_set(struct PointerRNA *ptr, int value)
387 {
388         wmManipulator *mpr = ptr->data;
389         wmManipulatorGroup *mgroup = mpr->parent_mgroup;
390         WM_manipulator_select_set(mgroup->parent_mmap, mpr, value);
391 }
392
393 static PointerRNA rna_Manipulator_group_get(PointerRNA *ptr)
394 {
395         wmManipulator *mpr = ptr->data;
396         return rna_pointer_inherit_refine(ptr, &RNA_ManipulatorGroup, mpr->parent_mgroup);
397 }
398
399 #ifdef WITH_PYTHON
400
401 static void rna_Manipulator_unregister(struct Main *bmain, StructRNA *type);
402 void BPY_RNA_manipulator_wrapper(wmManipulatorType *wgt, void *userdata);
403
404 static StructRNA *rna_Manipulator_register(
405         Main *bmain, ReportList *reports, void *data, const char *identifier,
406         StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
407 {
408         struct {
409                 char idname[MAX_NAME];
410         } temp_buffers;
411
412         wmManipulatorType dummywt = {NULL};
413         wmManipulator dummymnp = {NULL};
414         PointerRNA mnp_ptr;
415
416         /* Two sets of functions. */
417         int have_function[8];
418
419         /* setup dummy manipulator & manipulator type to store static properties in */
420         dummymnp.type = &dummywt;
421         dummywt.idname = temp_buffers.idname;
422         RNA_pointer_create(NULL, &RNA_Manipulator, &dummymnp, &mnp_ptr);
423
424         /* Clear so we can detect if it's left unset. */
425         temp_buffers.idname[0] = '\0';
426
427         /* validate the python class */
428         if (validate(&mnp_ptr, data, have_function) != 0)
429                 return NULL;
430
431         if (strlen(identifier) >= sizeof(temp_buffers.idname)) {
432                 BKE_reportf(reports, RPT_ERROR, "Registering manipulator class: '%s' is too long, maximum length is %d",
433                             identifier, (int)sizeof(temp_buffers.idname));
434                 return NULL;
435         }
436
437         /* check if we have registered this manipulator type before, and remove it */
438         {
439                 const wmManipulatorType *wt = WM_manipulatortype_find(dummywt.idname, true);
440                 if (wt && wt->ext.srna) {
441                         rna_Manipulator_unregister(bmain, wt->ext.srna);
442                 }
443         }
444
445         /* create a new manipulator type */
446         dummywt.ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, dummywt.idname, &RNA_Manipulator);
447         /* manipulator properties are registered separately */
448         RNA_def_struct_flag(dummywt.ext.srna, STRUCT_NO_IDPROPERTIES);
449         dummywt.ext.data = data;
450         dummywt.ext.call = call;
451         dummywt.ext.free = free;
452
453         {
454                 int i = 0;
455                 dummywt.draw = (have_function[i++]) ? rna_manipulator_draw_cb : NULL;
456                 dummywt.draw_select = (have_function[i++]) ? rna_manipulator_draw_select_cb : NULL;
457                 dummywt.test_select = (have_function[i++]) ? rna_manipulator_test_select_cb : NULL;
458                 dummywt.modal = (have_function[i++]) ? rna_manipulator_modal_cb : NULL;
459 //              dummywt.property_update = (have_function[i++]) ? rna_manipulator_property_update : NULL;
460 //              dummywt.position_get = (have_function[i++]) ? rna_manipulator_position_get : NULL;
461                 dummywt.setup = (have_function[i++]) ? rna_manipulator_setup_cb : NULL;
462                 dummywt.invoke = (have_function[i++]) ? rna_manipulator_invoke_cb : NULL;
463                 dummywt.exit = (have_function[i++]) ? rna_manipulator_exit_cb : NULL;
464                 dummywt.select_refresh = (have_function[i++]) ? rna_manipulator_select_refresh_cb : NULL;
465
466                 BLI_assert(i == ARRAY_SIZE(have_function));
467         }
468
469         RNA_def_struct_duplicate_pointers(dummywt.ext.srna);
470
471         /* use duplicated string */
472         dummywt.idname = dummywt.ext.srna->identifier;
473
474         WM_manipulatortype_append_ptr(BPY_RNA_manipulator_wrapper, (void *)&dummywt);
475
476         /* update while blender is running */
477         WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
478
479         return dummywt.ext.srna;
480 }
481
482 static void rna_Manipulator_unregister(struct Main *bmain, StructRNA *type)
483 {
484         wmManipulatorType *wt = RNA_struct_blender_type_get(type);
485
486         if (!wt)
487                 return;
488
489         WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
490
491         RNA_struct_free_extension(type, &wt->ext);
492
493         WM_manipulatortype_remove_ptr(NULL, bmain, wt);
494
495         RNA_struct_free(&BLENDER_RNA, type);
496 }
497
498 static void **rna_Manipulator_instance(PointerRNA *ptr)
499 {
500         wmManipulator *mpr = ptr->data;
501         return &mpr->py_instance;
502 }
503
504 #endif  /* WITH_PYTHON */
505
506
507 static StructRNA *rna_Manipulator_refine(PointerRNA *mnp_ptr)
508 {
509         wmManipulator *mpr = mnp_ptr->data;
510         return (mpr->type && mpr->type->ext.srna) ? mpr->type->ext.srna : &RNA_Manipulator;
511 }
512
513 /** \} */
514
515 /** \name Manipulator Group API
516  * \{ */
517
518 static wmManipulator *rna_ManipulatorGroup_manipulator_new(
519         wmManipulatorGroup *mgroup, ReportList *reports, const char *idname)
520 {
521         const wmManipulatorType *wt = WM_manipulatortype_find(idname, true);
522         if (wt == NULL) {
523                 BKE_reportf(reports, RPT_ERROR, "ManipulatorType '%s' not known", idname);
524                 return NULL;
525         }
526         wmManipulator *mpr = WM_manipulator_new_ptr(wt, mgroup, NULL);
527         return mpr;
528 }
529
530 static void rna_ManipulatorGroup_manipulator_remove(
531         wmManipulatorGroup *mgroup, bContext *C, wmManipulator *mpr)
532 {
533         WM_manipulator_unlink(&mgroup->manipulators, mgroup->parent_mmap, mpr, C);
534 }
535
536 static void rna_ManipulatorGroup_manipulator_clear(
537         wmManipulatorGroup *mgroup, bContext *C)
538 {
539         while (mgroup->manipulators.first) {
540                 WM_manipulator_unlink(&mgroup->manipulators, mgroup->parent_mmap, mgroup->manipulators.first, C);
541         }
542 }
543
544 static void rna_ManipulatorGroup_name_get(PointerRNA *ptr, char *value)
545 {
546         wmManipulatorGroup *mgroup = ptr->data;
547         strcpy(value, mgroup->type->name);
548 }
549
550 static int rna_ManipulatorGroup_name_length(PointerRNA *ptr)
551 {
552         wmManipulatorGroup *mgroup = ptr->data;
553         return strlen(mgroup->type->name);
554 }
555
556 /* just to work around 'const char *' warning and to ensure this is a python op */
557 static void rna_ManipulatorGroup_bl_idname_set(PointerRNA *ptr, const char *value)
558 {
559         wmManipulatorGroup *data = ptr->data;
560         char *str = (char *)data->type->idname;
561         if (!str[0])
562                 BLI_strncpy(str, value, MAX_NAME);    /* utf8 already ensured */
563         else
564                 assert(!"setting the bl_idname on a non-builtin operator");
565 }
566
567 static void rna_ManipulatorGroup_bl_label_set(PointerRNA *ptr, const char *value)
568 {
569         wmManipulatorGroup *data = ptr->data;
570         char *str = (char *)data->type->name;
571         if (!str[0])
572                 BLI_strncpy(str, value, MAX_NAME);    /* utf8 already ensured */
573         else
574                 assert(!"setting the bl_label on a non-builtin operator");
575 }
576
577 static int rna_ManipulatorGroup_has_reports_get(PointerRNA *ptr)
578 {
579         wmManipulatorGroup *mgroup = ptr->data;
580         return (mgroup->reports && mgroup->reports->list.first);
581 }
582
583 #ifdef WITH_PYTHON
584
585 static bool rna_manipulatorgroup_poll_cb(const bContext *C, wmManipulatorGroupType *wgt)
586 {
587
588         extern FunctionRNA rna_ManipulatorGroup_poll_func;
589
590         PointerRNA ptr;
591         ParameterList list;
592         FunctionRNA *func;
593         void *ret;
594         int visible;
595
596         RNA_pointer_create(NULL, wgt->ext.srna, NULL, &ptr); /* dummy */
597         func = &rna_ManipulatorGroup_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */
598
599         RNA_parameter_list_create(&list, &ptr, func);
600         RNA_parameter_set_lookup(&list, "context", &C);
601         wgt->ext.call((bContext *)C, &ptr, func, &list);
602
603         RNA_parameter_get_lookup(&list, "visible", &ret);
604         visible = *(int *)ret;
605
606         RNA_parameter_list_free(&list);
607
608         return visible;
609 }
610
611 static void rna_manipulatorgroup_setup_cb(const bContext *C, wmManipulatorGroup *mgroup)
612 {
613         extern FunctionRNA rna_ManipulatorGroup_setup_func;
614
615         PointerRNA mgroup_ptr;
616         ParameterList list;
617         FunctionRNA *func;
618
619         RNA_pointer_create(NULL, mgroup->type->ext.srna, mgroup, &mgroup_ptr);
620         func = &rna_ManipulatorGroup_setup_func; /* RNA_struct_find_function(&wgroupr, "setup"); */
621
622         RNA_parameter_list_create(&list, &mgroup_ptr, func);
623         RNA_parameter_set_lookup(&list, "context", &C);
624         mgroup->type->ext.call((bContext *)C, &mgroup_ptr, func, &list);
625
626         RNA_parameter_list_free(&list);
627 }
628
629 static wmKeyMap *rna_manipulatorgroup_setup_keymap_cb(const wmManipulatorGroupType *wgt, wmKeyConfig *config)
630 {
631         extern FunctionRNA rna_ManipulatorGroup_setup_keymap_func;
632         void *ret;
633
634         PointerRNA ptr;
635         ParameterList list;
636         FunctionRNA *func;
637
638         RNA_pointer_create(NULL, wgt->ext.srna, NULL, &ptr); /* dummy */
639         func = &rna_ManipulatorGroup_setup_keymap_func; /* RNA_struct_find_function(&wgroupr, "setup_keymap"); */
640
641         RNA_parameter_list_create(&list, &ptr, func);
642         RNA_parameter_set_lookup(&list, "keyconfig", &config);
643         wgt->ext.call(NULL, &ptr, func, &list);
644
645         RNA_parameter_get_lookup(&list, "keymap", &ret);
646         wmKeyMap *keymap = *(wmKeyMap **)ret;
647
648         RNA_parameter_list_free(&list);
649
650         return keymap;
651 }
652
653 static void rna_manipulatorgroup_refresh_cb(const bContext *C, wmManipulatorGroup *mgroup)
654 {
655         extern FunctionRNA rna_ManipulatorGroup_refresh_func;
656
657         PointerRNA mgroup_ptr;
658         ParameterList list;
659         FunctionRNA *func;
660
661         RNA_pointer_create(NULL, mgroup->type->ext.srna, mgroup, &mgroup_ptr);
662         func = &rna_ManipulatorGroup_refresh_func; /* RNA_struct_find_function(&wgroupr, "refresh"); */
663
664         RNA_parameter_list_create(&list, &mgroup_ptr, func);
665         RNA_parameter_set_lookup(&list, "context", &C);
666         mgroup->type->ext.call((bContext *)C, &mgroup_ptr, func, &list);
667
668         RNA_parameter_list_free(&list);
669 }
670
671 static void rna_manipulatorgroup_draw_prepare_cb(const bContext *C, wmManipulatorGroup *mgroup)
672 {
673         extern FunctionRNA rna_ManipulatorGroup_draw_prepare_func;
674
675         PointerRNA mgroup_ptr;
676         ParameterList list;
677         FunctionRNA *func;
678
679         RNA_pointer_create(NULL, mgroup->type->ext.srna, mgroup, &mgroup_ptr);
680         func = &rna_ManipulatorGroup_draw_prepare_func; /* RNA_struct_find_function(&wgroupr, "draw_prepare"); */
681
682         RNA_parameter_list_create(&list, &mgroup_ptr, func);
683         RNA_parameter_set_lookup(&list, "context", &C);
684         mgroup->type->ext.call((bContext *)C, &mgroup_ptr, func, &list);
685
686         RNA_parameter_list_free(&list);
687 }
688
689 void BPY_RNA_manipulatorgroup_wrapper(wmManipulatorGroupType *wgt, void *userdata);
690
691 static StructRNA *rna_ManipulatorGroup_register(
692         Main *bmain, ReportList *reports, void *data, const char *identifier,
693         StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
694 {
695         struct {
696                 char name[MAX_NAME];
697                 char idname[MAX_NAME];
698         } temp_buffers;
699
700         wmManipulatorGroupType dummywgt = {NULL};
701         wmManipulatorGroup dummywg = {NULL};
702         PointerRNA wgptr;
703
704         /* Two sets of functions. */
705         int have_function[5];
706
707         /* setup dummy manipulatorgroup & manipulatorgroup type to store static properties in */
708         dummywg.type = &dummywgt;
709         dummywgt.name = temp_buffers.name;
710         dummywgt.idname = temp_buffers.idname;
711
712         RNA_pointer_create(NULL, &RNA_ManipulatorGroup, &dummywg, &wgptr);
713
714         /* Clear so we can detect if it's left unset. */
715         temp_buffers.idname[0] = temp_buffers.name[0] = '\0';
716
717         /* validate the python class */
718         if (validate(&wgptr, data, have_function) != 0)
719                 return NULL;
720
721         if (strlen(identifier) >= sizeof(temp_buffers.idname)) {
722                 BKE_reportf(reports, RPT_ERROR, "Registering manipulatorgroup class: '%s' is too long, maximum length is %d",
723                             identifier, (int)sizeof(temp_buffers.idname));
724                 return NULL;
725         }
726
727         /* check if the area supports widgets */
728         const struct wmManipulatorMapType_Params wmap_params = {
729                 .spaceid = dummywgt.mmap_params.spaceid,
730                 .regionid = dummywgt.mmap_params.regionid,
731         };
732
733         wmManipulatorMapType *mmap_type = WM_manipulatormaptype_ensure(&wmap_params);
734         if (mmap_type == NULL) {
735                 BKE_reportf(reports, RPT_ERROR, "Area type does not support manipulators");
736                 return NULL;
737         }
738
739         /* check if we have registered this manipulatorgroup type before, and remove it */
740         {
741                 wmManipulatorGroupType *wgt = WM_manipulatorgrouptype_find(dummywgt.idname, true);
742                 if (wgt && wgt->ext.srna) {
743                         WM_manipulatormaptype_group_unlink(NULL, bmain, mmap_type, wgt);
744                         WM_manipulatorgrouptype_remove_ptr(wgt);
745
746                         WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
747                 }
748         }
749
750         /* create a new manipulatorgroup type */
751         dummywgt.ext.srna = RNA_def_struct_ptr(&BLENDER_RNA, dummywgt.idname, &RNA_ManipulatorGroup);
752         RNA_def_struct_flag(dummywgt.ext.srna, STRUCT_NO_IDPROPERTIES); /* manipulatorgroup properties are registered separately */
753         dummywgt.ext.data = data;
754         dummywgt.ext.call = call;
755         dummywgt.ext.free = free;
756
757         /* We used to register widget group types like this, now we do it similar to
758          * operator types. Thus we should be able to do the same as operator types now. */
759         dummywgt.poll = (have_function[0]) ? rna_manipulatorgroup_poll_cb : NULL;
760         dummywgt.setup_keymap =     (have_function[1]) ? rna_manipulatorgroup_setup_keymap_cb : NULL;
761         dummywgt.setup =            (have_function[2]) ? rna_manipulatorgroup_setup_cb : NULL;
762         dummywgt.refresh =          (have_function[3]) ? rna_manipulatorgroup_refresh_cb : NULL;
763         dummywgt.draw_prepare =     (have_function[4]) ? rna_manipulatorgroup_draw_prepare_cb : NULL;
764
765         RNA_def_struct_duplicate_pointers(dummywgt.ext.srna);
766         dummywgt.idname = dummywgt.ext.srna->identifier;
767         dummywgt.name = dummywgt.ext.srna->name;
768
769         wmManipulatorGroupType *wgt = WM_manipulatorgrouptype_append_ptr(
770                 BPY_RNA_manipulatorgroup_wrapper, (void *)&dummywgt);
771
772         if (wgt->flag & WM_MANIPULATORGROUPTYPE_PERSISTENT) {
773                 WM_manipulator_group_add_ptr_ex(wgt, mmap_type);
774
775                 /* update while blender is running */
776                 WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
777         }
778
779         return dummywgt.ext.srna;
780 }
781
782 static void rna_ManipulatorGroup_unregister(struct Main *bmain, StructRNA *type)
783 {
784         wmManipulatorGroupType *wgt = RNA_struct_blender_type_get(type);
785
786         if (!wgt)
787                 return;
788
789         WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
790
791         RNA_struct_free_extension(type, &wgt->ext);
792
793         WM_manipulator_group_remove_ptr(bmain, wgt);
794
795         RNA_struct_free(&BLENDER_RNA, type);
796 }
797
798 static void **rna_ManipulatorGroup_instance(PointerRNA *ptr)
799 {
800         wmManipulatorGroup *mgroup = ptr->data;
801         return &mgroup->py_instance;
802 }
803
804 #endif  /* WITH_PYTHON */
805
806 static StructRNA *rna_ManipulatorGroup_refine(PointerRNA *mgroup_ptr)
807 {
808         wmManipulatorGroup *mgroup = mgroup_ptr->data;
809         return (mgroup->type && mgroup->type->ext.srna) ? mgroup->type->ext.srna : &RNA_ManipulatorGroup;
810 }
811
812 static void rna_ManipulatorGroup_manipulators_begin(CollectionPropertyIterator *iter, PointerRNA *mgroup_ptr)
813 {
814         wmManipulatorGroup *mgroup = mgroup_ptr->data;
815         rna_iterator_listbase_begin(iter, &mgroup->manipulators, NULL);
816 }
817
818 /** \} */
819
820
821 #else /* RNA_RUNTIME */
822
823
824 /* ManipulatorGroup.manipulators */
825 static void rna_def_manipulators(BlenderRNA *brna, PropertyRNA *cprop)
826 {
827         StructRNA *srna;
828
829         FunctionRNA *func;
830         PropertyRNA *parm;
831
832         RNA_def_property_srna(cprop, "Manipulators");
833         srna = RNA_def_struct(brna, "Manipulators", NULL);
834         RNA_def_struct_sdna(srna, "wmManipulatorGroup");
835         RNA_def_struct_ui_text(srna, "Manipulators", "Collection of manipulators");
836
837         func = RNA_def_function(srna, "new", "rna_ManipulatorGroup_manipulator_new");
838         RNA_def_function_ui_description(func, "Add manipulator");
839         RNA_def_function_flag(func, FUNC_USE_REPORTS);
840         RNA_def_string(func, "type", "Type", 0, "", "Manipulator identifier"); /* optional */
841         parm = RNA_def_pointer(func, "manipulator", "Manipulator", "", "New manipulator");
842         RNA_def_function_return(func, parm);
843
844         func = RNA_def_function(srna, "remove", "rna_ManipulatorGroup_manipulator_remove");
845         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
846         RNA_def_function_ui_description(func, "Delete manipulator");
847         parm = RNA_def_pointer(func, "manipulator", "Manipulator", "", "New manipulator");
848         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
849         RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
850
851         func = RNA_def_function(srna, "clear", "rna_ManipulatorGroup_manipulator_clear");
852         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
853         RNA_def_function_ui_description(func, "Delete all manipulators");
854 }
855
856
857 static void rna_def_manipulator(BlenderRNA *brna, PropertyRNA *cprop)
858 {
859         StructRNA *srna;
860         PropertyRNA *prop;
861
862         FunctionRNA *func;
863         PropertyRNA *parm;
864
865         RNA_def_property_srna(cprop, "Manipulator");
866         srna = RNA_def_struct(brna, "Manipulator", NULL);
867         RNA_def_struct_sdna(srna, "wmManipulator");
868         RNA_def_struct_ui_text(srna, "Manipulator", "Collection of manipulators");
869         RNA_def_struct_refine_func(srna, "rna_Manipulator_refine");
870
871 #ifdef WITH_PYTHON
872         RNA_def_struct_register_funcs(
873                 srna,
874                 "rna_Manipulator_register",
875                 "rna_Manipulator_unregister",
876                 "rna_Manipulator_instance");
877 #endif
878         RNA_def_struct_translation_context(srna, BLT_I18NCONTEXT_OPERATOR_DEFAULT);
879
880         prop = RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
881         RNA_def_property_flag(prop, PROP_NEVER_NULL);
882         RNA_def_property_struct_type(prop, "ManipulatorProperties");
883         RNA_def_property_ui_text(prop, "Properties", "");
884         RNA_def_property_pointer_funcs(prop, "rna_Manipulator_properties_get", NULL, NULL, NULL);
885
886         /* -------------------------------------------------------------------- */
887         /* Registerable Variables */
888
889         RNA_define_verify_sdna(0); /* not in sdna */
890
891         prop = RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
892         RNA_def_property_string_sdna(prop, NULL, "type->idname");
893         RNA_def_property_string_maxlength(prop, MAX_NAME);
894         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Manipulator_bl_idname_set");
895         /* RNA_def_property_clear_flag(prop, PROP_EDITABLE); */
896         RNA_def_property_flag(prop, PROP_REGISTER);
897
898         RNA_define_verify_sdna(1); /* not in sdna */
899
900         /* wmManipulator.draw */
901         func = RNA_def_function(srna, "draw", NULL);
902         RNA_def_function_ui_description(func, "");
903         RNA_def_function_flag(func, FUNC_REGISTER);
904         parm = RNA_def_pointer(func, "context", "Context", "", "");
905         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
906
907         /* wmManipulator.draw_select */
908         func = RNA_def_function(srna, "draw_select", NULL);
909         RNA_def_function_ui_description(func, "");
910         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
911         parm = RNA_def_pointer(func, "context", "Context", "", "");
912         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
913         parm = RNA_def_int(func, "select_id", 0, 0, INT_MAX, "", "", 0, INT_MAX);
914
915         /* wmManipulator.test_select */
916         func = RNA_def_function(srna, "test_select", NULL);
917         RNA_def_function_ui_description(func, "");
918         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
919         parm = RNA_def_pointer(func, "context", "Context", "", "");
920         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
921         parm = RNA_def_pointer(func, "event", "Event", "", "");
922         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
923         parm = RNA_def_int(func, "intersect_id", 0, 0, INT_MAX, "", "", 0, INT_MAX);
924         RNA_def_function_return(func, parm);
925
926         /* wmManipulator.handler */
927         static EnumPropertyItem tweak_actions[] = {
928                 {WM_MANIPULATOR_TWEAK_PRECISE, "PRECISE", 0, "Precise", ""},
929                 {WM_MANIPULATOR_TWEAK_SNAP, "SNAP", 0, "Snap", ""},
930                 {0, NULL, 0, NULL, NULL}
931         };
932         func = RNA_def_function(srna, "modal", NULL);
933         RNA_def_function_ui_description(func, "");
934         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
935         parm = RNA_def_pointer(func, "context", "Context", "", "");
936         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
937         parm = RNA_def_pointer(func, "event", "Event", "", "");
938         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
939         /* TODO, shuold be a enum-flag */
940         parm = RNA_def_enum(func, "tweak", tweak_actions, 0, "Tweak", "");
941         RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
942         RNA_def_property_flag(parm, PROP_ENUM_FLAG);
943
944         /* wmManipulator.property_update */
945         /* TODO */
946
947         /* wmManipulator.setup */
948         func = RNA_def_function(srna, "setup", NULL);
949         RNA_def_function_ui_description(func, "");
950         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
951
952         /* wmManipulator.invoke */
953         func = RNA_def_function(srna, "invoke", NULL);
954         RNA_def_function_ui_description(func, "");
955         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
956         parm = RNA_def_pointer(func, "context", "Context", "", "");
957         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
958         parm = RNA_def_pointer(func, "event", "Event", "", "");
959         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
960
961         /* wmManipulator.exit */
962         func = RNA_def_function(srna, "exit", NULL);
963         RNA_def_function_ui_description(func, "");
964         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
965         parm = RNA_def_pointer(func, "context", "Context", "", "");
966         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
967         parm = RNA_def_boolean(func, "cancel", 0, "Cancel, otherwise confirm", "");
968         RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
969
970         /* wmManipulator.cursor_get */
971         /* TODO */
972
973         /* wmManipulator.select_refresh */
974         func = RNA_def_function(srna, "select_refresh", NULL);
975         RNA_def_function_ui_description(func, "");
976         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
977
978
979         /* -------------------------------------------------------------------- */
980         /* Instance Variables */
981
982         prop = RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
983         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
984         RNA_def_property_struct_type(prop, "ManipulatorGroup");
985         RNA_def_property_pointer_funcs(prop, "rna_Manipulator_group_get", NULL, NULL, NULL);
986         RNA_def_property_ui_text(prop, "", "Manipulator group this manipulator is a member of");
987
988         /* Color & Alpha */
989         prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
990         RNA_def_property_array(prop, 3);
991         RNA_def_property_float_funcs(prop, "rna_Manipulator_color_get", "rna_Manipulator_color_set", NULL);
992
993         prop = RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_NONE);
994         RNA_def_property_ui_text(prop, "Alpha", "");
995         RNA_def_property_float_funcs(prop, "rna_Manipulator_alpha_get", "rna_Manipulator_alpha_set", NULL);
996         RNA_def_property_range(prop, 0.0f, 1.0f);
997         RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
998
999         /* Color & Alpha (highlight) */
1000         prop = RNA_def_property(srna, "color_highlight", PROP_FLOAT, PROP_COLOR);
1001         RNA_def_property_array(prop, 3);
1002         RNA_def_property_float_funcs(prop, "rna_Manipulator_color_hi_get", "rna_Manipulator_color_hi_set", NULL);
1003
1004         prop = RNA_def_property(srna, "alpha_highlight", PROP_FLOAT, PROP_NONE);
1005         RNA_def_property_ui_text(prop, "Alpha", "");
1006         RNA_def_property_float_funcs(prop, "rna_Manipulator_alpha_hi_get", "rna_Manipulator_alpha_hi_set", NULL);
1007         RNA_def_property_range(prop, 0.0f, 1.0f);
1008         RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
1009
1010         prop = RNA_def_property(srna, "matrix_space", PROP_FLOAT, PROP_MATRIX);
1011         RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
1012         RNA_def_property_ui_text(prop, "Space Matrix", "");
1013         RNA_def_property_float_funcs(prop, "rna_Manipulator_matrix_space_get", "rna_Manipulator_matrix_space_set", NULL);
1014         RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
1015
1016         prop = RNA_def_property(srna, "matrix_basis", PROP_FLOAT, PROP_MATRIX);
1017         RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
1018         RNA_def_property_ui_text(prop, "Basis Matrix", "");
1019         RNA_def_property_float_funcs(prop, "rna_Manipulator_matrix_basis_get", "rna_Manipulator_matrix_basis_set", NULL);
1020         RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
1021
1022         prop = RNA_def_property(srna, "matrix_offset", PROP_FLOAT, PROP_MATRIX);
1023         RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
1024         RNA_def_property_ui_text(prop, "Offset Matrix", "");
1025         RNA_def_property_float_funcs(prop, "rna_Manipulator_matrix_offset_get", "rna_Manipulator_matrix_offset_set", NULL);
1026         RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
1027
1028         prop = RNA_def_property(srna, "matrix_world", PROP_FLOAT, PROP_MATRIX);
1029         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1030         RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
1031         RNA_def_property_ui_text(prop, "Final World Matrix", "");
1032         RNA_def_property_float_funcs(prop, "rna_Manipulator_matrix_world_get", NULL, NULL);
1033
1034         prop = RNA_def_property(srna, "scale_basis", PROP_FLOAT, PROP_NONE);
1035         RNA_def_property_ui_text(prop, "Scale Basis", "");
1036         RNA_def_property_float_funcs(prop, "rna_Manipulator_scale_basis_get", "rna_Manipulator_scale_basis_set", NULL);
1037         RNA_def_property_range(prop, 0.0f, FLT_MAX);
1038         RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
1039
1040         prop = RNA_def_property(srna, "line_width", PROP_FLOAT, PROP_PIXEL);
1041         RNA_def_property_ui_text(prop, "Line Width", "");
1042         RNA_def_property_float_funcs(prop, "rna_Manipulator_line_width_get", "rna_Manipulator_line_width_set", NULL);
1043         RNA_def_property_range(prop, 0.0f, FLT_MAX);
1044         RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
1045
1046         /* wmManipulator.flag */
1047         /* WM_MANIPULATOR_HIDDEN */
1048         prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
1049         RNA_def_property_boolean_funcs(
1050                 prop, "rna_Manipulator_flag_hide_get", "rna_Manipulator_flag_hide_set");
1051         RNA_def_property_ui_text(prop, "Hide", "");
1052         RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
1053         /* WM_MANIPULATOR_DRAW_HOVER */
1054         prop = RNA_def_property(srna, "use_draw_hover", PROP_BOOLEAN, PROP_NONE);
1055         RNA_def_property_boolean_funcs(
1056                 prop, "rna_Manipulator_flag_use_draw_hover_get", "rna_Manipulator_flag_use_draw_hover_set");
1057         RNA_def_property_ui_text(prop, "Draw Hover", "");
1058         RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
1059         /* WM_MANIPULATOR_DRAW_MODAL */
1060         prop = RNA_def_property(srna, "use_draw_modal", PROP_BOOLEAN, PROP_NONE);
1061         RNA_def_property_boolean_funcs(
1062                 prop, "rna_Manipulator_flag_use_draw_modal_get", "rna_Manipulator_flag_use_draw_modal_set");
1063         RNA_def_property_ui_text(prop, "Draw Active", "Draw while dragging");
1064         RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
1065         /* WM_MANIPULATOR_DRAW_VALUE */
1066         prop = RNA_def_property(srna, "use_draw_value", PROP_BOOLEAN, PROP_NONE);
1067         RNA_def_property_boolean_funcs(
1068                 prop, "rna_Manipulator_flag_use_draw_value_get", "rna_Manipulator_flag_use_draw_value_set");
1069         RNA_def_property_ui_text(prop, "Draw Value", "Show an indicator for the current value while dragging");
1070         RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
1071         /* WM_MANIPULATOR_DRAW_OFFSET_SCALE */
1072         prop = RNA_def_property(srna, "use_draw_offset_scale", PROP_BOOLEAN, PROP_NONE);
1073         RNA_def_property_boolean_funcs(
1074                 prop, "rna_Manipulator_flag_use_draw_offset_scale_get", "rna_Manipulator_flag_use_draw_offset_scale_set");
1075         RNA_def_property_ui_text(prop, "Draw Value", "Scale the offset matrix (use to apply screen-space offset)");
1076         RNA_def_property_update(prop, NC_SCREEN | NA_EDITED, NULL);
1077
1078         /* wmManipulator.state (readonly) */
1079         /* WM_MANIPULATOR_STATE_HIGHLIGHT */
1080         prop = RNA_def_property(srna, "is_highlight", PROP_BOOLEAN, PROP_NONE);
1081         RNA_def_property_boolean_funcs(prop, "rna_Manipulator_state_is_highlight_get", NULL);
1082         RNA_def_property_ui_text(prop, "Highlight", "");
1083         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1084         /* WM_MANIPULATOR_STATE_MODAL */
1085         prop = RNA_def_property(srna, "is_modal", PROP_BOOLEAN, PROP_NONE);
1086         RNA_def_property_boolean_funcs(prop, "rna_Manipulator_state_is_modal_get", NULL);
1087         RNA_def_property_ui_text(prop, "Highlight", "");
1088         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1089         /* WM_MANIPULATOR_STATE_SELECT */
1090         /* (note that setting is involved, needs to handle array) */
1091         prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
1092         RNA_def_property_boolean_funcs(prop, "rna_Manipulator_state_select_get", "rna_Manipulator_state_select_set");
1093         RNA_def_property_ui_text(prop, "Select", "");
1094
1095         RNA_api_manipulator(srna);
1096
1097         srna = RNA_def_struct(brna, "ManipulatorProperties", NULL);
1098         RNA_def_struct_ui_text(srna, "Manipulator Properties", "Input properties of an Manipulator");
1099         RNA_def_struct_refine_func(srna, "rna_ManipulatorProperties_refine");
1100         RNA_def_struct_idprops_func(srna, "rna_ManipulatorProperties_idprops");
1101         RNA_def_struct_flag(srna, STRUCT_NO_DATABLOCK_IDPROPERTIES);
1102 }
1103
1104 static void rna_def_manipulatorgroup(BlenderRNA *brna)
1105 {
1106         StructRNA *srna;
1107         PropertyRNA *prop;
1108
1109         FunctionRNA *func;
1110         PropertyRNA *parm;
1111
1112         srna = RNA_def_struct(brna, "ManipulatorGroup", NULL);
1113         RNA_def_struct_ui_text(srna, "ManipulatorGroup", "Storage of an operator being executed, or registered after execution");
1114         RNA_def_struct_sdna(srna, "wmManipulatorGroup");
1115         RNA_def_struct_refine_func(srna, "rna_ManipulatorGroup_refine");
1116 #ifdef WITH_PYTHON
1117         RNA_def_struct_register_funcs(
1118                 srna,
1119                 "rna_ManipulatorGroup_register",
1120                 "rna_ManipulatorGroup_unregister",
1121                 "rna_ManipulatorGroup_instance");
1122 #endif
1123         RNA_def_struct_translation_context(srna, BLT_I18NCONTEXT_OPERATOR_DEFAULT);
1124
1125         /* -------------------------------------------------------------------- */
1126         /* Registration */
1127
1128         RNA_define_verify_sdna(0); /* not in sdna */
1129
1130         prop = RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
1131         RNA_def_property_string_sdna(prop, NULL, "type->idname");
1132         RNA_def_property_string_maxlength(prop, MAX_NAME);
1133         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_ManipulatorGroup_bl_idname_set");
1134         RNA_def_property_flag(prop, PROP_REGISTER);
1135         RNA_def_struct_name_property(srna, prop);
1136
1137         prop = RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
1138         RNA_def_property_string_sdna(prop, NULL, "type->name");
1139         RNA_def_property_string_maxlength(prop, MAX_NAME); /* else it uses the pointer size! */
1140         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_ManipulatorGroup_bl_label_set");
1141         /* RNA_def_property_clear_flag(prop, PROP_EDITABLE); */
1142         RNA_def_property_flag(prop, PROP_REGISTER);
1143
1144         prop = RNA_def_property(srna, "bl_space_type", PROP_ENUM, PROP_NONE);
1145         RNA_def_property_enum_sdna(prop, NULL, "type->mmap_params.spaceid");
1146         RNA_def_property_enum_items(prop, rna_enum_space_type_items);
1147         RNA_def_property_flag(prop, PROP_REGISTER);
1148         RNA_def_property_ui_text(prop, "Space type", "The space where the panel is going to be used in");
1149
1150         prop = RNA_def_property(srna, "bl_region_type", PROP_ENUM, PROP_NONE);
1151         RNA_def_property_enum_sdna(prop, NULL, "type->mmap_params.regionid");
1152         RNA_def_property_enum_items(prop, rna_enum_region_type_items);
1153         RNA_def_property_flag(prop, PROP_REGISTER);
1154         RNA_def_property_ui_text(prop, "Region Type", "The region where the panel is going to be used in");
1155
1156         /* bl_options */
1157         static EnumPropertyItem manipulatorgroup_flag_items[] = {
1158                 {WM_MANIPULATORGROUPTYPE_3D, "3D", 0, "3D",
1159                  "Use in 3D viewport"},
1160                 {WM_MANIPULATORGROUPTYPE_SCALE, "SCALE", 0, "Scale",
1161                  "Scale to respect zoom (otherwise zoom independent draw size)"},
1162                 {WM_MANIPULATORGROUPTYPE_DEPTH_3D, "DEPTH_3D", 0, "Depth 3D",
1163                  "Supports culled depth by other objects in the view"},
1164                 {WM_MANIPULATORGROUPTYPE_SELECT, "SELECT", 0, "Select",
1165                  "Supports selection"},
1166                 {WM_MANIPULATORGROUPTYPE_PERSISTENT, "PERSISTENT", 0, "Persistent",
1167                  ""},
1168                 {WM_MANIPULATORGROUPTYPE_DRAW_MODAL_ALL, "SHOW_MODAL_ALL", 0, "Show Modal All",
1169                  "Show all while interacting"},
1170                 {0, NULL, 0, NULL, NULL}
1171         };
1172         prop = RNA_def_property(srna, "bl_options", PROP_ENUM, PROP_NONE);
1173         RNA_def_property_enum_sdna(prop, NULL, "type->flag");
1174         RNA_def_property_enum_items(prop, manipulatorgroup_flag_items);
1175         RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL | PROP_ENUM_FLAG);
1176         RNA_def_property_ui_text(prop, "Options",  "Options for this operator type");
1177
1178         RNA_define_verify_sdna(1); /* not in sdna */
1179
1180
1181         /* Functions */
1182
1183         /* poll */
1184         func = RNA_def_function(srna, "poll", NULL);
1185         RNA_def_function_ui_description(func, "Test if the manipulator group can be called or not");
1186         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_REGISTER_OPTIONAL);
1187         RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
1188         parm = RNA_def_pointer(func, "context", "Context", "", "");
1189         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
1190
1191         /* setup_keymap */
1192         func = RNA_def_function(srna, "setup_keymap", NULL);
1193         RNA_def_function_ui_description(
1194                 func,
1195                 "Initialize keymaps for this manipulator group, use fallback keymap when not present");
1196         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_REGISTER_OPTIONAL);
1197         parm = RNA_def_pointer(func, "keyconfig", "KeyConfig", "", "");
1198         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
1199         /* return */
1200         parm = RNA_def_pointer(func, "keymap", "KeyMap", "", "");
1201         RNA_def_property_flag(parm, PROP_NEVER_NULL);
1202         RNA_def_function_return(func, parm);
1203
1204         /* setup */
1205         func = RNA_def_function(srna, "setup", NULL);
1206         RNA_def_function_ui_description(func, "Create manipulators function for the manipulator group");
1207         RNA_def_function_flag(func, FUNC_REGISTER);
1208         parm = RNA_def_pointer(func, "context", "Context", "", "");
1209         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
1210
1211         /* refresh */
1212         func = RNA_def_function(srna, "refresh", NULL);
1213         RNA_def_function_ui_description(func, "Refresh data (called on common state changes such as selection)");
1214         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
1215         parm = RNA_def_pointer(func, "context", "Context", "", "");
1216         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
1217
1218         func = RNA_def_function(srna, "draw_prepare", NULL);
1219         RNA_def_function_ui_description(func, "Run before each redraw");
1220         RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
1221         parm = RNA_def_pointer(func, "context", "Context", "", "");
1222         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
1223
1224         /* -------------------------------------------------------------------- */
1225         /* Instance Variables */
1226
1227         prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
1228         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1229         RNA_def_property_string_funcs(prop, "rna_ManipulatorGroup_name_get", "rna_ManipulatorGroup_name_length", NULL);
1230         RNA_def_property_ui_text(prop, "Name", "");
1231
1232         prop = RNA_def_property(srna, "has_reports", PROP_BOOLEAN, PROP_NONE);
1233         RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* this is 'virtual' property */
1234         RNA_def_property_boolean_funcs(prop, "rna_ManipulatorGroup_has_reports_get", NULL);
1235         RNA_def_property_ui_text(prop, "Has Reports",
1236                                  "ManipulatorGroup has a set of reports (warnings and errors) from last execution");
1237
1238
1239         RNA_define_verify_sdna(0); /* not in sdna */
1240
1241         prop = RNA_def_property(srna, "manipulators", PROP_COLLECTION, PROP_NONE);
1242         RNA_def_property_collection_sdna(prop, NULL, "manipulators", NULL);
1243         RNA_def_property_struct_type(prop, "Manipulator");
1244         RNA_def_property_collection_funcs(
1245                 prop, "rna_ManipulatorGroup_manipulators_begin", "rna_iterator_listbase_next",
1246                 "rna_iterator_listbase_end", "rna_iterator_listbase_get",
1247                 NULL, NULL, NULL, NULL);
1248
1249         RNA_def_property_ui_text(prop, "Manipulators", "List of manipulators in the Manipulator Map");
1250         rna_def_manipulator(brna, prop);
1251         rna_def_manipulators(brna, prop);
1252
1253         RNA_define_verify_sdna(1); /* not in sdna */
1254
1255         RNA_api_manipulatorgroup(srna);
1256 }
1257
1258 void RNA_def_wm_manipulator(BlenderRNA *brna)
1259 {
1260         rna_def_manipulatorgroup(brna);
1261 }
1262
1263 #endif /* RNA_RUNTIME */