RNA:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 8 Apr 2009 16:40:46 +0000 (16:40 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 8 Apr 2009 16:40:46 +0000 (16:40 +0000)
* Added the build system code to compile files named
  editors/*/*_api.c into the makesrna preprocessing.

  The reason to do this is to keep operators and API
  close together, but it doesn't fit well with the build
  system, especially Makefiles use an ugly hack here.

* Some fixes to pass an RNA AnyType through the API,
  this will give a PointerRNA, for use in the interface
  code for example.

* Added RNA wrapping of some UI template code as a test.

source/blender/editors/interface/SConscript
source/blender/editors/interface/interface_api.c [new file with mode: 0644]
source/blender/makesrna/SConscript
source/blender/makesrna/intern/CMakeLists.txt
source/blender/makesrna/intern/Makefile
source/blender/makesrna/intern/SConscript
source/blender/makesrna/intern/makesrna.c
source/blender/makesrna/intern/rna_internal.h
source/blender/makesrna/intern/rna_screen.c
source/blender/makesrna/intern/rna_ui.c [new file with mode: 0644]

index 38cb876beb7365039bcc493529c379ece61f2c63..fa89cd4891cefd35d1514d487b00b3ed5915347f 100644 (file)
@@ -3,6 +3,9 @@ Import ('env')
 
 sources = env.Glob('*.c')
 
+for source in env.Glob('*_api.c'):
+       sources.remove(source)
+
 incs = '../include ../../blenlib ../../blenfont ../../blenkernel ../../makesdna ../../imbuf'
 incs += ' ../../makesrna ../../windowmanager #/intern/guardedalloc #intern/bmfont'
 incs += ' #/extern/glew/include'
diff --git a/source/blender/editors/interface/interface_api.c b/source/blender/editors/interface/interface_api.c
new file mode 100644 (file)
index 0000000..98a4384
--- /dev/null
@@ -0,0 +1,67 @@
+/**
+ * $Id:
+ *
+ * ***** 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,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ * 
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+void RNA_api_ui_layout(StructRNA *srna)
+{
+       FunctionRNA *func;
+
+       /* templates */
+       func= RNA_def_function(srna, "template_column", "uiTemplateColumn");
+       func= RNA_def_function(srna, "template_left_right", "uiTemplateLeftRight");
+       func= RNA_def_function(srna, "template_stack", "uiTemplateStack");
+
+       func= RNA_def_function(srna, "template_header_menus", "uiTemplateHeaderMenus");
+       func= RNA_def_function(srna, "template_header_buttons", "uiTemplateHeaderButtons");
+       //func= RNA_def_function(srna, "template_header_ID", "uiTemplateHeaderID");
+
+       /* items */
+       func= RNA_def_function(srna, "itemR", "uiItemR");
+       RNA_def_int(func, "slot", 0, 0, 5, "", "", 0, 5);
+       RNA_def_string(func, "name", "", 0, "", "");
+       RNA_def_int(func, "icon", 0, 0, INT_MAX, "", "", 0, INT_MAX);
+       RNA_def_pointer(func, "data", "AnyType", "", "");
+       RNA_def_string(func, "property", "", 0, "", "");
+
+       func= RNA_def_function(srna, "itemO", "uiItemO");
+       RNA_def_int(func, "slot", 0, 0, 5, "", "", 0, 5);
+       RNA_def_string(func, "name", "", 0, "", "");
+       RNA_def_int(func, "icon", 0, 0, INT_MAX, "", "", 0, INT_MAX);
+       RNA_def_string(func, "operator", "", 0, "", "");
+
+       func= RNA_def_function(srna, "itemL", "uiItemLabel");
+       RNA_def_int(func, "slot", 0, 0, 5, "", "", 0, 5);
+       RNA_def_string(func, "name", "", 0, "", "");
+       RNA_def_int(func, "icon", 0, 0, INT_MAX, "", "", 0, INT_MAX);
+}
+
index 94ea9ad764a8091ddf4fc837f3bbbcb8b02a2f14..7bf968a09799dbf6dde51d5605b0c2beb29b1240 100644 (file)
@@ -7,6 +7,6 @@ o = SConscript('intern/SConscript')
 objs += o
 
 incs = '#/intern/guardedalloc ../blenkernel ../blenlib ../makesdna intern .'
-incs += ' ../windowmanager ../editors'
+incs += ' ../windowmanager ../editors/include'
 
 env.BlenderLib ( 'bf_rna', objs, Split(incs), [], libtype=['core'], priority = [195] )
