Cleanup: remove DNA_PRIVATE_WORKSPACE hacks.
[blender.git] / source / blender / makesrna / intern / rna_workspace.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup RNA
19  */
20
21 #include "RNA_define.h"
22 #include "RNA_enum_types.h"
23 #include "RNA_types.h"
24
25 #include "BKE_workspace.h"
26
27 #include "ED_render.h"
28
29 #include "RE_engine.h"
30
31 #include "WM_api.h"
32 #include "WM_types.h"
33
34 #include "rna_internal.h"
35
36 #include "DNA_workspace_types.h"
37
38 #ifdef RNA_RUNTIME
39
40 #include "BLI_listbase.h"
41
42 #include "BKE_global.h"
43
44 #include "DNA_object_types.h"
45 #include "DNA_screen_types.h"
46 #include "DNA_space_types.h"
47
48 #include "RNA_access.h"
49
50 #include "WM_toolsystem.h"
51
52 static void rna_window_update_all(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *UNUSED(ptr))
53 {
54         WM_main_add_notifier(NC_WINDOW, NULL);
55 }
56
57 void rna_workspace_screens_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
58 {
59         WorkSpace *workspace = ptr->id.data;
60         rna_iterator_listbase_begin(iter, BKE_workspace_layouts_get(workspace), NULL);
61 }
62
63 static PointerRNA rna_workspace_screens_item_get(CollectionPropertyIterator *iter)
64 {
65         WorkSpaceLayout *layout = rna_iterator_listbase_get(iter);
66         bScreen *screen = BKE_workspace_layout_screen_get(layout);
67
68         return rna_pointer_inherit_refine(&iter->parent, &RNA_Screen, screen);
69 }
70
71 /* workspace.owner_ids */
72
73 static wmOwnerID *rna_WorkSpace_owner_ids_new(
74         WorkSpace *workspace, const char *name)
75 {
76         wmOwnerID *owner_id = MEM_callocN(sizeof(*owner_id), __func__);
77         BLI_addtail(&workspace->owner_ids, owner_id);
78         BLI_strncpy(owner_id->name, name, sizeof(owner_id->name));
79         WM_main_add_notifier(NC_WINDOW, NULL);
80         return owner_id;
81 }
82
83 static void rna_WorkSpace_owner_ids_remove(
84         WorkSpace *workspace, ReportList *reports, PointerRNA *wstag_ptr)
85 {
86         wmOwnerID *owner_id = wstag_ptr->data;
87         if (BLI_remlink_safe(&workspace->owner_ids, owner_id) == false) {
88                 BKE_reportf(reports, RPT_ERROR,
89                             "wmOwnerID '%s' not in workspace '%s'",
90                             owner_id->name, workspace->id.name + 2);
91                 return;
92         }
93
94         MEM_freeN(owner_id);
95         RNA_POINTER_INVALIDATE(wstag_ptr);
96
97         WM_main_add_notifier(NC_WINDOW, NULL);
98 }
99
100 static void rna_WorkSpace_owner_ids_clear(
101         WorkSpace *workspace)
102 {
103         BLI_freelistN(&workspace->owner_ids);
104         WM_main_add_notifier(NC_OBJECT | ND_MODIFIER | NA_REMOVED, workspace);
105 }
106
107 static bToolRef *rna_WorkSpace_tools_from_tkey(WorkSpace *workspace, const bToolKey *tkey, bool create)
108 {
109         if (create) {
110                 bToolRef *tref;
111                 WM_toolsystem_ref_ensure(workspace, tkey, &tref);
112                 return tref;
113         }
114         return WM_toolsystem_ref_find(workspace, tkey);
115 }
116
117 static bToolRef *rna_WorkSpace_tools_from_space_view3d_mode(
118         WorkSpace *workspace, int mode, bool create)
119 {
120         return rna_WorkSpace_tools_from_tkey(workspace, &(bToolKey){ .space_type = SPACE_VIEW3D, .mode = mode, }, create);
121 }
122
123 static bToolRef *rna_WorkSpace_tools_from_space_image_mode(
124         WorkSpace *workspace, int mode, bool create)
125 {
126         return rna_WorkSpace_tools_from_tkey(workspace, &(bToolKey){ .space_type = SPACE_IMAGE, .mode = mode, }, create);
127 }
128
129 static bToolRef *rna_WorkSpace_tools_from_space_node(
130         WorkSpace *workspace, bool create)
131 {
132         return rna_WorkSpace_tools_from_tkey(workspace, &(bToolKey){ .space_type = SPACE_NODE, .mode = 0, }, 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_all_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, "idname", PROP_STRING, PROP_NONE);
236         RNA_def_property_ui_text(prop, "Identifier", "");
237         RNA_def_struct_name_property(srna, prop);
238
239         prop = RNA_def_property(srna, "index", PROP_INT, PROP_NONE);
240         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
241         RNA_def_property_ui_text(prop, "Index", "");
242         RNA_def_property_int_funcs(prop, "rna_WorkSpaceTool_index_get", NULL, NULL);
243
244         prop = RNA_def_property(srna, "space_type", PROP_ENUM, PROP_NONE);
245         RNA_def_property_enum_sdna(prop, NULL, "space_type");
246         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
247         RNA_def_property_enum_items(prop, rna_enum_space_type_items);
248         RNA_def_property_ui_text(prop, "Space Type", "");
249
250         prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
251         RNA_def_property_enum_sdna(prop, NULL, "mode");
252         RNA_def_property_enum_items(prop, DummyRNA_DEFAULT_items);
253         RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_WorkSpace_tools_mode_itemf");
254         RNA_def_property_ui_text(prop, "Tool Mode", "");
255         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
256
257         RNA_define_verify_sdna(0);
258         prop = RNA_def_property(srna, "has_datablock", PROP_BOOLEAN, PROP_NONE);
259         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
260         RNA_def_property_ui_text(prop, "Has Datablock", "");
261         RNA_def_property_boolean_funcs(prop, "rna_WorkSpaceTool_has_datablock_get", NULL);
262         RNA_define_verify_sdna(1);
263
264         prop = RNA_def_property(srna, "widget", PROP_STRING, PROP_NONE);
265         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
266         RNA_def_property_ui_text(prop, "Widget", "");
267         RNA_def_property_string_funcs(prop, "rna_WorkSpaceTool_widget_get", "rna_WorkSpaceTool_widget_length", NULL);
268         RNA_define_verify_sdna(1);
269
270         RNA_api_workspace_tool(srna);
271 }
272
273 static void rna_def_workspace_tools(BlenderRNA *brna, PropertyRNA *cprop)
274 {
275         StructRNA *srna;
276
277         FunctionRNA *func;
278         PropertyRNA *parm;
279
280         RNA_def_property_srna(cprop, "wmTools");
281         srna = RNA_def_struct(brna, "wmTools", NULL);
282         RNA_def_struct_sdna(srna, "WorkSpace");
283         RNA_def_struct_ui_text(srna, "WorkSpace UI Tags", "");
284
285         /* add owner_id */
286         func = RNA_def_function(srna, "from_space_view3d_mode", "rna_WorkSpace_tools_from_space_view3d_mode");
287         RNA_def_function_ui_description(func, "");
288         parm = RNA_def_enum(func, "mode", rna_enum_context_mode_items, 0, "", "");
289         RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
290         RNA_def_boolean(func, "create", false, "Create", "");
291         /* return type */
292         parm = RNA_def_pointer(func, "result", "WorkSpaceTool", "", "");
293         RNA_def_function_return(func, parm);
294
295         func = RNA_def_function(srna, "from_space_image_mode", "rna_WorkSpace_tools_from_space_image_mode");
296         RNA_def_function_ui_description(func, "");
297         parm = RNA_def_enum(func, "mode", rna_enum_space_image_mode_all_items, 0, "", "");
298         RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
299         RNA_def_boolean(func, "create", false, "Create", "");
300         /* return type */
301         parm = RNA_def_pointer(func, "result", "WorkSpaceTool", "", "");
302         RNA_def_function_return(func, parm);
303
304         func = RNA_def_function(srna, "from_space_node", "rna_WorkSpace_tools_from_space_node");
305         RNA_def_function_ui_description(func, "");
306         RNA_def_boolean(func, "create", false, "Create", "");
307         /* return type */
308         parm = RNA_def_pointer(func, "result", "WorkSpaceTool", "", "");
309         RNA_def_function_return(func, parm);
310 }
311
312 static void rna_def_workspace(BlenderRNA *brna)
313 {
314         StructRNA *srna;
315         PropertyRNA *prop;
316
317         srna = RNA_def_struct(brna, "WorkSpace", "ID");
318         RNA_def_struct_sdna(srna, "WorkSpace");
319         RNA_def_struct_ui_text(srna, "Workspace", "Workspace data-block, defining the working environment for the user");
320         /* TODO: real icon, just to show something */
321         RNA_def_struct_ui_icon(srna, ICON_WORKSPACE);
322
323         prop = RNA_def_property(srna, "screens", PROP_COLLECTION, PROP_NONE);
324         RNA_def_property_collection_sdna(prop, NULL, "layouts", NULL);
325         RNA_def_property_struct_type(prop, "Screen");
326         RNA_def_property_collection_funcs(prop, "rna_workspace_screens_begin", NULL, NULL,
327                                           "rna_workspace_screens_item_get", NULL, NULL, NULL, NULL);
328         RNA_def_property_ui_text(prop, "Screens", "Screen layouts of a workspace");
329
330         prop = RNA_def_property(srna, "owner_ids", PROP_COLLECTION, PROP_NONE);
331         RNA_def_property_struct_type(prop, "wmOwnerID");
332         RNA_def_property_ui_text(prop, "UI Tags", "");
333         rna_def_workspace_owner_ids(brna, prop);
334
335         prop = RNA_def_property(srna, "tools", PROP_COLLECTION, PROP_NONE);
336         RNA_def_property_collection_sdna(prop, NULL, "tools", NULL);
337         RNA_def_property_struct_type(prop, "WorkSpaceTool");
338         RNA_def_property_ui_text(prop, "Tools", "");
339         rna_def_workspace_tools(brna, prop);
340
341         prop = RNA_def_property(srna, "tools_space_type", PROP_ENUM, PROP_NONE);
342         RNA_def_property_enum_sdna(prop, NULL, "tools_space_type");
343         RNA_def_property_enum_items(prop, rna_enum_space_type_items);
344         RNA_def_property_ui_text(prop, "Active Tool Space", "");
345         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
346
347         prop = RNA_def_property(srna, "tools_mode", PROP_ENUM, PROP_NONE);
348         RNA_def_property_enum_sdna(prop, NULL, "tools_mode");
349         RNA_def_property_enum_items(prop, DummyRNA_DEFAULT_items);
350         RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_WorkSpace_tools_mode_itemf");
351         RNA_def_property_ui_text(prop, "Active Tool Mode", "");
352         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
353
354         prop = RNA_def_property(srna, "object_mode", PROP_ENUM, PROP_NONE);
355         RNA_def_property_enum_items(prop, rna_enum_workspace_object_mode_items);
356         RNA_def_property_ui_text(prop, "Object Mode", "Switch to this object mode when activating the workspace");
357
358         /* Flags */
359         prop = RNA_def_property(srna, "use_filter_by_owner", PROP_BOOLEAN, PROP_NONE);
360         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
361         RNA_def_property_boolean_sdna(prop, NULL, "flags", WORKSPACE_USE_FILTER_BY_ORIGIN);
362         RNA_def_property_ui_text(prop, "Use UI Tags",
363                                  "Filter the UI by tags");
364         RNA_def_property_update(prop, 0, "rna_window_update_all");
365
366         RNA_api_workspace(srna);
367 }
368
369 void RNA_def_workspace(BlenderRNA *brna)
370 {
371         rna_def_workspace_owner(brna);
372         rna_def_workspace_tool(brna);
373
374         rna_def_workspace(brna);
375 }
376
377 #endif /* RNA_RUNTIME */