UI List: ctrl click on names in list can be used for renaming.
[blender-staging.git] / source / blender / makesrna / intern / rna_ui_api.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  * The Original Code is Copyright (C) 2009 Blender Foundation.
19  * All rights reserved.
20  *
21  *
22  * Contributor(s): Blender Foundation
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/makesrna/intern/rna_ui_api.c
28  *  \ingroup RNA
29  */
30
31
32 #include <stdlib.h>
33 #include <stdio.h>
34
35 #include "BLI_utildefines.h"
36
37 #include "BLF_translation.h"
38
39 #include "RNA_define.h"
40 #include "RNA_enum_types.h"
41
42 #include "DNA_screen_types.h"
43
44 #include "UI_resources.h"
45 #include "UI_interface.h"
46 #include "UI_interface_icons.h"
47
48 #include "rna_internal.h"
49
50 #define DEF_ICON_BLANK_SKIP
51 #define DEF_ICON(name) {ICON_##name, (#name), 0, (#name), ""},
52 #define DEF_VICO(name) {VICO_##name, (#name), 0, (#name), ""},
53 EnumPropertyItem icon_items[] = {
54 #include "UI_icons.h"
55         {0, NULL, 0, NULL, NULL}
56 };
57 #undef DEF_ICON_BLANK_SKIP
58 #undef DEF_ICON
59 #undef DEF_VICO
60
61 #ifdef RNA_RUNTIME
62
63 static const char *rna_translate_ui_text(const char *text, const char *text_ctxt, StructRNA *type, PropertyRNA *prop,
64                                          int translate)
65 {
66         /* Also return text if UI labels translation is disabled. */
67         if (!text || !text[0] || !translate || !BLF_translate_iface()) {
68                 return text;
69         }
70
71         /* If a text_ctxt is specified, use it! */
72         if (text_ctxt && text_ctxt[0]) {
73                 return BLF_pgettext(text_ctxt, text);
74         }
75
76         /* Else, if an RNA type or property is specified, use its context. */
77 #if 0
78         /* XXX Disabled for now. Unfortunately, their is absolutely no way from py code to get the RNA struct corresponding
79          *     to the 'data' (in functions like prop() & co), as this is pure runtime data. Hence, messages extraction
80          *     script can't determine the correct context it should use for such 'text' messages...
81          *     So for now, one have to explicitly specify the 'text_ctxt' when using prop() etc. functions,
82          *     if default context is not suitable.
83          */
84         if (prop) {
85                 return BLF_pgettext(RNA_property_translation_context(prop), text);
86         }
87 #else
88         (void)prop;
89 #endif
90         if (type) {
91                 return BLF_pgettext(RNA_struct_translation_context(type), text);
92         }
93
94         /* Else, default context! */
95         return BLF_pgettext(BLF_I18NCONTEXT_DEFAULT, text);
96 }
97
98 static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, const char *name, const char *text_ctxt,
99                         int translate, int icon, int expand, int slider, int toggle, int icon_only, int event,
100                         int full_event, int emboss, int index, int icon_value)
101 {
102         PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
103         int flag = 0;
104
105         if (!prop) {
106                 RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
107                 return;
108         }
109
110         if (icon_value && !icon) {
111                 icon = icon_value;
112         }
113
114         /* Get translated name (label). */
115         name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate);
116
117         flag |= (slider) ? UI_ITEM_R_SLIDER : 0;
118         flag |= (expand) ? UI_ITEM_R_EXPAND : 0;
119         flag |= (toggle) ? UI_ITEM_R_TOGGLE : 0;
120         flag |= (icon_only) ? UI_ITEM_R_ICON_ONLY : 0;
121         flag |= (event) ? UI_ITEM_R_EVENT : 0;
122         flag |= (full_event) ? UI_ITEM_R_FULL_EVENT : 0;
123         flag |= (emboss) ? 0 : UI_ITEM_R_NO_BG;
124
125         uiItemFullR(layout, ptr, prop, index, 0, flag, name, icon);
126 }
127
128 static void rna_uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name,
129                                 const char *text_ctxt, int translate, int icon)
130 {
131         PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
132
133         if (!prop) {
134                 RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
135                 return;
136         }
137
138         /* Get translated name (label). */
139         name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate);
140
141         /* XXX This will search property again :( */
142         uiItemMenuEnumR(layout, ptr, propname, name, icon);
143 }
144
145 static void rna_uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *value,
146                                    const char *name, const char *text_ctxt, int translate, int icon)
147 {
148         PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
149
150         if (!prop) {
151                 RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
152                 return;
153         }
154
155         /* Get translated name (label). */
156         name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate);
157
158         /* XXX This will search property again :( */
159         uiItemEnumR_string(layout, ptr, propname, value, name, icon);
160 }
161
162 static void rna_uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname,
163                                struct PointerRNA *searchptr, const char *searchpropname,
164                                const char *name, const char *text_ctxt, int translate, int icon)
165 {
166         PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
167
168         if (!prop) {
169                 RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
170                 return;
171         }
172
173         /* Get translated name (label). */
174         name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate);
175
176         /* XXX This will search property again :( */
177         uiItemPointerR(layout, ptr, propname, searchptr, searchpropname, name, icon);
178 }
179
180 static PointerRNA rna_uiItemO(uiLayout *layout, const char *opname, const char *name, const char *text_ctxt,
181                               int translate, int icon, int emboss)
182 {
183         wmOperatorType *ot;
184         int flag;
185
186         ot = WM_operatortype_find(opname, 0); /* print error next */
187         if (!ot || !ot->srna) {
188                 RNA_warning("%s '%s'", ot ? "unknown operator" : "operator missing srna", opname);
189                 return PointerRNA_NULL;
190         }
191
192         /* Get translated name (label). */
193         name = rna_translate_ui_text(name, text_ctxt, ot->srna, NULL, translate);
194
195         flag = UI_ITEM_O_RETURN_PROPS;
196         flag |= (emboss) ? 0 : UI_ITEM_R_NO_BG;
197
198         return uiItemFullO_ptr(layout, ot, name, icon, NULL, uiLayoutGetOperatorContext(layout), flag);
199 }
200
201 static void rna_uiItemMenuEnumO(uiLayout *layout, bContext *C, const char *opname, const char *propname, const char *name,
202                                 const char *text_ctxt, int translate, int icon)
203 {
204         wmOperatorType *ot = WM_operatortype_find(opname, 0); /* print error next */
205
206         if (!ot || !ot->srna) {
207                 RNA_warning("%s '%s'", ot ? "unknown operator" : "operator missing srna", opname);
208                 return;
209         }
210
211         /* Get translated name (label). */
212         name = rna_translate_ui_text(name, text_ctxt, ot->srna, NULL, translate);
213
214         /* XXX This will search operator again :( */
215         uiItemMenuEnumO(layout, C, opname, propname, name, icon);
216 }
217
218 static void rna_uiItemL(uiLayout *layout, const char *name, const char *text_ctxt, int translate,
219                         int icon, int icon_value)
220 {
221         /* Get translated name (label). */
222         name = rna_translate_ui_text(name, text_ctxt, NULL, NULL, translate);
223
224         if (icon_value && !icon) {
225                 icon = icon_value;
226         }
227
228         uiItemL(layout, name, icon);
229 }
230
231 static void rna_uiItemM(uiLayout *layout, bContext *C, const char *menuname, const char *name, const char *text_ctxt,
232                         int translate, int icon)
233 {
234         /* Get translated name (label). */
235         name = rna_translate_ui_text(name, text_ctxt, NULL, NULL, translate);
236
237         uiItemM(layout, C, menuname, name, icon);
238 }
239
240 static void rna_uiTemplateAnyID(uiLayout *layout, PointerRNA *ptr, const char *propname, const char *proptypename,
241                                 const char *name, const char *text_ctxt, int translate)
242 {
243         PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
244
245         if (!prop) {
246                 RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
247                 return;
248         }
249
250         /* Get translated name (label). */
251         name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate);
252
253         /* XXX This will search property again :( */
254         uiTemplateAnyID(layout, ptr, propname, proptypename, name);
255 }
256
257 static void rna_uiTemplatePathBuilder(uiLayout *layout, PointerRNA *ptr, const char *propname, PointerRNA *root_ptr,
258                                       const char *name, const char *text_ctxt, int translate)
259 {
260         PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
261
262         if (!prop) {
263                 RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
264                 return;
265         }
266
267         /* Get translated name (label). */
268         name = rna_translate_ui_text(name, text_ctxt, NULL, prop, translate);
269
270         /* XXX This will search property again :( */
271         uiTemplatePathBuilder(layout, ptr, propname, root_ptr, name);
272 }
273
274 static int rna_ui_get_rnaptr_icon(bContext *C, PointerRNA *ptr_icon)
275 {
276         return UI_rnaptr_icon_get(C, ptr_icon, RNA_struct_ui_icon(ptr_icon->type), false);
277 }
278
279 static const char *rna_ui_get_enum_name(bContext *C, PointerRNA *ptr, const char *propname, const char *identifier)
280 {
281         PropertyRNA *prop = NULL;
282         EnumPropertyItem *items = NULL, *item;
283         int free;
284         const char *name = "";
285
286         prop = RNA_struct_find_property(ptr, propname);
287         if (!prop || (RNA_property_type(prop) != PROP_ENUM)) {
288                 RNA_warning("Property not found or not an enum: %s.%s", RNA_struct_identifier(ptr->type), propname);
289                 return name;
290         }
291
292         RNA_property_enum_items_gettexted(C, ptr, prop, &items, NULL, &free);
293
294         if (items) {
295                 for (item = items; item->identifier; item++) {
296                         if (item->identifier[0] && strcmp(item->identifier, identifier) == 0) {
297                                 name = item->name;
298                                 break;
299                         }
300                 }
301                 if (free) {
302                         MEM_freeN(items);
303                 }
304         }
305
306         return name;
307 }
308
309 static const char *rna_ui_get_enum_description(bContext *C, PointerRNA *ptr, const char *propname,
310                                                const char *identifier)
311 {
312         PropertyRNA *prop = NULL;
313         EnumPropertyItem *items = NULL, *item;
314         int free;
315         const char *desc = "";
316
317         prop = RNA_struct_find_property(ptr, propname);
318         if (!prop || (RNA_property_type(prop) != PROP_ENUM)) {
319                 RNA_warning("Property not found or not an enum: %s.%s", RNA_struct_identifier(ptr->type), propname);
320                 return desc;
321         }
322
323         RNA_property_enum_items_gettexted(C, ptr, prop, &items, NULL, &free);
324
325         if (items) {
326                 for (item = items; item->identifier; item++) {
327                         if (item->identifier[0] && strcmp(item->identifier, identifier) == 0) {
328                                 desc = item->description;
329                                 break;
330                         }
331                 }
332                 if (free) {
333                         MEM_freeN(items);
334                 }
335         }
336
337         return desc;
338 }
339
340 static int rna_ui_get_enum_icon(bContext *C, PointerRNA *ptr, const char *propname, const char *identifier)
341 {
342         PropertyRNA *prop = NULL;
343         EnumPropertyItem *items = NULL, *item;
344         int free;
345         int icon = ICON_NONE;
346
347         prop = RNA_struct_find_property(ptr, propname);
348         if (!prop || (RNA_property_type(prop) != PROP_ENUM)) {
349                 RNA_warning("Property not found or not an enum: %s.%s", RNA_struct_identifier(ptr->type), propname);
350                 return icon;
351         }
352
353         RNA_property_enum_items(C, ptr, prop, &items, NULL, &free);
354
355         if (items) {
356                 for (item = items; item->identifier; item++) {
357                         if (item->identifier[0] && strcmp(item->identifier, identifier) == 0) {
358                                 icon = item->icon;
359                                 break;
360                         }
361                 }
362                 if (free) {
363                         MEM_freeN(items);
364                 }
365         }
366
367         return icon;
368 }
369
370 #else
371
372 static void api_ui_item_common_text(FunctionRNA *func)
373 {
374         RNA_def_string(func, "text", "", 0, "", "Override automatic text of the item");
375         RNA_def_string(func, "text_ctxt", "", 0, "", "Override automatic translation context of the given text");
376         RNA_def_boolean(func, "translate", true, "", "Translate the given text, when UI translation is enabled");
377 }
378
379 static void api_ui_item_common(FunctionRNA *func)
380 {
381         PropertyRNA *prop;
382
383         api_ui_item_common_text(func);
384
385         prop = RNA_def_property(func, "icon", PROP_ENUM, PROP_NONE);
386         RNA_def_property_enum_items(prop, icon_items);
387         RNA_def_property_ui_text(prop, "Icon", "Override automatic icon of the item");
388 }
389
390 static void api_ui_item_op(FunctionRNA *func)
391 {
392         PropertyRNA *parm;
393         parm = RNA_def_string(func, "operator", "", 0, "", "Identifier of the operator");
394         RNA_def_property_flag(parm, PROP_REQUIRED);
395 }
396
397 static void api_ui_item_op_common(FunctionRNA *func)
398 {
399         api_ui_item_op(func);
400         api_ui_item_common(func);
401 }
402
403 static void api_ui_item_rna_common(FunctionRNA *func)
404 {
405         PropertyRNA *parm;
406
407         parm = RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property");
408         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
409         parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in data");
410         RNA_def_property_flag(parm, PROP_REQUIRED);
411 }
412
413 void RNA_api_ui_layout(StructRNA *srna)
414 {
415         FunctionRNA *func;
416         PropertyRNA *parm;
417
418         static EnumPropertyItem curve_type_items[] = {
419                 {0, "NONE", 0, "None", ""},
420                 {'v', "VECTOR", 0, "Vector", ""},
421                 {'c', "COLOR", 0, "Color", ""},
422                 {'h', "HUE", 0, "Hue", ""},
423                 {0, NULL, 0, NULL, NULL}
424         };
425
426         static float node_socket_color_default[] = { 0.0f, 0.0f, 0.0f, 1.0f };
427
428         /* simple layout specifiers */
429         func = RNA_def_function(srna, "row", "uiLayoutRow");
430         parm = RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in");
431         RNA_def_function_return(func, parm);
432         RNA_def_function_ui_description(func,
433                                         "Sub-layout. Items placed in this sublayout are placed next to each other "
434                                         "in a row");
435         RNA_def_boolean(func, "align", false, "", "Align buttons to each other");
436         
437         func = RNA_def_function(srna, "column", "uiLayoutColumn");
438         parm = RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in");
439         RNA_def_function_return(func, parm);
440         RNA_def_function_ui_description(func,
441                                         "Sub-layout. Items placed in this sublayout are placed under each other "
442                                         "in a column");
443         RNA_def_boolean(func, "align", false, "", "Align buttons to each other");
444
445         func = RNA_def_function(srna, "column_flow", "uiLayoutColumnFlow");
446         RNA_def_int(func, "columns", 0, 0, INT_MAX, "", "Number of columns, 0 is automatic", 0, INT_MAX);
447         parm = RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in");
448         RNA_def_function_return(func, parm);
449         RNA_def_boolean(func, "align", false, "", "Align buttons to each other");
450
451         /* box layout */
452         func = RNA_def_function(srna, "box", "uiLayoutBox");
453         parm = RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in");
454         RNA_def_function_return(func, parm);
455         RNA_def_function_ui_description(func, "Sublayout (items placed in this sublayout are placed "
456                                         "under each other in a column and are surrounded by a box)");
457         
458         /* split layout */
459         func = RNA_def_function(srna, "split", "uiLayoutSplit");
460         parm = RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in");
461         RNA_def_function_return(func, parm);
462         RNA_def_float(func, "percentage", 0.0f, 0.0f, 1.0f, "Percentage", "Percentage of width to split at", 0.0f, 1.0f);
463         RNA_def_boolean(func, "align", false, "", "Align buttons to each other");
464
465         /* Icon of a rna pointer */
466         func = RNA_def_function(srna, "icon", "rna_ui_get_rnaptr_icon");
467         parm = RNA_def_int(func, "icon_value", ICON_NONE, 0, INT_MAX, "", "Icon identifier", 0, INT_MAX);
468         RNA_def_function_return(func, parm);
469         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
470         parm = RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take the icon");
471         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
472         RNA_def_function_ui_description(func, "Return the custom icon for this data, "
473                                               "use it e.g. to get materials or texture icons");
474
475         /* UI name, description and icon of an enum item */
476         func = RNA_def_function(srna, "enum_item_name", "rna_ui_get_enum_name");
477         parm = RNA_def_string(func, "name", "", 0, "", "UI name of the enum item");
478         RNA_def_function_return(func, parm);
479         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
480         api_ui_item_rna_common(func);
481         parm = RNA_def_string(func, "identifier", "", 0, "", "Identifier of the enum item");
482         RNA_def_property_flag(parm, PROP_REQUIRED);
483         RNA_def_function_ui_description(func, "Return the UI name for this enum item");
484
485         func = RNA_def_function(srna, "enum_item_description", "rna_ui_get_enum_description");
486         parm = RNA_def_string(func, "description", "", 0, "", "UI description of the enum item");
487         RNA_def_function_return(func, parm);
488         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
489         api_ui_item_rna_common(func);
490         parm = RNA_def_string(func, "identifier", "", 0, "", "Identifier of the enum item");
491         RNA_def_property_flag(parm, PROP_REQUIRED);
492         RNA_def_function_ui_description(func, "Return the UI description for this enum item");
493
494         func = RNA_def_function(srna, "enum_item_icon", "rna_ui_get_enum_icon");
495         parm = RNA_def_int(func, "icon_value", ICON_NONE, 0, INT_MAX, "", "Icon identifier", 0, INT_MAX);
496         RNA_def_function_return(func, parm);
497         RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_CONTEXT);
498         api_ui_item_rna_common(func);
499         parm = RNA_def_string(func, "identifier", "", 0, "", "Identifier of the enum item");
500         RNA_def_property_flag(parm, PROP_REQUIRED);
501         RNA_def_function_ui_description(func, "Return the icon for this enum item");
502
503         /* items */
504         func = RNA_def_function(srna, "prop", "rna_uiItemR");
505         RNA_def_function_ui_description(func, "Item. Exposes an RNA item and places it into the layout");
506         api_ui_item_rna_common(func);
507         api_ui_item_common(func);
508         RNA_def_boolean(func, "expand", false, "", "Expand button to show more detail");
509         RNA_def_boolean(func, "slider", false, "", "Use slider widget for numeric values");
510         RNA_def_boolean(func, "toggle", false, "", "Use toggle widget for boolean values");
511         RNA_def_boolean(func, "icon_only", false, "", "Draw only icons in buttons, no text");
512         RNA_def_boolean(func, "event", false, "", "Use button to input key events");
513         RNA_def_boolean(func, "full_event", false, "", "Use button to input full events including modifiers");
514         RNA_def_boolean(func, "emboss", true, "", "Draw the button itself, just the icon/text");
515         RNA_def_int(func, "index", -1, -2, INT_MAX, "",
516                     "The index of this button, when set a single member of an array can be accessed, "
517                     "when set to -1 all array members are used", -2, INT_MAX); /* RNA_NO_INDEX == -1 */
518         parm = RNA_def_property(func, "icon_value", PROP_INT, PROP_UNSIGNED);
519         RNA_def_property_ui_text(parm, "Icon Value",
520                                  "Override automatic icon of the item "
521                                  "(use it e.g. with custom material icons returned by icon()...)");
522
523         func = RNA_def_function(srna, "props_enum", "uiItemsEnumR");
524         api_ui_item_rna_common(func);
525
526         func = RNA_def_function(srna, "prop_menu_enum", "rna_uiItemMenuEnumR");
527         api_ui_item_rna_common(func);
528         api_ui_item_common(func);
529
530         func = RNA_def_function(srna, "prop_enum", "rna_uiItemEnumR_string");
531         api_ui_item_rna_common(func);
532         parm = RNA_def_string(func, "value", "", 0, "", "Enum property value");
533         RNA_def_property_flag(parm, PROP_REQUIRED);
534         api_ui_item_common(func);
535
536         func = RNA_def_function(srna, "prop_search", "rna_uiItemPointerR");
537         api_ui_item_rna_common(func);
538         parm = RNA_def_pointer(func, "search_data", "AnyType", "", "Data from which to take collection to search in");
539         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
540         parm = RNA_def_string(func, "search_property", "", 0, "", "Identifier of search collection property");
541         RNA_def_property_flag(parm, PROP_REQUIRED);
542         api_ui_item_common(func);
543
544         func = RNA_def_function(srna, "operator", "rna_uiItemO");
545         api_ui_item_op_common(func);
546         RNA_def_boolean(func, "emboss", true, "", "Draw the button itself, just the icon/text");
547         parm = RNA_def_pointer(func, "properties", "OperatorProperties", "",
548                                "Operator properties to fill in, return when 'properties' is set to true");
549         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR);
550         RNA_def_function_return(func, parm);
551         RNA_def_function_ui_description(func, "Item. Places a button into the layout to call an Operator");
552
553         func = RNA_def_function(srna, "operator_enum", "uiItemsEnumO");
554         parm = RNA_def_string(func, "operator", "", 0, "", "Identifier of the operator");
555         RNA_def_property_flag(parm, PROP_REQUIRED);
556         parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator");
557         RNA_def_property_flag(parm, PROP_REQUIRED);
558
559         func = RNA_def_function(srna, "operator_menu_enum", "rna_uiItemMenuEnumO");
560         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
561         api_ui_item_op(func); /* cant use api_ui_item_op_common because property must come right after */
562         parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator");
563         RNA_def_property_flag(parm, PROP_REQUIRED);
564         api_ui_item_common(func);
565
566         /* useful in C but not in python */
567 #if 0
568
569         func = RNA_def_function(srna, "operator_enum_single", "uiItemEnumO_string");
570         api_ui_item_op_common(func);
571         parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator");
572         RNA_def_property_flag(parm, PROP_REQUIRED);
573         parm = RNA_def_string(func, "value", "", 0, "", "Enum property value");
574         RNA_def_property_flag(parm, PROP_REQUIRED);
575
576         func = RNA_def_function(srna, "operator_boolean", "uiItemBooleanO");
577         api_ui_item_op_common(func);
578         parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator");
579         RNA_def_property_flag(parm, PROP_REQUIRED);
580         parm = RNA_def_boolean(func, "value", false, "", "Value of the property to call the operator with");
581         RNA_def_property_flag(parm, PROP_REQUIRED); */
582
583         func = RNA_def_function(srna, "operator_int", "uiItemIntO");
584         api_ui_item_op_common(func);
585         parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator");
586         RNA_def_property_flag(parm, PROP_REQUIRED);
587         parm = RNA_def_int(func, "value", 0, INT_MIN, INT_MAX, "",
588                           "Value of the property to call the operator with", INT_MIN, INT_MAX);
589         RNA_def_property_flag(parm, PROP_REQUIRED); */
590
591         func = RNA_def_function(srna, "operator_float", "uiItemFloatO");
592         api_ui_item_op_common(func);
593         parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator");
594         RNA_def_property_flag(parm, PROP_REQUIRED);
595         parm = RNA_def_float(func, "value", 0, -FLT_MAX, FLT_MAX, "",
596                             "Value of the property to call the operator with", -FLT_MAX, FLT_MAX);
597         RNA_def_property_flag(parm, PROP_REQUIRED); */
598
599         func = RNA_def_function(srna, "operator_string", "uiItemStringO");
600         api_ui_item_op_common(func);
601         parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator");
602         RNA_def_property_flag(parm, PROP_REQUIRED);
603         parm = RNA_def_string(func, "value", "", 0, "", "Value of the property to call the operator with");
604         RNA_def_property_flag(parm, PROP_REQUIRED);
605 #endif
606
607         func = RNA_def_function(srna, "label", "rna_uiItemL");
608         RNA_def_function_ui_description(func, "Item. Display text and/or icon in the layout");
609         api_ui_item_common(func);
610         parm = RNA_def_property(func, "icon_value", PROP_INT, PROP_UNSIGNED);
611         RNA_def_property_ui_text(parm, "Icon Value",
612                                  "Override automatic icon of the item "
613                                  "(use it e.g. with custom material icons returned by icon()...)");
614
615         func = RNA_def_function(srna, "menu", "rna_uiItemM");
616         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
617         parm = RNA_def_string(func, "menu", "", 0, "", "Identifier of the menu");
618         api_ui_item_common(func);
619         RNA_def_property_flag(parm, PROP_REQUIRED);
620
621         func = RNA_def_function(srna, "separator", "uiItemS");
622         RNA_def_function_ui_description(func, "Item. Inserts empty space into the layout between items");
623
624         /* context */
625         func = RNA_def_function(srna, "context_pointer_set", "uiLayoutSetContextPointer");
626         parm = RNA_def_string(func, "name", "", 0, "Name", "Name of entry in the context");
627         RNA_def_property_flag(parm, PROP_REQUIRED);
628         parm = RNA_def_pointer(func, "data", "AnyType", "", "Pointer to put in context");
629         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR);
630         
631         /* templates */
632         func = RNA_def_function(srna, "template_header", "uiTemplateHeader");
633         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
634         RNA_def_boolean(func, "menus", true, "", "The header has menus, and should show menu expander");
635
636         func = RNA_def_function(srna, "template_ID", "uiTemplateID");
637         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
638         api_ui_item_rna_common(func);
639         RNA_def_string(func, "new", "", 0, "", "Operator identifier to create a new ID block");
640         RNA_def_string(func, "open", "", 0, "", "Operator identifier to open a file for creating a new ID block");
641         RNA_def_string(func, "unlink", "", 0, "", "Operator identifier to unlink the ID block");
642         
643         func = RNA_def_function(srna, "template_ID_preview", "uiTemplateIDPreview");
644         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
645         api_ui_item_rna_common(func);
646         RNA_def_string(func, "new", "", 0, "", "Operator identifier to create a new ID block");
647         RNA_def_string(func, "open", "", 0, "", "Operator identifier to open a file for creating a new ID block");
648         RNA_def_string(func, "unlink", "", 0, "", "Operator identifier to unlink the ID block");
649         RNA_def_int(func, "rows", 0, 0, INT_MAX, "Number of thumbnail preview rows to display", "", 0, INT_MAX);
650         RNA_def_int(func, "cols", 0, 0, INT_MAX, "Number of thumbnail preview columns to display", "", 0, INT_MAX);
651         
652         func = RNA_def_function(srna, "template_any_ID", "rna_uiTemplateAnyID");
653         parm = RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property");
654         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
655         parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in data");
656         RNA_def_property_flag(parm, PROP_REQUIRED);
657         parm = RNA_def_string(func, "type_property", "", 0, "",
658                               "Identifier of property in data giving the type of the ID-blocks to use");
659         RNA_def_property_flag(parm, PROP_REQUIRED);
660         api_ui_item_common_text(func);
661         
662         func = RNA_def_function(srna, "template_path_builder", "rna_uiTemplatePathBuilder");
663         parm = RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property");
664         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
665         parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in data");
666         RNA_def_property_flag(parm, PROP_REQUIRED);
667         parm = RNA_def_pointer(func, "root", "ID", "", "ID-block from which path is evaluated from");
668         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR);
669         api_ui_item_common_text(func);
670         
671         func = RNA_def_function(srna, "template_modifier", "uiTemplateModifier");
672         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
673         RNA_def_function_ui_description(func, "Layout . Generates the UI layout for modifiers");
674         parm = RNA_def_pointer(func, "data", "Modifier", "", "Modifier data");
675         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
676         parm = RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in");
677         RNA_def_function_return(func, parm);
678
679         func = RNA_def_function(srna, "template_constraint", "uiTemplateConstraint");
680         RNA_def_function_ui_description(func, "Layout . Generates the UI layout for constraints");
681         parm = RNA_def_pointer(func, "data", "Constraint", "", "Constraint data");
682         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
683         parm = RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in");
684         RNA_def_function_return(func, parm);
685
686         func = RNA_def_function(srna, "template_preview", "uiTemplatePreview");
687         RNA_def_function_ui_description(func, "Item. A preview window for materials, textures, lamps, etc");
688         parm = RNA_def_pointer(func, "id", "ID", "", "ID datablock");
689         RNA_def_property_flag(parm, PROP_REQUIRED);
690         RNA_def_boolean(func, "show_buttons", true, "", "Show preview buttons?");
691         RNA_def_pointer(func, "parent", "ID", "", "ID datablock");
692         RNA_def_pointer(func, "slot", "TextureSlot", "", "Texture slot");
693
694         func = RNA_def_function(srna, "template_curve_mapping", "uiTemplateCurveMapping");
695         RNA_def_function_ui_description(func, "Item. A curve mapping widget used for e.g falloff curves for lamps");
696         api_ui_item_rna_common(func);
697         RNA_def_enum(func, "type", curve_type_items, 0, "Type", "Type of curves to display");
698         RNA_def_boolean(func, "levels", false, "", "Show black/white levels");
699         RNA_def_boolean(func, "brush", false, "", "Show brush options");
700
701         func = RNA_def_function(srna, "template_color_ramp", "uiTemplateColorRamp");
702         RNA_def_function_ui_description(func, "Item. A color ramp widget");
703         api_ui_item_rna_common(func);
704         RNA_def_boolean(func, "expand", false, "", "Expand button to show more detail");
705         
706         func = RNA_def_function(srna, "template_icon_view", "uiTemplateIconView");
707         RNA_def_function_ui_description(func, "Enum. Large widget showing Icon previews");
708         api_ui_item_rna_common(func);
709         
710         func = RNA_def_function(srna, "template_histogram", "uiTemplateHistogram");
711         RNA_def_function_ui_description(func, "Item. A histogramm widget to analyze imaga data");
712         api_ui_item_rna_common(func);
713         
714         func = RNA_def_function(srna, "template_waveform", "uiTemplateWaveform");
715         RNA_def_function_ui_description(func, "Item. A waveform widget to analyze imaga data");
716         api_ui_item_rna_common(func);
717         
718         func = RNA_def_function(srna, "template_vectorscope", "uiTemplateVectorscope");
719         RNA_def_function_ui_description(func, "Item. A vectorscope widget to analyze imaga data");
720         api_ui_item_rna_common(func);
721         
722         func = RNA_def_function(srna, "template_layers", "uiTemplateLayers");
723         api_ui_item_rna_common(func);
724         parm = RNA_def_pointer(func, "used_layers_data", "AnyType", "", "Data from which to take property");
725         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR);
726         parm = RNA_def_string(func, "used_layers_property", "", 0, "", "Identifier of property in data");
727         RNA_def_property_flag(parm, PROP_REQUIRED);
728         parm = RNA_def_int(func, "active_layer", 0, 0, INT_MAX, "Active Layer", "", 0, INT_MAX);
729         RNA_def_property_flag(parm, PROP_REQUIRED);
730         
731         func = RNA_def_function(srna, "template_color_picker", "uiTemplateColorPicker");
732         RNA_def_function_ui_description(func, "Item. A color wheel widget to pick colors");
733         api_ui_item_rna_common(func);
734         RNA_def_boolean(func, "value_slider", false, "", "Display the value slider to the right of the color wheel");
735         RNA_def_boolean(func, "lock", false, "", "Lock the color wheel display to value 1.0 regardless of actual color");
736         RNA_def_boolean(func, "lock_luminosity", false, "", "Keep the color at its original vector length");
737         RNA_def_boolean(func, "cubic", true, "", "Cubic saturation for picking values close to white");
738
739         func = RNA_def_function(srna, "template_image_layers", "uiTemplateImageLayers");
740         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
741         parm = RNA_def_pointer(func, "image", "Image", "", "");
742         RNA_def_property_flag(parm, PROP_REQUIRED);
743         parm = RNA_def_pointer(func, "image_user", "ImageUser", "", "");
744         RNA_def_property_flag(parm, PROP_REQUIRED);
745
746         func = RNA_def_function(srna, "template_image", "uiTemplateImage");
747         RNA_def_function_ui_description(func, "Item(s). User interface for selecting images and their source paths");
748         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
749         api_ui_item_rna_common(func);
750         parm = RNA_def_pointer(func, "image_user", "ImageUser", "", "");
751         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
752         RNA_def_boolean(func, "compact", false, "", "Use more compact layout");
753
754         func = RNA_def_function(srna, "template_image_settings", "uiTemplateImageSettings");
755         RNA_def_function_ui_description(func, "User interface for setting image format options");
756         parm = RNA_def_pointer(func, "image_settings", "ImageFormatSettings", "", "");
757         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
758         RNA_def_boolean(func, "color_management", false, "", "Show color management settings");
759
760         func = RNA_def_function(srna, "template_movieclip", "uiTemplateMovieClip");
761         RNA_def_function_ui_description(func, "Item(s). User interface for selecting movie clips and their source paths");
762         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
763         api_ui_item_rna_common(func);
764         RNA_def_boolean(func, "compact", false, "", "Use more compact layout");
765
766         func = RNA_def_function(srna, "template_track", "uiTemplateTrack");
767         RNA_def_function_ui_description(func, "Item. A movie-track widget to preview tracking image.");
768         api_ui_item_rna_common(func);
769
770         func = RNA_def_function(srna, "template_marker", "uiTemplateMarker");
771         RNA_def_function_ui_description(func, "Item. A widget to control single marker settings.");
772         api_ui_item_rna_common(func);
773         parm = RNA_def_pointer(func, "clip_user", "MovieClipUser", "", "");
774         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
775         parm = RNA_def_pointer(func, "track", "MovieTrackingTrack", "", "");
776         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
777         RNA_def_boolean(func, "compact", false, "", "Use more compact layout");
778
779         func = RNA_def_function(srna, "template_movieclip_information", "uiTemplateMovieclipInformation");
780         RNA_def_function_ui_description(func, "Item. Movie clip information data.");
781         api_ui_item_rna_common(func);
782         parm = RNA_def_pointer(func, "clip_user", "MovieClipUser", "", "");
783         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
784
785         func = RNA_def_function(srna, "template_list", "uiTemplateList");
786         RNA_def_function_ui_description(func, "Item. A list widget to display data, e.g. vertexgroups.");
787         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
788         parm = RNA_def_string(func, "listtype_name", "", 0, "", "Identifier of the list type to use");
789         RNA_def_property_flag(parm, PROP_REQUIRED);
790         parm = RNA_def_string(func, "list_id", "", 0, "",
791                               "Identifier of this list widget (mandatory when using default \"" UI_UL_DEFAULT_CLASS_NAME
792                               "\" class). "
793                               "If this is set, the uilist gets a custom ID, otherwise it takes the "
794                               "name of the class used to define the uilist (for example, if the "
795                               "class name is \"OBJECT_UL_vgroups\", and list_id is not set by the "
796                               "script, then bl_idname = \"OBJECT_UL_vgroups\")");
797         parm = RNA_def_pointer(func, "dataptr", "AnyType", "", "Data from which to take the Collection property");
798         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR);
799         parm = RNA_def_string(func, "propname", "", 0, "", "Identifier of the Collection property in data");
800         RNA_def_property_flag(parm, PROP_REQUIRED);
801         parm = RNA_def_pointer(func, "active_dataptr", "AnyType", "",
802                                "Data from which to take the integer property, index of the active item");
803         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
804         parm = RNA_def_string(func, "active_propname", "", 0, "",
805                               "Identifier of the integer property in active_data, index of the active item");
806         RNA_def_property_flag(parm, PROP_REQUIRED);
807         RNA_def_int(func, "rows", 5, 0, INT_MAX, "", "Default and minimum number of rows to display", 0, INT_MAX);
808         RNA_def_int(func, "maxrows", 5, 0, INT_MAX, "", "Default maximum number of rows to display", 0, INT_MAX);
809         RNA_def_enum(func, "type", uilist_layout_type_items, UILST_LAYOUT_DEFAULT, "Type", "Type of layout to use");
810         RNA_def_int(func, "columns", 9, 0, INT_MAX, "", "Number of items to display per row, for GRID layout", 0, INT_MAX);
811
812         func = RNA_def_function(srna, "template_running_jobs", "uiTemplateRunningJobs");
813         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
814
815         RNA_def_function(srna, "template_operator_search", "uiTemplateOperatorSearch");
816
817         func = RNA_def_function(srna, "template_header_3D", "uiTemplateHeader3D");
818         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
819
820         func = RNA_def_function(srna, "template_edit_mode_selection", "uiTemplateEditModeSelection");
821         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
822         
823         func = RNA_def_function(srna, "template_reports_banner", "uiTemplateReportsBanner");
824         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
825
826         func = RNA_def_function(srna, "template_node_link", "uiTemplateNodeLink");
827         parm = RNA_def_pointer(func, "ntree", "NodeTree", "", "");
828         RNA_def_property_flag(parm, PROP_REQUIRED);
829         parm = RNA_def_pointer(func, "node", "Node", "", "");
830         RNA_def_property_flag(parm, PROP_REQUIRED);
831         parm = RNA_def_pointer(func, "socket", "NodeSocket", "", "");
832         RNA_def_property_flag(parm, PROP_REQUIRED);
833
834         func = RNA_def_function(srna, "template_node_view", "uiTemplateNodeView");
835         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
836         parm = RNA_def_pointer(func, "ntree", "NodeTree", "", "");
837         RNA_def_property_flag(parm, PROP_REQUIRED);
838         parm = RNA_def_pointer(func, "node", "Node", "", "");
839         RNA_def_property_flag(parm, PROP_REQUIRED);
840         parm = RNA_def_pointer(func, "socket", "NodeSocket", "", "");
841         RNA_def_property_flag(parm, PROP_REQUIRED);
842
843         func = RNA_def_function(srna, "template_texture_user", "uiTemplateTextureUser");
844         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
845
846         func = RNA_def_function(srna, "template_keymap_item_properties", "uiTemplateKeymapItemProperties");
847         parm = RNA_def_pointer(func, "item", "KeyMapItem", "", "");
848         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR | PROP_NEVER_NULL);
849
850         func = RNA_def_function(srna, "template_component_menu", "uiTemplateComponentMenu");
851         RNA_def_function_ui_description(func, "Item. Display expanded property in a popup menu");
852         parm = RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property");
853         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_RNAPTR);
854         parm = RNA_def_string(func, "property", "", 0, "", "Identifier of property in data");
855         RNA_def_property_flag(parm, PROP_REQUIRED);
856         RNA_def_string(func, "name", "", 0, "", "");
857
858         func = RNA_def_function(srna, "introspect", "uiLayoutIntrospect");
859         parm = RNA_def_string(func, "string", "", 1024 * 1024, "Descr", "DESCR");
860         RNA_def_function_return(func, parm);
861
862         /* color management templates */
863         func = RNA_def_function(srna, "template_colorspace_settings", "uiTemplateColorspaceSettings");
864         RNA_def_function_ui_description(func, "Item. A widget to control input color space settings.");
865         api_ui_item_rna_common(func);
866
867         func = RNA_def_function(srna, "template_colormanaged_view_settings", "uiTemplateColormanagedViewSettings");
868         RNA_def_function_ui_description(func, "Item. A widget to control color managed view settings settings.");
869         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
870         api_ui_item_rna_common(func);
871         /* RNA_def_boolean(func, "show_global_settings", false, "", "Show widgets to control global color management settings"); */
872
873         /* node socket icon */
874         func = RNA_def_function(srna, "template_node_socket", "uiTemplateNodeSocket");
875         RNA_def_function_ui_description(func, "Node Socket Icon");
876         RNA_def_function_flag(func, FUNC_USE_CONTEXT);
877         RNA_def_float_array(func, "color", 4, node_socket_color_default, 0.0f, 1.0f, "Color", "", 0.0f, 1.0f);
878 }
879
880 #endif