index ecdc2ca865ca501b593820a9999d1a969a2aa977..0971727cbf68d3d5dd23472214805fabba6d0a65 100644 (file)
 
 FILE(GLOB DEFSRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.c")
 LIST(REMOVE_ITEM DEFSRC rna_access.c rna_define.c makesrna.c)
-
+FILE(GLOB_RECURSE APISRC "../../editors/*/*_api.c")
 STRING(REGEX REPLACE "rna_([a-zA-Z0-9_-]*).c" "${CMAKE_CURRENT_BINARY_DIR}/rna_\\1_gen.c" GENSRC "${DEFSRC}")
 
 SET(SRC
      makesrna.c
      rna_define.c
      ${DEFSRC}
+     ${APISRC}
      ../../../../intern/guardedalloc/intern/mallocn.c
      ../../../../intern/guardedalloc/intern/mmap_win.c)
 
-INCLUDE_DIRECTORIES(../../../../intern/guardedalloc .. ../../makesdna ../../blenkernel ../../blenlib ../../windowmanager ../../editors .)
+INCLUDE_DIRECTORIES(../../../../intern/guardedalloc .. ../../makesdna ../../blenkernel ../../blenlib ../../windowmanager ../../editors/include .)
 FILE(GLOB INC_FILES ../*.h ../../makesdna/*.h)
 
 # Build makesrna executable
index 070f6f264bd8ad56f49848c613938f2c1570a9a9..f64c11ac718988190b8edbc95725eea3423fa04c 100644 (file)
@@ -31,8 +31,8 @@ DEFRNA = $(filter-out %rna_define.c, $(filter-out %rna_access.c, $(ALLRNA)))
 GENSRCS = $(patsubst rna_%.c, rna_%_gen.c, $(DEFRNA))
 GENTARGET = $(patsubst %.c, $(DIR)/$(DEBUG_DIR)%.c, $(GENSRCS))
 
-MAKESRCS = $(DEFRNA) makesrna.c rna_define.c
-MAKEOBJS = $(patsubst %.c, $(DIR)/$(DEBUG_DIR)%.o, $(MAKESRCS))
+MAKESRCS = $(DEFRNA) makesrna.c rna_define.c $(wildcard ../../editors/*/*_api.c)
+MAKEOBJS = $(patsubst %.c, $(DIR)/$(DEBUG_DIR)%.o, $(notdir $(MAKESRCS)))
 
 CSRCS = $(GENSRCS) rna_access.c
 
@@ -49,6 +49,7 @@ CPPFLAGS += -I../../blenlib
 CPPFLAGS += -I../../blenkernel
 CPPFLAGS += -I../../makesdna
 CPPFLAGS += -I../../windowmanager
+CPPFLAGS += -I../../editors/include
 CPPFLAGS += -I..
 CPPFLAGS += -I.
 
@@ -72,6 +73,24 @@ clean::
 
 # TODO include right .mk for ldflags
 
+# XXX this is an ugly hack, copying code from nan_compile.mk
+# we want the .o's to be in the makesrna/ directory, but the
+# .c's are in the editors/*/ directories
+
+$(DIR)/$(DEBUG_DIR)%_api.o: ../../editors/*/%_api.c
+    ifdef NAN_DEPEND
+       @set -e; $(CC) -M $(CPPFLAGS) $< 2>/dev/null \
+               | sed 's@\($*\)\.o[ :]*@$(DIR)/$(DEBUG_DIR)\1.o : @g' \
+               > $(DIR)/$(DEBUG_DIR)$*.d; \
+               [ -s $(DIR)/$(DEBUG_DIR)$*.d ] || $(RM) $(DIR)/$*.d
+    endif
+    ifdef NAN_QUIET
+       @echo " -- $< -- "
+       @$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
+    else
+       $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@)
+    endif
+
 # A small note: we do not use the debug version of the alloc lib. That
 # is done quite intentionally. If there is a bug in that lib, it needs
 # to be fixed by the module maintainer.
index 46f748f7c7c0f7c189b58eed86148ade90ebe475..a8cc452d350fa49e18166d3bdaa25b37943fdb41 100644 (file)
@@ -11,17 +11,15 @@ defines = []
 root_build_dir=normpath(env['BF_BUILDDIR'])
 
 source_files = env.Glob('*.c')
-
-# making rna_access.c part of both makesrna and blender seems to
-# give conflict, how to solve?
 source_files.remove('rna_access.c')
 
 generated_files = source_files[:]
 generated_files.remove('rna_define.c')
 generated_files.remove('makesrna.c')
-
 generated_files = [filename[:-2] + '_gen.c' for filename in generated_files]
 
+source_files.extend(env.Glob('../../editors/*/*_api.c'))
+
 makesrna_tool = env.Clone()
 rna = env.Clone()
 makesrna_tool.Append(CCFLAGS = '-DBASE_HEADER="\\"source/blender/makesrna/\\"" ')
@@ -32,7 +30,7 @@ makesrna_tool.Append (CPPPATH = ['#/intern/guardedalloc',
                                  '../../makesdna',
                                  '../../makesrna',
                                                                 '../../windowmanager',
-                                                                '../../editors'])
+                                                                '../../editors/include'])
 
 if env['OURPLATFORM'] == 'linuxcross':
        USE_WINE = True # when cross compiling on linux 64bit this is useful
