21150af71440f0055be16ab1cbe8e1c6daa81637
[blender.git] / source / blender / blenkernel / BKE_screen.h
1 /**
2  * blenlib/BKE_screen.h (mar-2001 nzc)
3  *      
4  * $Id$ 
5  *
6  * ***** BEGIN GPL LICENSE BLOCK *****
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL LICENSE BLOCK *****
30  */
31 #ifndef BKE_SCREEN_H
32 #define BKE_SCREEN_H
33
34 struct ARegion;
35 struct bContext;
36 struct bContextDataResult;
37 struct bScreen;
38 struct ListBase;
39 struct Panel;
40 struct Header;
41 struct Menu;
42 struct ScrArea;
43 struct SpaceType;
44 struct Scene;
45 struct wmNotifier;
46 struct wmWindow;
47 struct wmWindowManager;
48 struct wmKeyConfig;
49 struct uiLayout;
50 struct uiMenuItem;
51
52 #include "RNA_types.h"
53
54 /* spacetype has everything stored to get an editor working, it gets initialized via 
55    ED_spacetypes_init() in editors/area/spacetypes.c   */
56 /* an editor in Blender is a combined ScrArea + SpaceType + SpaceData */
57
58 #define BKE_ST_MAXNAME  64
59
60 typedef struct SpaceType {
61         struct SpaceType *next, *prev;
62         
63         char                    name[BKE_ST_MAXNAME];           /* for menus */
64         int                             spaceid;                                        /* unique space identifier */
65         int                             iconid;                                         /* icon lookup for menus */
66         
67         /* initial allocation, after this WM will call init() too */
68         struct SpaceLink        *(*new)(const struct bContext *C);
69         /* not free spacelink itself */
70         void            (*free)(struct SpaceLink *);
71         
72         /* init is to cope with file load, screen (size) changes, check handlers */
73         void            (*init)(struct wmWindowManager *, struct ScrArea *);
74         /* Listeners can react to bContext changes */
75         void            (*listener)(struct ScrArea *, struct wmNotifier *);
76         
77         /* refresh context, called after filereads, ED_area_tag_refresh() */
78         void            (*refresh)(const struct bContext *, struct ScrArea *);
79         
80         /* after a spacedata copy, an init should result in exact same situation */
81         struct SpaceLink        *(*duplicate)(struct SpaceLink *);
82
83         /* register operator types on startup */
84         void            (*operatortypes)(void);
85         /* add default items to WM keymap */
86         void            (*keymap)(struct wmKeyConfig *);
87
88         /* return context data */
89         int                     (*context)(const struct bContext *, const char*, struct bContextDataResult *);
90
91         /* region type definitions */
92         ListBase        regiontypes;
93         
94         /* tool shelf definitions */
95         ListBase toolshelf;
96         
97         /* read and write... */
98         
99         /* default keymaps to add */
100         int                     keymapflag;
101         
102 } SpaceType;
103
104 /* region types are also defined using spacetypes_init, via a callback */
105
106 typedef struct ARegionType {
107         struct ARegionType *next, *prev;
108         
109         int                     regionid;       /* unique identifier within this space */
110         
111         /* add handlers, stuff you only do once or on area/region type/size changes */
112         void            (*init)(struct wmWindowManager *, struct ARegion *);
113         /* draw entirely, view changes should be handled here */
114         void            (*draw)(const struct bContext *, struct ARegion *);     
115         /* contextual changes should be handled here */
116         void            (*listener)(struct ARegion *, struct wmNotifier *);
117         
118         void            (*free)(struct ARegion *);
119
120         /* split region, copy data optionally */
121         void            *(*duplicate)(void *);
122
123         
124         /* register operator types on startup */
125         void            (*operatortypes)(void);
126         /* add own items to keymap */
127         void            (*keymap)(struct wmKeyConfig *);
128         /* allows default cursor per region */
129         void            (*cursor)(struct wmWindow *, struct ScrArea *, struct ARegion *ar);
130
131         /* return context data */
132         int                     (*context)(const struct bContext *, const char *, struct bContextDataResult *);
133
134         /* custom drawing callbacks */
135         ListBase        drawcalls;
136
137         /* panels type definitions */
138         ListBase paneltypes;
139
140         /* header type definitions */
141         ListBase headertypes;
142         
143         /* hardcoded constraints, smaller than these values region is not visible */
144         int                     minsizex, minsizey;
145         /* default keymaps to add */
146         int                     keymapflag;
147 } ARegionType;
148
149 /* panel types */
150
151 typedef struct PanelType {
152         struct PanelType *next, *prev;
153         
154         char            idname[BKE_ST_MAXNAME];         /* unique name */
155         char            label[BKE_ST_MAXNAME];          /* for panel header */
156         char            context[BKE_ST_MAXNAME];        /* for buttons window */
157         int                     space_type;
158         int                     region_type;
159
160         int             flag;
161
162         /* verify if the panel should draw or not */
163         int                     (*poll)(const struct bContext *, struct PanelType *);
164         /* draw header (optional) */
165         void            (*draw_header)(const struct bContext *, struct Panel *);        
166         /* draw entirely, view changes should be handled here */
167         void            (*draw)(const struct bContext *, struct Panel *);       
168
169         /* RNA integration */
170         ExtensionRNA ext;
171 } PanelType;
172
173 /* header types */
174
175 typedef struct HeaderType {
176         struct HeaderType *next, *prev;
177
178         char            idname[BKE_ST_MAXNAME]; /* unique name */
179         int             space_type;
180
181         /* draw entirely, view changes should be handled here */
182         void            (*draw)(const struct bContext *, struct Header *);      
183
184         /* RNA integration */
185         ExtensionRNA ext;
186 } HeaderType;
187
188 typedef struct Header {
189         struct HeaderType *type;        /* runtime */
190         struct uiLayout *layout;        /* runtime for drawing */
191 } Header;
192
193
194 /* menu types */
195
196 typedef struct MenuType {
197         struct MenuType *next, *prev;
198
199         char            idname[BKE_ST_MAXNAME]; /* unique name */
200         char            label[BKE_ST_MAXNAME];  /* for button text */
201
202         /* verify if the menu should draw or not */
203         int                     (*poll)(const struct bContext *, struct MenuType *);
204         /* draw entirely, view changes should be handled here */
205         void            (*draw)(const struct bContext *, struct Menu *);        
206
207         /* RNA integration */
208         ExtensionRNA ext;
209 } MenuType;
210
211 typedef struct Menu {
212         struct MenuType *type;          /* runtime */
213         struct uiLayout *layout;        /* runtime for drawing */
214 } Menu;
215
216 /* spacetypes */
217 struct SpaceType *BKE_spacetype_from_id(int spaceid);
218 struct ARegionType *BKE_regiontype_from_id(struct SpaceType *st, int regionid);
219 const struct ListBase *BKE_spacetypes_list(void);
220 void BKE_spacetype_register(struct SpaceType *st);
221 void BKE_spacetypes_free(void); /* only for quitting blender */
222
223 /* spacedata */
224 void BKE_spacedata_freelist(ListBase *lb);
225 void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2);
226 void BKE_spacedata_copyfirst(ListBase *lb1, ListBase *lb2);
227
228 /* area/regions */
229 struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar);
230 void    BKE_area_region_free(struct SpaceType *st, struct ARegion *ar);
231 void    BKE_screen_area_free(struct ScrArea *sa);
232
233 /* screen */
234 void free_screen(struct bScreen *sc); 
235 unsigned int BKE_screen_visible_layers(struct bScreen *screen, struct Scene *scene);
236
237 #endif
238