Cleanup: indentation
[blender.git] / source / blender / makesrna / intern / rna_workspace.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  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 /** \file blender/makesrna/intern/rna_workspace.c
22  *  \ingroup RNA
23  */
24
25 #include "RNA_define.h"
26 #include "RNA_enum_types.h"
27 #include "RNA_types.h"
28
29 #include "BKE_workspace.h"
30
31 #include "ED_render.h"
32
33 #include "RE_engine.h"
34
35 #include "WM_api.h"
36 #include "WM_types.h"
37
38 #include "rna_internal.h"
39
40 /* Allow accessing private members of DNA_workspace_types.h */
41 #define DNA_PRIVATE_WORKSPACE_ALLOW
42 #include "DNA_workspace_types.h"
43
44 #ifdef RNA_RUNTIME
45
46 #include "BLI_listbase.h"
47
48 #include "BKE_global.h"
49
50 #include "DNA_object_types.h"
51 #include "DNA_screen_types.h"
52 #include "DNA_space_types.h"
53
54 #include "RNA_access.h"
55
56 #include "WM_toolsystem.h"
57
58 static void rna_window_update_all(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *UNUSED(ptr))
59 {
60         WM_main_add_notifier(NC_WINDOW, NULL);
61 }
62
63 void rna_workspace_screens_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
64 {
65         WorkSpace *workspace = ptr->id.data;
66         rna_iterator_listbase_begin(iter, BKE_workspace_layouts_get(workspace), NULL);
67 }
68
69 static PointerRNA rna_workspace_screens_item_get(CollectionPropertyIterator *iter)
70 {
71         WorkSpaceLayout *layout = rna_iterator_listbase_get(iter);
72         bScreen *screen = BKE_workspace_layout_screen_get(layout);
73
74         return rna_pointer_inherit_refine(&iter->parent, &RNA_Screen, screen);
75 }
76
77 /* workspace.owner_ids */
78
79 static wmOwnerID *rna_WorkSpace_owner_ids_new(
80         WorkSpace *workspace, const char *name)
81 {
82         wmOwnerID *owner_id = MEM_callocN(sizeof(*owner_id), __func__);
83         BLI_addtail(&workspace->owner_ids, owner_id);
84         BLI_strncpy(owner_id->name, name, sizeof(owner_id->name));
85         WM_main_add_notifier(NC_WINDOW, NULL);
86         return owner_id;
87 }
88
89 static void rna_WorkSpace_owner_ids_remove(
90         WorkSpace *workspace, ReportList *reports, PointerRNA *wstag_ptr)
91 {
92         wmOwnerID *owner_id = wstag_ptr->data;
93         if (BLI_remlink_safe(&workspace->owner_ids, owner_id) == false) {
94                 BKE_reportf(reports, RPT_ERROR,
95                             "wmOwnerID '%s' not in workspace '%s'",
96                             owner_id->name, workspace->id.name + 2);
97                 return;
98         }
99
100         MEM_freeN(owner_id);
101         RNA_POINTER_INVALIDATE(wstag_ptr);
102
103         WM_main_add_notifier(NC_WINDOW, NULL);
104 }
105
106 static void rna_WorkSpace_owner_ids_clear(
107         WorkSpace *workspace)
108 {
109         BLI_freelistN(&workspace->owner_ids);
110         WM_main_add_notifier(NC_OBJECT | ND_MODIFIER | NA_REMOVED, workspace);
111 }
112
113 static bToolRef *rna_WorkSpace_tools_from_tkey(WorkSpace *workspace, const bToolKey *tkey, bool create)
114 {
115         if (create) {
116                 bToolRef *tref;
117                 WM_toolsystem_ref_ensure(workspace, tkey, &tref);
118                 return tref;
119         }
120         return WM_toolsystem_ref_find(workspace, tkey);
121 }
122
123 static bToolRef *rna_WorkSpace_tools_from_space_view3d_mode(
124         WorkSpace *workspace, int mode, bool create)
125 {
126         return rna_WorkSpace_tools_from_tkey(workspace, &(bToolKey){ .space_type = SPACE_VIEW3D, .mode = mode}, create);
127 }
128
129 static bToolRef *rna_WorkSpace_tools_from_space_image_mode(
130         WorkSpace *workspace, int mode, bool create)
131 {
132         return rna_WorkSpace_tools_from_tkey(workspace, &(bToolKey){ .space_type = SPACE_IMAGE, .mode = mode}, create);
133 }
134
135 const EnumPropertyItem *rna_WorkSpace_tools_mode_itemf(
136         bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *UNUSED(r_free))
137 {
138         WorkSpace *workspace = ptr->id.data;
139
140         switch (workspace->tools_space_type) {
141                 case SPACE_VIEW3D:
142                         return rna_enum_context_mode_items;
143                 case SPACE_IMAGE:
144                         return rna_enum_space_image_mode_items;
145         }
146         return DummyRNA_DEFAULT_items;
147 }
148
149 static int rna_WorkspaceTool_index_get(PointerRNA *ptr)
150 {
151         bToolRef *tref = ptr->data;
152         return (tref->runtime) ? tref->runtime->index : 0;
153 }
154
155 static int rna_WorkspaceTool_has_datablock_get(PointerRNA *ptr)
156 {
157         bToolRef *tref = ptr->data;
158         return (tref->runtime) ? (tref->runtime->data_block[0] != '\0') : false;
159 }
160
161 static void rna_WorkspaceTool_widget_get(PointerRNA *ptr, char *value)
162 {
163         bToolRef *tref = ptr->data;
164         strcpy(value, tref->runtime ? tref->runtime->gizmo_group : "");
165 }
166
167 static int rna_WorkspaceTool_widget_length(PointerRNA *ptr)
168 {
169         bToolRef *tref = ptr->data;
170         return tref->runtime ? strlen(tref->runtime->gizmo_group) : 0;
171 }
172
173 #else /* RNA_RUNTIME */
174
175 static void rna_def_workspace_owner(BlenderRNA *brna)
176 {
177         StructRNA *srna;
178         PropertyRNA *prop;
179
180         srna = RNA_def_struct(brna, "wmOwnerID", NULL);
181         RNA_def_struct_sdna(srna, "wmOwnerID");
182         RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
183         RNA_def_struct_ui_text(srna, "Work Space UI Tag", "");
184
185         prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
186         RNA_def_property_ui_text(prop, "Name", "");
187         RNA_def_struct_name_property(srna, prop);
188 }
189
190 static void rna_def_workspace_owner_ids(BlenderRNA *brna, PropertyRNA *cprop)
191 {
192         StructRNA *srna;
193
194         FunctionRNA *func;
195         PropertyRNA *parm;
196
197         RNA_def_property_srna(cprop, "wmOwnerIDs");
198         srna = RNA_def_struct(brna, "wmOwnerIDs", NULL);
199         RNA_def_struct_sdna(srna, "WorkSpace");
200         RNA_def_struct_ui_text(srna, "WorkSpace UI Tags", "");
201
202         /* add owner_id */
203         func = RNA_def_function(srna, "new", "rna_WorkSpace_owner_ids_new");
204         RNA_def_function_ui_description(func, "Add ui tag");
205         parm = RNA_def_string(func, "name", "Name", 0, "", "New name for the tag");
206         RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
207         /* return type */
208         parm = RNA_def_pointer(func, "owner_id", "wmOwnerID", "", "");
209         RNA_def_function_return(func, parm);
210
211         /* remove owner_id */
212         func = RNA_def_function(srna, "remove", "rna_WorkSpace_owner_ids_remove");
213         RNA_def_function_flag(func, FUNC_USE_REPORTS);
214         RNA_def_function_ui_description(func, "Remove ui tag");
215         /* owner_id to remove */
216         parm = RNA_def_pointer(func, "owner_id", "wmOwnerID", "", "Tag to remove");
217         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
218         RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
219
220         /* clear all modifiers */
221         func = RNA_def_function(srna, "clear", "rna_WorkSpace_owner_ids_clear");
222         RNA_def_function_ui_description(func, "Remove all tags");
223 }
224
225 static void rna_def_workspace_tool(BlenderRNA *brna)
226 {
227         StructRNA *srna;
228         PropertyRNA *prop;
229
230         srna = RNA_def_struct(brna, "WorkspaceTool", NULL);
231         RNA_def_struct_sdna(srna, "bToolRef");
232         RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
233         RNA_def_struct_ui_text(srna, "Work Space Tool", "");
234
235         prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
236         RNA_def_property_string_sdna(prop, NULL, "idname");
237         RNA_def_property_ui_text(prop, "Name", "");
238         RNA_def_struct_name_property(srna, prop);
239
240         prop = RNA_def_property(srna, "index", PROP_INT, PROP_NONE);
241         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
242         RNA_def_property_ui_text(prop, "Index", "");
243         RNA_def_property_int_funcs(prop, "rna_WorkspaceTool_index_get", NULL, NULL);
244
245         prop = RNA_def_property(srna, "space_type", PROP_ENUM, PROP_NONE);
246         RNA_def_property_enum_sdna(prop, NULL, "space_type");
247         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
248         RNA_def_property_enum_items(prop, rna_enum_space_type_items);
249         RNA_def_property_ui_text(prop, "Space Type", "");
250
251         prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
252         RNA_def_property_enum_sdna(prop, NULL, "mode");
253         RNA_def_property_enum_items(prop, DummyRNA_DEFAULT_items);
254         RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_WorkSpace_tools_mode_itemf");
255         RNA_def_property_ui_text(prop, "Tool Mode", "");
256         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
257
258         RNA_define_verify_sdna(0);
259         prop = RNA_def_property(srna, "has_datablock", PROP_BOOLEAN, PROP_NONE);
260         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
261         RNA_def_property_ui_text(prop, "Has Datablock", "");
262         RNA_def_property_boolean_funcs(prop, "rna_WorkspaceTool_has_datablock_get", NULL);
263         RNA_define_verify_sdna(1);
264
265         prop = RNA_def_property(srna, "widget", PROP_STRING, PROP_NONE);
266         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
267         RNA_def_property_ui_text(prop, "Widget", "");
268         RNA_def_property_string_funcs(prop, "rna_WorkspaceTool_widget_get", "rna_WorkspaceTool_widget_length", NULL);
269         RNA_define_verify_sdna(1);
270
271         RNA_api_workspace_tool(srna);
272 }
273
274 static void rna_def_workspace_tools(BlenderRNA *brna, PropertyRNA *cprop)
275 {
276         StructRNA *srna;
277
278         FunctionRNA *func;
279         PropertyRNA *parm;
280
281         RNA_def_property_srna(cprop, "wmTools");
282         srna = RNA_def_struct(brna, "wmTools", NULL);
283         RNA_def_struct_sdna(srna, "WorkSpace");
284         RNA_def_struct_ui_text(srna, "WorkSpace UI Tags", "");
285
286         /* add owner_id */
287         func = RNA_def_function(srna, "from_space_view3d_mode", "rna_WorkSpace_tools_from_space_view3d_mode");
288         RNA_def_function_ui_description(func, "");
289         parm = RNA_def_enum(func, "mode", rna_enum_context_mode_items, 0, "", "");
290         RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
291         RNA_def_boolean(func, "create", false, "Create", "");
292         /* return type */
293         parm = RNA_def_pointer(func, "result", "WorkspaceTool", "", "");
294         RNA_def_function_return(func, parm);
295
296         func = RNA_def_function(srna, "from_space_image_mode", "rna_WorkSpace_tools_from_space_image_mode");
297         RNA_def_function_ui_description(func, "");
298         parm = RNA_def_enum(func, "mode", rna_enum_space_image_mode_items, 0, "", "");
299         RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
300         RNA_def_boolean(func, "create", false, "Create", "");
301         /* return type */
302         parm = RNA_def_pointer(func, "result", "WorkspaceTool", "", "");
303         RNA_def_function_return(func, parm);
304 }
305
306 static void rna_def_workspace(BlenderRNA *brna)
307 {
308         StructRNA *srna;
309         PropertyRNA *prop;
310
311         srna = RNA_def_struct(brna, "WorkSpace", "ID");
312         RNA_def_struct_sdna(srna, "WorkSpace");
313         RNA_def_struct_ui_text(srna, "Workspace", "Workspace data-block, defining the working environment for the user");
314         /* TODO: real icon, just to show something */
315         RNA_def_struct_ui_icon(srna, ICON_WORKSPACE);
316
317         prop = RNA_def_property(srna, "screens", PROP_COLLECTION, PROP_NONE);
318         RNA_def_property_collection_sdna(prop, NULL, "layouts", NULL);
319         RNA_def_property_struct_type(prop, "Screen");
320         RNA_def_property_collection_funcs(prop, "rna_workspace_screens_begin", NULL, NULL,
321                                           "rna_workspace_screens_item_get", NULL, NULL, NULL, NULL);
322         RNA_def_property_ui_text(prop, "Screens", "Screen layouts of a workspace");
323
324         prop = RNA_def_property(srna, "owner_ids", PROP_COLLECTION, PROP_NONE);
325         RNA_def_property_struct_type(prop, "wmOwnerID");
326         RNA_def_property_ui_text(prop, "UI Tags", "");
327         rna_def_workspace_owner_ids(brna, prop);
328
329         prop = RNA_def_property(srna, "tools", PROP_COLLECTION, PROP_NONE);
330         RNA_def_property_collection_sdna(prop, NULL, "tools", NULL);
331         RNA_def_property_struct_type(prop, "WorkspaceTool");
332         RNA_def_property_ui_text(prop, "Tools", "");
333         rna_def_workspace_tools(brna, prop);
334
335         prop = RNA_def_property(srna, "tools_space_type", PROP_ENUM, PROP_NONE);
336         RNA_def_property_enum_sdna(prop, NULL, "tools_space_type");
337         RNA_def_property_enum_items(prop, rna_enum_space_type_items);
338         RNA_def_property_ui_text(prop, "Active Tool Space", "");
339         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
340
341         prop = RNA_def_property(srna, "tools_mode", PROP_ENUM, PROP_NONE);
342         RNA_def_property_enum_sdna(prop, NULL, "tools_mode");
343         RNA_def_property_enum_items(prop, DummyRNA_DEFAULT_items);
344         RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_WorkSpace_tools_mode_itemf");
345         RNA_def_property_ui_text(prop, "Active Tool Mode", "");
346         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
347
348         prop = RNA_def_property(srna, "object_mode", PROP_ENUM, PROP_NONE);
349         RNA_def_property_enum_items(prop, rna_enum_workspace_object_mode_items);
350         RNA_def_property_ui_text(prop, "Object Mode", "Switch to this object mode when activating the workspace");
351
352         /* Flags */
353         prop = RNA_def_property(srna, "use_filter_by_owner", PROP_BOOLEAN, PROP_NONE);
354         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
355         RNA_def_property_boolean_sdna(prop, NULL, "flags", WORKSPACE_USE_FILTER_BY_ORIGIN);
356         RNA_def_property_ui_text(prop, "Use UI Tags",
357                                  "Filter the UI by tags");
358         RNA_def_property_update(prop, 0, "rna_window_update_all");
359
360         RNA_api_workspace(srna);
361 }
362
363 void RNA_def_workspace(BlenderRNA *brna)
364 {
365         rna_def_workspace_owner(brna);
366         rna_def_workspace_tool(brna);
367
368         rna_def_workspace(brna);
369 }
370
371 #endif /* RNA_RUNTIME */