index a9f08f8f82ab458104c4d888f7a22f038c225fdf..5eceb62f8971083923b797990b25d100df0cad2a 100644 (file)
@@ -1116,12 +1116,20 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
 
        dparm= dfunc->cont.properties.first;
        for(; dparm; dparm= dparm->next) {
-               ptrstr= (dparm->prop->type == PROP_POINTER || dparm->prop->arraylength > 0)? "*" : "";
-
                if(dparm->prop==func->ret) 
                        fprintf(f, "\t_retdata= _data;\n");
+               else if(dparm->prop->arraylength)
+                       fprintf(f, "\t%s= ((%s%s*)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
+               else if(dparm->prop->type == PROP_POINTER) {
+                       PointerPropertyRNA *pprop= (PointerPropertyRNA*)dparm->prop;
+
+                       if(strcmp((char*)pprop->type, "AnyType") == 0)
+                               fprintf(f, "\t%s= ((%s%s*)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
+                       else
+                               fprintf(f, "\t%s= *((%s%s**)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
+               }
                else
-                       fprintf(f, "\t%s= *((%s%s%s*)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr);
+                       fprintf(f, "\t%s= *((%s%s*)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
 
                if(dparm->next)
                        fprintf(f, "\t_data+= %d;\n", rna_parameter_size(dparm->prop));
@@ -1694,6 +1702,7 @@ RNAProcessItem PROCESS_ITEMS[]= {
        {"rna_text.c", RNA_def_text},
        {"rna_timeline.c", RNA_def_timeline_marker},
        {"rna_sound.c", RNA_def_sound},
+       {"rna_ui.c", RNA_def_ui},
        {"rna_userdef.c", RNA_def_userdef},
        {"rna_vfont.c", RNA_def_vfont},
        {"rna_vpaint.c", RNA_def_vpaint},
index 572c8b2ae142b2a60868a27a47c5498b270c878b..d0aa60dc390a30b6b67248e4f0c2a3ae8cc5fd1b 100644 (file)
@@ -153,12 +153,15 @@ void RNA_def_text(struct BlenderRNA *brna);
 void RNA_def_texture(struct BlenderRNA *brna);
 void RNA_def_timeline_marker(struct BlenderRNA *brna);
 void RNA_def_sound(struct BlenderRNA *brna);
+void RNA_def_ui(struct BlenderRNA *brna);
 void RNA_def_userdef(struct BlenderRNA *brna);
 void RNA_def_vfont(struct BlenderRNA *brna);
 void RNA_def_vpaint(struct BlenderRNA *brna);
 void RNA_def_wm(struct BlenderRNA *brna);
 void RNA_def_world(struct BlenderRNA *brna);
 
+/* Common Define functions */
+
 void rna_def_animdata_common(struct StructRNA *srna);
 
 void rna_def_texmat_common(struct StructRNA *srna, const char *texspace_editable);
@@ -177,6 +180,10 @@ void rna_object_vgroup_name_set(struct PointerRNA *ptr, const char *value, char
 void rna_object_uvlayer_name_set(struct PointerRNA *ptr, const char *value, char *result, int maxlen);
 void rna_object_vcollayer_name_set(struct PointerRNA *ptr, const char *value, char *result, int maxlen);
 
+/* API functions */
+
+void RNA_api_ui_layout(struct StructRNA *srna);
+
 /* ID Properties */
 
 extern StringPropertyRNA rna_IDProperty_string;
index 00cf29bfc511dc86740ee06ba4850299689ce4da..a976cd54abc6d852d6785f6263ffa46186889e9e 100644 (file)
@@ -72,10 +72,14 @@ static void rna_def_scrarea(BlenderRNA *brna)
 static void rna_def_panel(BlenderRNA *brna)
 {
        StructRNA *srna;
+       PropertyRNA *prop;
        
        srna= RNA_def_struct(brna, "Panel", NULL);
        RNA_def_struct_ui_text(srna, "Panel", "Buttons panel.");
        RNA_def_struct_sdna(srna, "Panel");
+
+       prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
+       RNA_def_property_struct_type(prop, "UILayout");
 }
 
 static void rna_def_region(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c
new file mode 100644 (file)
index 0000000..8a93fb4
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * $Id$
+ *
+ * ***** 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,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Contributor(s): Blender Foundation (2009)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+#include "rna_internal.h"
+
+#ifdef RNA_RUNTIME
+
+#include "UI_interface.h"
+
+#else
+
+static void rna_def_ui_layout(BlenderRNA *brna)
+{
+       StructRNA *srna;
+
+       srna= RNA_def_struct(brna, "UILayout", NULL);
+       RNA_def_struct_sdna(srna, "uiLayout");
+       RNA_def_struct_ui_text(srna, "UI Layout", "User interface layout in a panel or header.");
+
+       RNA_api_ui_layout(srna);
+}
+
+void RNA_def_ui(BlenderRNA *brna)
+{
+       rna_def_ui_layout(brna);
+}
+
+#endif
+