Merging r40265 through r40492 from trunk into soc-2011-tomato
[blender.git] / source / blender / makesrna / intern / rna_screen.c
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * Contributor(s): Blender Foundation (2008), Nathan Letwory
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 /** \file blender/makesrna/intern/rna_screen.c
26  *  \ingroup RNA
27  */
28
29
30 #include <stdlib.h>
31 #include <stddef.h>
32
33 #include "RNA_define.h"
34 #include "RNA_enum_types.h"
35
36 #include "rna_internal.h"
37
38 #include "DNA_screen_types.h"
39 #include "DNA_scene_types.h"
40
41 EnumPropertyItem region_type_items[] = {
42         {RGN_TYPE_WINDOW, "WINDOW", 0, "Window", ""},
43         {RGN_TYPE_HEADER, "HEADER", 0, "Header", ""},
44         {RGN_TYPE_CHANNELS, "CHANNELS", 0, "Channels", ""},
45         {RGN_TYPE_TEMPORARY, "TEMPORARY", 0, "Temporary", ""},
46         {RGN_TYPE_UI, "UI", 0, "UI", ""},
47         {RGN_TYPE_TOOLS, "TOOLS", 0, "Tools", ""},
48         {RGN_TYPE_TOOL_PROPS, "TOOL_PROPS", 0, "Tool Properties", ""},
49         {RGN_TYPE_PREVIEW, "PREVIEW", 0, "Preview", ""},
50         {0, NULL, 0, NULL, NULL}};
51
52 #include "ED_screen.h"
53
54 #include "WM_api.h"
55 #include "WM_types.h"
56
57 #ifdef RNA_RUNTIME
58
59
60 static void rna_Screen_scene_set(PointerRNA *ptr, PointerRNA value)
61 {
62         bScreen *sc= (bScreen*)ptr->data;
63
64         if(value.data == NULL)
65                 return;
66
67         /* exception: can't set screens inside of area/region handers */
68         sc->newscene= value.data;
69 }
70
71 static void rna_Screen_scene_update(bContext *C, PointerRNA *ptr)
72 {
73         bScreen *sc= (bScreen*)ptr->data;
74
75         /* exception: can't set screens inside of area/region handers, and must
76            use context so notifier gets to the right window  */
77         if(sc->newscene) {
78                 WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, sc->newscene);
79                 sc->newscene= NULL;
80         }
81 }
82
83 static void rna_Screen_redraw_update(Main *bmain, Scene *scene, PointerRNA *ptr)
84 {
85         bScreen *screen= (bScreen*)ptr->data;
86
87         /* the settings for this are currently only available from a menu in the TimeLine, hence refresh=SPACE_TIME */
88         ED_screen_animation_timer_update(screen, screen->redraws_flag, SPACE_TIME);
89 }
90
91
92 static int rna_Screen_is_animation_playing_get(PointerRNA *ptr)
93 {
94         bScreen *sc= (bScreen*)ptr->data;
95         return (sc->animtimer != NULL);
96 }
97
98 static int rna_Screen_fullscreen_get(PointerRNA *ptr)
99 {
100         bScreen *sc= (bScreen*)ptr->data;
101         return (sc->full != 0);
102 }
103
104 static void rna_Area_type_set(PointerRNA *ptr, int value)
105 {
106         ScrArea *sa= (ScrArea*)ptr->data;
107         sa->butspacetype= value;
108 }
109
110 static void rna_Area_type_update(bContext *C, PointerRNA *ptr)
111 {
112         ScrArea *sa= (ScrArea*)ptr->data;
113
114         ED_area_newspace(C, sa, sa->butspacetype); /* XXX - this uses the window */
115         ED_area_tag_redraw(sa);
116 }
117
118 #else
119
120 /* Area.spaces */
121 static void rna_def_area_spaces(BlenderRNA *brna, PropertyRNA *cprop)
122 {
123         StructRNA *srna;
124         PropertyRNA *prop;
125
126         RNA_def_property_srna(cprop, "AreaSpaces");
127         srna= RNA_def_struct(brna, "AreaSpaces", NULL);
128         RNA_def_struct_sdna(srna, "ScrArea");
129         RNA_def_struct_ui_text(srna, "Area Spaces", "Collection of spaces");
130
131         prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
132         RNA_def_property_pointer_sdna(prop, NULL, "spacedata.first");
133         RNA_def_property_struct_type(prop, "Space");
134         RNA_def_property_ui_text(prop, "Active Space", "Space currently being displayed in this area");
135 }
136
137 static void rna_def_area(BlenderRNA *brna)
138 {
139         StructRNA *srna;
140         PropertyRNA *prop;
141         FunctionRNA *func;
142
143         srna= RNA_def_struct(brna, "Area", NULL);
144         RNA_def_struct_ui_text(srna, "Area", "Area in a subdivided screen, containing an editor");
145         RNA_def_struct_sdna(srna, "ScrArea");
146
147         prop= RNA_def_property(srna, "spaces", PROP_COLLECTION, PROP_NONE);
148         RNA_def_property_collection_sdna(prop, NULL, "spacedata", NULL);
149         RNA_def_property_struct_type(prop, "Space");
150         RNA_def_property_ui_text(prop, "Spaces",
151                                  "Spaces contained in this area, the first being the active space. "
152                                  "NOTE: Useful for example to restore a previously used 3d view space "
153                                  "in a certain area to get the old view orientation");
154         rna_def_area_spaces(brna, prop);
155
156         prop= RNA_def_property(srna, "regions", PROP_COLLECTION, PROP_NONE);
157         RNA_def_property_collection_sdna(prop, NULL, "regionbase", NULL);
158         RNA_def_property_struct_type(prop, "Region");
159         RNA_def_property_ui_text(prop, "Regions", "Regions this area is subdivided in");
160
161         prop= RNA_def_property(srna, "show_menus", PROP_BOOLEAN, PROP_NONE);
162         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", HEADER_NO_PULLDOWN);
163         RNA_def_property_ui_text(prop, "Show Menus", "Show menus in the header");
164
165         prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
166         RNA_def_property_enum_sdna(prop, NULL, "spacetype");
167         RNA_def_property_enum_items(prop, space_type_items);
168         RNA_def_property_enum_funcs(prop, NULL, "rna_Area_type_set", NULL);
169         RNA_def_property_ui_text(prop, "Type", "Space type");
170         RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
171         RNA_def_property_update(prop, 0, "rna_Area_type_update");
172
173         prop= RNA_def_property(srna, "width", PROP_INT, PROP_UNSIGNED);
174         RNA_def_property_int_sdna(prop, NULL, "winx");
175         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
176         RNA_def_property_ui_text(prop, "Width", "Area width");
177
178         prop= RNA_def_property(srna, "height", PROP_INT, PROP_UNSIGNED);
179         RNA_def_property_int_sdna(prop, NULL, "winy");
180         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
181         RNA_def_property_ui_text(prop, "Height", "Area height");
182
183         RNA_def_function(srna, "tag_redraw", "ED_area_tag_redraw");
184
185         func= RNA_def_function(srna, "header_text_set", "ED_area_headerprint");
186         RNA_def_function_ui_description(func, "Set the header text");
187         RNA_def_string(func, "text", NULL, 0, "Text", "New string for the header, no argument clears the text");
188 }
189
190 static void rna_def_region(BlenderRNA *brna)
191 {
192         StructRNA *srna;
193         PropertyRNA *prop;
194
195         srna= RNA_def_struct(brna, "Region", NULL);
196         RNA_def_struct_ui_text(srna, "Region", "Region in a subdivided screen area");
197         RNA_def_struct_sdna(srna, "ARegion");
198
199         prop= RNA_def_property(srna, "id", PROP_INT, PROP_NONE);
200         RNA_def_property_int_sdna(prop, NULL, "swinid");
201         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
202         RNA_def_property_ui_text(prop, "Region ID", "Unique ID for this region");
203
204         prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
205         RNA_def_property_enum_sdna(prop, NULL, "regiontype");
206         RNA_def_property_enum_items(prop, region_type_items);
207         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
208         RNA_def_property_ui_text(prop, "Region Type", "Type of this region");
209
210         prop= RNA_def_property(srna, "width", PROP_INT, PROP_UNSIGNED);
211         RNA_def_property_int_sdna(prop, NULL, "winx");
212         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
213         RNA_def_property_ui_text(prop, "Width", "Region width");
214
215         prop= RNA_def_property(srna, "height", PROP_INT, PROP_UNSIGNED);
216         RNA_def_property_int_sdna(prop, NULL, "winy");
217         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
218         RNA_def_property_ui_text(prop, "Height", "Region height");
219
220         RNA_def_function(srna, "tag_redraw", "ED_region_tag_redraw");
221 }
222
223 static void rna_def_screen(BlenderRNA *brna)
224 {
225         StructRNA *srna;
226         PropertyRNA *prop;
227
228         srna= RNA_def_struct(brna, "Screen", "ID");
229         RNA_def_struct_sdna(srna, "Screen"); /* it is actually bScreen but for 2.5 the dna is patched! */
230         RNA_def_struct_ui_text(srna, "Screen", "Screen datablock, defining the layout of areas in a window");
231         RNA_def_struct_ui_icon(srna, ICON_SPLITSCREEN);
232
233         /* pointers */
234         prop= RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
235         RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_NULL);
236         RNA_def_property_pointer_funcs(prop, NULL, "rna_Screen_scene_set", NULL, NULL);
237         RNA_def_property_ui_text(prop, "Scene", "Active scene to be edited in the screen");
238         RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
239         RNA_def_property_update(prop, 0, "rna_Screen_scene_update");
240
241         /* collections */
242         prop= RNA_def_property(srna, "areas", PROP_COLLECTION, PROP_NONE);
243         RNA_def_property_collection_sdna(prop, NULL, "areabase", NULL);
244         RNA_def_property_struct_type(prop, "Area");
245         RNA_def_property_ui_text(prop, "Areas", "Areas the screen is subdivided into");
246
247         /* readonly status indicators */
248         prop= RNA_def_property(srna, "is_animation_playing", PROP_BOOLEAN, PROP_NONE);
249         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
250         RNA_def_property_boolean_funcs(prop, "rna_Screen_is_animation_playing_get", NULL);
251         RNA_def_property_ui_text(prop, "Animation Playing", "Animation playback is active");
252
253         prop= RNA_def_property(srna, "show_fullscreen", PROP_BOOLEAN, PROP_NONE);
254         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
255         RNA_def_property_boolean_funcs(prop, "rna_Screen_fullscreen_get", NULL);
256         RNA_def_property_ui_text(prop, "Fullscreen", "An area is maximised, filling this screen");
257
258         /* Define Anim Playback Areas */
259         prop= RNA_def_property(srna, "use_play_top_left_3d_editor", PROP_BOOLEAN, PROP_NONE);
260         RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_REGION);
261         RNA_def_property_ui_text(prop, "Top-Left 3D Editor", "");
262         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
263
264         prop= RNA_def_property(srna, "use_play_3d_editors", PROP_BOOLEAN, PROP_NONE);
265         RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_ALL_3D_WIN);
266         RNA_def_property_ui_text(prop, "All 3D View Editors", "");
267         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
268
269         prop= RNA_def_property(srna, "use_play_animation_editors", PROP_BOOLEAN, PROP_NONE);
270         RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_ALL_ANIM_WIN);
271         RNA_def_property_ui_text(prop, "Animation Editors", "");
272         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
273
274         prop= RNA_def_property(srna, "use_play_properties_editors", PROP_BOOLEAN, PROP_NONE);
275         RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_ALL_BUTS_WIN);
276         RNA_def_property_ui_text(prop, "Property Editors", "");
277         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
278
279         prop= RNA_def_property(srna, "use_play_image_editors", PROP_BOOLEAN, PROP_NONE);
280         RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_ALL_IMAGE_WIN);
281         RNA_def_property_ui_text(prop, "Image Editors", "");
282         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
283
284         prop= RNA_def_property(srna, "use_play_sequence_editors", PROP_BOOLEAN, PROP_NONE);
285         RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_SEQ);
286         RNA_def_property_ui_text(prop, "Sequencer Editors", "");
287         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
288
289         prop= RNA_def_property(srna, "use_play_node_editors", PROP_BOOLEAN, PROP_NONE);
290         RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_NODES);
291         RNA_def_property_ui_text(prop, "Node Editors", "");
292         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
293
294         prop= RNA_def_property(srna, "use_play_clip_editors", PROP_BOOLEAN, PROP_NONE);
295         RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_CLIPS);
296         RNA_def_property_ui_text(prop, "Clip Editors", "");
297         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
298 }
299
300 void RNA_def_screen(BlenderRNA *brna)
301 {
302         rna_def_screen(brna);
303         rna_def_area(brna);
304         rna_def_region(brna);
305 }
306
307 #endif
308