Tool System: per space/mode tool support
[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 static void rna_window_update_all(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *UNUSED(ptr))
57 {
58         WM_main_add_notifier(NC_WINDOW, NULL);
59 }
60
61 void rna_workspace_screens_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
62 {
63         WorkSpace *workspace = ptr->id.data;
64         rna_iterator_listbase_begin(iter, BKE_workspace_layouts_get(workspace), NULL);
65 }
66
67 static PointerRNA rna_workspace_screens_item_get(CollectionPropertyIterator *iter)
68 {
69         WorkSpaceLayout *layout = rna_iterator_listbase_get(iter);
70         bScreen *screen = BKE_workspace_layout_screen_get(layout);
71
72         return rna_pointer_inherit_refine(&iter->parent, &RNA_Screen, screen);
73 }
74
75 /* workspace.owner_ids */
76
77 static wmOwnerID *rna_WorkSpace_owner_ids_new(
78         WorkSpace *workspace, const char *name)
79 {
80         wmOwnerID *owner_id = MEM_callocN(sizeof(*owner_id), __func__);
81         BLI_addtail(&workspace->owner_ids, owner_id);
82         BLI_strncpy(owner_id->name, name, sizeof(owner_id->name));
83         WM_main_add_notifier(NC_WINDOW, NULL);
84         return owner_id;
85 }
86
87 static void rna_WorkSpace_owner_ids_remove(
88         WorkSpace *workspace, ReportList *reports, PointerRNA *wstag_ptr)
89 {
90         wmOwnerID *owner_id = wstag_ptr->data;
91         if (BLI_remlink_safe(&workspace->owner_ids, owner_id) == false) {
92                 BKE_reportf(reports, RPT_ERROR,
93                             "wmOwnerID '%s' not in workspace '%s'",
94                             owner_id->name, workspace->id.name + 2);
95                 return;
96         }
97
98         MEM_freeN(owner_id);
99         RNA_POINTER_INVALIDATE(wstag_ptr);
100
101         WM_main_add_notifier(NC_WINDOW, NULL);
102 }
103
104 static void rna_WorkSpace_owner_ids_clear(
105         WorkSpace *workspace)
106 {
107         BLI_freelistN(&workspace->owner_ids);
108         WM_main_add_notifier(NC_OBJECT | ND_MODIFIER | NA_REMOVED, workspace);
109 }
110
111 static bToolRef *rna_WorkSpace_tools_from_tkey(WorkSpace *workspace, const bToolKey *tkey, bool create)
112 {
113         if (create) {
114                 bToolRef *tref;
115                 WM_toolsystem_ref_ensure(workspace, tkey, &tref);
116                 return tref;
117         }
118         return WM_toolsystem_ref_find(workspace, tkey);
119 }
120
121 static bToolRef *rna_WorkSpace_tools_from_space_view3d_mode(
122         WorkSpace *workspace, int mode, int create)
123 {
124         return rna_WorkSpace_tools_from_tkey(workspace, &(bToolKey){ .space_type = SPACE_VIEW3D, .mode = mode}, create);
125 }
126
127 static bToolRef *rna_WorkSpace_tools_from_space_image_mode(
128         WorkSpace *workspace, int mode, int create)
129 {
130         return rna_WorkSpace_tools_from_tkey(workspace, &(bToolKey){ .space_type = SPACE_IMAGE, .mode = mode}, create);
131 }
132
133 const EnumPropertyItem *rna_WorkSpace_tools_mode_itemf(
134         bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *UNUSED(r_free))
135 {
136         WorkSpace *workspace = ptr->id.data;
137
138         switch (workspace->tools_space_type) {
139                 case SPACE_VIEW3D:
140                         return rna_enum_object_mode_items;
141                 case SPACE_IMAGE:
142                         return rna_enum_space_image_mode_items;
143         }
144         return DummyRNA_NULL_items;
145 }
146
147 #else /* RNA_RUNTIME */
148
149 static void rna_def_workspace_owner(BlenderRNA *brna)
150 {
151         StructRNA *srna;
152         PropertyRNA *prop;
153
154         srna = RNA_def_struct(brna, "wmOwnerID", NULL);
155         RNA_def_struct_sdna(srna, "wmOwnerID");
156         RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
157         RNA_def_struct_ui_text(srna, "Work Space UI Tag", "");
158
159         prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
160         RNA_def_property_ui_text(prop, "Name", "");
161         RNA_def_struct_name_property(srna, prop);
162 }
163
164 static void rna_def_workspace_owner_ids(BlenderRNA *brna, PropertyRNA *cprop)
165 {
166         StructRNA *srna;
167
168         FunctionRNA *func;
169         PropertyRNA *parm;
170
171         RNA_def_property_srna(cprop, "wmOwnerIDs");
172         srna = RNA_def_struct(brna, "wmOwnerIDs", NULL);
173         RNA_def_struct_sdna(srna, "WorkSpace");
174         RNA_def_struct_ui_text(srna, "WorkSpace UI Tags", "");
175
176         /* add owner_id */
177         func = RNA_def_function(srna, "new", "rna_WorkSpace_owner_ids_new");
178         RNA_def_function_ui_description(func, "Add ui tag");
179         parm = RNA_def_string(func, "name", "Name", 0, "", "New name for the tag");
180         RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
181         /* return type */
182         parm = RNA_def_pointer(func, "owner_id", "wmOwnerID", "", "");
183         RNA_def_function_return(func, parm);
184
185         /* remove owner_id */
186         func = RNA_def_function(srna, "remove", "rna_WorkSpace_owner_ids_remove");
187         RNA_def_function_flag(func, FUNC_USE_REPORTS);
188         RNA_def_function_ui_description(func, "Remove ui tag");
189         /* owner_id to remove */
190         parm = RNA_def_pointer(func, "owner_id", "wmOwnerID", "", "Tag to remove");
191         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
192         RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
193
194         /* clear all modifiers */
195         func = RNA_def_function(srna, "clear", "rna_WorkSpace_owner_ids_clear");
196         RNA_def_function_ui_description(func, "Remove all tags");
197 }
198
199 static void rna_def_workspace_tool(BlenderRNA *brna)
200 {
201         StructRNA *srna;
202         PropertyRNA *prop;
203
204         srna = RNA_def_struct(brna, "WorkspaceTool", NULL);
205         RNA_def_struct_sdna(srna, "bToolRef");
206         RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
207         RNA_def_struct_ui_text(srna, "Work Space Tool", "");
208
209         prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
210         RNA_def_property_string_sdna(prop, NULL, "idname");
211         RNA_def_property_ui_text(prop, "Name", "");
212         RNA_def_struct_name_property(srna, prop);
213
214         RNA_api_workspace_tool(srna);
215 }
216
217 static void rna_def_workspace_tools(BlenderRNA *brna, PropertyRNA *cprop)
218 {
219         StructRNA *srna;
220
221         FunctionRNA *func;
222         PropertyRNA *parm;
223
224         RNA_def_property_srna(cprop, "wmTools");
225         srna = RNA_def_struct(brna, "wmTools", NULL);
226         RNA_def_struct_sdna(srna, "WorkSpace");
227         RNA_def_struct_ui_text(srna, "WorkSpace UI Tags", "");
228
229         /* add owner_id */
230         func = RNA_def_function(srna, "from_space_view3d_mode", "rna_WorkSpace_tools_from_space_view3d_mode");
231         RNA_def_function_ui_description(func, "");
232         parm = RNA_def_enum(func, "mode", rna_enum_object_mode_items, 0, "", "");
233         RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
234         RNA_def_boolean(func, "create", false, "Create", "");
235         /* return type */
236         parm = RNA_def_pointer(func, "result", "WorkspaceTool", "", "");
237         RNA_def_function_return(func, parm);
238
239         func = RNA_def_function(srna, "from_space_image_mode", "rna_WorkSpace_tools_from_space_image_mode");
240         RNA_def_function_ui_description(func, "");
241         parm = RNA_def_enum(func, "mode", rna_enum_space_image_mode_items, 0, "", "");
242         RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
243         RNA_def_boolean(func, "create", false, "Create", "");
244         /* return type */
245         parm = RNA_def_pointer(func, "result", "WorkspaceTool", "", "");
246         RNA_def_function_return(func, parm);
247 }
248
249 static void rna_def_workspace(BlenderRNA *brna)
250 {
251         StructRNA *srna;
252         PropertyRNA *prop;
253
254         srna = RNA_def_struct(brna, "WorkSpace", "ID");
255         RNA_def_struct_sdna(srna, "WorkSpace");
256         RNA_def_struct_ui_text(srna, "Workspace", "Workspace data-block, defining the working environment for the user");
257         /* TODO: real icon, just to show something */
258         RNA_def_struct_ui_icon(srna, ICON_SPLITSCREEN);
259
260         prop = RNA_def_property(srna, "screens", PROP_COLLECTION, PROP_NONE);
261         RNA_def_property_collection_sdna(prop, NULL, "layouts", NULL);
262         RNA_def_property_struct_type(prop, "Screen");
263         RNA_def_property_collection_funcs(prop, "rna_workspace_screens_begin", NULL, NULL,
264                                           "rna_workspace_screens_item_get", NULL, NULL, NULL, NULL);
265         RNA_def_property_ui_text(prop, "Screens", "Screen layouts of a workspace");
266
267         prop = RNA_def_property(srna, "owner_ids", PROP_COLLECTION, PROP_NONE);
268         RNA_def_property_struct_type(prop, "wmOwnerID");
269         RNA_def_property_ui_text(prop, "UI Tags", "");
270         rna_def_workspace_owner_ids(brna, prop);
271
272         prop = RNA_def_property(srna, "tools", PROP_COLLECTION, PROP_NONE);
273         RNA_def_property_collection_sdna(prop, NULL, "tools", NULL);
274         RNA_def_property_struct_type(prop, "WorkspaceTool");
275         RNA_def_property_ui_text(prop, "Tools", "");
276         rna_def_workspace_tools(brna, prop);
277
278         prop = RNA_def_property(srna, "tools_space_type", PROP_ENUM, PROP_NONE);
279         RNA_def_property_enum_sdna(prop, NULL, "tools_space_type");
280         RNA_def_property_enum_items(prop, rna_enum_space_type_items);
281         RNA_def_property_ui_text(prop, "Active Tool Space", "Tool space type");
282         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
283
284         prop = RNA_def_property(srna, "tools_mode", PROP_ENUM, PROP_NONE);
285         RNA_def_property_enum_sdna(prop, NULL, "tools_mode");
286         RNA_def_property_enum_items(prop, rna_enum_object_mode_items);  /* value is placeholder, itemf is used. */
287         RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_WorkSpace_tools_mode_itemf");
288         RNA_def_property_ui_text(prop, "Active Tool Space", "Tool mode");
289         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
290
291 #if 0
292         prop = RNA_def_property(srna, "object_mode", PROP_ENUM, PROP_NONE);
293         RNA_def_property_enum_items(prop, rna_enum_object_mode_items);
294         RNA_def_property_ui_text(prop, "Mode", "Object interaction mode used in this window");
295 #endif
296
297         /* Flags */
298         prop = RNA_def_property(srna, "use_filter_by_owner", PROP_BOOLEAN, PROP_NONE);
299         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
300         RNA_def_property_boolean_sdna(prop, NULL, "flags", WORKSPACE_USE_FILTER_BY_ORIGIN);
301         RNA_def_property_ui_text(prop, "Use UI Tags",
302                                  "Filter the UI by tags");
303         RNA_def_property_update(prop, 0, "rna_window_update_all");
304
305         RNA_api_workspace(srna);
306 }
307
308 void RNA_def_workspace(BlenderRNA *brna)
309 {
310         rna_def_workspace_owner(brna);
311         rna_def_workspace_tool(brna);
312
313         rna_def_workspace(brna);
314 }
315
316 #endif /* RNA_RUNTIME */