2011-02-23 10:52:22 +00:00
|
|
|
/*
|
2009-04-08 16:40:46 +00:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2009-04-08 16:40:46 +00:00
|
|
|
*
|
|
|
|
* Contributor(s): Blender Foundation (2009)
|
|
|
|
*
|
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
|
|
*/
|
|
|
|
|
2011-02-27 20:20:01 +00:00
|
|
|
/** \file blender/makesrna/intern/rna_ui.c
|
|
|
|
* \ingroup RNA
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2009-04-08 16:40:46 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
2009-06-16 00:52:21 +00:00
|
|
|
#include "DNA_screen_types.h"
|
|
|
|
|
2009-04-08 16:40:46 +00:00
|
|
|
#include "RNA_define.h"
|
|
|
|
|
|
|
|
#include "rna_internal.h"
|
2009-04-19 17:12:16 +00:00
|
|
|
#include "RNA_enum_types.h"
|
2009-04-08 16:40:46 +00:00
|
|
|
|
2009-05-28 23:37:55 +00:00
|
|
|
#include "UI_interface.h"
|
|
|
|
|
2009-06-09 10:30:11 +00:00
|
|
|
#include "WM_types.h"
|
|
|
|
|
2010-02-10 11:10:38 +00:00
|
|
|
/* see WM_types.h */
|
|
|
|
EnumPropertyItem operator_context_items[] = {
|
|
|
|
{WM_OP_INVOKE_DEFAULT, "INVOKE_DEFAULT", 0, "Invoke Default", ""},
|
|
|
|
{WM_OP_INVOKE_REGION_WIN, "INVOKE_REGION_WIN", 0, "Invoke Region Window", ""},
|
|
|
|
{WM_OP_INVOKE_REGION_CHANNELS, "INVOKE_REGION_CHANNELS", 0, "Invoke Region Channels", ""},
|
|
|
|
{WM_OP_INVOKE_REGION_PREVIEW, "INVOKE_REGION_PREVIEW", 0, "Invoke Region Preview", ""},
|
|
|
|
{WM_OP_INVOKE_AREA, "INVOKE_AREA", 0, "Invoke Area", ""},
|
|
|
|
{WM_OP_INVOKE_SCREEN, "INVOKE_SCREEN", 0, "Invoke Screen", ""},
|
|
|
|
{WM_OP_EXEC_DEFAULT, "EXEC_DEFAULT", 0, "Exec Default", ""},
|
|
|
|
{WM_OP_EXEC_REGION_WIN, "EXEC_REGION_WIN", 0, "Exec Region Window", ""},
|
|
|
|
{WM_OP_EXEC_REGION_CHANNELS, "EXEC_REGION_CHANNELS", 0, "Exec Region Channels", ""},
|
|
|
|
{WM_OP_EXEC_REGION_PREVIEW, "EXEC_REGION_PREVIEW", 0, "Exec Region Preview", ""},
|
|
|
|
{WM_OP_EXEC_AREA, "EXEC_AREA", 0, "Exec Area", ""},
|
|
|
|
{WM_OP_EXEC_SCREEN, "EXEC_SCREEN", 0, "Exec Screen", ""},
|
|
|
|
{0, NULL, 0, NULL, NULL}};
|
|
|
|
|
2009-04-08 16:40:46 +00:00
|
|
|
#ifdef RNA_RUNTIME
|
|
|
|
|
2011-11-15 14:58:14 +00:00
|
|
|
#include <assert.h>
|
|
|
|
|
2009-04-19 13:37:59 +00:00
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
|
|
|
#include "RNA_access.h"
|
|
|
|
|
|
|
|
#include "BLI_dynstr.h"
|
|
|
|
|
|
|
|
#include "BKE_context.h"
|
|
|
|
#include "BKE_report.h"
|
|
|
|
#include "BKE_screen.h"
|
|
|
|
|
|
|
|
#include "WM_api.h"
|
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
static ARegionType *region_type_find(ReportList *reports, int space_type, int region_type)
|
2009-04-19 13:37:59 +00:00
|
|
|
{
|
2009-04-19 17:12:16 +00:00
|
|
|
SpaceType *st;
|
|
|
|
ARegionType *art;
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
st= BKE_spacetype_from_id(space_type);
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
for(art= (st)? st->regiontypes.first: NULL; art; art= art->next) {
|
|
|
|
if (art->regionid==region_type)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* region type not found? abort */
|
|
|
|
if (art==NULL) {
|
2011-09-19 13:23:58 +00:00
|
|
|
BKE_report(reports, RPT_ERROR, "Region not found in spacetype");
|
2009-04-19 17:12:16 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
return art;
|
2009-04-19 13:37:59 +00:00
|
|
|
}
|
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
/* Panel */
|
|
|
|
|
2009-04-19 13:37:59 +00:00
|
|
|
static int panel_poll(const bContext *C, PanelType *pt)
|
|
|
|
{
|
2011-10-19 22:40:03 +00:00
|
|
|
extern FunctionRNA rna_Panel_poll_func;
|
|
|
|
|
2009-04-19 13:37:59 +00:00
|
|
|
PointerRNA ptr;
|
2009-07-17 02:31:28 +00:00
|
|
|
ParameterList list;
|
2009-04-19 13:37:59 +00:00
|
|
|
FunctionRNA *func;
|
|
|
|
void *ret;
|
|
|
|
int visible;
|
|
|
|
|
2009-07-21 20:05:16 +00:00
|
|
|
RNA_pointer_create(NULL, pt->ext.srna, NULL, &ptr); /* dummy */
|
2011-10-19 22:40:03 +00:00
|
|
|
func= &rna_Panel_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_list_create(&list, &ptr, func);
|
|
|
|
RNA_parameter_set_lookup(&list, "context", &C);
|
2010-12-07 04:12:15 +00:00
|
|
|
pt->ext.call((bContext *)C, &ptr, func, &list);
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_get_lookup(&list, "visible", &ret);
|
2009-04-19 13:37:59 +00:00
|
|
|
visible= *(int*)ret;
|
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_list_free(&list);
|
2009-04-19 13:37:59 +00:00
|
|
|
|
|
|
|
return visible;
|
|
|
|
}
|
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
static void panel_draw(const bContext *C, Panel *pnl)
|
2009-04-19 13:37:59 +00:00
|
|
|
{
|
2011-10-19 22:40:03 +00:00
|
|
|
extern FunctionRNA rna_Panel_draw_func;
|
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
PointerRNA ptr;
|
2009-07-17 02:31:28 +00:00
|
|
|
ParameterList list;
|
2009-04-19 17:12:16 +00:00
|
|
|
FunctionRNA *func;
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-07-21 20:05:16 +00:00
|
|
|
RNA_pointer_create(&CTX_wm_screen(C)->id, pnl->type->ext.srna, pnl, &ptr);
|
2011-10-19 22:40:03 +00:00
|
|
|
func= &rna_Panel_draw_func;/* RNA_struct_find_function(&ptr, "draw"); */
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_list_create(&list, &ptr, func);
|
|
|
|
RNA_parameter_set_lookup(&list, "context", &C);
|
2010-12-07 04:12:15 +00:00
|
|
|
pnl->type->ext.call((bContext *)C, &ptr, func, &list);
|
2009-04-19 17:12:16 +00:00
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_list_free(&list);
|
2009-04-19 13:37:59 +00:00
|
|
|
}
|
|
|
|
|
2009-05-19 17:13:33 +00:00
|
|
|
static void panel_draw_header(const bContext *C, Panel *pnl)
|
|
|
|
{
|
2011-10-19 22:40:03 +00:00
|
|
|
extern FunctionRNA rna_Panel_draw_header_func;
|
|
|
|
|
2009-05-19 17:13:33 +00:00
|
|
|
PointerRNA ptr;
|
2009-07-17 02:31:28 +00:00
|
|
|
ParameterList list;
|
2009-05-19 17:13:33 +00:00
|
|
|
FunctionRNA *func;
|
|
|
|
|
2009-07-21 20:05:16 +00:00
|
|
|
RNA_pointer_create(&CTX_wm_screen(C)->id, pnl->type->ext.srna, pnl, &ptr);
|
2011-10-19 22:40:03 +00:00
|
|
|
func= &rna_Panel_draw_header_func; /* RNA_struct_find_function(&ptr, "draw_header"); */
|
2009-05-19 17:13:33 +00:00
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_list_create(&list, &ptr, func);
|
|
|
|
RNA_parameter_set_lookup(&list, "context", &C);
|
2010-12-07 04:12:15 +00:00
|
|
|
pnl->type->ext.call((bContext *)C, &ptr, func, &list);
|
2009-05-19 17:13:33 +00:00
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_list_free(&list);
|
2009-05-19 17:13:33 +00:00
|
|
|
}
|
|
|
|
|
2011-05-31 02:14:25 +00:00
|
|
|
static void rna_Panel_unregister(Main *UNUSED(bmain), StructRNA *type)
|
2009-04-19 13:37:59 +00:00
|
|
|
{
|
|
|
|
ARegionType *art;
|
2009-04-19 17:12:16 +00:00
|
|
|
PanelType *pt= RNA_struct_blender_type_get(type);
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
if(!pt)
|
|
|
|
return;
|
|
|
|
if(!(art=region_type_find(NULL, pt->space_type, pt->region_type)))
|
|
|
|
return;
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-08-16 07:26:29 +00:00
|
|
|
RNA_struct_free_extension(type, &pt->ext);
|
2009-08-14 12:29:55 +00:00
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
BLI_freelinkN(&art->paneltypes, pt);
|
|
|
|
RNA_struct_free(&BLENDER_RNA, type);
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
/* update while blender is running */
|
2011-05-18 10:56:26 +00:00
|
|
|
WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);
|
2009-04-19 13:37:59 +00:00
|
|
|
}
|
|
|
|
|
2011-09-19 13:23:58 +00:00
|
|
|
static StructRNA *rna_Panel_register(Main *bmain, ReportList *reports, void *data, const char *identifier,
|
|
|
|
StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
|
2009-04-19 13:37:59 +00:00
|
|
|
{
|
|
|
|
ARegionType *art;
|
2011-03-03 17:58:06 +00:00
|
|
|
PanelType *pt, dummypt = {NULL};
|
|
|
|
Panel dummypanel= {NULL};
|
2009-04-19 13:37:59 +00:00
|
|
|
PointerRNA dummyptr;
|
2009-05-27 00:03:49 +00:00
|
|
|
int have_function[3];
|
2009-04-19 13:37:59 +00:00
|
|
|
|
|
|
|
/* setup dummy panel & panel type to store static properties in */
|
|
|
|
dummypanel.type= &dummypt;
|
|
|
|
RNA_pointer_create(NULL, &RNA_Panel, &dummypanel, &dummyptr);
|
|
|
|
|
|
|
|
/* validate the python class */
|
|
|
|
if(validate(&dummyptr, data, have_function) != 0)
|
|
|
|
return NULL;
|
2009-12-22 10:04:15 +00:00
|
|
|
|
|
|
|
if(strlen(identifier) >= sizeof(dummypt.idname)) {
|
2011-09-19 13:23:58 +00:00
|
|
|
BKE_reportf(reports, RPT_ERROR, "registering panel class: '%s' is too long, maximum length is %d",
|
|
|
|
identifier, (int)sizeof(dummypt.idname));
|
2009-12-22 10:04:15 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
if(!(art=region_type_find(reports, dummypt.space_type, dummypt.region_type)))
|
2009-04-19 13:37:59 +00:00
|
|
|
return NULL;
|
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
/* check if we have registered this panel type before, and remove it */
|
|
|
|
for(pt=art->paneltypes.first; pt; pt=pt->next) {
|
|
|
|
if(strcmp(pt->idname, dummypt.idname) == 0) {
|
2009-07-21 20:05:16 +00:00
|
|
|
if(pt->ext.srna)
|
2011-05-18 10:56:26 +00:00
|
|
|
rna_Panel_unregister(bmain, pt->ext.srna);
|
2009-07-10 11:59:45 +00:00
|
|
|
else
|
|
|
|
BLI_freelinkN(&art->paneltypes, pt);
|
2009-04-19 13:37:59 +00:00
|
|
|
break;
|
2009-04-19 17:12:16 +00:00
|
|
|
}
|
2009-04-19 13:37:59 +00:00
|
|
|
}
|
2009-04-19 17:12:16 +00:00
|
|
|
|
|
|
|
/* create a new panel type */
|
|
|
|
pt= MEM_callocN(sizeof(PanelType), "python buttons panel");
|
|
|
|
memcpy(pt, &dummypt, sizeof(dummypt));
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-07-21 20:05:16 +00:00
|
|
|
pt->ext.srna= RNA_def_struct(&BLENDER_RNA, pt->idname, "Panel");
|
|
|
|
pt->ext.data= data;
|
|
|
|
pt->ext.call= call;
|
|
|
|
pt->ext.free= free;
|
|
|
|
RNA_struct_blender_type_set(pt->ext.srna, pt);
|
2010-08-19 10:16:30 +00:00
|
|
|
RNA_def_struct_flag(pt->ext.srna, STRUCT_NO_IDPROPERTIES);
|
2009-04-19 13:37:59 +00:00
|
|
|
|
|
|
|
pt->poll= (have_function[0])? panel_poll: NULL;
|
|
|
|
pt->draw= (have_function[1])? panel_draw: NULL;
|
2009-05-19 17:13:33 +00:00
|
|
|
pt->draw_header= (have_function[2])? panel_draw_header: NULL;
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2011-01-23 13:52:24 +00:00
|
|
|
/* XXX use "no header" flag for some ordering of panels until we have real panel ordering */
|
|
|
|
if(pt->flag & PNL_NO_HEADER) {
|
|
|
|
PanelType *pth = art->paneltypes.first;
|
|
|
|
while(pth && pth->flag & PNL_NO_HEADER)
|
|
|
|
pth=pth->next;
|
|
|
|
|
|
|
|
if(pth)
|
|
|
|
BLI_insertlinkbefore(&art->paneltypes, pth, pt);
|
|
|
|
else
|
|
|
|
BLI_addtail(&art->paneltypes, pt);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
BLI_addtail(&art->paneltypes, pt);
|
2009-04-19 13:37:59 +00:00
|
|
|
|
|
|
|
/* update while blender is running */
|
2011-05-18 10:56:26 +00:00
|
|
|
WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-07-21 20:05:16 +00:00
|
|
|
return pt->ext.srna;
|
2009-04-19 13:37:59 +00:00
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static StructRNA* rna_Panel_refine(PointerRNA *ptr)
|
2009-04-19 17:12:16 +00:00
|
|
|
{
|
|
|
|
Panel *hdr= (Panel*)ptr->data;
|
2009-07-21 20:05:16 +00:00
|
|
|
return (hdr->type && hdr->type->ext.srna)? hdr->type->ext.srna: &RNA_Panel;
|
2009-04-19 17:12:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Header */
|
|
|
|
|
|
|
|
static void header_draw(const bContext *C, Header *hdr)
|
|
|
|
{
|
2011-10-19 22:40:03 +00:00
|
|
|
extern FunctionRNA rna_Header_draw_func;
|
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
PointerRNA htr;
|
2009-07-17 02:31:28 +00:00
|
|
|
ParameterList list;
|
2009-04-19 17:12:16 +00:00
|
|
|
FunctionRNA *func;
|
|
|
|
|
2009-07-21 20:05:16 +00:00
|
|
|
RNA_pointer_create(&CTX_wm_screen(C)->id, hdr->type->ext.srna, hdr, &htr);
|
2011-10-19 22:40:03 +00:00
|
|
|
func= &rna_Header_draw_func; /* RNA_struct_find_function(&htr, "draw"); */
|
2009-04-19 17:12:16 +00:00
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_list_create(&list, &htr, func);
|
|
|
|
RNA_parameter_set_lookup(&list, "context", &C);
|
2010-12-07 04:12:15 +00:00
|
|
|
hdr->type->ext.call((bContext *)C, &htr, func, &list);
|
2009-04-19 17:12:16 +00:00
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_list_free(&list);
|
2009-04-19 17:12:16 +00:00
|
|
|
}
|
|
|
|
|
2011-05-31 02:14:25 +00:00
|
|
|
static void rna_Header_unregister(Main *UNUSED(bmain), StructRNA *type)
|
2009-04-19 13:37:59 +00:00
|
|
|
{
|
|
|
|
ARegionType *art;
|
2009-04-19 17:12:16 +00:00
|
|
|
HeaderType *ht= RNA_struct_blender_type_get(type);
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
if(!ht)
|
|
|
|
return;
|
|
|
|
if(!(art=region_type_find(NULL, ht->space_type, RGN_TYPE_HEADER)))
|
2009-04-19 13:37:59 +00:00
|
|
|
return;
|
|
|
|
|
2009-08-16 07:26:29 +00:00
|
|
|
RNA_struct_free_extension(type, &ht->ext);
|
2009-08-14 12:29:55 +00:00
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
BLI_freelinkN(&art->headertypes, ht);
|
2009-04-19 13:37:59 +00:00
|
|
|
RNA_struct_free(&BLENDER_RNA, type);
|
|
|
|
|
|
|
|
/* update while blender is running */
|
2011-05-18 10:56:26 +00:00
|
|
|
WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);
|
2009-04-19 13:37:59 +00:00
|
|
|
}
|
|
|
|
|
2011-09-19 13:23:58 +00:00
|
|
|
static StructRNA *rna_Header_register(Main *bmain, ReportList *reports, void *data, const char *identifier,
|
|
|
|
StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
|
2009-04-19 13:37:59 +00:00
|
|
|
{
|
2009-04-19 17:12:16 +00:00
|
|
|
ARegionType *art;
|
2011-03-03 17:58:06 +00:00
|
|
|
HeaderType *ht, dummyht = {NULL};
|
|
|
|
Header dummyheader= {NULL};
|
2009-04-19 17:12:16 +00:00
|
|
|
PointerRNA dummyhtr;
|
|
|
|
int have_function[1];
|
|
|
|
|
|
|
|
/* setup dummy header & header type to store static properties in */
|
|
|
|
dummyheader.type= &dummyht;
|
|
|
|
RNA_pointer_create(NULL, &RNA_Header, &dummyheader, &dummyhtr);
|
|
|
|
|
|
|
|
/* validate the python class */
|
|
|
|
if(validate(&dummyhtr, data, have_function) != 0)
|
|
|
|
return NULL;
|
2009-12-22 10:04:15 +00:00
|
|
|
|
|
|
|
if(strlen(identifier) >= sizeof(dummyht.idname)) {
|
2011-09-19 13:23:58 +00:00
|
|
|
BKE_reportf(reports, RPT_ERROR, "registering header class: '%s' is too long, maximum length is %d",
|
|
|
|
identifier, (int)sizeof(dummyht.idname));
|
2009-12-22 10:04:15 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
if(!(art=region_type_find(reports, dummyht.space_type, RGN_TYPE_HEADER)))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
/* check if we have registered this header type before, and remove it */
|
|
|
|
for(ht=art->headertypes.first; ht; ht=ht->next) {
|
|
|
|
if(strcmp(ht->idname, dummyht.idname) == 0) {
|
2009-07-21 20:05:16 +00:00
|
|
|
if(ht->ext.srna)
|
2011-05-18 10:56:26 +00:00
|
|
|
rna_Header_unregister(bmain, ht->ext.srna);
|
2009-04-19 17:12:16 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* create a new header type */
|
|
|
|
ht= MEM_callocN(sizeof(HeaderType), "python buttons header");
|
|
|
|
memcpy(ht, &dummyht, sizeof(dummyht));
|
|
|
|
|
2009-07-21 20:05:16 +00:00
|
|
|
ht->ext.srna= RNA_def_struct(&BLENDER_RNA, ht->idname, "Header");
|
|
|
|
ht->ext.data= data;
|
|
|
|
ht->ext.call= call;
|
|
|
|
ht->ext.free= free;
|
|
|
|
RNA_struct_blender_type_set(ht->ext.srna, ht);
|
2009-04-19 17:12:16 +00:00
|
|
|
|
|
|
|
ht->draw= (have_function[0])? header_draw: NULL;
|
|
|
|
|
|
|
|
BLI_addtail(&art->headertypes, ht);
|
|
|
|
|
|
|
|
/* update while blender is running */
|
2011-05-18 10:56:26 +00:00
|
|
|
WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);
|
2009-04-19 17:12:16 +00:00
|
|
|
|
2009-07-21 20:05:16 +00:00
|
|
|
return ht->ext.srna;
|
2009-04-19 17:12:16 +00:00
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static StructRNA* rna_Header_refine(PointerRNA *htr)
|
2009-04-19 17:12:16 +00:00
|
|
|
{
|
|
|
|
Header *hdr= (Header*)htr->data;
|
2009-07-21 20:05:16 +00:00
|
|
|
return (hdr->type && hdr->type->ext.srna)? hdr->type->ext.srna: &RNA_Header;
|
2009-04-19 13:37:59 +00:00
|
|
|
}
|
|
|
|
|
2009-04-22 18:39:44 +00:00
|
|
|
/* Menu */
|
|
|
|
|
|
|
|
static int menu_poll(const bContext *C, MenuType *pt)
|
|
|
|
{
|
2011-10-19 22:40:03 +00:00
|
|
|
extern FunctionRNA rna_Menu_poll_func;
|
|
|
|
|
2009-04-22 18:39:44 +00:00
|
|
|
PointerRNA ptr;
|
2009-07-17 02:31:28 +00:00
|
|
|
ParameterList list;
|
2009-04-22 18:39:44 +00:00
|
|
|
FunctionRNA *func;
|
|
|
|
void *ret;
|
|
|
|
int visible;
|
|
|
|
|
2009-07-21 20:05:16 +00:00
|
|
|
RNA_pointer_create(NULL, pt->ext.srna, NULL, &ptr); /* dummy */
|
2011-10-19 22:40:03 +00:00
|
|
|
func= &rna_Menu_poll_func; /* RNA_struct_find_function(&ptr, "poll"); */
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_list_create(&list, &ptr, func);
|
|
|
|
RNA_parameter_set_lookup(&list, "context", &C);
|
2010-12-07 04:12:15 +00:00
|
|
|
pt->ext.call((bContext *)C, &ptr, func, &list);
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_get_lookup(&list, "visible", &ret);
|
2009-04-22 18:39:44 +00:00
|
|
|
visible= *(int*)ret;
|
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_list_free(&list);
|
2009-04-22 18:39:44 +00:00
|
|
|
|
|
|
|
return visible;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void menu_draw(const bContext *C, Menu *hdr)
|
|
|
|
{
|
2011-10-19 22:40:03 +00:00
|
|
|
extern FunctionRNA rna_Menu_draw_func;
|
|
|
|
|
2009-04-22 18:39:44 +00:00
|
|
|
PointerRNA mtr;
|
2009-07-17 02:31:28 +00:00
|
|
|
ParameterList list;
|
2009-04-22 18:39:44 +00:00
|
|
|
FunctionRNA *func;
|
|
|
|
|
2009-07-21 20:05:16 +00:00
|
|
|
RNA_pointer_create(&CTX_wm_screen(C)->id, hdr->type->ext.srna, hdr, &mtr);
|
2011-10-19 22:40:03 +00:00
|
|
|
func= &rna_Menu_draw_func; /* RNA_struct_find_function(&mtr, "draw"); */
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_list_create(&list, &mtr, func);
|
|
|
|
RNA_parameter_set_lookup(&list, "context", &C);
|
2010-12-07 04:12:15 +00:00
|
|
|
hdr->type->ext.call((bContext *)C, &mtr, func, &list);
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2009-07-17 02:31:28 +00:00
|
|
|
RNA_parameter_list_free(&list);
|
2009-04-22 18:39:44 +00:00
|
|
|
}
|
|
|
|
|
2011-05-31 02:14:25 +00:00
|
|
|
static void rna_Menu_unregister(Main *UNUSED(bmain), StructRNA *type)
|
2009-04-22 18:39:44 +00:00
|
|
|
{
|
|
|
|
MenuType *mt= RNA_struct_blender_type_get(type);
|
|
|
|
|
|
|
|
if(!mt)
|
|
|
|
return;
|
|
|
|
|
2009-08-16 07:26:29 +00:00
|
|
|
RNA_struct_free_extension(type, &mt->ext);
|
2009-08-14 12:29:55 +00:00
|
|
|
|
2009-10-08 19:06:32 +00:00
|
|
|
WM_menutype_freelink(mt);
|
|
|
|
|
2009-04-22 18:39:44 +00:00
|
|
|
RNA_struct_free(&BLENDER_RNA, type);
|
|
|
|
|
|
|
|
/* update while blender is running */
|
2011-05-18 10:56:26 +00:00
|
|
|
WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);
|
2009-04-22 18:39:44 +00:00
|
|
|
}
|
|
|
|
|
2011-11-15 14:58:14 +00:00
|
|
|
static char _menu_descr[1024];
|
2011-09-19 13:23:58 +00:00
|
|
|
static StructRNA *rna_Menu_register(Main *bmain, ReportList *reports, void *data, const char *identifier,
|
|
|
|
StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
|
2009-04-22 18:39:44 +00:00
|
|
|
{
|
2011-03-03 17:58:06 +00:00
|
|
|
MenuType *mt, dummymt = {NULL};
|
|
|
|
Menu dummymenu= {NULL};
|
2009-04-22 18:39:44 +00:00
|
|
|
PointerRNA dummymtr;
|
|
|
|
int have_function[2];
|
2011-11-15 14:58:14 +00:00
|
|
|
size_t over_alloc= 0; /* warning, if this becomes a bess, we better do another alloc */
|
|
|
|
size_t description_size= 0;
|
2009-04-22 18:39:44 +00:00
|
|
|
|
|
|
|
/* setup dummy menu & menu type to store static properties in */
|
|
|
|
dummymenu.type= &dummymt;
|
2011-11-15 14:58:14 +00:00
|
|
|
dummymenu.type->description= _menu_descr;
|
2009-04-22 18:39:44 +00:00
|
|
|
RNA_pointer_create(NULL, &RNA_Menu, &dummymenu, &dummymtr);
|
|
|
|
|
2011-11-15 14:58:14 +00:00
|
|
|
/* clear incase they are left unset */
|
|
|
|
_menu_descr[0]= '\0';
|
|
|
|
|
2009-04-22 18:39:44 +00:00
|
|
|
/* validate the python class */
|
|
|
|
if(validate(&dummymtr, data, have_function) != 0)
|
|
|
|
return NULL;
|
2009-12-22 10:04:15 +00:00
|
|
|
|
|
|
|
if(strlen(identifier) >= sizeof(dummymt.idname)) {
|
2011-09-19 13:23:58 +00:00
|
|
|
BKE_reportf(reports, RPT_ERROR, "registering menu class: '%s' is too long, maximum length is %d",
|
|
|
|
identifier, (int)sizeof(dummymt.idname));
|
2009-12-22 10:04:15 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
2009-04-22 18:39:44 +00:00
|
|
|
|
|
|
|
/* check if we have registered this menu type before, and remove it */
|
2009-10-08 19:06:32 +00:00
|
|
|
mt= WM_menutype_find(dummymt.idname, TRUE);
|
2009-10-06 13:04:31 +00:00
|
|
|
if(mt && mt->ext.srna)
|
2011-05-18 10:56:26 +00:00
|
|
|
rna_Menu_unregister(bmain, mt->ext.srna);
|
2009-04-22 18:39:44 +00:00
|
|
|
|
|
|
|
/* create a new menu type */
|
2011-11-15 14:58:14 +00:00
|
|
|
if (_menu_descr[0]) {
|
|
|
|
description_size= strlen(_menu_descr) + 1;
|
|
|
|
over_alloc += description_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
mt= MEM_callocN(sizeof(MenuType) + over_alloc, "python buttons menu");
|
2009-04-22 18:39:44 +00:00
|
|
|
memcpy(mt, &dummymt, sizeof(dummymt));
|
|
|
|
|
2011-11-15 14:58:14 +00:00
|
|
|
if (_menu_descr[0]) {
|
|
|
|
char *buf= (char *)(mt + 1);
|
|
|
|
memcpy(buf, _menu_descr, description_size);
|
|
|
|
mt->description= buf;
|
|
|
|
}
|
|
|
|
|
2009-07-21 20:05:16 +00:00
|
|
|
mt->ext.srna= RNA_def_struct(&BLENDER_RNA, mt->idname, "Menu");
|
|
|
|
mt->ext.data= data;
|
|
|
|
mt->ext.call= call;
|
|
|
|
mt->ext.free= free;
|
|
|
|
RNA_struct_blender_type_set(mt->ext.srna, mt);
|
2010-08-19 10:16:30 +00:00
|
|
|
RNA_def_struct_flag(mt->ext.srna, STRUCT_NO_IDPROPERTIES);
|
2009-04-22 18:39:44 +00:00
|
|
|
|
|
|
|
mt->poll= (have_function[0])? menu_poll: NULL;
|
|
|
|
mt->draw= (have_function[1])? menu_draw: NULL;
|
|
|
|
|
2009-10-08 19:06:32 +00:00
|
|
|
WM_menutype_add(mt);
|
2009-04-22 18:39:44 +00:00
|
|
|
|
|
|
|
/* update while blender is running */
|
2011-05-18 10:56:26 +00:00
|
|
|
WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2009-07-21 20:05:16 +00:00
|
|
|
return mt->ext.srna;
|
2009-04-22 18:39:44 +00:00
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static StructRNA* rna_Menu_refine(PointerRNA *mtr)
|
2009-04-22 18:39:44 +00:00
|
|
|
{
|
|
|
|
Menu *hdr= (Menu*)mtr->data;
|
2009-07-21 20:05:16 +00:00
|
|
|
return (hdr->type && hdr->type->ext.srna)? hdr->type->ext.srna: &RNA_Menu;
|
2009-04-22 18:39:44 +00:00
|
|
|
}
|
|
|
|
|
2011-11-15 14:58:14 +00:00
|
|
|
static void rna_Menu_bl_description_set(PointerRNA *ptr, const char *value)
|
|
|
|
{
|
|
|
|
Menu *data= (Menu*)(ptr->data);
|
|
|
|
char *str= (char *)data->type->description;
|
|
|
|
if(!str[0]) strcpy(str, value);
|
|
|
|
else assert(!"setting the bl_description on a non-builtin menu");
|
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static int rna_UILayout_active_get(PointerRNA *ptr)
|
2009-05-28 23:37:55 +00:00
|
|
|
{
|
|
|
|
return uiLayoutGetActive(ptr->data);
|
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static void rna_UILayout_active_set(PointerRNA *ptr, int value)
|
2009-05-28 23:37:55 +00:00
|
|
|
{
|
RNA
* Mesh.add_geometry, Mesh.update and make indices editable. This
is without checking if they are valid still, no time now to
implement this.
* Also fix warnings in rna_ui.c, and a bug in CDDM_calc_edges.
Example code:
co = [0.0, 0.0, 0.0] + [1.0, 0.0, 0.0] + [0.0, 1.0, 0.0] + [1.0, 1.0, 0.0]
faces = [0, 1, 2, 0] + [1, 3, 2, 0]
mesh.add_geometry(4, 0, 2)
mesh.verts.foreach_set("co", co)
mesh.faces.foreach_set("verts", faces)
mesh.update()
2009-07-01 12:19:00 +00:00
|
|
|
uiLayoutSetActive(ptr->data, value);
|
2009-05-28 23:37:55 +00:00
|
|
|
}
|
|
|
|
|
2011-01-03 13:33:07 +00:00
|
|
|
static int rna_UILayout_alert_get(PointerRNA *ptr)
|
2011-01-02 23:47:48 +00:00
|
|
|
{
|
|
|
|
return uiLayoutGetRedAlert(ptr->data);
|
|
|
|
}
|
|
|
|
|
2011-01-03 13:33:07 +00:00
|
|
|
static void rna_UILayout_alert_set(PointerRNA *ptr, int value)
|
2011-01-02 23:47:48 +00:00
|
|
|
{
|
|
|
|
uiLayoutSetRedAlert(ptr->data, value);
|
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static void rna_UILayout_op_context_set(PointerRNA *ptr, int value)
|
2009-06-09 10:30:11 +00:00
|
|
|
{
|
RNA
* Mesh.add_geometry, Mesh.update and make indices editable. This
is without checking if they are valid still, no time now to
implement this.
* Also fix warnings in rna_ui.c, and a bug in CDDM_calc_edges.
Example code:
co = [0.0, 0.0, 0.0] + [1.0, 0.0, 0.0] + [0.0, 1.0, 0.0] + [1.0, 1.0, 0.0]
faces = [0, 1, 2, 0] + [1, 3, 2, 0]
mesh.add_geometry(4, 0, 2)
mesh.verts.foreach_set("co", co)
mesh.faces.foreach_set("verts", faces)
mesh.update()
2009-07-01 12:19:00 +00:00
|
|
|
uiLayoutSetOperatorContext(ptr->data, value);
|
2009-06-09 10:30:11 +00:00
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static int rna_UILayout_op_context_get(PointerRNA *ptr)
|
2009-06-09 10:30:11 +00:00
|
|
|
{
|
|
|
|
return uiLayoutGetOperatorContext(ptr->data);
|
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static int rna_UILayout_enabled_get(PointerRNA *ptr)
|
2009-05-28 23:37:55 +00:00
|
|
|
{
|
|
|
|
return uiLayoutGetEnabled(ptr->data);
|
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static void rna_UILayout_enabled_set(PointerRNA *ptr, int value)
|
2009-05-28 23:37:55 +00:00
|
|
|
{
|
RNA
* Mesh.add_geometry, Mesh.update and make indices editable. This
is without checking if they are valid still, no time now to
implement this.
* Also fix warnings in rna_ui.c, and a bug in CDDM_calc_edges.
Example code:
co = [0.0, 0.0, 0.0] + [1.0, 0.0, 0.0] + [0.0, 1.0, 0.0] + [1.0, 1.0, 0.0]
faces = [0, 1, 2, 0] + [1, 3, 2, 0]
mesh.add_geometry(4, 0, 2)
mesh.verts.foreach_set("co", co)
mesh.faces.foreach_set("verts", faces)
mesh.update()
2009-07-01 12:19:00 +00:00
|
|
|
uiLayoutSetEnabled(ptr->data, value);
|
2009-05-28 23:37:55 +00:00
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
#if 0
|
|
|
|
static int rna_UILayout_red_alert_get(PointerRNA *ptr)
|
2009-05-28 23:37:55 +00:00
|
|
|
{
|
|
|
|
return uiLayoutGetRedAlert(ptr->data);
|
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static void rna_UILayout_red_alert_set(PointerRNA *ptr, int value)
|
2009-05-28 23:37:55 +00:00
|
|
|
{
|
RNA
* Mesh.add_geometry, Mesh.update and make indices editable. This
is without checking if they are valid still, no time now to
implement this.
* Also fix warnings in rna_ui.c, and a bug in CDDM_calc_edges.
Example code:
co = [0.0, 0.0, 0.0] + [1.0, 0.0, 0.0] + [0.0, 1.0, 0.0] + [1.0, 1.0, 0.0]
faces = [0, 1, 2, 0] + [1, 3, 2, 0]
mesh.add_geometry(4, 0, 2)
mesh.verts.foreach_set("co", co)
mesh.faces.foreach_set("verts", faces)
mesh.update()
2009-07-01 12:19:00 +00:00
|
|
|
uiLayoutSetRedAlert(ptr->data, value);
|
2009-05-28 23:37:55 +00:00
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static int rna_UILayout_keep_aspect_get(PointerRNA *ptr)
|
2009-05-28 23:37:55 +00:00
|
|
|
{
|
|
|
|
return uiLayoutGetKeepAspect(ptr->data);
|
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static void rna_UILayout_keep_aspect_set(PointerRNA *ptr, int value)
|
2009-05-28 23:37:55 +00:00
|
|
|
{
|
RNA
* Mesh.add_geometry, Mesh.update and make indices editable. This
is without checking if they are valid still, no time now to
implement this.
* Also fix warnings in rna_ui.c, and a bug in CDDM_calc_edges.
Example code:
co = [0.0, 0.0, 0.0] + [1.0, 0.0, 0.0] + [0.0, 1.0, 0.0] + [1.0, 1.0, 0.0]
faces = [0, 1, 2, 0] + [1, 3, 2, 0]
mesh.add_geometry(4, 0, 2)
mesh.verts.foreach_set("co", co)
mesh.faces.foreach_set("verts", faces)
mesh.update()
2009-07-01 12:19:00 +00:00
|
|
|
uiLayoutSetKeepAspect(ptr->data, value);
|
2009-05-28 23:37:55 +00:00
|
|
|
}
|
2009-07-21 01:26:17 +00:00
|
|
|
#endif
|
2009-05-28 23:37:55 +00:00
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static int rna_UILayout_alignment_get(PointerRNA *ptr)
|
2009-05-28 23:37:55 +00:00
|
|
|
{
|
|
|
|
return uiLayoutGetAlignment(ptr->data);
|
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static void rna_UILayout_alignment_set(PointerRNA *ptr, int value)
|
2009-05-28 23:37:55 +00:00
|
|
|
{
|
RNA
* Mesh.add_geometry, Mesh.update and make indices editable. This
is without checking if they are valid still, no time now to
implement this.
* Also fix warnings in rna_ui.c, and a bug in CDDM_calc_edges.
Example code:
co = [0.0, 0.0, 0.0] + [1.0, 0.0, 0.0] + [0.0, 1.0, 0.0] + [1.0, 1.0, 0.0]
faces = [0, 1, 2, 0] + [1, 3, 2, 0]
mesh.add_geometry(4, 0, 2)
mesh.verts.foreach_set("co", co)
mesh.faces.foreach_set("verts", faces)
mesh.update()
2009-07-01 12:19:00 +00:00
|
|
|
uiLayoutSetAlignment(ptr->data, value);
|
2009-05-28 23:37:55 +00:00
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static float rna_UILayout_scale_x_get(PointerRNA *ptr)
|
2009-05-28 23:37:55 +00:00
|
|
|
{
|
2009-06-03 00:04:48 +00:00
|
|
|
return uiLayoutGetScaleX(ptr->data);
|
2009-05-28 23:37:55 +00:00
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static void rna_UILayout_scale_x_set(PointerRNA *ptr, float value)
|
2009-05-28 23:37:55 +00:00
|
|
|
{
|
RNA
* Mesh.add_geometry, Mesh.update and make indices editable. This
is without checking if they are valid still, no time now to
implement this.
* Also fix warnings in rna_ui.c, and a bug in CDDM_calc_edges.
Example code:
co = [0.0, 0.0, 0.0] + [1.0, 0.0, 0.0] + [0.0, 1.0, 0.0] + [1.0, 1.0, 0.0]
faces = [0, 1, 2, 0] + [1, 3, 2, 0]
mesh.add_geometry(4, 0, 2)
mesh.verts.foreach_set("co", co)
mesh.faces.foreach_set("verts", faces)
mesh.update()
2009-07-01 12:19:00 +00:00
|
|
|
uiLayoutSetScaleX(ptr->data, value);
|
2009-06-03 00:04:48 +00:00
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static float rna_UILayout_scale_y_get(PointerRNA *ptr)
|
2009-06-03 00:04:48 +00:00
|
|
|
{
|
|
|
|
return uiLayoutGetScaleY(ptr->data);
|
|
|
|
}
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
static void rna_UILayout_scale_y_set(PointerRNA *ptr, float value)
|
2009-06-03 00:04:48 +00:00
|
|
|
{
|
RNA
* Mesh.add_geometry, Mesh.update and make indices editable. This
is without checking if they are valid still, no time now to
implement this.
* Also fix warnings in rna_ui.c, and a bug in CDDM_calc_edges.
Example code:
co = [0.0, 0.0, 0.0] + [1.0, 0.0, 0.0] + [0.0, 1.0, 0.0] + [1.0, 1.0, 0.0]
faces = [0, 1, 2, 0] + [1, 3, 2, 0]
mesh.add_geometry(4, 0, 2)
mesh.verts.foreach_set("co", co)
mesh.faces.foreach_set("verts", faces)
mesh.update()
2009-07-01 12:19:00 +00:00
|
|
|
uiLayoutSetScaleY(ptr->data, value);
|
2009-05-28 23:37:55 +00:00
|
|
|
}
|
|
|
|
|
2009-06-09 10:30:11 +00:00
|
|
|
#else // RNA_RUNTIME
|
2009-04-08 16:40:46 +00:00
|
|
|
|
|
|
|
static void rna_def_ui_layout(BlenderRNA *brna)
|
|
|
|
{
|
|
|
|
StructRNA *srna;
|
2009-05-28 23:37:55 +00:00
|
|
|
PropertyRNA *prop;
|
|
|
|
|
|
|
|
static EnumPropertyItem alignment_items[] = {
|
2009-06-16 00:52:21 +00:00
|
|
|
{UI_LAYOUT_ALIGN_EXPAND, "EXPAND", 0, "Expand", ""},
|
|
|
|
{UI_LAYOUT_ALIGN_LEFT, "LEFT", 0, "Left", ""},
|
|
|
|
{UI_LAYOUT_ALIGN_CENTER, "CENTER", 0, "Center", ""},
|
2009-10-22 16:35:51 +00:00
|
|
|
{UI_LAYOUT_ALIGN_RIGHT, "RIGHT", 0, "Right", ""},
|
2009-06-16 00:52:21 +00:00
|
|
|
{0, NULL, 0, NULL, NULL}};
|
2009-07-21 01:26:17 +00:00
|
|
|
|
|
|
|
/* layout */
|
2009-04-08 16:40:46 +00:00
|
|
|
|
|
|
|
srna= RNA_def_struct(brna, "UILayout", NULL);
|
|
|
|
RNA_def_struct_sdna(srna, "uiLayout");
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_struct_ui_text(srna, "UI Layout", "User interface layout in a panel or header");
|
2009-04-08 16:40:46 +00:00
|
|
|
|
2009-05-28 23:37:55 +00:00
|
|
|
prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
|
|
|
|
RNA_def_property_boolean_funcs(prop, "rna_UILayout_active_get", "rna_UILayout_active_set");
|
2009-06-09 10:30:11 +00:00
|
|
|
|
|
|
|
prop= RNA_def_property(srna, "operator_context", PROP_ENUM, PROP_NONE);
|
|
|
|
RNA_def_property_enum_items(prop, operator_context_items);
|
|
|
|
RNA_def_property_enum_funcs(prop, "rna_UILayout_op_context_get", "rna_UILayout_op_context_set", NULL);
|
2010-08-07 18:34:16 +00:00
|
|
|
|
2009-05-28 23:37:55 +00:00
|
|
|
prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
|
|
|
|
RNA_def_property_boolean_funcs(prop, "rna_UILayout_enabled_get", "rna_UILayout_enabled_set");
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Enabled", "When false, this (sub)layout is greyed out");
|
2010-08-07 18:34:16 +00:00
|
|
|
|
2011-01-03 13:33:07 +00:00
|
|
|
prop= RNA_def_property(srna, "alert", PROP_BOOLEAN, PROP_NONE);
|
|
|
|
RNA_def_property_boolean_funcs(prop, "rna_UILayout_alert_get", "rna_UILayout_alert_set");
|
2009-05-28 23:37:55 +00:00
|
|
|
|
|
|
|
prop= RNA_def_property(srna, "alignment", PROP_ENUM, PROP_NONE);
|
|
|
|
RNA_def_property_enum_items(prop, alignment_items);
|
|
|
|
RNA_def_property_enum_funcs(prop, "rna_UILayout_alignment_get", "rna_UILayout_alignment_set", NULL);
|
|
|
|
|
2009-07-21 01:26:17 +00:00
|
|
|
#if 0
|
2009-05-28 23:37:55 +00:00
|
|
|
prop= RNA_def_property(srna, "keep_aspect", PROP_BOOLEAN, PROP_NONE);
|
|
|
|
RNA_def_property_boolean_funcs(prop, "rna_UILayout_keep_aspect_get", "rna_UILayout_keep_aspect_set");
|
2009-07-21 01:26:17 +00:00
|
|
|
#endif
|
2009-05-28 23:37:55 +00:00
|
|
|
|
2009-06-03 00:04:48 +00:00
|
|
|
prop= RNA_def_property(srna, "scale_x", PROP_FLOAT, PROP_UNSIGNED);
|
|
|
|
RNA_def_property_float_funcs(prop, "rna_UILayout_scale_x_get", "rna_UILayout_scale_x_set", NULL);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Scale X", "Scale factor along the X for items in this (sub)layout");
|
2010-08-07 18:34:16 +00:00
|
|
|
|
2009-06-03 00:04:48 +00:00
|
|
|
prop= RNA_def_property(srna, "scale_y", PROP_FLOAT, PROP_UNSIGNED);
|
|
|
|
RNA_def_property_float_funcs(prop, "rna_UILayout_scale_y_get", "rna_UILayout_scale_y_set", NULL);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Scale Y", "Scale factor along the Y for items in this (sub)layout");
|
2009-04-08 16:40:46 +00:00
|
|
|
RNA_api_ui_layout(srna);
|
|
|
|
}
|
|
|
|
|
2009-04-19 13:37:59 +00:00
|
|
|
static void rna_def_panel(BlenderRNA *brna)
|
|
|
|
{
|
|
|
|
StructRNA *srna;
|
|
|
|
PropertyRNA *prop;
|
2009-12-26 17:49:08 +00:00
|
|
|
PropertyRNA *parm;
|
2009-04-19 13:37:59 +00:00
|
|
|
FunctionRNA *func;
|
|
|
|
|
2010-08-26 01:05:37 +00:00
|
|
|
static EnumPropertyItem panel_flag_items[] = {
|
2011-09-19 13:23:58 +00:00
|
|
|
{PNL_DEFAULT_CLOSED, "DEFAULT_CLOSED", 0, "Default Closed",
|
|
|
|
"Defines if the panel has to be open or collapsed at the time of its creation"},
|
|
|
|
{PNL_NO_HEADER, "HIDE_HEADER", 0, "Show Header",
|
|
|
|
"If set to True, the panel shows a header, which contains a clickable "
|
|
|
|
"arrow to collapse the panel and the label (see bl_label)"},
|
2010-08-26 01:05:37 +00:00
|
|
|
{0, NULL, 0, NULL, NULL}};
|
|
|
|
|
2009-04-19 13:37:59 +00:00
|
|
|
srna= RNA_def_struct(brna, "Panel", NULL);
|
2010-08-04 16:57:24 +00:00
|
|
|
RNA_def_struct_ui_text(srna, "Panel", "Panel containing UI elements");
|
2009-04-19 13:37:59 +00:00
|
|
|
RNA_def_struct_sdna(srna, "Panel");
|
|
|
|
RNA_def_struct_refine_func(srna, "rna_Panel_refine");
|
2011-05-18 11:21:10 +00:00
|
|
|
RNA_def_struct_register_funcs(srna, "rna_Panel_register", "rna_Panel_unregister", NULL);
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
/* poll */
|
2009-04-19 13:37:59 +00:00
|
|
|
func= RNA_def_function(srna, "poll", NULL);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_function_ui_description(func, "If this method returns a non-null output, then the panel can be drawn");
|
2011-05-15 06:29:52 +00:00
|
|
|
RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_REGISTER_OPTIONAL);
|
2009-04-19 13:37:59 +00:00
|
|
|
RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
|
2009-12-26 17:49:08 +00:00
|
|
|
parm= RNA_def_pointer(func, "context", "Context", "", "");
|
2011-02-16 10:19:14 +00:00
|
|
|
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
/* draw */
|
2009-04-19 13:37:59 +00:00
|
|
|
func= RNA_def_function(srna, "draw", NULL);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_function_ui_description(func, "Draw UI elements into the panel UI layout");
|
2009-04-19 13:37:59 +00:00
|
|
|
RNA_def_function_flag(func, FUNC_REGISTER);
|
2009-12-26 17:49:08 +00:00
|
|
|
parm= RNA_def_pointer(func, "context", "Context", "", "");
|
2011-02-16 10:19:14 +00:00
|
|
|
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-05-19 17:13:33 +00:00
|
|
|
func= RNA_def_function(srna, "draw_header", NULL);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_function_ui_description(func, "Draw UI elements into the panel's header UI layout");
|
2009-05-19 17:13:33 +00:00
|
|
|
RNA_def_function_flag(func, FUNC_REGISTER);
|
2009-12-26 17:49:08 +00:00
|
|
|
parm= RNA_def_pointer(func, "context", "Context", "", "");
|
2011-02-16 10:19:14 +00:00
|
|
|
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
|
2009-05-19 17:13:33 +00:00
|
|
|
|
2009-04-19 13:37:59 +00:00
|
|
|
prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
|
|
|
|
RNA_def_property_struct_type(prop, "UILayout");
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Layout", "Defines the structure of the panel in the UI");
|
2010-08-04 16:57:24 +00:00
|
|
|
|
2009-07-28 16:46:14 +00:00
|
|
|
prop= RNA_def_property(srna, "text", PROP_STRING, PROP_NONE);
|
|
|
|
RNA_def_property_string_sdna(prop, NULL, "drawname");
|
2010-08-04 16:57:24 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Text", "XXX todo");
|
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
/* registration */
|
2009-10-31 13:31:23 +00:00
|
|
|
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
|
2009-04-19 17:12:16 +00:00
|
|
|
RNA_def_property_string_sdna(prop, NULL, "type->idname");
|
2011-01-24 03:38:34 +00:00
|
|
|
RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "ID Name",
|
|
|
|
"If this is set, the panel gets a custom ID, otherwise it takes the "
|
|
|
|
"name of the class used to define the panel. For example, if the "
|
|
|
|
"class name is \"OBJECT_PT_hello\", and bl_idname is not set by the "
|
|
|
|
"script, then bl_idname = \"OBJECT_PT_hello\"");
|
2010-08-04 16:57:24 +00:00
|
|
|
|
2011-09-26 14:29:39 +00:00
|
|
|
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
|
2009-04-19 17:12:16 +00:00
|
|
|
RNA_def_property_string_sdna(prop, NULL, "type->label");
|
2009-04-19 13:37:59 +00:00
|
|
|
RNA_def_property_flag(prop, PROP_REGISTER);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Label",
|
|
|
|
"The panel label, shows up in the panel header at the right of the "
|
|
|
|
"triangle used to collapse the panel");
|
2010-08-04 16:57:24 +00:00
|
|
|
|
2009-10-31 13:31:23 +00:00
|
|
|
prop= RNA_def_property(srna, "bl_space_type", PROP_ENUM, PROP_NONE);
|
2009-04-19 17:12:16 +00:00
|
|
|
RNA_def_property_enum_sdna(prop, NULL, "type->space_type");
|
|
|
|
RNA_def_property_enum_items(prop, space_type_items);
|
2009-04-19 13:37:59 +00:00
|
|
|
RNA_def_property_flag(prop, PROP_REGISTER);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Space type", "The space where the panel is going to be used in");
|
2010-08-04 16:57:24 +00:00
|
|
|
|
2009-10-31 13:31:23 +00:00
|
|
|
prop= RNA_def_property(srna, "bl_region_type", PROP_ENUM, PROP_NONE);
|
2009-04-19 17:12:16 +00:00
|
|
|
RNA_def_property_enum_sdna(prop, NULL, "type->region_type");
|
|
|
|
RNA_def_property_enum_items(prop, region_type_items);
|
2009-04-19 13:37:59 +00:00
|
|
|
RNA_def_property_flag(prop, PROP_REGISTER);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Region Type", "The region where the panel is going to be used in");
|
2009-04-19 13:37:59 +00:00
|
|
|
|
2009-10-31 13:31:23 +00:00
|
|
|
prop= RNA_def_property(srna, "bl_context", PROP_STRING, PROP_NONE);
|
2009-04-19 17:12:16 +00:00
|
|
|
RNA_def_property_string_sdna(prop, NULL, "type->context");
|
2009-10-31 18:48:58 +00:00
|
|
|
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); /* should this be optional? - Campbell */
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Context",
|
|
|
|
"The context in which the panel belongs to. (TODO: explain the "
|
|
|
|
"possible combinations bl_context/bl_region_type/bl_space_type)");
|
2010-08-04 16:57:24 +00:00
|
|
|
|
2010-08-26 01:05:37 +00:00
|
|
|
prop= RNA_def_property(srna, "bl_options", PROP_ENUM, PROP_NONE);
|
|
|
|
RNA_def_property_enum_sdna(prop, NULL, "type->flag");
|
|
|
|
RNA_def_property_enum_items(prop, panel_flag_items);
|
|
|
|
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL|PROP_ENUM_FLAG);
|
|
|
|
RNA_def_property_ui_text(prop, "Options", "Options for this panel type");
|
2009-04-19 17:12:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_def_header(BlenderRNA *brna)
|
|
|
|
{
|
|
|
|
StructRNA *srna;
|
|
|
|
PropertyRNA *prop;
|
2009-12-26 17:49:08 +00:00
|
|
|
PropertyRNA *parm;
|
2009-04-19 17:12:16 +00:00
|
|
|
FunctionRNA *func;
|
|
|
|
|
|
|
|
srna= RNA_def_struct(brna, "Header", NULL);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_struct_ui_text(srna, "Header", "Editor header containing UI elements");
|
2009-04-19 17:12:16 +00:00
|
|
|
RNA_def_struct_sdna(srna, "Header");
|
|
|
|
RNA_def_struct_refine_func(srna, "rna_Header_refine");
|
2011-05-18 11:21:10 +00:00
|
|
|
RNA_def_struct_register_funcs(srna, "rna_Header_register", "rna_Header_unregister", NULL);
|
2009-04-19 17:12:16 +00:00
|
|
|
|
|
|
|
/* draw */
|
|
|
|
func= RNA_def_function(srna, "draw", NULL);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_function_ui_description(func, "Draw UI elements into the header UI layout");
|
2009-04-19 17:12:16 +00:00
|
|
|
RNA_def_function_flag(func, FUNC_REGISTER);
|
2009-12-26 17:49:08 +00:00
|
|
|
parm= RNA_def_pointer(func, "context", "Context", "", "");
|
|
|
|
RNA_def_property_flag(parm, PROP_REQUIRED);
|
2009-04-19 17:12:16 +00:00
|
|
|
|
2009-07-21 01:14:55 +00:00
|
|
|
RNA_define_verify_sdna(0); // not in sdna
|
|
|
|
|
2009-04-19 17:12:16 +00:00
|
|
|
prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
|
2009-07-21 01:14:55 +00:00
|
|
|
RNA_def_property_pointer_sdna(prop, NULL, "layout");
|
2009-04-19 17:12:16 +00:00
|
|
|
RNA_def_property_struct_type(prop, "UILayout");
|
2011-09-29 14:41:11 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Layout", "Structure of the header in the UI");
|
2009-04-19 17:12:16 +00:00
|
|
|
|
|
|
|
/* registration */
|
2009-10-31 13:31:23 +00:00
|
|
|
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
|
2009-04-19 17:12:16 +00:00
|
|
|
RNA_def_property_string_sdna(prop, NULL, "type->idname");
|
2011-01-24 03:38:34 +00:00
|
|
|
RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "ID Name",
|
|
|
|
"If this is set, the header gets a custom ID, otherwise it takes the "
|
2011-09-29 14:41:11 +00:00
|
|
|
"name of the class used to define the panel; for example, if the "
|
2011-09-19 13:23:58 +00:00
|
|
|
"class name is \"OBJECT_HT_hello\", and bl_idname is not set by the "
|
|
|
|
"script, then bl_idname = \"OBJECT_HT_hello\"");
|
2009-04-19 17:12:16 +00:00
|
|
|
|
2009-10-31 13:31:23 +00:00
|
|
|
prop= RNA_def_property(srna, "bl_space_type", PROP_ENUM, PROP_NONE);
|
2009-04-19 17:12:16 +00:00
|
|
|
RNA_def_property_enum_sdna(prop, NULL, "type->space_type");
|
|
|
|
RNA_def_property_enum_items(prop, space_type_items);
|
2009-04-19 13:37:59 +00:00
|
|
|
RNA_def_property_flag(prop, PROP_REGISTER);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Space type", "The space where the header is going to be used in");
|
2009-07-21 01:14:55 +00:00
|
|
|
|
|
|
|
RNA_define_verify_sdna(1);
|
2009-04-19 13:37:59 +00:00
|
|
|
}
|
|
|
|
|
2009-04-22 18:39:44 +00:00
|
|
|
static void rna_def_menu(BlenderRNA *brna)
|
|
|
|
{
|
|
|
|
StructRNA *srna;
|
|
|
|
PropertyRNA *prop;
|
2009-12-26 17:49:08 +00:00
|
|
|
PropertyRNA *parm;
|
2009-04-22 18:39:44 +00:00
|
|
|
FunctionRNA *func;
|
|
|
|
|
|
|
|
srna= RNA_def_struct(brna, "Menu", NULL);
|
2010-02-10 21:15:44 +00:00
|
|
|
RNA_def_struct_ui_text(srna, "Menu", "Editor menu containing buttons");
|
2009-04-22 18:39:44 +00:00
|
|
|
RNA_def_struct_sdna(srna, "Menu");
|
|
|
|
RNA_def_struct_refine_func(srna, "rna_Menu_refine");
|
2011-05-18 11:21:10 +00:00
|
|
|
RNA_def_struct_register_funcs(srna, "rna_Menu_register", "rna_Menu_unregister", NULL);
|
2009-04-22 18:39:44 +00:00
|
|
|
|
|
|
|
/* poll */
|
|
|
|
func= RNA_def_function(srna, "poll", NULL);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_function_ui_description(func, "If this method returns a non-null output, then the menu can be drawn");
|
2011-05-15 06:29:52 +00:00
|
|
|
RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_REGISTER_OPTIONAL);
|
2009-04-22 18:39:44 +00:00
|
|
|
RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
|
2009-12-26 17:49:08 +00:00
|
|
|
parm= RNA_def_pointer(func, "context", "Context", "", "");
|
|
|
|
RNA_def_property_flag(parm, PROP_REQUIRED);
|
2009-04-22 18:39:44 +00:00
|
|
|
|
|
|
|
/* draw */
|
|
|
|
func= RNA_def_function(srna, "draw", NULL);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_function_ui_description(func, "Draw UI elements into the menu UI layout");
|
2009-04-22 18:39:44 +00:00
|
|
|
RNA_def_function_flag(func, FUNC_REGISTER);
|
2009-12-26 17:49:08 +00:00
|
|
|
parm= RNA_def_pointer(func, "context", "Context", "", "");
|
|
|
|
RNA_def_property_flag(parm, PROP_REQUIRED);
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2009-07-21 01:14:55 +00:00
|
|
|
RNA_define_verify_sdna(0); // not in sdna
|
|
|
|
|
2009-04-22 18:39:44 +00:00
|
|
|
prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
|
2009-07-21 01:14:55 +00:00
|
|
|
RNA_def_property_pointer_sdna(prop, NULL, "layout");
|
2009-04-22 18:39:44 +00:00
|
|
|
RNA_def_property_struct_type(prop, "UILayout");
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Layout", "Defines the structure of the menu in the UI");
|
2009-04-22 18:39:44 +00:00
|
|
|
|
|
|
|
/* registration */
|
2009-10-31 13:31:23 +00:00
|
|
|
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
|
2009-04-22 18:39:44 +00:00
|
|
|
RNA_def_property_string_sdna(prop, NULL, "type->idname");
|
2011-01-24 03:38:34 +00:00
|
|
|
RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
|
2011-09-19 13:23:58 +00:00
|
|
|
RNA_def_property_ui_text(prop, "ID Name",
|
|
|
|
"If this is set, the menu gets a custom ID, otherwise it takes the "
|
2011-10-02 08:46:46 +00:00
|
|
|
"name of the class used to define the menu (for example, if the "
|
2011-09-19 13:23:58 +00:00
|
|
|
"class name is \"OBJECT_MT_hello\", and bl_idname is not set by the "
|
2011-10-02 08:46:46 +00:00
|
|
|
"script, then bl_idname = \"OBJECT_MT_hello\")");
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2011-09-26 14:29:39 +00:00
|
|
|
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
|
2009-04-22 18:39:44 +00:00
|
|
|
RNA_def_property_string_sdna(prop, NULL, "type->label");
|
|
|
|
RNA_def_property_flag(prop, PROP_REGISTER);
|
2010-08-04 16:57:24 +00:00
|
|
|
RNA_def_property_ui_text(prop, "Label", "The menu label");
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2011-11-15 14:58:14 +00:00
|
|
|
prop= RNA_def_property(srna, "bl_description", PROP_STRING, PROP_TRANSLATE);
|
|
|
|
RNA_def_property_string_sdna(prop, NULL, "type->description");
|
|
|
|
RNA_def_property_string_maxlength(prop, 1024); /* else it uses the pointer size! */
|
|
|
|
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Menu_bl_description_set");
|
|
|
|
// RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
|
|
|
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
|
|
|
|
|
2009-07-21 01:14:55 +00:00
|
|
|
RNA_define_verify_sdna(1);
|
2009-04-22 18:39:44 +00:00
|
|
|
}
|
|
|
|
|
2009-04-08 16:40:46 +00:00
|
|
|
void RNA_def_ui(BlenderRNA *brna)
|
|
|
|
{
|
|
|
|
rna_def_ui_layout(brna);
|
2009-04-19 13:37:59 +00:00
|
|
|
rna_def_panel(brna);
|
2009-04-19 17:12:16 +00:00
|
|
|
rna_def_header(brna);
|
2009-04-22 18:39:44 +00:00
|
|
|
rna_def_menu(brna);
|
2009-04-08 16:40:46 +00:00
|
|
|
}
|
|
|
|
|
2009-06-09 10:30:11 +00:00
|
|
|
#endif // RNA_RUNTIME
|
2009-04-08 16:40:46 +00:00
|
|
|
|