3D View: add opacity for sculpt mask display
[blender.git] / source / blender / makesrna / intern / rna_space.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 <stdlib.h>
22 #include <string.h>
23
24 #include "MEM_guardedalloc.h"
25
26 #include "BLT_translation.h"
27
28 #include "BKE_image.h"
29 #include "BKE_key.h"
30 #include "BKE_movieclip.h"
31 #include "BKE_node.h"
32 #include "BKE_studiolight.h"
33
34 #include "BLI_math.h"
35
36 #include "DNA_action_types.h"
37 #include "DNA_gpencil_types.h"
38 #include "DNA_key_types.h"
39 #include "DNA_material_types.h"
40 #include "DNA_node_types.h"
41 #include "DNA_object_types.h"
42 #include "DNA_space_types.h"
43 #include "DNA_sequence_types.h"
44 #include "DNA_mask_types.h"
45 #include "DNA_view3d_types.h"
46 #include "DNA_workspace_types.h"
47
48 #include "RNA_access.h"
49 #include "RNA_define.h"
50
51 #include "rna_internal.h"
52
53 #include "WM_api.h"
54 #include "WM_types.h"
55
56 #include "RE_engine.h"
57 #include "RE_pipeline.h"
58
59 #include "RNA_enum_types.h"
60
61 const EnumPropertyItem rna_enum_space_type_items[] = {
62     /* empty must be here for python, is skipped for UI */
63     {SPACE_EMPTY, "EMPTY", ICON_NONE, "Empty", ""},
64
65     /* General */
66     {0, "", ICON_NONE, "General", ""},
67     {SPACE_VIEW3D,
68      "VIEW_3D",
69      ICON_VIEW3D,
70      "3D Viewport",
71      "Manipulate objects in a 3D environment"},
72     {SPACE_IMAGE,
73      "IMAGE_EDITOR",
74      ICON_IMAGE,
75      "UV/Image Editor",
76      "View and edit images and UV Maps"},
77     {SPACE_NODE,
78      "NODE_EDITOR",
79      ICON_NODETREE,
80      "Node Editor",
81      "Editor for node-based shading and compositing tools"},
82     {SPACE_SEQ, "SEQUENCE_EDITOR", ICON_SEQUENCE, "Video Sequencer", "Video editing tools"},
83     {SPACE_CLIP, "CLIP_EDITOR", ICON_TRACKER, "Movie Clip Editor", "Motion tracking tools"},
84
85     /* Animation */
86     {0, "", ICON_NONE, "Animation", ""},
87     //{SPACE_ACTION, "TIMELINE", ICON_TIME, "Timeline", "Timeline and playback controls (NOTE: Switch to 'Timeline' mode)"}, /* XXX */
88     {SPACE_ACTION, "DOPESHEET_EDITOR", ICON_ACTION, "Dope Sheet", "Adjust timing of keyframes"},
89     {SPACE_GRAPH,
90      "GRAPH_EDITOR",
91      ICON_GRAPH,
92      "Graph Editor",
93      "Edit drivers and keyframe interpolation"},
94     {SPACE_NLA, "NLA_EDITOR", ICON_NLA, "Nonlinear Animation", "Combine and layer Actions"},
95
96     /* Scripting */
97     {0, "", ICON_NONE, "Scripting", ""},
98     {SPACE_TEXT,
99      "TEXT_EDITOR",
100      ICON_TEXT,
101      "Text Editor",
102      "Edit scripts and in-file documentation"},
103     {SPACE_CONSOLE,
104      "CONSOLE",
105      ICON_CONSOLE,
106      "Python Console",
107      "Interactive programmatic console for "
108      "advanced editing and script development"},
109     {SPACE_INFO,
110      "INFO",
111      ICON_INFO,
112      "Info",
113      "Main menu bar and list of error messages "
114      "(drag down to expand and display)"},
115     /* Special case: Top-bar and Status-bar aren't supposed to be a regular editor for the user. */
116     {SPACE_TOPBAR,
117      "TOPBAR",
118      ICON_NONE,
119      "Top Bar",
120      "Global bar at the top of the screen for "
121      "global per-window settings"},
122     {SPACE_STATUSBAR,
123      "STATUSBAR",
124      ICON_NONE,
125      "Status Bar",
126      "Global bar at the bottom of the "
127      "screen for general status information"},
128
129     /* Data */
130     {0, "", ICON_NONE, "Data", ""},
131     {SPACE_OUTLINER,
132      "OUTLINER",
133      ICON_OUTLINER,
134      "Outliner",
135      "Overview of scene graph and all available data-blocks"},
136     {SPACE_PROPERTIES,
137      "PROPERTIES",
138      ICON_PROPERTIES,
139      "Properties",
140      "Edit properties of active object and related data-blocks"},
141     {SPACE_FILE, "FILE_BROWSER", ICON_FILEBROWSER, "File Browser", "Browse for files and assets"},
142     {SPACE_USERPREF,
143      "PREFERENCES",
144      ICON_PREFERENCES,
145      "Preferences",
146      "Edit persistent configuration settings"},
147     {0, NULL, 0, NULL, NULL},
148 };
149
150 const EnumPropertyItem rna_enum_space_graph_mode_items[] = {
151     {SIPO_MODE_ANIMATION,
152      "FCURVES",
153      ICON_GRAPH,
154      "Graph Editor",
155      "Edit animation/keyframes displayed as 2D curves"},
156     {SIPO_MODE_DRIVERS, "DRIVERS", ICON_DRIVER, "Drivers", "Edit drivers"},
157     {0, NULL, 0, NULL, NULL},
158 };
159
160 #define SACT_ITEM_DOPESHEET \
161   { \
162     SACTCONT_DOPESHEET, "DOPESHEET", ICON_ACTION, "Dope Sheet", "Edit all keyframes in scene" \
163   }
164 #define SACT_ITEM_TIMELINE \
165   { \
166     SACTCONT_TIMELINE, "TIMELINE", ICON_TIME, "Timeline", "Timeline and playback controls" \
167   }
168 #define SACT_ITEM_ACTION \
169   { \
170     SACTCONT_ACTION, "ACTION", ICON_OBJECT_DATA, "Action Editor", \
171         "Edit keyframes in active object's Object-level action" \
172   }
173 #define SACT_ITEM_SHAPEKEY \
174   { \
175     SACTCONT_SHAPEKEY, "SHAPEKEY", ICON_SHAPEKEY_DATA, "Shape Key Editor", \
176         "Edit keyframes in active object's Shape Keys action" \
177   }
178 #define SACT_ITEM_GPENCIL \
179   { \
180     SACTCONT_GPENCIL, "GPENCIL", ICON_GREASEPENCIL, "Grease Pencil", \
181         "Edit timings for all Grease Pencil sketches in file" \
182   }
183 #define SACT_ITEM_MASK \
184   { \
185     SACTCONT_MASK, "MASK", ICON_MOD_MASK, "Mask", "Edit timings for Mask Editor splines" \
186   }
187 #define SACT_ITEM_CACHEFILE \
188   { \
189     SACTCONT_CACHEFILE, "CACHEFILE", ICON_FILE, "Cache File", \
190         "Edit timings for Cache File data-blocks" \
191   }
192
193 #ifndef RNA_RUNTIME
194 /* XXX: action-editor is currently for object-level only actions, so show that using object-icon hint */
195 static EnumPropertyItem rna_enum_space_action_mode_all_items[] = {
196     SACT_ITEM_DOPESHEET,
197     SACT_ITEM_TIMELINE,
198     SACT_ITEM_ACTION,
199     SACT_ITEM_SHAPEKEY,
200     SACT_ITEM_GPENCIL,
201     SACT_ITEM_MASK,
202     SACT_ITEM_CACHEFILE,
203     {0, NULL, 0, NULL, NULL},
204 };
205 static EnumPropertyItem rna_enum_space_action_ui_mode_items[] = {
206     SACT_ITEM_DOPESHEET,
207     /* SACT_ITEM_TIMELINE, */
208     SACT_ITEM_ACTION,
209     SACT_ITEM_SHAPEKEY,
210     SACT_ITEM_GPENCIL,
211     SACT_ITEM_MASK,
212     SACT_ITEM_CACHEFILE,
213     {0, NULL, 0, NULL, NULL},
214 };
215 #endif
216 /* expose as ui_mode */
217 const EnumPropertyItem rna_enum_space_action_mode_items[] = {
218     SACT_ITEM_DOPESHEET,
219     SACT_ITEM_TIMELINE,
220     {0, NULL, 0, NULL, NULL},
221 };
222
223 #undef SACT_ITEM_DOPESHEET
224 #undef SACT_ITEM_TIMELINE
225 #undef SACT_ITEM_ACTION
226 #undef SACT_ITEM_SHAPEKEY
227 #undef SACT_ITEM_GPENCIL
228 #undef SACT_ITEM_MASK
229 #undef SACT_ITEM_CACHEFILE
230
231 #define SI_ITEM_VIEW(name, icon) \
232   { \
233     SI_MODE_VIEW, "VIEW", icon, name, "View the image" \
234   }
235 #define SI_ITEM_UV \
236   { \
237     SI_MODE_UV, "UV", ICON_UV, "UV Editor", "UV edit in mesh editmode" \
238   }
239 #define SI_ITEM_PAINT \
240   { \
241     SI_MODE_PAINT, "PAINT", ICON_TPAINT_HLT, "Paint", "2D image painting mode" \
242   }
243 #define SI_ITEM_MASK \
244   { \
245     SI_MODE_MASK, "MASK", ICON_MOD_MASK, "Mask", "Mask editing" \
246   }
247
248 const EnumPropertyItem rna_enum_space_image_mode_all_items[] = {
249     SI_ITEM_VIEW("View", ICON_FILE_IMAGE),
250     SI_ITEM_UV,
251     SI_ITEM_PAINT,
252     SI_ITEM_MASK,
253     {0, NULL, 0, NULL, NULL},
254 };
255
256 static const EnumPropertyItem rna_enum_space_image_mode_ui_items[] = {
257     SI_ITEM_VIEW("View", ICON_FILE_IMAGE),
258     SI_ITEM_PAINT,
259     SI_ITEM_MASK,
260     {0, NULL, 0, NULL, NULL},
261 };
262
263 const EnumPropertyItem rna_enum_space_image_mode_items[] = {
264     SI_ITEM_VIEW("Image Editor", ICON_IMAGE),
265     SI_ITEM_UV,
266     {0, NULL, 0, NULL, NULL},
267 };
268
269 #undef SI_ITEM_VIEW
270 #undef SI_ITEM_UV
271 #undef SI_ITEM_PAINT
272 #undef SI_ITEM_MASK
273
274 #define V3D_S3D_CAMERA_LEFT {STEREO_LEFT_ID, "LEFT", ICON_RESTRICT_RENDER_OFF, "Left", ""},
275 #define V3D_S3D_CAMERA_RIGHT {STEREO_RIGHT_ID, "RIGHT", ICON_RESTRICT_RENDER_OFF, "Right", ""},
276 #define V3D_S3D_CAMERA_S3D {STEREO_3D_ID, "S3D", ICON_CAMERA_STEREO, "3D", ""},
277 #ifdef RNA_RUNTIME
278 #  define V3D_S3D_CAMERA_VIEWS {STEREO_MONO_ID, "MONO", ICON_RESTRICT_RENDER_OFF, "Views", ""},
279 #endif
280
281 static const EnumPropertyItem stereo3d_camera_items[] = {
282     V3D_S3D_CAMERA_LEFT V3D_S3D_CAMERA_RIGHT V3D_S3D_CAMERA_S3D{0, NULL, 0, NULL, NULL},
283 };
284
285 #ifdef RNA_RUNTIME
286 static const EnumPropertyItem multiview_camera_items[] = {
287     V3D_S3D_CAMERA_VIEWS V3D_S3D_CAMERA_S3D{0, NULL, 0, NULL, NULL},
288 };
289 #endif
290
291 #undef V3D_S3D_CAMERA_LEFT
292 #undef V3D_S3D_CAMERA_RIGHT
293 #undef V3D_S3D_CAMERA_S3D
294 #undef V3D_S3D_CAMERA_VIEWS
295
296 #ifndef RNA_RUNTIME
297 static const EnumPropertyItem stereo3d_eye_items[] = {
298     {STEREO_LEFT_ID, "LEFT_EYE", ICON_NONE, "Left Eye"},
299     {STEREO_RIGHT_ID, "RIGHT_EYE", ICON_NONE, "Right Eye"},
300     {0, NULL, 0, NULL, NULL},
301 };
302 #endif
303
304 static const EnumPropertyItem display_channels_items[] = {
305     {SI_USE_ALPHA,
306      "COLOR_ALPHA",
307      ICON_IMAGE_RGB_ALPHA,
308      "Color and Alpha",
309      "Display image with RGB colors and alpha transparency"},
310     {0, "COLOR", ICON_IMAGE_RGB, "Color", "Display image with RGB colors"},
311     {SI_SHOW_ALPHA, "ALPHA", ICON_IMAGE_ALPHA, "Alpha", "Display  alpha transparency channel"},
312     {SI_SHOW_ZBUF,
313      "Z_BUFFER",
314      ICON_IMAGE_ZDEPTH,
315      "Z-Buffer",
316      "Display Z-buffer associated with image (mapped from camera clip start to end)"},
317     {SI_SHOW_R, "RED", ICON_COLOR_RED, "Red", ""},
318     {SI_SHOW_G, "GREEN", ICON_COLOR_GREEN, "Green", ""},
319     {SI_SHOW_B, "BLUE", ICON_COLOR_BLUE, "Blue", ""},
320     {0, NULL, 0, NULL, NULL},
321 };
322
323 #ifndef RNA_RUNTIME
324 static const EnumPropertyItem autosnap_items[] = {
325     {SACTSNAP_OFF, "NONE", 0, "No Auto-Snap", ""},
326     /* {-1, "", 0, "", ""}, */
327     {SACTSNAP_STEP, "STEP", 0, "Frame Step", "Snap to 1.0 frame intervals"},
328     {SACTSNAP_TSTEP, "TIME_STEP", 0, "Second Step", "Snap to 1.0 second intervals"},
329     /* {-1, "", 0, "", ""}, */
330     {SACTSNAP_FRAME, "FRAME", 0, "Nearest Frame", "Snap to actual frames (nla-action time)"},
331     {SACTSNAP_SECOND, "SECOND", 0, "Nearest Second", "Snap to actual seconds (nla-action time)"},
332     /* {-1, "", 0, "", ""}, */
333     {SACTSNAP_MARKER, "MARKER", 0, "Nearest Marker", "Snap to nearest marker"},
334     {0, NULL, 0, NULL, NULL},
335 };
336 #endif
337
338 const EnumPropertyItem rna_enum_shading_type_items[] = {
339     {OB_WIRE, "WIREFRAME", ICON_SHADING_WIRE, "Wireframe", "Display the object as wire edges"},
340     {OB_SOLID, "SOLID", ICON_SHADING_SOLID, "Solid", "Display in solid mode"},
341     {OB_MATERIAL, "MATERIAL", ICON_SHADING_TEXTURE, "LookDev", "Display in LookDev mode"},
342     {OB_RENDER, "RENDERED", ICON_SHADING_RENDERED, "Rendered", "Display render preview"},
343     {0, NULL, 0, NULL, NULL},
344 };
345
346 static const EnumPropertyItem rna_enum_viewport_lighting_items[] = {
347     {V3D_LIGHTING_FLAT, "FLAT", 0, "Flat", "Display using flat lighting"},
348     {V3D_LIGHTING_STUDIO, "STUDIO", 0, "Studio", "Display using studio lighting"},
349     {V3D_LIGHTING_MATCAP, "MATCAP", 0, "MatCap", "Display using matcap material and lighting"},
350     {0, NULL, 0, NULL, NULL},
351 };
352
353 static const EnumPropertyItem rna_enum_shading_color_type_items[] = {
354     {V3D_SHADING_SINGLE_COLOR, "SINGLE", 0, "Single", "Show scene in a single color"},
355     {V3D_SHADING_MATERIAL_COLOR, "MATERIAL", 0, "Material", "Show material color"},
356     {V3D_SHADING_OBJECT_COLOR, "OBJECT", 0, "Object", "Show object color"},
357     {V3D_SHADING_RANDOM_COLOR, "RANDOM", 0, "Random", "Show random object color"},
358     {V3D_SHADING_TEXTURE_COLOR, "TEXTURE", 0, "Texture", "Show texture"},
359     {0, NULL, 0, NULL, NULL},
360 };
361
362 static const EnumPropertyItem rna_enum_studio_light_items[] = {
363     {0, "DEFAULT", 0, "Default", ""},
364     {0, NULL, 0, NULL, NULL},
365 };
366
367 const EnumPropertyItem rna_enum_clip_editor_mode_items[] = {
368     {SC_MODE_TRACKING, "TRACKING", ICON_ANIM_DATA, "Tracking", "Show tracking and solving tools"},
369     {SC_MODE_MASKEDIT, "MASK", ICON_MOD_MASK, "Mask", "Show mask editing tools"},
370     {0, NULL, 0, NULL, NULL},
371 };
372
373 /* Actually populated dynamically trough a function, but helps for context-less access (e.g. doc, i18n...). */
374 static const EnumPropertyItem buttons_context_items[] = {
375     {BCONTEXT_TOOL, "TOOL", ICON_TOOL_SETTINGS, "Tool", "Active Tool and Workspace settings"},
376     {BCONTEXT_SCENE, "SCENE", ICON_SCENE_DATA, "Scene", "Scene"},
377     {BCONTEXT_RENDER, "RENDER", ICON_SCENE, "Render", "Render"},
378     {BCONTEXT_OUTPUT, "OUTPUT", ICON_OUTPUT, "Output", "Output"},
379     {BCONTEXT_VIEW_LAYER, "VIEW_LAYER", ICON_RENDER_RESULT, "View Layer", "View Layer"},
380     {BCONTEXT_WORLD, "WORLD", ICON_WORLD, "World", "World"},
381     {BCONTEXT_OBJECT, "OBJECT", ICON_OBJECT_DATA, "Object", "Object"},
382     {BCONTEXT_CONSTRAINT, "CONSTRAINT", ICON_CONSTRAINT, "Constraints", "Object Constraints"},
383     {BCONTEXT_MODIFIER, "MODIFIER", ICON_MODIFIER, "Modifiers", "Modifiers"},
384     {BCONTEXT_DATA, "DATA", ICON_NONE, "Data", "Object Data"},
385     {BCONTEXT_BONE, "BONE", ICON_BONE_DATA, "Bone", "Bone"},
386     {BCONTEXT_BONE_CONSTRAINT,
387      "BONE_CONSTRAINT",
388      ICON_CONSTRAINT_BONE,
389      "Bone Constraints",
390      "Bone Constraints"},
391     {BCONTEXT_MATERIAL, "MATERIAL", ICON_MATERIAL, "Material", "Material"},
392     {BCONTEXT_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture"},
393     {BCONTEXT_PARTICLE, "PARTICLES", ICON_PARTICLES, "Particles", "Particles"},
394     {BCONTEXT_PHYSICS, "PHYSICS", ICON_PHYSICS, "Physics", "Physics"},
395     {BCONTEXT_SHADERFX, "SHADERFX", ICON_SHADERFX, "Effects", "Object visual effects"},
396     {0, NULL, 0, NULL, NULL},
397 };
398
399 static const EnumPropertyItem fileselectparams_recursion_level_items[] = {
400     {0, "NONE", 0, "None", "Only list current directory's content, with no recursion"},
401     {1, "BLEND", 0, "Blend File", "List .blend files' content"},
402     {2, "ALL_1", 0, "One Level", "List all sub-directories' content, one level of recursion"},
403     {3, "ALL_2", 0, "Two Levels", "List all sub-directories' content, two levels of recursion"},
404     {4,
405      "ALL_3",
406      0,
407      "Three Levels",
408      "List all sub-directories' content, three levels of recursion"},
409     {0, NULL, 0, NULL, NULL},
410 };
411
412 const EnumPropertyItem rna_enum_file_sort_items[] = {
413     {FILE_SORT_ALPHA,
414      "FILE_SORT_ALPHA",
415      ICON_SORTALPHA,
416      "Sort alphabetically",
417      "Sort the file list alphabetically"},
418     {FILE_SORT_EXTENSION,
419      "FILE_SORT_EXTENSION",
420      ICON_SORTBYEXT,
421      "Sort by extension",
422      "Sort the file list by extension/type"},
423     {FILE_SORT_TIME,
424      "FILE_SORT_TIME",
425      ICON_SORTTIME,
426      "Sort by time",
427      "Sort files by modification time"},
428     {FILE_SORT_SIZE, "FILE_SORT_SIZE", ICON_SORTSIZE, "Sort by size", "Sort files by size"},
429     {0, NULL, 0, NULL, NULL},
430 };
431
432 #ifdef RNA_RUNTIME
433
434 #  include "DNA_anim_types.h"
435 #  include "DNA_scene_types.h"
436 #  include "DNA_screen_types.h"
437 #  include "DNA_userdef_types.h"
438
439 #  include "BLI_path_util.h"
440 #  include "BLI_string.h"
441
442 #  include "BKE_animsys.h"
443 #  include "BKE_brush.h"
444 #  include "BKE_colortools.h"
445 #  include "BKE_context.h"
446 #  include "BKE_layer.h"
447 #  include "BKE_global.h"
448 #  include "BKE_nla.h"
449 #  include "BKE_paint.h"
450 #  include "BKE_scene.h"
451 #  include "BKE_screen.h"
452 #  include "BKE_icons.h"
453 #  include "BKE_workspace.h"
454
455 #  include "DEG_depsgraph.h"
456 #  include "DEG_depsgraph_build.h"
457
458 #  include "ED_anim_api.h"
459 #  include "ED_buttons.h"
460 #  include "ED_fileselect.h"
461 #  include "ED_image.h"
462 #  include "ED_node.h"
463 #  include "ED_transform.h"
464 #  include "ED_screen.h"
465 #  include "ED_view3d.h"
466 #  include "ED_sequencer.h"
467 #  include "ED_clip.h"
468
469 #  include "GPU_material.h"
470
471 #  include "IMB_imbuf_types.h"
472
473 #  include "UI_interface.h"
474 #  include "UI_view2d.h"
475
476 static StructRNA *rna_Space_refine(struct PointerRNA *ptr)
477 {
478   SpaceLink *space = (SpaceLink *)ptr->data;
479
480   switch (space->spacetype) {
481     case SPACE_VIEW3D:
482       return &RNA_SpaceView3D;
483     case SPACE_GRAPH:
484       return &RNA_SpaceGraphEditor;
485     case SPACE_OUTLINER:
486       return &RNA_SpaceOutliner;
487     case SPACE_PROPERTIES:
488       return &RNA_SpaceProperties;
489     case SPACE_FILE:
490       return &RNA_SpaceFileBrowser;
491     case SPACE_IMAGE:
492       return &RNA_SpaceImageEditor;
493     case SPACE_INFO:
494       return &RNA_SpaceInfo;
495     case SPACE_SEQ:
496       return &RNA_SpaceSequenceEditor;
497     case SPACE_TEXT:
498       return &RNA_SpaceTextEditor;
499     case SPACE_ACTION:
500       return &RNA_SpaceDopeSheetEditor;
501     case SPACE_NLA:
502       return &RNA_SpaceNLA;
503     case SPACE_NODE:
504       return &RNA_SpaceNodeEditor;
505     case SPACE_CONSOLE:
506       return &RNA_SpaceConsole;
507     case SPACE_USERPREF:
508       return &RNA_SpacePreferences;
509     case SPACE_CLIP:
510       return &RNA_SpaceClipEditor;
511     default:
512       return &RNA_Space;
513   }
514 }
515
516 static ScrArea *rna_area_from_space(PointerRNA *ptr)
517 {
518   bScreen *sc = (bScreen *)ptr->id.data;
519   SpaceLink *link = (SpaceLink *)ptr->data;
520   return BKE_screen_find_area_from_space(sc, link);
521 }
522
523 static void area_region_from_regiondata(bScreen *sc,
524                                         void *regiondata,
525                                         ScrArea **r_sa,
526                                         ARegion **r_ar)
527 {
528   ScrArea *sa;
529   ARegion *ar;
530
531   *r_sa = NULL;
532   *r_ar = NULL;
533
534   for (sa = sc->areabase.first; sa; sa = sa->next) {
535     for (ar = sa->regionbase.first; ar; ar = ar->next) {
536       if (ar->regiondata == regiondata) {
537         *r_sa = sa;
538         *r_ar = ar;
539         return;
540       }
541     }
542   }
543 }
544
545 static void rna_area_region_from_regiondata(PointerRNA *ptr, ScrArea **r_sa, ARegion **r_ar)
546 {
547   bScreen *sc = (bScreen *)ptr->id.data;
548   void *regiondata = ptr->data;
549
550   area_region_from_regiondata(sc, regiondata, r_sa, r_ar);
551 }
552
553 /* -------------------------------------------------------------------- */
554 /** \name Generic Region Flag Access
555  * \{ */
556
557 static bool rna_Space_bool_from_region_flag_get_by_type(PointerRNA *ptr,
558                                                         const int region_type,
559                                                         const int region_flag)
560 {
561   ScrArea *sa = rna_area_from_space(ptr);
562   ARegion *ar = BKE_area_find_region_type(sa, region_type);
563   if (ar) {
564     return (ar->flag & region_flag);
565   }
566   return false;
567 }
568
569 static void rna_Space_bool_from_region_flag_set_by_type(PointerRNA *ptr,
570                                                         const int region_type,
571                                                         const int region_flag,
572                                                         bool value)
573 {
574   ScrArea *sa = rna_area_from_space(ptr);
575   ARegion *ar = BKE_area_find_region_type(sa, region_type);
576   if (ar) {
577     SET_FLAG_FROM_TEST(ar->flag, value, region_flag);
578   }
579   ED_region_tag_redraw(ar);
580 }
581
582 static void rna_Space_bool_from_region_flag_update_by_type(bContext *C,
583                                                            PointerRNA *ptr,
584                                                            const int region_type,
585                                                            const int region_flag)
586 {
587   ScrArea *sa = rna_area_from_space(ptr);
588   ARegion *ar = BKE_area_find_region_type(sa, region_type);
589   if (ar) {
590     if (region_flag == RGN_FLAG_HIDDEN) {
591       /* Only support animation when the area is in the current context. */
592       if (ar->overlap && (sa == CTX_wm_area(C))) {
593         ED_region_visibility_change_update_animated(C, sa, ar);
594       }
595       else {
596         ED_region_visibility_change_update(C, sa, ar);
597       }
598     }
599     else if (region_flag == RGN_FLAG_HIDDEN_BY_USER) {
600       if (!(ar->flag & RGN_FLAG_HIDDEN_BY_USER) != !(ar->flag & RGN_FLAG_HIDDEN)) {
601         ED_region_toggle_hidden(C, ar);
602
603         if ((ar->flag & RGN_FLAG_HIDDEN_BY_USER) == 0) {
604           ED_area_type_hud_ensure(C, sa);
605         }
606       }
607     }
608   }
609 }
610
611 /** \} */
612
613 /* -------------------------------------------------------------------- */
614 /** \name Region Flag Access (Typed Callbacks)
615  * \{ */
616
617 /* Header Region. */
618 static bool rna_Space_show_region_header_get(PointerRNA *ptr)
619 {
620   return !rna_Space_bool_from_region_flag_get_by_type(ptr, RGN_TYPE_HEADER, RGN_FLAG_HIDDEN);
621 }
622 static void rna_Space_show_region_header_set(PointerRNA *ptr, bool value)
623 {
624   rna_Space_bool_from_region_flag_set_by_type(ptr, RGN_TYPE_HEADER, RGN_FLAG_HIDDEN, !value);
625
626   /* Special case, never show the tool properties when the header is invisible. */
627   bool value_for_tool_header = value;
628   if (value == true) {
629     ScrArea *sa = rna_area_from_space(ptr);
630     ARegion *ar_tool_header = BKE_area_find_region_type(sa, RGN_TYPE_TOOL_HEADER);
631     if (ar_tool_header != NULL) {
632       value = !(ar_tool_header->flag & RGN_FLAG_HIDDEN_BY_USER);
633     }
634   }
635   rna_Space_bool_from_region_flag_set_by_type(
636       ptr, RGN_TYPE_TOOL_HEADER, RGN_FLAG_HIDDEN, !value_for_tool_header);
637 }
638 static void rna_Space_show_region_header_update(bContext *C, PointerRNA *ptr)
639 {
640   rna_Space_bool_from_region_flag_update_by_type(C, ptr, RGN_TYPE_HEADER, RGN_FLAG_HIDDEN);
641 }
642
643 /* Tool Header Region.
644  *
645  * This depends on the 'RGN_TYPE_TOOL_HEADER'
646  */
647 static bool rna_Space_show_region_tool_header_get(PointerRNA *ptr)
648 {
649   return !rna_Space_bool_from_region_flag_get_by_type(
650       ptr, RGN_TYPE_TOOL_HEADER, RGN_FLAG_HIDDEN_BY_USER);
651 }
652 static void rna_Space_show_region_tool_header_set(PointerRNA *ptr, bool value)
653 {
654   rna_Space_bool_from_region_flag_set_by_type(
655       ptr, RGN_TYPE_TOOL_HEADER, RGN_FLAG_HIDDEN_BY_USER, !value);
656   rna_Space_bool_from_region_flag_set_by_type(ptr, RGN_TYPE_TOOL_HEADER, RGN_FLAG_HIDDEN, !value);
657 }
658 static void rna_Space_show_region_tool_header_update(bContext *C, PointerRNA *ptr)
659 {
660   rna_Space_bool_from_region_flag_update_by_type(C, ptr, RGN_TYPE_TOOL_HEADER, RGN_FLAG_HIDDEN);
661 }
662
663 /* Tools Region. */
664 static bool rna_Space_show_region_toolbar_get(PointerRNA *ptr)
665 {
666   return !rna_Space_bool_from_region_flag_get_by_type(ptr, RGN_TYPE_TOOLS, RGN_FLAG_HIDDEN);
667 }
668 static void rna_Space_show_region_toolbar_set(PointerRNA *ptr, bool value)
669 {
670   rna_Space_bool_from_region_flag_set_by_type(ptr, RGN_TYPE_TOOLS, RGN_FLAG_HIDDEN, !value);
671 }
672 static void rna_Space_show_region_toolbar_update(bContext *C, PointerRNA *ptr)
673 {
674   rna_Space_bool_from_region_flag_update_by_type(C, ptr, RGN_TYPE_TOOLS, RGN_FLAG_HIDDEN);
675 }
676
677 /* UI Region */
678 static bool rna_Space_show_region_ui_get(PointerRNA *ptr)
679 {
680   return !rna_Space_bool_from_region_flag_get_by_type(ptr, RGN_TYPE_UI, RGN_FLAG_HIDDEN);
681 }
682 static void rna_Space_show_region_ui_set(PointerRNA *ptr, bool value)
683 {
684   rna_Space_bool_from_region_flag_set_by_type(ptr, RGN_TYPE_UI, RGN_FLAG_HIDDEN, !value);
685 }
686 static void rna_Space_show_region_ui_update(bContext *C, PointerRNA *ptr)
687 {
688   rna_Space_bool_from_region_flag_update_by_type(C, ptr, RGN_TYPE_UI, RGN_FLAG_HIDDEN);
689 }
690
691 /* Redo (HUD) Region */
692 static bool rna_Space_show_region_hud_get(PointerRNA *ptr)
693 {
694   return !rna_Space_bool_from_region_flag_get_by_type(ptr, RGN_TYPE_HUD, RGN_FLAG_HIDDEN_BY_USER);
695 }
696 static void rna_Space_show_region_hud_set(PointerRNA *ptr, bool value)
697 {
698   rna_Space_bool_from_region_flag_set_by_type(ptr, RGN_TYPE_HUD, RGN_FLAG_HIDDEN_BY_USER, !value);
699 }
700 static void rna_Space_show_region_hud_update(bContext *C, PointerRNA *ptr)
701 {
702   rna_Space_bool_from_region_flag_update_by_type(C, ptr, RGN_TYPE_HUD, RGN_FLAG_HIDDEN_BY_USER);
703 }
704
705 /** \} */
706
707 static bool rna_Space_view2d_sync_get(PointerRNA *ptr)
708 {
709   ScrArea *sa;
710   ARegion *ar;
711
712   sa = rna_area_from_space(ptr); /* can be NULL */
713   ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
714   if (ar) {
715     View2D *v2d = &ar->v2d;
716     return (v2d->flag & V2D_VIEWSYNC_SCREEN_TIME) != 0;
717   }
718
719   return false;
720 }
721
722 static void rna_Space_view2d_sync_set(PointerRNA *ptr, bool value)
723 {
724   ScrArea *sa;
725   ARegion *ar;
726
727   sa = rna_area_from_space(ptr); /* can be NULL */
728   ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
729   if (ar) {
730     View2D *v2d = &ar->v2d;
731     if (value) {
732       v2d->flag |= V2D_VIEWSYNC_SCREEN_TIME;
733     }
734     else {
735       v2d->flag &= ~V2D_VIEWSYNC_SCREEN_TIME;
736     }
737   }
738 }
739
740 static void rna_Space_view2d_sync_update(Main *UNUSED(bmain),
741                                          Scene *UNUSED(scene),
742                                          PointerRNA *ptr)
743 {
744   ScrArea *sa;
745   ARegion *ar;
746
747   sa = rna_area_from_space(ptr); /* can be NULL */
748   ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
749
750   if (ar) {
751     bScreen *sc = (bScreen *)ptr->id.data;
752     View2D *v2d = &ar->v2d;
753
754     UI_view2d_sync(sc, sa, v2d, V2D_LOCK_SET);
755   }
756 }
757
758 static void rna_GPencil_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *UNUSED(ptr))
759 {
760   /* need set all caches as dirty to recalculate onion skinning */
761   for (Object *ob = bmain->objects.first; ob; ob = ob->id.next) {
762     if (ob->type == OB_GPENCIL) {
763       DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
764     }
765   }
766   WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL);
767 }
768
769 /* Space 3D View */
770 static void rna_SpaceView3D_camera_update(Main *bmain, Scene *scene, PointerRNA *ptr)
771 {
772   View3D *v3d = (View3D *)(ptr->data);
773   if (v3d->scenelock) {
774     wmWindowManager *wm = bmain->wm.first;
775
776     scene->camera = v3d->camera;
777     WM_windows_scene_data_sync(&wm->windows, scene);
778   }
779 }
780
781 static void rna_SpaceView3D_use_local_camera_set(PointerRNA *ptr, bool value)
782 {
783   View3D *v3d = (View3D *)(ptr->data);
784   bScreen *sc = (bScreen *)ptr->id.data;
785
786   v3d->scenelock = !value;
787
788   if (!value) {
789     Scene *scene = ED_screen_scene_find(sc, G_MAIN->wm.first);
790     v3d->camera = scene->camera;
791   }
792 }
793
794 static float rna_View3DOverlay_GridScaleUnit_get(PointerRNA *ptr)
795 {
796   View3D *v3d = (View3D *)(ptr->data);
797   bScreen *screen = ptr->id.data;
798   Scene *scene = ED_screen_scene_find(screen, G_MAIN->wm.first);
799
800   return ED_view3d_grid_scale(scene, v3d, NULL);
801 }
802
803 static PointerRNA rna_SpaceView3D_region_3d_get(PointerRNA *ptr)
804 {
805   View3D *v3d = (View3D *)(ptr->data);
806   ScrArea *sa = rna_area_from_space(ptr);
807   void *regiondata = NULL;
808   if (sa) {
809     ListBase *regionbase = (sa->spacedata.first == v3d) ? &sa->regionbase : &v3d->regionbase;
810     ARegion *ar = regionbase->last; /* always last in list, weak .. */
811     regiondata = ar->regiondata;
812   }
813
814   return rna_pointer_inherit_refine(ptr, &RNA_RegionView3D, regiondata);
815 }
816
817 static void rna_SpaceView3D_region_quadviews_begin(CollectionPropertyIterator *iter,
818                                                    PointerRNA *ptr)
819 {
820   View3D *v3d = (View3D *)(ptr->data);
821   ScrArea *sa = rna_area_from_space(ptr);
822   int i = 3;
823
824   ARegion *ar = ((sa && sa->spacedata.first == v3d) ? &sa->regionbase : &v3d->regionbase)->last;
825   ListBase lb = {NULL, NULL};
826
827   if (ar && ar->alignment == RGN_ALIGN_QSPLIT) {
828     while (i-- && ar) {
829       ar = ar->prev;
830     }
831
832     if (i < 0) {
833       lb.first = ar;
834     }
835   }
836
837   rna_iterator_listbase_begin(iter, &lb, NULL);
838 }
839
840 static PointerRNA rna_SpaceView3D_region_quadviews_get(CollectionPropertyIterator *iter)
841 {
842   void *regiondata = ((ARegion *)rna_iterator_listbase_get(iter))->regiondata;
843
844   return rna_pointer_inherit_refine(&iter->parent, &RNA_RegionView3D, regiondata);
845 }
846
847 static void rna_RegionView3D_quadview_update(Main *UNUSED(main),
848                                              Scene *UNUSED(scene),
849                                              PointerRNA *ptr)
850 {
851   ScrArea *sa;
852   ARegion *ar;
853
854   rna_area_region_from_regiondata(ptr, &sa, &ar);
855   if (sa && ar && ar->alignment == RGN_ALIGN_QSPLIT)
856     ED_view3d_quadview_update(sa, ar, false);
857 }
858
859 /* same as above but call clip==true */
860 static void rna_RegionView3D_quadview_clip_update(Main *UNUSED(main),
861                                                   Scene *UNUSED(scene),
862                                                   PointerRNA *ptr)
863 {
864   ScrArea *sa;
865   ARegion *ar;
866
867   rna_area_region_from_regiondata(ptr, &sa, &ar);
868   if (sa && ar && ar->alignment == RGN_ALIGN_QSPLIT)
869     ED_view3d_quadview_update(sa, ar, true);
870 }
871
872 static void rna_RegionView3D_view_location_get(PointerRNA *ptr, float *values)
873 {
874   RegionView3D *rv3d = (RegionView3D *)(ptr->data);
875   negate_v3_v3(values, rv3d->ofs);
876 }
877
878 static void rna_RegionView3D_view_location_set(PointerRNA *ptr, const float *values)
879 {
880   RegionView3D *rv3d = (RegionView3D *)(ptr->data);
881   negate_v3_v3(rv3d->ofs, values);
882 }
883
884 static void rna_RegionView3D_view_rotation_get(PointerRNA *ptr, float *values)
885 {
886   RegionView3D *rv3d = (RegionView3D *)(ptr->data);
887   invert_qt_qt(values, rv3d->viewquat);
888 }
889
890 static void rna_RegionView3D_view_rotation_set(PointerRNA *ptr, const float *values)
891 {
892   RegionView3D *rv3d = (RegionView3D *)(ptr->data);
893   invert_qt_qt(rv3d->viewquat, values);
894 }
895
896 static void rna_RegionView3D_view_matrix_set(PointerRNA *ptr, const float *values)
897 {
898   RegionView3D *rv3d = (RegionView3D *)(ptr->data);
899   float mat[4][4];
900   invert_m4_m4(mat, (float(*)[4])values);
901   ED_view3d_from_m4(mat, rv3d->ofs, rv3d->viewquat, &rv3d->dist);
902 }
903
904 static bool rna_RegionView3D_is_orthographic_side_view_get(PointerRNA *ptr)
905 {
906   RegionView3D *rv3d = (RegionView3D *)(ptr->data);
907   return RV3D_VIEW_IS_AXIS(rv3d->view);
908 }
909
910 static void rna_3DViewShading_type_update(Main *bmain, Scene *scene, PointerRNA *ptr)
911 {
912   ID *id = ptr->id.data;
913   if (GS(id->name) == ID_SCE) {
914     return;
915   }
916
917   View3DShading *shading = ptr->data;
918   if (shading->type == OB_MATERIAL ||
919       (shading->type == OB_RENDER &&
920        STR_ELEM(scene->r.engine, RE_engine_id_BLENDER_EEVEE, RE_engine_id_CYCLES))) {
921     /* When switching from workbench to render or material mode the geometry of any
922      * active sculpt session needs to be recalculated. */
923     for (Object *ob = bmain->objects.first; ob; ob = ob->id.next) {
924       if (ob->sculpt) {
925         DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
926       }
927     }
928   }
929
930   bScreen *screen = ptr->id.data;
931   for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
932     for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
933       if (sl->spacetype == SPACE_VIEW3D) {
934         View3D *v3d = (View3D *)sl;
935         if (&v3d->shading == shading) {
936           ED_view3d_shade_update(bmain, v3d, sa);
937           return;
938         }
939       }
940     }
941   }
942 }
943
944 static Scene *rna_3DViewShading_scene(PointerRNA *ptr)
945 {
946   /* Get scene, depends if using 3D view or OpenGL render settings. */
947   ID *id = ptr->id.data;
948   if (GS(id->name) == ID_SCE) {
949     return (Scene *)id;
950   }
951   else {
952     bScreen *screen = ptr->id.data;
953     return WM_windows_scene_get_from_screen(G_MAIN->wm.first, screen);
954   }
955 }
956
957 static int rna_3DViewShading_type_get(PointerRNA *ptr)
958 {
959   /* Available shading types depend on render engine. */
960   Scene *scene = rna_3DViewShading_scene(ptr);
961   RenderEngineType *type = (scene) ? RE_engines_find(scene->r.engine) : NULL;
962   View3DShading *shading = (View3DShading *)ptr->data;
963
964   if (scene == NULL || BKE_scene_uses_blender_eevee(scene)) {
965     return shading->type;
966   }
967   else if (BKE_scene_uses_blender_workbench(scene)) {
968     return (shading->type == OB_MATERIAL) ? OB_RENDER : shading->type;
969   }
970   else {
971     if (shading->type == OB_RENDER && !(type && type->view_draw)) {
972       return OB_MATERIAL;
973     }
974     else {
975       return shading->type;
976     }
977   }
978 }
979
980 static void rna_3DViewShading_type_set(PointerRNA *ptr, int value)
981 {
982   View3DShading *shading = (View3DShading *)ptr->data;
983   if (value != shading->type && value == OB_RENDER) {
984     shading->prev_type = shading->type;
985   }
986   shading->type = value;
987 }
988
989 static const EnumPropertyItem *rna_3DViewShading_type_itemf(bContext *UNUSED(C),
990                                                             PointerRNA *ptr,
991                                                             PropertyRNA *UNUSED(prop),
992                                                             bool *r_free)
993 {
994   Scene *scene = rna_3DViewShading_scene(ptr);
995   RenderEngineType *type = (scene) ? RE_engines_find(scene->r.engine) : NULL;
996
997   EnumPropertyItem *item = NULL;
998   int totitem = 0;
999
1000   RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_WIRE);
1001   RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_SOLID);
1002
1003   if (scene == NULL || BKE_scene_uses_blender_eevee(scene)) {
1004     RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_MATERIAL);
1005     RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_RENDER);
1006   }
1007   else if (BKE_scene_uses_blender_workbench(scene)) {
1008     RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_RENDER);
1009   }
1010   else {
1011     RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_MATERIAL);
1012     if (type && type->view_draw) {
1013       RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_RENDER);
1014     }
1015   }
1016
1017   RNA_enum_item_end(&item, &totitem);
1018   *r_free = true;
1019
1020   return item;
1021 }
1022
1023 /* Shading.selected_studio_light */
1024 static PointerRNA rna_View3DShading_selected_studio_light_get(PointerRNA *ptr)
1025 {
1026   View3DShading *shading = (View3DShading *)ptr->data;
1027   StudioLight *sl;
1028   if (shading->type == OB_SOLID && shading->light == V3D_LIGHTING_MATCAP) {
1029     sl = BKE_studiolight_find(shading->matcap, STUDIOLIGHT_FLAG_ALL);
1030   }
1031   else if (shading->type == OB_SOLID && shading->light == V3D_LIGHTING_STUDIO) {
1032     sl = BKE_studiolight_find(shading->studio_light, STUDIOLIGHT_FLAG_ALL);
1033   }
1034   else {
1035     sl = BKE_studiolight_find(shading->lookdev_light, STUDIOLIGHT_FLAG_ALL);
1036   }
1037   return rna_pointer_inherit_refine(ptr, &RNA_StudioLight, sl);
1038 }
1039
1040 /* shading.light */
1041 static int rna_View3DShading_light_get(PointerRNA *ptr)
1042 {
1043   View3DShading *shading = (View3DShading *)ptr->data;
1044   return shading->light;
1045 }
1046
1047 static void rna_View3DShading_light_set(PointerRNA *ptr, int value)
1048 {
1049   View3DShading *shading = (View3DShading *)ptr->data;
1050   if (value == V3D_LIGHTING_MATCAP && shading->color_type == V3D_SHADING_TEXTURE_COLOR) {
1051     shading->color_type = V3D_SHADING_MATERIAL_COLOR;
1052   }
1053   shading->light = value;
1054 }
1055
1056 static const EnumPropertyItem *rna_View3DShading_color_type_itemf(bContext *UNUSED(C),
1057                                                                   PointerRNA *ptr,
1058                                                                   PropertyRNA *UNUSED(prop),
1059                                                                   bool *r_free)
1060 {
1061   View3DShading *shading = (View3DShading *)ptr->data;
1062
1063   int totitem = 0;
1064   EnumPropertyItem *item = NULL;
1065
1066   if (shading->type == OB_SOLID) {
1067     RNA_enum_items_add_value(
1068         &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_SINGLE_COLOR);
1069     RNA_enum_items_add_value(
1070         &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_MATERIAL_COLOR);
1071     RNA_enum_items_add_value(
1072         &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_OBJECT_COLOR);
1073     RNA_enum_items_add_value(
1074         &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_RANDOM_COLOR);
1075     if (shading->light != V3D_LIGHTING_MATCAP) {
1076       RNA_enum_items_add_value(
1077           &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_TEXTURE_COLOR);
1078     }
1079   }
1080   else if (shading->type == OB_WIRE) {
1081     RNA_enum_items_add_value(
1082         &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_SINGLE_COLOR);
1083     RNA_enum_items_add_value(
1084         &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_OBJECT_COLOR);
1085     RNA_enum_items_add_value(
1086         &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_RANDOM_COLOR);
1087   }
1088
1089   RNA_enum_item_end(&item, &totitem);
1090   *r_free = true;
1091   return item;
1092 }
1093
1094 /* Studio light */
1095 static int rna_View3DShading_studio_light_get(PointerRNA *ptr)
1096 {
1097   View3DShading *shading = (View3DShading *)ptr->data;
1098   char *dna_storage = shading->studio_light;
1099
1100   int flag = STUDIOLIGHT_TYPE_STUDIO;
1101   if (shading->type == OB_SOLID && shading->light == V3D_LIGHTING_MATCAP) {
1102     flag = STUDIOLIGHT_TYPE_MATCAP;
1103     dna_storage = shading->matcap;
1104   }
1105   else if (shading->type == OB_MATERIAL) {
1106     flag = STUDIOLIGHT_TYPE_WORLD;
1107     dna_storage = shading->lookdev_light;
1108   }
1109   StudioLight *sl = BKE_studiolight_find(dna_storage, flag);
1110   if (sl) {
1111     BLI_strncpy(dna_storage, sl->name, FILE_MAXFILE);
1112     return sl->index;
1113   }
1114   else {
1115     return 0;
1116   }
1117 }
1118
1119 static void rna_View3DShading_studio_light_set(PointerRNA *ptr, int value)
1120 {
1121   View3DShading *shading = (View3DShading *)ptr->data;
1122   char *dna_storage = shading->studio_light;
1123
1124   int flag = STUDIOLIGHT_TYPE_STUDIO;
1125   if (shading->type == OB_SOLID && shading->light == V3D_LIGHTING_MATCAP) {
1126     flag = STUDIOLIGHT_TYPE_MATCAP;
1127     dna_storage = shading->matcap;
1128   }
1129   else if (shading->type == OB_MATERIAL) {
1130     flag = STUDIOLIGHT_TYPE_WORLD;
1131     dna_storage = shading->lookdev_light;
1132   }
1133   StudioLight *sl = BKE_studiolight_findindex(value, flag);
1134   if (sl) {
1135     BLI_strncpy(dna_storage, sl->name, FILE_MAXFILE);
1136   }
1137 }
1138
1139 static const EnumPropertyItem *rna_View3DShading_studio_light_itemf(bContext *UNUSED(C),
1140                                                                     PointerRNA *ptr,
1141                                                                     PropertyRNA *UNUSED(prop),
1142                                                                     bool *r_free)
1143 {
1144   View3DShading *shading = (View3DShading *)ptr->data;
1145   EnumPropertyItem *item = NULL;
1146   int totitem = 0;
1147
1148   if (shading->type == OB_SOLID && shading->light == V3D_LIGHTING_MATCAP) {
1149     const int flags = (STUDIOLIGHT_EXTERNAL_FILE | STUDIOLIGHT_TYPE_MATCAP);
1150
1151     LISTBASE_FOREACH (StudioLight *, sl, BKE_studiolight_listbase()) {
1152       int icon_id = (shading->flag & V3D_SHADING_MATCAP_FLIP_X) ? sl->icon_id_matcap_flipped :
1153                                                                   sl->icon_id_matcap;
1154       if ((sl->flag & flags) == flags) {
1155         EnumPropertyItem tmp = {sl->index, sl->name, icon_id, sl->name, ""};
1156         RNA_enum_item_add(&item, &totitem, &tmp);
1157       }
1158     }
1159   }
1160   else {
1161     LISTBASE_FOREACH (StudioLight *, sl, BKE_studiolight_listbase()) {
1162       int icon_id = sl->icon_id_irradiance;
1163       bool show_studiolight = false;
1164
1165       if (sl->flag & STUDIOLIGHT_INTERNAL) {
1166         /* always show internal lights for solid */
1167         if (shading->type == OB_SOLID) {
1168           show_studiolight = true;
1169         }
1170       }
1171       else {
1172         switch (shading->type) {
1173           case OB_SOLID:
1174           case OB_TEXTURE:
1175             show_studiolight = ((sl->flag & STUDIOLIGHT_TYPE_STUDIO) != 0);
1176             break;
1177
1178           case OB_MATERIAL:
1179             show_studiolight = ((sl->flag & STUDIOLIGHT_TYPE_WORLD) != 0);
1180             icon_id = sl->icon_id_radiance;
1181             break;
1182         }
1183       }
1184
1185       if (show_studiolight) {
1186         EnumPropertyItem tmp = {sl->index, sl->name, icon_id, sl->name, ""};
1187         RNA_enum_item_add(&item, &totitem, &tmp);
1188       }
1189     }
1190   }
1191
1192   RNA_enum_item_end(&item, &totitem);
1193   *r_free = true;
1194   return item;
1195 }
1196
1197 static const EnumPropertyItem *rna_SpaceView3D_stereo3d_camera_itemf(bContext *C,
1198                                                                      PointerRNA *UNUSED(ptr),
1199                                                                      PropertyRNA *UNUSED(prop),
1200                                                                      bool *UNUSED(r_free))
1201 {
1202   Scene *scene = CTX_data_scene(C);
1203
1204   if (scene->r.views_format == SCE_VIEWS_FORMAT_MULTIVIEW)
1205     return multiview_camera_items;
1206   else
1207     return stereo3d_camera_items;
1208 }
1209
1210 static int rna_SpaceView3D_icon_from_show_object_viewport_get(PointerRNA *ptr)
1211 {
1212   const View3D *v3d = (View3D *)ptr->data;
1213   /* Ignore selection values when view is off, intent is to show if visible objects aren't selectable. */
1214   const int view_value = (v3d->object_type_exclude_viewport != 0);
1215   const int select_value = (v3d->object_type_exclude_select &
1216                             ~v3d->object_type_exclude_viewport) != 0;
1217   return ICON_VIS_SEL_11 + (view_value << 1) + select_value;
1218 }
1219
1220 static char *rna_View3DShading_path(PointerRNA *UNUSED(ptr))
1221 {
1222   return BLI_strdup("shading");
1223 }
1224
1225 static PointerRNA rna_SpaceView3D_overlay_get(PointerRNA *ptr)
1226 {
1227   return rna_pointer_inherit_refine(ptr, &RNA_View3DOverlay, ptr->data);
1228 }
1229
1230 static char *rna_View3DOverlay_path(PointerRNA *UNUSED(ptr))
1231 {
1232   return BLI_strdup("overlay");
1233 }
1234
1235 /* Space Image Editor */
1236
1237 static PointerRNA rna_SpaceImageEditor_uvedit_get(PointerRNA *ptr)
1238 {
1239   return rna_pointer_inherit_refine(ptr, &RNA_SpaceUVEditor, ptr->data);
1240 }
1241
1242 static void rna_SpaceImageEditor_mode_update(Main *bmain, Scene *scene, PointerRNA *UNUSED(ptr))
1243 {
1244   ED_space_image_paint_update(bmain, bmain->wm.first, scene);
1245 }
1246
1247 static void rna_SpaceImageEditor_show_stereo_set(PointerRNA *ptr, int value)
1248 {
1249   SpaceImage *sima = (SpaceImage *)(ptr->data);
1250
1251   if (value)
1252     sima->iuser.flag |= IMA_SHOW_STEREO;
1253   else
1254     sima->iuser.flag &= ~IMA_SHOW_STEREO;
1255 }
1256
1257 static bool rna_SpaceImageEditor_show_stereo_get(PointerRNA *ptr)
1258 {
1259   SpaceImage *sima = (SpaceImage *)(ptr->data);
1260   return (sima->iuser.flag & IMA_SHOW_STEREO) != 0;
1261 }
1262
1263 static void rna_SpaceImageEditor_show_stereo_update(Main *UNUSED(bmain),
1264                                                     Scene *UNUSED(unused),
1265                                                     PointerRNA *ptr)
1266 {
1267   SpaceImage *sima = (SpaceImage *)(ptr->data);
1268   Image *ima = sima->image;
1269
1270   if (ima) {
1271     if (ima->rr) {
1272       BKE_image_multilayer_index(ima->rr, &sima->iuser);
1273     }
1274     else {
1275       BKE_image_multiview_index(ima, &sima->iuser);
1276     }
1277   }
1278 }
1279
1280 static bool rna_SpaceImageEditor_show_render_get(PointerRNA *ptr)
1281 {
1282   SpaceImage *sima = (SpaceImage *)(ptr->data);
1283   return ED_space_image_show_render(sima);
1284 }
1285
1286 static bool rna_SpaceImageEditor_show_paint_get(PointerRNA *ptr)
1287 {
1288   SpaceImage *sima = (SpaceImage *)(ptr->data);
1289   return ED_space_image_show_paint(sima);
1290 }
1291
1292 static bool rna_SpaceImageEditor_show_uvedit_get(PointerRNA *ptr)
1293 {
1294   SpaceImage *sima = (SpaceImage *)(ptr->data);
1295   bScreen *sc = (bScreen *)ptr->id.data;
1296   wmWindow *win = ED_screen_window_find(sc, G_MAIN->wm.first);
1297   ViewLayer *view_layer = WM_window_get_active_view_layer(win);
1298   Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
1299   return ED_space_image_show_uvedit(sima, obedit);
1300 }
1301
1302 static bool rna_SpaceImageEditor_show_maskedit_get(PointerRNA *ptr)
1303 {
1304   SpaceImage *sima = (SpaceImage *)(ptr->data);
1305   bScreen *sc = (bScreen *)ptr->id.data;
1306   wmWindow *win = ED_screen_window_find(sc, G_MAIN->wm.first);
1307   ViewLayer *view_layer = WM_window_get_active_view_layer(win);
1308   return ED_space_image_check_show_maskedit(sima, view_layer);
1309 }
1310
1311 static void rna_SpaceImageEditor_image_set(PointerRNA *ptr, PointerRNA value)
1312 {
1313   SpaceImage *sima = (SpaceImage *)(ptr->data);
1314   bScreen *sc = (bScreen *)ptr->id.data;
1315   wmWindow *win = ED_screen_window_find(sc, G_MAIN->wm.first);
1316   ViewLayer *view_layer = WM_window_get_active_view_layer(win);
1317   Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
1318
1319   BLI_assert(BKE_id_is_in_global_main(value.data));
1320   ED_space_image_set(G_MAIN, sima, obedit, (Image *)value.data, false);
1321 }
1322
1323 static void rna_SpaceImageEditor_mask_set(PointerRNA *ptr, PointerRNA value)
1324 {
1325   SpaceImage *sima = (SpaceImage *)(ptr->data);
1326
1327   ED_space_image_set_mask(NULL, sima, (Mask *)value.data);
1328 }
1329
1330 static const EnumPropertyItem *rna_SpaceImageEditor_display_channels_itemf(
1331     bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
1332 {
1333   SpaceImage *sima = (SpaceImage *)ptr->data;
1334   EnumPropertyItem *item = NULL;
1335   ImBuf *ibuf;
1336   void *lock;
1337   int zbuf, alpha, totitem = 0;
1338
1339   ibuf = ED_space_image_acquire_buffer(sima, &lock);
1340
1341   alpha = ibuf && (ibuf->channels == 4);
1342   zbuf = ibuf && (ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels == 1));
1343
1344   ED_space_image_release_buffer(sima, ibuf, lock);
1345
1346   if (alpha && zbuf)
1347     return display_channels_items;
1348
1349   if (alpha) {
1350     RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_USE_ALPHA);
1351     RNA_enum_items_add_value(&item, &totitem, display_channels_items, 0);
1352     RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_ALPHA);
1353   }
1354   else if (zbuf) {
1355     RNA_enum_items_add_value(&item, &totitem, display_channels_items, 0);
1356     RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_ZBUF);
1357   }
1358   else {
1359     RNA_enum_items_add_value(&item, &totitem, display_channels_items, 0);
1360   }
1361
1362   RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_R);
1363   RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_G);
1364   RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_B);
1365
1366   RNA_enum_item_end(&item, &totitem);
1367   *r_free = true;
1368
1369   return item;
1370 }
1371
1372 static void rna_SpaceImageEditor_zoom_get(PointerRNA *ptr, float *values)
1373 {
1374   SpaceImage *sima = (SpaceImage *)ptr->data;
1375   ScrArea *sa;
1376   ARegion *ar;
1377
1378   values[0] = values[1] = 1;
1379
1380   /* find aregion */
1381   sa = rna_area_from_space(ptr); /* can be NULL */
1382   ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
1383   if (ar) {
1384     ED_space_image_get_zoom(sima, ar, &values[0], &values[1]);
1385   }
1386 }
1387
1388 static void rna_SpaceImageEditor_cursor_location_get(PointerRNA *ptr, float *values)
1389 {
1390   SpaceImage *sima = (SpaceImage *)ptr->data;
1391
1392   if (sima->flag & SI_COORDFLOATS) {
1393     copy_v2_v2(values, sima->cursor);
1394   }
1395   else {
1396     int w, h;
1397     ED_space_image_get_size(sima, &w, &h);
1398
1399     values[0] = sima->cursor[0] * w;
1400     values[1] = sima->cursor[1] * h;
1401   }
1402 }
1403
1404 static void rna_SpaceImageEditor_cursor_location_set(PointerRNA *ptr, const float *values)
1405 {
1406   SpaceImage *sima = (SpaceImage *)ptr->data;
1407
1408   if (sima->flag & SI_COORDFLOATS) {
1409     copy_v2_v2(sima->cursor, values);
1410   }
1411   else {
1412     int w, h;
1413     ED_space_image_get_size(sima, &w, &h);
1414
1415     sima->cursor[0] = values[0] / w;
1416     sima->cursor[1] = values[1] / h;
1417   }
1418 }
1419
1420 static void rna_SpaceImageEditor_image_update(Main *UNUSED(bmain),
1421                                               Scene *UNUSED(scene),
1422                                               PointerRNA *ptr)
1423 {
1424   SpaceImage *sima = (SpaceImage *)ptr->data;
1425   Image *ima = sima->image;
1426
1427   /* make sure all the iuser settings are valid for the sima image */
1428   if (ima) {
1429     if (ima->rr) {
1430       if (BKE_image_multilayer_index(sima->image->rr, &sima->iuser) == NULL) {
1431         BKE_image_init_imageuser(sima->image, &sima->iuser);
1432       }
1433     }
1434     else {
1435       BKE_image_multiview_index(ima, &sima->iuser);
1436     }
1437   }
1438 }
1439
1440 static void rna_SpaceImageEditor_scopes_update(struct bContext *C, struct PointerRNA *ptr)
1441 {
1442   SpaceImage *sima = (SpaceImage *)ptr->data;
1443   ImBuf *ibuf;
1444   void *lock;
1445
1446   ibuf = ED_space_image_acquire_buffer(sima, &lock);
1447   if (ibuf) {
1448     ED_space_image_scopes_update(C, sima, ibuf, true);
1449     WM_main_add_notifier(NC_IMAGE, sima->image);
1450   }
1451   ED_space_image_release_buffer(sima, ibuf, lock);
1452 }
1453
1454 static const EnumPropertyItem *rna_SpaceImageEditor_pivot_itemf(bContext *UNUSED(C),
1455                                                                 PointerRNA *ptr,
1456                                                                 PropertyRNA *UNUSED(prop),
1457                                                                 bool *UNUSED(r_free))
1458 {
1459   static const EnumPropertyItem pivot_items[] = {
1460       {V3D_AROUND_CENTER_BOUNDS, "CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center", ""},
1461       {V3D_AROUND_CENTER_MEDIAN, "MEDIAN", ICON_PIVOT_MEDIAN, "Median Point", ""},
1462       {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "2D Cursor", ""},
1463       {V3D_AROUND_LOCAL_ORIGINS,
1464        "INDIVIDUAL_ORIGINS",
1465        ICON_PIVOT_INDIVIDUAL,
1466        "Individual Origins",
1467        "Pivot around each selected island's own median point"},
1468       {0, NULL, 0, NULL, NULL},
1469   };
1470
1471   SpaceImage *sima = (SpaceImage *)ptr->data;
1472
1473   if (sima->mode == SI_MODE_PAINT)
1474     return rna_enum_transform_pivot_items_full;
1475   else
1476     return pivot_items;
1477 }
1478
1479 /* Space Text Editor */
1480
1481 static void rna_SpaceTextEditor_word_wrap_set(PointerRNA *ptr, bool value)
1482 {
1483   SpaceText *st = (SpaceText *)(ptr->data);
1484
1485   st->wordwrap = value;
1486   st->left = 0;
1487 }
1488
1489 static void rna_SpaceTextEditor_text_set(PointerRNA *ptr, PointerRNA value)
1490 {
1491   SpaceText *st = (SpaceText *)(ptr->data);
1492
1493   st->text = value.data;
1494
1495   WM_main_add_notifier(NC_TEXT | NA_SELECTED, st->text);
1496 }
1497
1498 static void rna_SpaceTextEditor_updateEdited(Main *UNUSED(bmain),
1499                                              Scene *UNUSED(scene),
1500                                              PointerRNA *ptr)
1501 {
1502   SpaceText *st = (SpaceText *)ptr->data;
1503
1504   if (st->text)
1505     WM_main_add_notifier(NC_TEXT | NA_EDITED, st->text);
1506 }
1507
1508 /* Space Properties */
1509
1510 /* note: this function exists only to avoid id refcounting */
1511 static void rna_SpaceProperties_pin_id_set(PointerRNA *ptr, PointerRNA value)
1512 {
1513   SpaceProperties *sbuts = (SpaceProperties *)(ptr->data);
1514   sbuts->pinid = value.data;
1515 }
1516
1517 static StructRNA *rna_SpaceProperties_pin_id_typef(PointerRNA *ptr)
1518 {
1519   SpaceProperties *sbuts = (SpaceProperties *)(ptr->data);
1520
1521   if (sbuts->pinid)
1522     return ID_code_to_RNA_type(GS(sbuts->pinid->name));
1523
1524   return &RNA_ID;
1525 }
1526
1527 static void rna_SpaceProperties_pin_id_update(Main *UNUSED(bmain),
1528                                               Scene *UNUSED(scene),
1529                                               PointerRNA *ptr)
1530 {
1531   SpaceProperties *sbuts = (SpaceProperties *)(ptr->data);
1532   ID *id = sbuts->pinid;
1533
1534   if (id == NULL) {
1535     sbuts->flag &= ~SB_PIN_CONTEXT;
1536     return;
1537   }
1538
1539   switch (GS(id->name)) {
1540     case ID_MA:
1541       WM_main_add_notifier(NC_MATERIAL | ND_SHADING, NULL);
1542       break;
1543     case ID_TE:
1544       WM_main_add_notifier(NC_TEXTURE, NULL);
1545       break;
1546     case ID_WO:
1547       WM_main_add_notifier(NC_WORLD, NULL);
1548       break;
1549     case ID_LA:
1550       WM_main_add_notifier(NC_LAMP, NULL);
1551       break;
1552     default:
1553       break;
1554   }
1555 }
1556
1557 static void rna_SpaceProperties_context_set(PointerRNA *ptr, int value)
1558 {
1559   SpaceProperties *sbuts = (SpaceProperties *)(ptr->data);
1560
1561   sbuts->mainb = value;
1562   sbuts->mainbuser = value;
1563 }
1564
1565 static const EnumPropertyItem *rna_SpaceProperties_context_itemf(bContext *UNUSED(C),
1566                                                                  PointerRNA *ptr,
1567                                                                  PropertyRNA *UNUSED(prop),
1568                                                                  bool *r_free)
1569 {
1570   SpaceProperties *sbuts = (SpaceProperties *)(ptr->data);
1571   EnumPropertyItem *item = NULL;
1572   int totitem = 0;
1573
1574   if (sbuts->pathflag & (1 << BCONTEXT_TOOL)) {
1575     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_TOOL);
1576   }
1577
1578   if (totitem) {
1579     RNA_enum_item_add_separator(&item, &totitem);
1580   }
1581
1582   if (sbuts->pathflag & (1 << BCONTEXT_RENDER)) {
1583     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_RENDER);
1584   }
1585
1586   if (sbuts->pathflag & (1 << BCONTEXT_OUTPUT)) {
1587     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_OUTPUT);
1588   }
1589
1590   if (sbuts->pathflag & (1 << BCONTEXT_VIEW_LAYER)) {
1591     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_VIEW_LAYER);
1592   }
1593
1594   if (sbuts->pathflag & (1 << BCONTEXT_SCENE)) {
1595     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_SCENE);
1596   }
1597
1598   if (sbuts->pathflag & (1 << BCONTEXT_WORLD)) {
1599     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_WORLD);
1600   }
1601
1602   if (totitem) {
1603     RNA_enum_item_add_separator(&item, &totitem);
1604   }
1605
1606   if (sbuts->pathflag & (1 << BCONTEXT_OBJECT)) {
1607     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_OBJECT);
1608   }
1609
1610   if (sbuts->pathflag & (1 << BCONTEXT_MODIFIER)) {
1611     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_MODIFIER);
1612   }
1613
1614   if (sbuts->pathflag & (1 << BCONTEXT_SHADERFX)) {
1615     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_SHADERFX);
1616   }
1617
1618   if (sbuts->pathflag & (1 << BCONTEXT_PARTICLE)) {
1619     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_PARTICLE);
1620   }
1621
1622   if (sbuts->pathflag & (1 << BCONTEXT_PHYSICS)) {
1623     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_PHYSICS);
1624   }
1625
1626   if (sbuts->pathflag & (1 << BCONTEXT_CONSTRAINT)) {
1627     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_CONSTRAINT);
1628   }
1629
1630   if (sbuts->pathflag & (1 << BCONTEXT_DATA)) {
1631     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_DATA);
1632     (item + totitem - 1)->icon = sbuts->dataicon;
1633   }
1634
1635   if (sbuts->pathflag & (1 << BCONTEXT_BONE)) {
1636     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_BONE);
1637   }
1638
1639   if (sbuts->pathflag & (1 << BCONTEXT_BONE_CONSTRAINT)) {
1640     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_BONE_CONSTRAINT);
1641   }
1642
1643   if (sbuts->pathflag & (1 << BCONTEXT_MATERIAL)) {
1644     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_MATERIAL);
1645   }
1646
1647   if (totitem) {
1648     RNA_enum_item_add_separator(&item, &totitem);
1649   }
1650
1651   if (sbuts->pathflag & (1 << BCONTEXT_TEXTURE)) {
1652     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_TEXTURE);
1653   }
1654
1655   RNA_enum_item_end(&item, &totitem);
1656   *r_free = true;
1657
1658   return item;
1659 }
1660
1661 static void rna_SpaceProperties_context_update(Main *UNUSED(bmain),
1662                                                Scene *UNUSED(scene),
1663                                                PointerRNA *ptr)
1664 {
1665   SpaceProperties *sbuts = (SpaceProperties *)(ptr->data);
1666   /* XXX BCONTEXT_DATA is ugly, but required for lights... See T51318. */
1667   if (ELEM(sbuts->mainb, BCONTEXT_WORLD, BCONTEXT_MATERIAL, BCONTEXT_TEXTURE, BCONTEXT_DATA)) {
1668     sbuts->preview = 1;
1669   }
1670 }
1671
1672 /* Space Console */
1673 static void rna_ConsoleLine_body_get(PointerRNA *ptr, char *value)
1674 {
1675   ConsoleLine *ci = (ConsoleLine *)ptr->data;
1676   memcpy(value, ci->line, ci->len + 1);
1677 }
1678
1679 static int rna_ConsoleLine_body_length(PointerRNA *ptr)
1680 {
1681   ConsoleLine *ci = (ConsoleLine *)ptr->data;
1682   return ci->len;
1683 }
1684
1685 static void rna_ConsoleLine_body_set(PointerRNA *ptr, const char *value)
1686 {
1687   ConsoleLine *ci = (ConsoleLine *)ptr->data;
1688   int len = strlen(value);
1689
1690   if ((len >= ci->len_alloc) || (len * 2 < ci->len_alloc)) { /* allocate a new string */
1691     MEM_freeN(ci->line);
1692     ci->line = MEM_mallocN((len + 1) * sizeof(char), "rna_consoleline");
1693     ci->len_alloc = len + 1;
1694   }
1695   memcpy(ci->line, value, len + 1);
1696   ci->len = len;
1697
1698   if (ci->cursor > len) /* clamp the cursor */
1699     ci->cursor = len;
1700 }
1701
1702 static void rna_ConsoleLine_cursor_index_range(
1703     PointerRNA *ptr, int *min, int *max, int *UNUSED(softmin), int *UNUSED(softmax))
1704 {
1705   ConsoleLine *ci = (ConsoleLine *)ptr->data;
1706
1707   *min = 0;
1708   *max = ci->len; /* intentionally _not_ -1 */
1709 }
1710
1711 /* Space Dopesheet */
1712
1713 static void rna_SpaceDopeSheetEditor_action_set(PointerRNA *ptr, PointerRNA value)
1714 {
1715   SpaceAction *saction = (SpaceAction *)(ptr->data);
1716   bAction *act = (bAction *)value.data;
1717
1718   if ((act == NULL) || (act->idroot == 0)) {
1719     /* just set if we're clearing the action or if the action is "amorphous" still */
1720     saction->action = act;
1721   }
1722   else {
1723     /* action to set must strictly meet the mode criteria... */
1724     if (saction->mode == SACTCONT_ACTION) {
1725       /* currently, this is "object-level" only, until we have some way of specifying this */
1726       if (act->idroot == ID_OB)
1727         saction->action = act;
1728       else
1729         printf(
1730             "ERROR: cannot assign Action '%s' to Action Editor, as action is not object-level "
1731             "animation\n",
1732             act->id.name + 2);
1733     }
1734     else if (saction->mode == SACTCONT_SHAPEKEY) {
1735       /* as the name says, "shapekey-level" only... */
1736       if (act->idroot == ID_KE)
1737         saction->action = act;
1738       else
1739         printf(
1740             "ERROR: cannot assign Action '%s' to Shape Key Editor, as action doesn't animate "
1741             "Shape Keys\n",
1742             act->id.name + 2);
1743     }
1744     else {
1745       printf(
1746           "ACK: who's trying to set an action while not in a mode displaying a single Action "
1747           "only?\n");
1748     }
1749   }
1750 }
1751
1752 static void rna_SpaceDopeSheetEditor_action_update(bContext *C, PointerRNA *ptr)
1753 {
1754   SpaceAction *saction = (SpaceAction *)(ptr->data);
1755   ViewLayer *view_layer = CTX_data_view_layer(C);
1756   Main *bmain = CTX_data_main(C);
1757   Object *obact = OBACT(view_layer);
1758
1759   /* we must set this action to be the one used by active object (if not pinned) */
1760   if (obact /* && saction->pin == 0*/) {
1761     AnimData *adt = NULL;
1762
1763     if (saction->mode == SACTCONT_ACTION) {
1764       /* TODO: context selector could help decide this with more control? */
1765       adt = BKE_animdata_add_id(&obact->id); /* this only adds if non-existent */
1766     }
1767     else if (saction->mode == SACTCONT_SHAPEKEY) {
1768       Key *key = BKE_key_from_object(obact);
1769       if (key)
1770         adt = BKE_animdata_add_id(&key->id); /* this only adds if non-existent */
1771     }
1772
1773     /* set action */
1774     // FIXME: this overlaps a lot with the BKE_animdata_set_action() API method
1775     if (adt) {
1776       /* Don't do anything if old and new actions are the same... */
1777       if (adt->action != saction->action) {
1778         /* NLA Tweak Mode needs special handling... */
1779         if (adt->flag & ADT_NLA_EDIT_ON) {
1780           /* Exit editmode first - we cannot change actions while in tweakmode
1781            * NOTE: This will clear the action ref properly
1782            */
1783           BKE_nla_tweakmode_exit(adt);
1784
1785           /* Assign new action, and adjust the usercounts accordingly */
1786           adt->action = saction->action;
1787           id_us_plus((ID *)adt->action);
1788         }
1789         else {
1790           /* Handle old action... */
1791           if (adt->action) {
1792             /* Fix id-count of action we're replacing */
1793             id_us_min(&adt->action->id);
1794
1795             /* To prevent data loss (i.e. if users flip between actions using the Browse menu),
1796              * stash this action if nothing else uses it.
1797              *
1798              * EXCEPTION:
1799              * This callback runs when unlinking actions. In that case, we don't want to
1800              * stash the action, as the user is signalling that they want to detach it.
1801              * This can be reviewed again later, but it could get annoying if we keep these instead.
1802              */
1803             if ((adt->action->id.us <= 0) && (saction->action != NULL)) {
1804               /* XXX: Things here get dodgy if this action is only partially completed,
1805                *      and the user then uses the browse menu to get back to this action,
1806                *      assigning it as the active action (i.e. the stash strip gets out of sync)
1807                */
1808               BKE_nla_action_stash(adt);
1809             }
1810           }
1811
1812           /* Assign new action, and adjust the usercounts accordingly */
1813           adt->action = saction->action;
1814           id_us_plus((ID *)adt->action);
1815         }
1816       }
1817
1818       /* Force update of animdata */
1819       DEG_id_tag_update(&obact->id, ID_RECALC_ANIMATION);
1820     }
1821
1822     /* force depsgraph flush too */
1823     DEG_id_tag_update(&obact->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
1824     /* Update relations as well, so new time source dependency is added. */
1825     DEG_relations_tag_update(bmain);
1826   }
1827 }
1828
1829 static void rna_SpaceDopeSheetEditor_mode_update(bContext *C, PointerRNA *ptr)
1830 {
1831   SpaceAction *saction = (SpaceAction *)(ptr->data);
1832   ScrArea *sa = CTX_wm_area(C);
1833   ViewLayer *view_layer = CTX_data_view_layer(C);
1834   Object *obact = OBACT(view_layer);
1835
1836   /* special exceptions for ShapeKey Editor mode */
1837   if (saction->mode == SACTCONT_SHAPEKEY) {
1838     Key *key = BKE_key_from_object(obact);
1839
1840     /* 1) update the action stored for the editor */
1841     if (key)
1842       saction->action = (key->adt) ? key->adt->action : NULL;
1843     else
1844       saction->action = NULL;
1845
1846     /* 2) enable 'show sliders' by default, since one of the main
1847      *    points of the ShapeKey Editor is to provide a one-stop shop
1848      *    for controlling the shapekeys, whose main control is the value
1849      */
1850     saction->flag |= SACTION_SLIDERS;
1851   }
1852   /* make sure action stored is valid */
1853   else if (saction->mode == SACTCONT_ACTION) {
1854     /* 1) update the action stored for the editor */
1855     /* TODO: context selector could help decide this with more control? */
1856     if (obact)
1857       saction->action = (obact->adt) ? obact->adt->action : NULL;
1858     else
1859       saction->action = NULL;
1860   }
1861
1862   /* Collapse (and show) summary channel and hide channel list for timeline */
1863   if (saction->mode == SACTCONT_TIMELINE) {
1864     saction->ads.flag |= ADS_FLAG_SUMMARY_COLLAPSED;
1865     saction->ads.filterflag |= ADS_FILTER_SUMMARY;
1866   }
1867
1868   if (sa && sa->spacedata.first == saction) {
1869     ARegion *channels_region = BKE_area_find_region_type(sa, RGN_TYPE_CHANNELS);
1870     if (channels_region) {
1871       if (saction->mode == SACTCONT_TIMELINE) {
1872         channels_region->flag |= RGN_FLAG_HIDDEN;
1873       }
1874       else {
1875         channels_region->flag &= ~RGN_FLAG_HIDDEN;
1876       }
1877       ED_region_visibility_change_update(C, sa, channels_region);
1878     }
1879   }
1880
1881   /* recalculate extents of channel list */
1882   saction->runtime.flag |= SACTION_RUNTIME_FLAG_NEED_CHAN_SYNC;
1883
1884   /* store current mode as "old mode", so that returning from other editors doesn't always reset to "Action Editor" */
1885   if (saction->mode != SACTCONT_TIMELINE) {
1886     saction->mode_prev = saction->mode;
1887   }
1888 }
1889
1890 /* Space Graph Editor */
1891
1892 static void rna_SpaceGraphEditor_display_mode_update(bContext *C, PointerRNA *ptr)
1893 {
1894   ScrArea *sa = rna_area_from_space(ptr);
1895   SpaceGraph *sipo = (SpaceGraph *)ptr->data;
1896
1897   /* for "Drivers" mode, enable all the necessary bits and pieces */
1898   if (sipo->mode == SIPO_MODE_DRIVERS) {
1899     ED_drivers_editor_init(C, sa);
1900     ED_area_tag_redraw(sa);
1901   }
1902
1903   /* after changing view mode, must force recalculation of F-Curve colors
1904    * which can only be achieved using refresh as opposed to redraw
1905    */
1906   ED_area_tag_refresh(sa);
1907 }
1908
1909 static bool rna_SpaceGraphEditor_has_ghost_curves_get(PointerRNA *ptr)
1910 {
1911   SpaceGraph *sipo = (SpaceGraph *)(ptr->data);
1912   return (BLI_listbase_is_empty(&sipo->runtime.ghost_curves) == false);
1913 }
1914
1915 static void rna_SpaceConsole_rect_update(Main *UNUSED(bmain),
1916                                          Scene *UNUSED(scene),
1917                                          PointerRNA *ptr)
1918 {
1919   SpaceConsole *sc = ptr->data;
1920   WM_main_add_notifier(NC_SPACE | ND_SPACE_CONSOLE | NA_EDITED, sc);
1921 }
1922
1923 static void rna_Sequencer_view_type_update(Main *UNUSED(bmain),
1924                                            Scene *UNUSED(scene),
1925                                            PointerRNA *ptr)
1926 {
1927   ScrArea *sa = rna_area_from_space(ptr);
1928   ED_area_tag_refresh(sa);
1929 }
1930
1931 /* Space Node Editor */
1932
1933 static void rna_SpaceNodeEditor_node_tree_set(PointerRNA *ptr, const PointerRNA value)
1934 {
1935   SpaceNode *snode = (SpaceNode *)ptr->data;
1936   ED_node_tree_start(snode, (bNodeTree *)value.data, NULL, NULL);
1937 }
1938
1939 static bool rna_SpaceNodeEditor_node_tree_poll(PointerRNA *ptr, const PointerRNA value)
1940 {
1941   SpaceNode *snode = (SpaceNode *)ptr->data;
1942   bNodeTree *ntree = (bNodeTree *)value.data;
1943
1944   /* node tree type must match the selected type in node editor */
1945   return (STREQ(snode->tree_idname, ntree->idname));
1946 }
1947
1948 static void rna_SpaceNodeEditor_node_tree_update(const bContext *C, PointerRNA *UNUSED(ptr))
1949 {
1950   ED_node_tree_update(C);
1951 }
1952
1953 static int rna_SpaceNodeEditor_tree_type_get(PointerRNA *ptr)
1954 {
1955   SpaceNode *snode = (SpaceNode *)ptr->data;
1956   return rna_node_tree_idname_to_enum(snode->tree_idname);
1957 }
1958 static void rna_SpaceNodeEditor_tree_type_set(PointerRNA *ptr, int value)
1959 {
1960   SpaceNode *snode = (SpaceNode *)ptr->data;
1961   ED_node_set_tree_type(snode, rna_node_tree_type_from_enum(value));
1962 }
1963 static bool rna_SpaceNodeEditor_tree_type_poll(void *Cv, bNodeTreeType *type)
1964 {
1965   bContext *C = (bContext *)Cv;
1966   if (type->poll)
1967     return type->poll(C, type);
1968   else
1969     return true;
1970 }
1971
1972 const EnumPropertyItem *RNA_enum_node_tree_types_itemf_impl(bContext *C, bool *r_free)
1973 {
1974   return rna_node_tree_type_itemf(C, rna_SpaceNodeEditor_tree_type_poll, r_free);
1975 }
1976
1977 static const EnumPropertyItem *rna_SpaceNodeEditor_tree_type_itemf(bContext *C,
1978                                                                    PointerRNA *UNUSED(ptr),
1979                                                                    PropertyRNA *UNUSED(prop),
1980                                                                    bool *r_free)
1981 {
1982   return RNA_enum_node_tree_types_itemf_impl(C, r_free);
1983 }
1984
1985 static void rna_SpaceNodeEditor_path_get(PointerRNA *ptr, char *value)
1986 {
1987   SpaceNode *snode = ptr->data;
1988   ED_node_tree_path_get(snode, value);
1989 }
1990
1991 static int rna_SpaceNodeEditor_path_length(PointerRNA *ptr)
1992 {
1993   SpaceNode *snode = ptr->data;
1994   return ED_node_tree_path_length(snode);
1995 }
1996
1997 static void rna_SpaceNodeEditor_path_clear(SpaceNode *snode, bContext *C)
1998 {
1999   ED_node_tree_start(snode, NULL, NULL, NULL);
2000   ED_node_tree_update(C);
2001 }
2002
2003 static void rna_SpaceNodeEditor_path_start(SpaceNode *snode, bContext *C, PointerRNA *node_tree)
2004 {
2005   ED_node_tree_start(snode, (bNodeTree *)node_tree->data, NULL, NULL);
2006   ED_node_tree_update(C);
2007 }
2008
2009 static void rna_SpaceNodeEditor_path_append(SpaceNode *snode,
2010                                             bContext *C,
2011                                             PointerRNA *node_tree,
2012                                             PointerRNA *node)
2013 {
2014   ED_node_tree_push(snode, node_tree->data, node->data);
2015   ED_node_tree_update(C);
2016 }
2017
2018 static void rna_SpaceNodeEditor_path_pop(SpaceNode *snode, bContext *C)
2019 {
2020   ED_node_tree_pop(snode);
2021   ED_node_tree_update(C);
2022 }
2023
2024 static void rna_SpaceNodeEditor_show_backdrop_update(Main *UNUSED(bmain),
2025                                                      Scene *UNUSED(scene),
2026                                                      PointerRNA *UNUSED(ptr))
2027 {
2028   WM_main_add_notifier(NC_NODE | NA_EDITED, NULL);
2029   WM_main_add_notifier(NC_SCENE | ND_NODES, NULL);
2030 }
2031
2032 static void rna_SpaceNodeEditor_cursor_location_from_region(SpaceNode *snode,
2033                                                             bContext *C,
2034                                                             int x,
2035                                                             int y)
2036 {
2037   ARegion *ar = CTX_wm_region(C);
2038
2039   UI_view2d_region_to_view(&ar->v2d, x, y, &snode->cursor[0], &snode->cursor[1]);
2040   snode->cursor[0] /= UI_DPI_FAC;
2041   snode->cursor[1] /= UI_DPI_FAC;
2042 }
2043
2044 static void rna_SpaceClipEditor_clip_set(PointerRNA *ptr, PointerRNA value)
2045 {
2046   SpaceClip *sc = (SpaceClip *)(ptr->data);
2047   bScreen *screen = (bScreen *)ptr->id.data;
2048
2049   ED_space_clip_set_clip(NULL, screen, sc, (MovieClip *)value.data);
2050 }
2051
2052 static void rna_SpaceClipEditor_mask_set(PointerRNA *ptr, PointerRNA value)
2053 {
2054   SpaceClip *sc = (SpaceClip *)(ptr->data);
2055
2056   ED_space_clip_set_mask(NULL, sc, (Mask *)value.data);
2057 }
2058
2059 static void rna_SpaceClipEditor_clip_mode_update(Main *UNUSED(bmain),
2060                                                  Scene *UNUSED(scene),
2061                                                  PointerRNA *ptr)
2062 {
2063   SpaceClip *sc = (SpaceClip *)(ptr->data);
2064
2065   sc->scopes.ok = 0;
2066 }
2067
2068 static void rna_SpaceClipEditor_lock_selection_update(Main *UNUSED(bmain),
2069                                                       Scene *UNUSED(scene),
2070                                                       PointerRNA *ptr)
2071 {
2072   SpaceClip *sc = (SpaceClip *)(ptr->data);
2073
2074   sc->xlockof = 0.f;
2075   sc->ylockof = 0.f;
2076 }
2077
2078 static void rna_SpaceClipEditor_view_type_update(Main *UNUSED(bmain),
2079                                                  Scene *UNUSED(scene),
2080                                                  PointerRNA *ptr)
2081 {
2082   ScrArea *sa = rna_area_from_space(ptr);
2083   ED_area_tag_refresh(sa);
2084 }
2085
2086 /* File browser. */
2087
2088 static bool rna_FileSelectParams_use_lib_get(PointerRNA *ptr)
2089 {
2090   FileSelectParams *params = ptr->data;
2091
2092   return params && (params->type == FILE_LOADLIB);
2093 }
2094
2095 static const EnumPropertyItem *rna_FileSelectParams_recursion_level_itemf(
2096     bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
2097 {
2098   FileSelectParams *params = ptr->data;
2099
2100   if (params && params->type != FILE_LOADLIB) {
2101     EnumPropertyItem *item = NULL;
2102     int totitem = 0;
2103
2104     RNA_enum_items_add_value(&item, &totitem, fileselectparams_recursion_level_items, 0);
2105     RNA_enum_items_add_value(&item, &totitem, fileselectparams_recursion_level_items, 2);
2106     RNA_enum_items_add_value(&item, &totitem, fileselectparams_recursion_level_items, 3);
2107     RNA_enum_items_add_value(&item, &totitem, fileselectparams_recursion_level_items, 4);
2108
2109     RNA_enum_item_end(&item, &totitem);
2110     *r_free = true;
2111
2112     return item;
2113   }
2114
2115   *r_free = false;
2116   return fileselectparams_recursion_level_items;
2117 }
2118
2119 static void rna_FileSelectPrams_filter_glob_set(PointerRNA *ptr, const char *value)
2120 {
2121   FileSelectParams *params = ptr->data;
2122
2123   BLI_strncpy(params->filter_glob, value, sizeof(params->filter_glob));
2124
2125   /* Remove stupi things like last group being a wildcard-only one... */
2126   BLI_path_extension_glob_validate(params->filter_glob);
2127 }
2128
2129 static void rna_FileBrowser_FSMenuEntry_path_get(PointerRNA *ptr, char *value)
2130 {
2131   char *path = ED_fsmenu_entry_get_path(ptr->data);
2132
2133   strcpy(value, path ? path : "");
2134 }
2135
2136 static int rna_FileBrowser_FSMenuEntry_path_length(PointerRNA *ptr)
2137 {
2138   char *path = ED_fsmenu_entry_get_path(ptr->data);
2139
2140   return (int)(path ? strlen(path) : 0);
2141 }
2142
2143 static void rna_FileBrowser_FSMenuEntry_path_set(PointerRNA *ptr, const char *value)
2144 {
2145   FSMenuEntry *fsm = ptr->data;
2146
2147   /* Note: this will write to file immediately.
2148    * Not nice (and to be fixed ultimately), but acceptable in this case for now. */
2149   ED_fsmenu_entry_set_path(fsm, value);
2150 }
2151
2152 static void rna_FileBrowser_FSMenuEntry_name_get(PointerRNA *ptr, char *value)
2153 {
2154   strcpy(value, ED_fsmenu_entry_get_name(ptr->data));
2155 }
2156
2157 static int rna_FileBrowser_FSMenuEntry_name_length(PointerRNA *ptr)
2158 {
2159   return (int)strlen(ED_fsmenu_entry_get_name(ptr->data));
2160 }
2161
2162 static void rna_FileBrowser_FSMenuEntry_name_set(PointerRNA *ptr, const char *value)
2163 {
2164   FSMenuEntry *fsm = ptr->data;
2165
2166   /* Note: this will write to file immediately.
2167    * Not nice (and to be fixed ultimately), but acceptable in this case for now. */
2168   ED_fsmenu_entry_set_name(fsm, value);
2169 }
2170
2171 static int rna_FileBrowser_FSMenuEntry_name_get_editable(PointerRNA *ptr,
2172                                                          const char **UNUSED(r_info))
2173 {
2174   FSMenuEntry *fsm = ptr->data;
2175
2176   return fsm->save ? PROP_EDITABLE : 0;
2177 }
2178
2179 static bool rna_FileBrowser_FSMenuEntry_use_save_get(PointerRNA *ptr)
2180 {
2181   FSMenuEntry *fsm = ptr->data;
2182   return fsm->save;
2183 }
2184
2185 static bool rna_FileBrowser_FSMenuEntry_is_valid_get(PointerRNA *ptr)
2186 {
2187   FSMenuEntry *fsm = ptr->data;
2188   return fsm->valid;
2189 }
2190
2191 static void rna_FileBrowser_FSMenu_next(CollectionPropertyIterator *iter)
2192 {
2193   ListBaseIterator *internal = &iter->internal.listbase;
2194
2195   if (internal->skip) {
2196     do {
2197       internal->link = (Link *)(((FSMenuEntry *)(internal->link))->next);
2198       iter->valid = (internal->link != NULL);
2199     } while (iter->valid && internal->skip(iter, internal->link));
2200   }
2201   else {
2202     internal->link = (Link *)(((FSMenuEntry *)(internal->link))->next);
2203     iter->valid = (internal->link != NULL);
2204   }
2205 }
2206
2207 static void rna_FileBrowser_FSMenu_begin(CollectionPropertyIterator *iter, FSMenuCategory category)
2208 {
2209   ListBaseIterator *internal = &iter->internal.listbase;
2210
2211   struct FSMenu *fsmenu = ED_fsmenu_get();
2212   struct FSMenuEntry *fsmentry = ED_fsmenu_get_category(fsmenu, category);
2213
2214   internal->link = (fsmentry) ? (Link *)fsmentry : NULL;
2215   internal->skip = NULL;
2216
2217   iter->valid = (internal->link != NULL);
2218 }
2219
2220 static PointerRNA rna_FileBrowser_FSMenu_get(CollectionPropertyIterator *iter)
2221 {
2222   ListBaseIterator *internal = &iter->internal.listbase;
2223   PointerRNA r_ptr;
2224
2225   RNA_pointer_create(NULL, &RNA_FileBrowserFSMenuEntry, internal->link, &r_ptr);
2226
2227   return r_ptr;
2228 }
2229
2230 static void rna_FileBrowser_FSMenu_end(CollectionPropertyIterator *UNUSED(iter))
2231 {
2232 }
2233
2234 static void rna_FileBrowser_FSMenuSystem_data_begin(CollectionPropertyIterator *iter,
2235                                                     PointerRNA *UNUSED(ptr))
2236 {
2237   rna_FileBrowser_FSMenu_begin(iter, FS_CATEGORY_SYSTEM);
2238 }
2239
2240 static int rna_FileBrowser_FSMenuSystem_data_length(PointerRNA *UNUSED(ptr))
2241 {
2242   struct FSMenu *fsmenu = ED_fsmenu_get();
2243
2244   return ED_fsmenu_get_nentries(fsmenu, FS_CATEGORY_SYSTEM);
2245 }
2246
2247 static void rna_FileBrowser_FSMenuSystemBookmark_data_begin(CollectionPropertyIterator *iter,
2248                                                             PointerRNA *UNUSED(ptr))
2249 {
2250   rna_FileBrowser_FSMenu_begin(iter, FS_CATEGORY_SYSTEM_BOOKMARKS);
2251 }
2252
2253 static int rna_FileBrowser_FSMenuSystemBookmark_data_length(PointerRNA *UNUSED(ptr))
2254 {
2255   struct FSMenu *fsmenu = ED_fsmenu_get();
2256
2257   return ED_fsmenu_get_nentries(fsmenu, FS_CATEGORY_SYSTEM_BOOKMARKS);
2258 }
2259
2260 static void rna_FileBrowser_FSMenuBookmark_data_begin(CollectionPropertyIterator *iter,
2261                                                       PointerRNA *UNUSED(ptr))
2262 {
2263   rna_FileBrowser_FSMenu_begin(iter, FS_CATEGORY_BOOKMARKS);
2264 }
2265
2266 static int rna_FileBrowser_FSMenuBookmark_data_length(PointerRNA *UNUSED(ptr))
2267 {
2268   struct FSMenu *fsmenu = ED_fsmenu_get();
2269
2270   return ED_fsmenu_get_nentries(fsmenu, FS_CATEGORY_BOOKMARKS);
2271 }
2272
2273 static void rna_FileBrowser_FSMenuRecent_data_begin(CollectionPropertyIterator *iter,
2274                                                     PointerRNA *UNUSED(ptr))
2275 {
2276   rna_FileBrowser_FSMenu_begin(iter, FS_CATEGORY_RECENT);
2277 }
2278
2279 static int rna_FileBrowser_FSMenuRecent_data_length(PointerRNA *UNUSED(ptr))
2280 {
2281   struct FSMenu *fsmenu = ED_fsmenu_get();
2282
2283   return ED_fsmenu_get_nentries(fsmenu, FS_CATEGORY_RECENT);
2284 }
2285
2286 static int rna_FileBrowser_FSMenu_active_get(PointerRNA *ptr, const FSMenuCategory category)
2287 {
2288   SpaceFile *sf = ptr->data;
2289   int actnr = -1;
2290
2291   switch (category) {
2292     case FS_CATEGORY_SYSTEM:
2293       actnr = sf->systemnr;
2294       break;
2295     case FS_CATEGORY_SYSTEM_BOOKMARKS:
2296       actnr = sf->system_bookmarknr;
2297       break;
2298     case FS_CATEGORY_BOOKMARKS:
2299       actnr = sf->bookmarknr;
2300       break;
2301     case FS_CATEGORY_RECENT:
2302       actnr = sf->recentnr;
2303       break;
2304   }
2305
2306   return actnr;
2307 }
2308
2309 static void rna_FileBrowser_FSMenu_active_set(PointerRNA *ptr,
2310                                               int value,
2311                                               const FSMenuCategory category)
2312 {
2313   SpaceFile *sf = ptr->data;
2314   struct FSMenu *fsmenu = ED_fsmenu_get();
2315   FSMenuEntry *fsm = ED_fsmenu_get_entry(fsmenu, category, value);
2316
2317   if (fsm && sf->params) {
2318     switch (category) {
2319       case FS_CATEGORY_SYSTEM:
2320         sf->systemnr = value;
2321         break;
2322       case FS_CATEGORY_SYSTEM_BOOKMARKS:
2323         sf->system_bookmarknr = value;
2324         break;
2325       case FS_CATEGORY_BOOKMARKS:
2326         sf->bookmarknr = value;
2327         break;
2328       case FS_CATEGORY_RECENT:
2329         sf->recentnr = value;
2330         break;
2331     }
2332
2333     BLI_strncpy(sf->params->dir, fsm->path, sizeof(sf->params->dir));
2334   }
2335 }
2336
2337 static void rna_FileBrowser_FSMenu_active_range(PointerRNA *UNUSED(ptr),
2338                                                 int *min,
2339                                                 int *max,
2340                                                 int *softmin,
2341                                                 int *softmax,
2342                                                 const FSMenuCategory category)
2343 {
2344   struct FSMenu *fsmenu = ED_fsmenu_get();
2345
2346   *min = *softmin = -1;
2347   *max = *softmax = ED_fsmenu_get_nentries(fsmenu, category) - 1;
2348 }
2349
2350 static void rna_FileBrowser_FSMenu_active_update(struct bContext *C, PointerRNA *UNUSED(ptr))
2351 {
2352   ED_file_change_dir(C);
2353 }
2354
2355 static int rna_FileBrowser_FSMenuSystem_active_get(PointerRNA *ptr)
2356 {
2357   return rna_FileBrowser_FSMenu_active_get(ptr, FS_CATEGORY_SYSTEM);
2358 }
2359
2360 static void rna_FileBrowser_FSMenuSystem_active_set(PointerRNA *ptr, int value)
2361 {
2362   rna_FileBrowser_FSMenu_active_set(ptr, value, FS_CATEGORY_SYSTEM);
2363 }
2364
2365 static void rna_FileBrowser_FSMenuSystem_active_range(
2366     PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
2367 {
2368   rna_FileBrowser_FSMenu_active_range(ptr, min, max, softmin, softmax, FS_CATEGORY_SYSTEM);
2369 }
2370
2371 static int rna_FileBrowser_FSMenuSystemBookmark_active_get(PointerRNA *ptr)
2372 {
2373   return rna_FileBrowser_FSMenu_active_get(ptr, FS_CATEGORY_SYSTEM_BOOKMARKS);
2374 }
2375
2376 static void rna_FileBrowser_FSMenuSystemBookmark_active_set(PointerRNA *ptr, int value)
2377 {
2378   rna_FileBrowser_FSMenu_active_set(ptr, value, FS_CATEGORY_SYSTEM_BOOKMARKS);
2379 }
2380
2381 static void rna_FileBrowser_FSMenuSystemBookmark_active_range(
2382     PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
2383 {
2384   rna_FileBrowser_FSMenu_active_range(
2385       ptr, min, max, softmin, softmax, FS_CATEGORY_SYSTEM_BOOKMARKS);
2386 }
2387
2388 static int rna_FileBrowser_FSMenuBookmark_active_get(PointerRNA *ptr)
2389 {
2390   return rna_FileBrowser_FSMenu_active_get(ptr, FS_CATEGORY_BOOKMARKS);
2391 }
2392
2393 static void rna_FileBrowser_FSMenuBookmark_active_set(PointerRNA *ptr, int value)
2394 {
2395   rna_FileBrowser_FSMenu_active_set(ptr, value, FS_CATEGORY_BOOKMARKS);
2396 }
2397
2398 static void rna_FileBrowser_FSMenuBookmark_active_range(
2399     PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
2400 {
2401   rna_FileBrowser_FSMenu_active_range(ptr, min, max, softmin, softmax, FS_CATEGORY_BOOKMARKS);
2402 }
2403
2404 static int rna_FileBrowser_FSMenuRecent_active_get(PointerRNA *ptr)
2405 {
2406   return rna_FileBrowser_FSMenu_active_get(ptr, FS_CATEGORY_RECENT);
2407 }
2408
2409 static void rna_FileBrowser_FSMenuRecent_active_set(PointerRNA *ptr, int value)
2410 {
2411   rna_FileBrowser_FSMenu_active_set(ptr, value, FS_CATEGORY_RECENT);
2412 }
2413
2414 static void rna_FileBrowser_FSMenuRecent_active_range(
2415     PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
2416 {
2417   rna_FileBrowser_FSMenu_active_range(ptr, min, max, softmin, softmax, FS_CATEGORY_RECENT);
2418 }
2419
2420 #else
2421
2422 static const EnumPropertyItem dt_uv_items[] = {
2423     {SI_UVDT_OUTLINE, "OUTLINE", 0, "Outline", "Display white edges with black outline"},
2424     {SI_UVDT_DASH, "DASH", 0, "Dash", "Display dashed black-white edges"},
2425     {SI_UVDT_BLACK, "BLACK", 0, "Black", "Display black edges"},
2426     {SI_UVDT_WHITE, "WHITE", 0, "White", "Display white edges"},
2427     {0, NULL, 0, NULL, NULL},
2428 };
2429
2430 static void rna_def_space_generic_show_region_toggles(StructRNA *srna, int region_type_mask)
2431 {
2432   PropertyRNA *prop;
2433
2434 #  define DEF_SHOW_REGION_PROPERTY(identifier, label, description) \
2435     { \
2436       prop = RNA_def_property(srna, STRINGIFY(identifier), PROP_BOOLEAN, PROP_NONE); \
2437       RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); \
2438       RNA_def_property_boolean_funcs(prop, \
2439                                      STRINGIFY(rna_Space_##identifier##_get), \
2440                                      STRINGIFY(rna_Space_##identifier##_set)); \
2441       RNA_def_property_ui_text(prop, label, description); \
2442       RNA_def_property_update(prop, 0, STRINGIFY(rna_Space_##identifier##_update)); \
2443     } \
2444     ((void)0)
2445
2446   if (region_type_mask & (1 << RGN_TYPE_TOOL_HEADER)) {
2447     region_type_mask &= ~(1 << RGN_TYPE_TOOL_HEADER);
2448     DEF_SHOW_REGION_PROPERTY(show_region_tool_header, "Tool Header", "");
2449   }
2450   if (region_type_mask & (1 << RGN_TYPE_HEADER)) {
2451     region_type_mask &= ~(1 << RGN_TYPE_HEADER);
2452     DEF_SHOW_REGION_PROPERTY(show_region_header, "Header", "");
2453   }
2454   if (region_type_mask & (1 << RGN_TYPE_TOOLS)) {
2455     region_type_mask &= ~(1 << RGN_TYPE_TOOLS);
2456     DEF_SHOW_REGION_PROPERTY(show_region_toolbar, "Toolbar", "");
2457   }
2458   if (region_type_mask & (1 << RGN_TYPE_UI)) {
2459     region_type_mask &= ~(1 << RGN_TYPE_UI);
2460     DEF_SHOW_REGION_PROPERTY(show_region_ui, "Sidebar", "");
2461   }
2462   if (region_type_mask & (1 << RGN_TYPE_HUD)) {
2463     region_type_mask &= ~(1 << RGN_TYPE_HUD);
2464     DEF_SHOW_REGION_PROPERTY(show_region_hud, "Adjust Last Operation", "");
2465   }
2466   BLI_assert(region_type_mask == 0);
2467 }
2468
2469 static void rna_def_space(BlenderRNA *brna)
2470 {
2471   StructRNA *srna;
2472   PropertyRNA *prop;
2473
2474   srna = RNA_def_struct(brna, "Space", NULL);
2475   RNA_def_struct_sdna(srna, "SpaceLink");
2476   RNA_def_struct_ui_text(srna, "Space", "Space data for a screen area");
2477   RNA_def_struct_refine_func(srna, "rna_Space_refine");
2478
2479   prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
2480   RNA_def_property_enum_sdna(prop, NULL, "spacetype");
2481   RNA_def_property_enum_items(prop, rna_enum_space_type_items);
2482   /* When making this editable, take care for the special case of global areas (see rna_Area_type_set). */
2483   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
2484   RNA_def_property_ui_text(prop, "Type", "Space data type");
2485
2486   /* access to V2D_VIEWSYNC_SCREEN_TIME */
2487   prop = RNA_def_property(srna, "show_locked_time", PROP_BOOLEAN, PROP_NONE);
2488   RNA_def_property_boolean_funcs(prop, "rna_Space_view2d_sync_get", "rna_Space_view2d_sync_set");
2489   RNA_def_property_ui_text(prop, "Lock Time to Other Windows", "");
2490   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TIME, "rna_Space_view2d_sync_update");
2491
2492   rna_def_space_generic_show_region_toggles(srna, (1 << RGN_TYPE_HEADER));
2493 }
2494
2495 /* for all spaces that use a mask */
2496 static void rna_def_space_mask_info(StructRNA *srna, int noteflag, const char *mask_set_func)
2497 {
2498   PropertyRNA *prop;
2499
2500   static const EnumPropertyItem overlay_mode_items[] = {
2501       {MASK_OVERLAY_ALPHACHANNEL,
2502        "ALPHACHANNEL",
2503        ICON_NONE,
2504        "Alpha Channel",
2505        "Show alpha channel of the mask"},
2506       {MASK_OVERLAY_COMBINED,
2507        "COMBINED",
2508        ICON_NONE,
2509        "Combined",
2510        "Combine space background image with the mask"},
2511       {0, NULL, 0, NULL, NULL},
2512   };
2513
2514   prop = RNA_def_property(srna, "mask", PROP_POINTER, PROP_NONE);
2515   RNA_def_property_pointer_sdna(prop, NULL, "mask_info.mask");
2516   RNA_def_property_flag(prop, PROP_EDITABLE);
2517   RNA_def_property_ui_text(prop, "Mask", "Mask displayed and edited in this space");
2518   RNA_def_property_pointer_funcs(prop, NULL, mask_set_func, NULL, NULL);
2519   RNA_def_property_update(prop, noteflag, NULL);
2520
2521   /* mask drawing */
2522   prop = RNA_def_property(srna, "mask_display_type", PROP_ENUM, PROP_NONE);
2523   RNA_def_property_enum_sdna(prop, NULL, "mask_info.draw_type");
2524   RNA_def_property_enum_items(prop, dt_uv_items);
2525   RNA_def_property_ui_text(prop, "Edge Display Type", "Display type for mask splines");
2526   RNA_def_property_update(prop, noteflag, NULL);
2527
2528   prop = RNA_def_property(srna, "show_mask_smooth", PROP_BOOLEAN, PROP_NONE);
2529   RNA_def_property_boolean_sdna(prop, NULL, "mask_info.draw_flag", MASK_DRAWFLAG_SMOOTH);
2530   RNA_def_property_ui_text(prop, "Display Smooth Splines", "");
2531   RNA_def_property_update(prop, noteflag, NULL);
2532
2533   prop = RNA_def_property(srna, "show_mask_overlay", PROP_BOOLEAN, PROP_NONE);
2534   RNA_def_property_boolean_sdna(prop, NULL, "mask_info.draw_flag", MASK_DRAWFLAG_OVERLAY);
2535   RNA_def_property_ui_text(prop, "Show Mask Overlay", "");
2536   RNA_def_property_update(prop, noteflag, NULL);
2537
2538   prop = RNA_def_property(srna, "mask_overlay_mode", PROP_ENUM, PROP_NONE);
2539   RNA_def_property_enum_sdna(prop, NULL, "mask_info.overlay_mode");
2540   RNA_def_property_enum_items(prop, overlay_mode_items);
2541   RNA_def_property_ui_text(prop, "Overlay Mode", "Overlay mode of rasterized mask");
2542   RNA_def_property_update(prop, noteflag, NULL);
2543 }
2544
2545 static void rna_def_space_image_uv(BlenderRNA *brna)
2546 {
2547   StructRNA *srna;
2548   PropertyRNA *prop;
2549
2550   static const EnumPropertyItem sticky_mode_items[] = {
2551       {SI_STICKY_DISABLE,
2552        "DISABLED",
2553        ICON_STICKY_UVS_DISABLE,
2554        "Disabled",
2555        "Sticky vertex selection disabled"},
2556       {SI_STICKY_LOC,
2557        "SHARED_LOCATION",
2558        ICON_STICKY_UVS_LOC,
2559        "Shared Location",
2560        "Select UVs that are at the same location and share a mesh vertex"},
2561       {SI_STICKY_VERTEX,
2562        "SHARED_VERTEX",
2563        ICON_STICKY_UVS_VERT,
2564        "Shared Vertex",
2565        "Select UVs that share mesh vertex, irrespective if they are in the same location"},
2566       {0, NULL, 0, NULL, NULL},
2567   };
2568
2569   static const EnumPropertyItem dt_uvstretch_items[] = {
2570       {SI_UVDT_STRETCH_ANGLE, "ANGLE", 0, "Angle", "Angular distortion between UV and 3D angles"},
2571       {SI_UVDT_STRETCH_AREA, "AREA", 0, "Area", "Area distortion between UV and 3D faces"},
2572       {0, NULL, 0, NULL, NULL},
2573   };
2574
2575   static const EnumPropertyItem pixel_snap_mode_items[] = {
2576       {SI_PIXEL_SNAP_DISABLED, "DISABLED", 0, "Disabled", "Don't snap to pixels"},
2577       {SI_PIXEL_SNAP_CORNER, "CORNER", 0, "Corner", "Snap to pixel corners"},
2578       {SI_PIXEL_SNAP_CENTER, "CENTER", 0, "Center", "Snap to pixel centers"},
2579       {0, NULL, 0, NULL, NULL},
2580   };
2581
2582   srna = RNA_def_struct(brna, "SpaceUVEditor", NULL);
2583   RNA_def_struct_sdna(srna, "SpaceImage");
2584   RNA_def_struct_nested(brna, srna, "SpaceImageEditor");
2585   RNA_def_struct_ui_text(srna, "Space UV Editor", "UV editor data for the image editor space");
2586
2587   /* selection */
2588   prop = RNA_def_property(srna, "sticky_select_mode", PROP_ENUM, PROP_NONE);
2589   RNA_def_property_enum_sdna(prop, NULL, "sticky");
2590   RNA_def_property_enum_items(prop, sticky_mode_items);
2591   RNA_def_property_ui_text(
2592       prop,
2593       "Sticky Selection Mode",
2594       "Automatically select also UVs sharing the same vertex as the ones being selected");
2595   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2596
2597   /* drawing */
2598   prop = RNA_def_property(srna, "edge_display_type", PROP_ENUM, PROP_NONE);
2599   RNA_def_property_enum_sdna(prop, NULL, "dt_uv");
2600   RNA_def_property_enum_items(prop, dt_uv_items);
2601   RNA_def_property_ui_text(prop, "Edge Display Type", "Display type for drawing UV edges");
2602   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2603
2604   prop = RNA_def_property(srna, "show_smooth_edges", PROP_BOOLEAN, PROP_NONE);
2605   RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_SMOOTH_UV);
2606   RNA_def_property_ui_text(prop, "Display Smooth Edges", "Display UV edges anti-aliased");
2607   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2608
2609   prop = RNA_def_property(srna, "show_stretch", PROP_BOOLEAN, PROP_NONE);
2610   RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_STRETCH);
2611   RNA_def_property_ui_text(
2612       prop,
2613       "Display Stretch",
2614       "Display faces colored according to the difference in shape between UVs and "
2615       "their 3D coordinates (blue for low distortion, red for high distortion)");
2616   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2617
2618   prop = RNA_def_property(srna, "display_stretch_type", PROP_ENUM, PROP_NONE);
2619   RNA_def_property_enum_sdna(prop, NULL, "dt_uvstretch");
2620   RNA_def_property_enum_items(prop, dt_uvstretch_items);
2621   RNA_def_property_ui_text(prop, "Display Stretch Type", "Type of stretch to draw");
2622   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2623
2624   prop = RNA_def_property(srna, "show_modified_edges", PROP_BOOLEAN, PROP_NONE);
2625   RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAWSHADOW);
2626   RNA_def_property_ui_text(
2627       prop, "Display Modified Edges", "Display edges after modifiers are applied");
2628   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2629
2630   prop = RNA_def_property(srna, "show_metadata", PROP_BOOLEAN, PROP_NONE);
2631   RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_METADATA);
2632   RNA_def_property_ui_text(prop, "Show Metadata", "Display metadata properties of the image");
2633   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2634
2635   prop = RNA_def_property(srna, "show_texpaint", PROP_BOOLEAN, PROP_NONE);
2636   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SI_NO_DRAW_TEXPAINT);
2637   RNA_def_property_ui_text(
2638       prop, "Display Texture Paint UVs", "Display overlay of texture paint uv layer");
2639   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2640
2641   prop = RNA_def_property(srna, "show_pixel_coords", PROP_BOOLEAN, PROP_NONE);
2642   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SI_COORDFLOATS);
2643   RNA_def_property_ui_text(
2644       prop, "Pixel Coordinates", "Display UV coordinates in pixels rather than from 0.0 to 1.0");
2645   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2646
2647   prop = RNA_def_property(srna, "show_faces", PROP_BOOLEAN, PROP_NONE);
2648   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SI_NO_DRAWFACES);
2649   RNA_def_property_ui_text(prop, "Display Faces", "Display faces over the image");
2650   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2651
2652   prop = RNA_def_property(srna, "show_edges", PROP_BOOLEAN, PROP_NONE);
2653   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SI_NO_DRAWEDGES);
2654   RNA_def_property_ui_text(prop, "Display Edges", "Display edges in vertex select mode");
2655   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2656
2657   /* todo: move edge and face drawing options here from G.f */
2658
2659   prop = RNA_def_property(srna, "pixel_snap_mode", PROP_ENUM, PROP_NONE);
2660   RNA_def_property_enum_items(prop, pixel_snap_mode_items);
2661   RNA_def_property_ui_text(prop, "Snap to Pixels", "Snap UVs to pixels while editing");
2662   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2663
2664   prop = RNA_def_property(srna, "lock_bounds", PROP_BOOLEAN, PROP_NONE);
2665   RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_CLIP_UV);
2666   RNA_def_property_ui_text(prop,
2667                            "Constrain to Image Bounds",
2668                            "Constraint to stay within the image bounds while editing");
2669   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2670
2671   prop = RNA_def_property(srna, "use_live_unwrap", PROP_BOOLEAN, PROP_NONE);
2672   RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_LIVE_UNWRAP);
2673   RNA_def_property_ui_text(
2674       prop,
2675       "Live Unwrap",
2676       "Continuously unwrap the selected UV island while transforming pinned vertices");
2677   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2678 }
2679
2680 static void rna_def_space_outliner(BlenderRNA *brna)
2681 {
2682   StructRNA *srna;
2683   PropertyRNA *prop;
2684
2685   static const EnumPropertyItem display_mode_items[] = {
2686       {SO_SCENES,
2687        "SCENES",
2688        ICON_SCENE_DATA,
2689        "Scenes",
2690        "Display scenes and their view layers, collections and objects"},
2691       {SO_VIEW_LAYER,
2692        "VIEW_LAYER",
2693        ICON_RENDER_RESULT,
2694        "View Layer",
2695        "Display collections and objects in the view layer"},
2696       {SO_SEQUENCE, "SEQUENCE", ICON_SEQUENCE, "Sequence", "Display sequence data-blocks"},
2697       {SO_LIBRARIES,
2698        "LIBRARIES",
2699        ICON_FILE_BLEND,
2700        "Blender File",
2701        "Display data of current file and linked libraries"},
2702       {SO_DATA_API,
2703        "DATA_API",
2704        ICON_RNA,
2705        "Data API",
2706        "Display low level Blender data and its properties"},
2707       {SO_ID_ORPHANS,
2708        "ORPHAN_DATA",
2709        ICON_ORPHAN_DATA,
2710        "Orphan Data",
2711        "Display data-blocks which are unused and/or will be lost when the file is reloaded"},
2712       {0, NULL, 0, NULL, NULL},
2713   };
2714
2715   static const EnumPropertyItem filter_state_items[] = {
2716       {SO_FILTER_OB_ALL, "ALL", 0, "All", "Show all objects in the view layer"},
2717       {SO_FILTER_OB_VISIBLE, "VISIBLE", 0, "Visible", "Show visible objects"},
2718       {SO_FILTER_OB_SELECTED, "SELECTED", 0, "Selected", "Show selected objects"},
2719       {SO_FILTER_OB_ACTIVE, "ACTIVE", 0, "Active", "Show only the active object"},
2720       {0, NULL, 0, NULL, NULL},
2721   };
2722
2723   srna = RNA_def_struct(brna, "SpaceOutliner", "Space");
2724   RNA_def_struct_sdna(srna, "SpaceOutliner");
2725   RNA_def_struct_ui_text(srna, "Space Outliner", "Outliner space data");
2726
2727   prop = RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE);
2728   RNA_def_property_enum_sdna(prop, NULL, "outlinevis");
2729   RNA_def_property_enum_items(prop, display_mode_items);
2730   RNA_def_property_ui_text(prop, "Display Mode", "Type of information to display");
2731   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2732
2733   prop = RNA_def_property(srna, "filter_text", PROP_STRING, PROP_NONE);
2734   RNA_def_property_string_sdna(prop, NULL, "search_string");
2735   RNA_def_property_ui_text(prop, "Display Filter", "Live search filtering string");
2736   RNA_def_property_flag(prop, PROP_TEXTEDIT_UPDATE);
2737   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2738
2739   prop = RNA_def_property(srna, "use_filter_case_sensitive", PROP_BOOLEAN, PROP_NONE);
2740   RNA_def_property_boolean_sdna(prop, NULL, "search_flags", SO_FIND_CASE_SENSITIVE);
2741   RNA_def_property_ui_text(
2742       prop, "Case Sensitive Matches Only", "Only use case sensitive matches of search string");
2743   RNA_def_property_ui_icon(prop, ICON_SYNTAX_OFF, 0);
2744   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2745
2746   prop = RNA_def_property(srna, "use_filter_complete", PROP_BOOLEAN, PROP_NONE);
2747   RNA_def_property_boolean_sdna(prop, NULL, "search_flags", SO_FIND_COMPLETE);
2748   RNA_def_property_ui_text(
2749       prop, "Complete Matches Only", "Only use complete matches of search string");
2750   RNA_def_property_ui_icon(prop, ICON_OUTLINER_DATA_FONT, 0);
2751   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2752
2753   prop = RNA_def_property(srna, "use_sort_alpha", PROP_BOOLEAN, PROP_NONE);
2754   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SO_SKIP_SORT_ALPHA);
2755   RNA_def_property_ui_text(prop, "Sort Alphabetically", "");
2756   RNA_def_property_ui_icon(prop, ICON_SORTALPHA, 0);
2757   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2758
2759   prop = RNA_def_property(srna, "show_restrict_columns", PROP_BOOLEAN, PROP_NONE);
2760   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SO_HIDE_RESTRICTCOLS);
2761   RNA_def_property_ui_text(prop, "Show Restriction Columns", "Show column");
2762   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2763
2764   /* Filters. */
2765   prop = RNA_def_property(srna, "use_filter_object", PROP_BOOLEAN, PROP_NONE);
2766   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OBJECT);
2767   RNA_def_property_ui_text(prop, "Filter Objects", "Show objects");
2768   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2769
2770   prop = RNA_def_property(srna, "use_filter_object_content", PROP_BOOLEAN, PROP_NONE);
2771   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_CONTENT);
2772   RNA_def_property_ui_text(
2773       prop, "Show Object Contents", "Show what is inside the objects elements");
2774   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2775
2776   prop = RNA_def_property(srna, "use_filter_children", PROP_BOOLEAN, PROP_NONE);
2777   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_CHILDREN);
2778   RNA_def_property_ui_text(prop, "Show Object Children", "Show children");
2779   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2780
2781   prop = RNA_def_property(srna, "use_filter_collection", PROP_BOOLEAN, PROP_NONE);
2782   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_COLLECTION);
2783   RNA_def_property_ui_text(prop, "Show Collections", "Show collections");
2784   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2785
2786   /* Filters object state. */
2787   prop = RNA_def_property(srna, "filter_state", PROP_ENUM, PROP_NONE);
2788   RNA_def_property_enum_sdna(prop, NULL, "filter_state");
2789   RNA_def_property_enum_items(prop, filter_state_items);
2790   RNA_def_property_ui_text(prop, "Object State Filter", "");
2791   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2792
2793   /* Filters object type. */
2794   prop = RNA_def_property(srna, "use_filter_object_mesh", PROP_BOOLEAN, PROP_NONE);
2795   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_MESH);
2796   RNA_def_property_ui_text(prop, "Show Meshes", "Show mesh objects");
2797   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2798
2799   prop = RNA_def_property(srna, "use_filter_object_armature", PROP_BOOLEAN, PROP_NONE);
2800   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_ARMATURE);
2801   RNA_def_property_ui_text(prop, "Show Armatures", "Show armature objects");
2802   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2803
2804   prop = RNA_def_property(srna, "use_filter_object_empty", PROP_BOOLEAN, PROP_NONE);
2805   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_EMPTY);
2806   RNA_def_property_ui_text(prop, "Show Empties", "Show empty objects");
2807   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2808
2809   prop = RNA_def_property(srna, "use_filter_object_light", PROP_BOOLEAN, PROP_NONE);
2810   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_LAMP);
2811   RNA_def_property_ui_text(prop, "Show Lights", "Show light objects");
2812   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2813
2814   prop = RNA_def_property(srna, "use_filter_object_camera", PROP_BOOLEAN, PROP_NONE);
2815   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_CAMERA);
2816   RNA_def_property_ui_text(prop, "Show Cameras", "Show camera objects");
2817   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2818
2819   prop = RNA_def_property(srna, "use_filter_object_others", PROP_BOOLEAN, PROP_NONE);
2820   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_OTHERS);
2821   RNA_def_property_ui_text(
2822       prop, "Show Other Objects", "Show curves, lattices, light probes, fonts, ...");
2823   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2824
2825   /* Libraries filter. */
2826   prop = RNA_def_property(srna, "use_filter_id_type", PROP_BOOLEAN, PROP_NONE);
2827   RNA_def_property_boolean_sdna(prop, NULL, "filter", SO_FILTER_ID_TYPE);
2828   RNA_def_property_ui_text(prop, "Filter By Type", "Show only data-blocks of one type");
2829   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2830
2831   prop = RNA_def_property(srna, "filter_id_type", PROP_ENUM, PROP_NONE);
2832   RNA_def_property_enum_sdna(prop, NULL, "filter_id_type");
2833   RNA_def_property_enum_items(prop, rna_enum_id_type_items);
2834   RNA_def_property_ui_text(prop, "Filter ID Type", "Data-block type to show");
2835   RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_ID);
2836 }
2837
2838 static void rna_def_space_view3d_shading(BlenderRNA *brna)
2839 {
2840   StructRNA *srna;
2841   PropertyRNA *prop;
2842
2843   static const EnumPropertyItem background_type_items[] = {
2844       {V3D_SHADING_BACKGROUND_THEME, "THEME", 0, "Theme", "Use the theme for background color"},
2845       {V3D_SHADING_BACKGROUND_WORLD, "WORLD", 0, "World", "Use the world for background color"},
2846       {V3D_SHADING_BACKGROUND_VIEWPORT,
2847        "VIEWPORT",
2848        0,
2849        "Viewport",
2850        "Use a custom color limited to this viewport only"},
2851       {0, NULL, 0, NULL, NULL},
2852   };
2853   static const float default_background_color[] = {0.05f, 0.05f, 0.05f};
2854
2855   static const EnumPropertyItem cavity_type_items[] = {
2856       {V3D_SHADING_CAVITY_SSAO,
2857        "WORLD",
2858        0,
2859        "World",
2860        "Cavity shading computed in world space, useful for larger-scale occlusion"},
2861       {V3D_SHADING_CAVITY_CURVATURE,
2862        "SCREEN",
2863        0,
2864        "Screen",
2865        "Curvature-based shading, useful for making fine details more visible"},
2866       {V3D_SHADING_CAVITY_BOTH, "BOTH", 0, "Both", "Use both effects simultaneously"},
2867       {0, NULL, 0, NULL, NULL},
2868   };
2869
2870   /* Note these settings are used for both 3D viewport and the OpenGL render
2871    * engine in the scene, so can't assume to always be part of a screen. */
2872   srna = RNA_def_struct(brna, "View3DShading", NULL);
2873   RNA_def_struct_path_func(srna, "rna_View3DShading_path");
2874   RNA_def_struct_ui_text(
2875       srna, "3D View Shading Settings", "Settings for shading in the 3D viewport");
2876
2877   prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
2878   RNA_def_property_enum_items(prop, rna_enum_shading_type_items);
2879   RNA_def_property_enum_funcs(prop,
2880                               "rna_3DViewShading_type_get",
2881                               "rna_3DViewShading_type_set",
2882                               "rna_3DViewShading_type_itemf");
2883   RNA_def_property_ui_text(
2884       prop, "Viewport Shading", "Method to display/shade objects in the 3D View");
2885   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_3DViewShading_type_update");
2886
2887   prop = RNA_def_property(srna, "light", PROP_ENUM, PROP_NONE);
2888   RNA_def_property_enum_sdna(prop, NULL, "light");
2889   RNA_def_property_enum_items(prop, rna_enum_viewport_lighting_items);
2890   RNA_def_property_enum_funcs(
2891       prop, "rna_View3DShading_light_get", "rna_View3DShading_light_set", NULL);
2892   RNA_def_property_ui_text(prop, "Lighting", "Lighting Method for Solid/Texture Viewport Shading");
2893   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2894
2895   prop = RNA_def_property(srna, "show_object_outline", PROP_BOOLEAN, PROP_NONE);
2896   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_OBJECT_OUTLINE);
2897   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
2898   RNA_def_property_ui_text(prop, "Outline", "Show Object Outline");
2899   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2900
2901   prop = RNA_def_property(srna, "studio_light", PROP_ENUM, PROP_NONE);
2902   RNA_def_property_enum_items(prop, rna_enum_studio_light_items);
2903   RNA_def_property_enum_default(prop, 0);
2904   RNA_def_property_enum_funcs(prop,
2905                               "rna_View3DShading_studio_light_get",
2906                               "rna_View3DShading_studio_light_set",
2907                               "rna_View3DShading_studio_light_itemf");
2908   RNA_def_property_ui_text(prop, "Studiolight", "Studio lighting setup");
2909   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2910
2911   prop = RNA_def_property(srna, "use_world_space_lighting", PROP_BOOLEAN, PROP_NONE);
2912   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_WORLD_ORIENTATION);
2913   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
2914   RNA_def_property_ui_text(
2915       prop, "World Space Lighting", "Make the lighting fixed and not follow the camera");
2916   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2917
2918   prop = RNA_def_property(srna, "show_backface_culling", PROP_BOOLEAN, PROP_NONE);
2919   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_BACKFACE_CULLING);
2920   RNA_def_property_ui_text(
2921       prop, "Backface Culling", "Use back face culling to hide the back side of faces");
2922   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2923
2924   prop = RNA_def_property(srna, "show_cavity", PROP_BOOLEAN, PROP_NONE);
2925   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_CAVITY);
2926   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
2927   RNA_def_property_ui_text(prop, "Cavity", "Show Cavity");
2928   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2929
2930   prop = RNA_def_property(srna, "cavity_type", PROP_ENUM, PROP_NONE);
2931   RNA_def_property_enum_items(prop, cavity_type_items);
2932   RNA_def_property_ui_text(prop, "Cavity Type", "Way to draw the cavity shading");
2933   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2934
2935   prop = RNA_def_property(srna, "curvature_ridge_factor", PROP_FLOAT, PROP_FACTOR);
2936   RNA_def_property_float_sdna(prop, NULL, "curvature_ridge_factor");
2937   RNA_def_property_float_default(prop, 1.0f);
2938   RNA_def_property_ui_text(prop, "Curvature Ridge", "Factor for the curvature ridges");
2939   RNA_def_property_range(prop, 0.0f, 2.0f);
2940   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
2941   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2942
2943   prop = RNA_def_property(srna, "curvature_valley_factor", PROP_FLOAT, PROP_FACTOR);
2944   RNA_def_property_float_sdna(prop, NULL, "curvature_valley_factor");
2945   RNA_def_property_float_default(prop, 1.0f);
2946   RNA_def_property_ui_text(prop, "Curvature Valley", "Factor for the curvature valleys");
2947   RNA_def_property_range(prop, 0.0f, 2.0f);
2948   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
2949   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2950
2951   prop = RNA_def_property(srna, "cavity_ridge_factor", PROP_FLOAT, PROP_FACTOR);
2952   RNA_def_property_float_sdna(prop, NULL, "cavity_ridge_factor");
2953   RNA_def_property_float_default(prop, 1.0f);
2954   RNA_def_property_ui_text(prop, "Cavity Ridge", "Factor for the cavity ridges");
2955   RNA_def_property_range(prop, 0.0f, 250.0f);
2956   RNA_def_property_ui_range(prop, 0.00f, 2.5f, 1, 3);
2957   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
2958   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2959
2960   prop = RNA_def_property(srna, "cavity_valley_factor", PROP_FLOAT, PROP_FACTOR);
2961   RNA_def_property_float_sdna(prop, NULL, "cavity_valley_factor");
2962   RNA_def_property_float_default(prop, 1.0);
2963   RNA_def_property_ui_text(prop, "Cavity Valley", "Factor for the cavity valleys");
2964   RNA_def_property_range(prop, 0.0f, 250.0f);
2965   RNA_def_property_ui_range(prop, 0.00f, 2.5f, 1, 3);
2966   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
2967   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2968
2969   prop = RNA_def_property(srna, "selected_studio_light", PROP_POINTER, PROP_NONE);
2970   RNA_def_property_struct_type(prop, "StudioLight");
2971   RNA_define_verify_sdna(0);
2972   RNA_def_property_ui_text(prop, "Studio Light", "Selected StudioLight");
2973   RNA_def_property_pointer_funcs(
2974       prop, "rna_View3DShading_selected_studio_light_get", NULL, NULL, NULL);
2975   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
2976   RNA_define_verify_sdna(1);
2977
2978   prop = RNA_def_property(srna, "studiolight_rotate_z", PROP_FLOAT, PROP_ANGLE);
2979   RNA_def_property_float_sdna(prop, NULL, "studiolight_rot_z");
2980   RNA_def_property_float_default(prop, 0.0);
2981   RNA_def_property_ui_text(
2982       prop, "Studiolight Rotation", "Rotation of the studiolight around the Z-Axis");
2983   RNA_def_property_range(prop, -M_PI, M_PI);
2984   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
2985   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2986
2987   prop = RNA_def_property(srna, "color_type", PROP_ENUM, PROP_NONE);
2988   RNA_def_property_enum_sdna(prop, NULL, "color_type");
2989   RNA_def_property_enum_items(prop, rna_enum_shading_color_type_items);
2990   RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_View3DShading_color_type_itemf");
2991   RNA_def_property_ui_text(prop, "Color", "Color Type");
2992   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2993
2994   prop = RNA_def_property(srna, "wireframe_color_type", PROP_ENUM, PROP_NONE);
2995   RNA_def_property_enum_sdna(prop, NULL, "wire_color_type");
2996   RNA_def_property_enum_items(prop, rna_enum_shading_color_type_items);
2997   RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_View3DShading_color_type_itemf");
2998   RNA_def_property_ui_text(prop, "Color", "Color Type");
2999   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3000
3001   prop = RNA_def_property(srna, "single_color", PROP_FLOAT, PROP_COLOR);
3002   RNA_def_property_float_sdna(prop, NULL, "single_color");
3003   RNA_def_property_array(prop, 3);
3004   RNA_def_property_ui_text(prop, "Color", "Color for single color mode");
3005   RNA_def_property_range(prop, 0.0f, 1.0f);
3006   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3007
3008   prop = RNA_def_property(srna, "background_type", PROP_ENUM, PROP_NONE);
3009   RNA_def_property_enum_items(prop, background_type_items);
3010   RNA_def_property_ui_text(prop, "Background", "Way to draw the background");
3011   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3012
3013   prop = RNA_def_property(srna, "background_color", PROP_FLOAT, PROP_COLOR);
3014   RNA_def_property_array(prop, 3);
3015   RNA_def_property_float_array_default(prop, default_background_color);
3016   RNA_def_property_ui_text(prop, "Background Color", "Color for custom background color");
3017   RNA_def_property_range(prop, 0.0f, 1.0f);
3018   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3019
3020   prop = RNA_def_property(srna, "show_shadows", PROP_BOOLEAN, PROP_NONE);
3021   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_SHADOW);
3022   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3023   RNA_def_property_ui_text(prop, "Shadow", "Show Shadow");
3024   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3025
3026   prop = RNA_def_property(srna, "show_xray", PROP_BOOLEAN, PROP_NONE);
3027   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_XRAY);
3028   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3029   RNA_def_property_ui_text(prop, "Show X-Ray", "Show whole scene transparent");
3030   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3031
3032   prop = RNA_def_property(srna, "show_xray_wireframe", PROP_BOOLEAN, PROP_NONE);
3033   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_XRAY_BONE);
3034   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3035   RNA_def_property_ui_text(prop, "Show X-Ray", "Show whole scene transparent");
3036   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3037
3038   prop = RNA_def_property(srna, "xray_alpha", PROP_FLOAT, PROP_FACTOR);
3039   RNA_def_property_float_sdna(prop, NULL, "xray_alpha");
3040   RNA_def_property_float_default(prop, 0.5);
3041   RNA_def_property_ui_text(prop, "X-Ray Alpha", "Amount of alpha to use");
3042   RNA_def_property_range(prop, 0.0f, 1.0f);
3043   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3044   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3045
3046   prop = RNA_def_property(srna, "xray_alpha_wireframe", PROP_FLOAT, PROP_FACTOR);
3047   RNA_def_property_float_sdna(prop, NULL, "xray_alpha_wire");
3048   RNA_def_property_float_default(prop, 0.5);
3049   RNA_def_property_ui_text(prop, "X-Ray Alpha", "Amount of alpha to use");
3050   RNA_def_property_range(prop, 0.0f, 1.0f);
3051   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3052   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3053
3054   prop = RNA_def_property(srna, "use_dof", PROP_BOOLEAN, PROP_NONE);
3055   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_DEPTH_OF_FIELD);
3056   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3057   RNA_def_property_ui_text(
3058       prop,
3059       "Depth Of Field",
3060       "Use depth of field on viewport using the values from the active camera");
3061   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3062
3063   prop = RNA_def_property(srna, "use_scene_lights", PROP_BOOLEAN, PROP_NONE);
3064   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_SCENE_LIGHTS);
3065   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3066   RNA_def_property_ui_text(prop, "Scene Lights", "Render lights and light probes of the scene");
3067   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3068
3069   prop = RNA_def_property(srna, "use_scene_world", PROP_BOOLEAN, PROP_NONE);
3070   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_SCENE_WORLD);
3071   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3072   RNA_def_property_ui_text(prop, "Scene World", "Use scene world for lighting");
3073   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3074
3075   prop = RNA_def_property(srna, "show_specular_highlight", PROP_BOOLEAN, PROP_NONE);
3076   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_SPECULAR_HIGHLIGHT);
3077   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3078   RNA_def_property_ui_text(prop, "Specular Highlights", "Render specular highlights");
3079   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3080
3081   prop = RNA_def_property(srna, "object_outline_color", PROP_FLOAT, PROP_COLOR);
3082   RNA_def_property_float_sdna(prop, NULL, "object_outline_color");
3083   RNA_def_property_array(prop, 3);
3084   RNA_def_property_ui_text(prop, "Outline Color", "Color for object outline");
3085   RNA_def_property_range(prop, 0.0f, 1.0f);
3086   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3087
3088   prop = RNA_def_property(srna, "shadow_intensity", PROP_FLOAT, PROP_FACTOR);
3089   RNA_def_property_float_sdna(prop, NULL, "shadow_intensity");
3090   RNA_def_property_float_default(prop, 0.5);
3091   RNA_def_property_ui_text(prop, "Shadow Intensity", "Darkness of shadows");
3092   RNA_def_property_range(prop, 0.0f, 1.0f);
3093   RNA_def_property_ui_range(prop, 0.00f, 1.0f, 1, 3);
3094   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3095   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3096
3097   prop = RNA_def_property(srna, "studiolight_background_alpha", PROP_FLOAT, PROP_FACTOR);
3098   RNA_def_property_float_sdna(prop, NULL, "studiolight_background");
3099   RNA_def_property_float_default(prop, 0.0);
3100   RNA_def_property_ui_text(prop, "Background", "Show the studiolight in the background");
3101   RNA_def_property_range(prop, 0.0f, 1.0f);
3102   RNA_def_property_ui_range(prop, 0.00f, 1.0f, 1, 3);
3103   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3104   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3105 }
3106
3107 static void rna_def_space_view3d_overlay(BlenderRNA *brna)
3108 {
3109   StructRNA *srna;
3110   PropertyRNA *prop;
3111
3112   srna = RNA_def_struct(brna, "View3DOverlay", NULL);
3113   RNA_def_struct_sdna(srna, "View3D");
3114   RNA_def_struct_nested(brna, srna, "SpaceView3D");
3115   RNA_def_struct_path_func(srna, "rna_View3DOverlay_path");
3116   RNA_def_struct_ui_text(
3117       srna, "3D View Overlay Settings", "Settings for display of overlays in the 3D viewport");
3118
3119   prop = RNA_def_property(srna, "show_overlays", PROP_BOOLEAN, PROP_NONE);
3120   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag2", V3D_HIDE_OVERLAYS);
3121   RNA_def_property_ui_text(prop, "Show Overlays", "Display overlays like gizmos and outlines");
3122   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3123
3124   prop = RNA_def_property(srna, "show_ortho_grid", PROP_BOOLEAN, PROP_NONE);
3125   RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_ORTHO_GRID);
3126   RNA_def_property_ui_text(prop, "Display Grid", "Show grid in othographic side view");
3127   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3128
3129   prop = RNA_def_property(srna, "show_floor", PROP_BOOLEAN, PROP_NONE);
3130   RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_FLOOR);
3131   RNA_def_property_ui_text(
3132       prop, "Display Grid Floor", "Show the ground plane grid in perspective view");
3133   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3134
3135   prop = RNA_def_property(srna, "show_axis_x", PROP_BOOLEAN, PROP_NONE);
3136   RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_X);
3137   RNA_def_property_ui_text(prop, "Display X Axis", "Show the X axis line in perspective view");
3138   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3139
3140   prop = RNA_def_property(srna, "show_axis_y", PROP_BOOLEAN, PROP_NONE);
3141   RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_Y);
3142   RNA_def_property_ui_text(prop, "Display Y Axis", "Show the Y axis line in perspective view");
3143   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3144
3145   prop = RNA_def_property(srna, "show_axis_z", PROP_BOOLEAN, PROP_NONE);
3146   RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_Z);
3147   RNA_def_property_ui_text(prop, "Display Z Axis", "Show the Z axis line in perspective view");
3148   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3149
3150   prop = RNA_def_property(srna, "grid_scale", PROP_FLOAT, PROP_NONE);
3151   RNA_def_property_float_sdna(prop, NULL, "grid");
3152   RNA_def_property_ui_text(prop, "Grid Scale", "Distance between 3D View grid lines");
3153   RNA_def_property_range(prop, 0.0f, FLT_MAX);
3154   RNA_def_property_ui_range(prop, 0.001f, 1000.0f, 0.1f, 3);
3155   RNA_def_property_float_default(prop, 1.0f);
3156   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3157
3158   prop = RNA_def_property(srna, "grid_lines", PROP_INT, PROP_NONE);
3159   RNA_def_property_int_sdna(prop, NULL, "gridlines");
3160   RNA_def_property_ui_text(
3161       prop, "Grid Lines", "Number of grid lines to display in perspective view");
3162   RNA_def_property_range(prop, 0, 1024);
3163   RNA_def_property_int_default(prop, 16);
3164   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3165
3166   prop = RNA_def_property(srna, "grid_subdivisions", PROP_INT, PROP_NONE);
3167   RNA_def_property_int_sdna(prop, NULL, "gridsubdiv");
3168   RNA_def_property_ui_text(prop, "Grid Subdivisions", "Number of subdivisions between grid lines");
3169   RNA_def_property_range(prop, 1, 1024);
3170   RNA_def_property_int_default(prop, 10);
3171   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3172
3173   prop = RNA_def_property(srna, "grid_scale_unit", PROP_FLOAT, PROP_NONE);
3174   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
3175   RNA_def_property_float_funcs(prop, "rna_View3DOverlay_GridScaleUnit_get", NULL, NULL);
3176   RNA_def_property_ui_text(
3177       prop, "Grid Scale Unit", "Grid cell size scaled by scene unit system settings");
3178
3179   prop = RNA_def_property(srna, "show_outline_selected", PROP_BOOLEAN, PROP_NONE);
3180   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SELECT_OUTLINE);
3181   RNA_def_property_ui_text(
3182       prop,
3183       "Outline Selected",
3184       "Show an outline highlight around selected objects in non-wireframe views");
3185   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3186
3187   prop = RNA_def_property(srna, "show_object_origins", PROP_BOOLEAN, PROP_NONE);
3188   RNA_def_property_boolean_negative_sdna(
3189       prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_OBJECT_ORIGINS);
3190   RNA_def_property_ui_text(prop, "Object Origins", "Show object center dots");
3191   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3192
3193   prop = RNA_def_property(srna, "show_object_origins_all", PROP_BOOLEAN, PROP_NONE);
3194   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_DRAW_CENTERS);
3195   RNA_def_property_ui_text(
3196       prop,
3197       "All Object Origins",
3198       "Show the object origin center dot for all (selected and unselected) objects");
3199   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3200
3201   prop = RNA_def_property(srna, "show_relationship_lines", PROP_BOOLEAN, PROP_NONE);
3202   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", V3D_HIDE_HELPLINES);
3203   RNA_def_property_ui_text(prop,
3204                            "Relationship Lines",
3205                            "Show dashed lines indicating parent or constraint relationships");
3206   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3207
3208   prop = RNA_def_property(srna, "show_cursor", PROP_BOOLEAN, PROP_NONE);
3209   RNA_def_property_boolean_negative_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_CURSOR);
3210   RNA_def_property_ui_text(prop, "Show 3D Cursor", "Display 3D Cursor Overlay");
3211   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3212
3213   prop = RNA_def_property(srna, "show_text", PROP_BOOLEAN, PROP_NONE);
3214   RNA_def_property_boolean_negative_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_TEXT);
3215   RNA_def_property_ui_text(prop, "Show Text", "Display overlay text");
3216   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3217
3218   prop = RNA_def_property(srna, "show_extras", PROP_BOOLEAN, PROP_NONE);
3219   RNA_def_property_boolean_negative_sdna(
3220       prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_OBJECT_XTRAS);
3221   RNA_def_property_ui_text(
3222       prop, "Extras", "Object details, including empty wire, cameras and other visual guides");
3223   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3224
3225   prop = RNA_def_property(srna, "show_bones", PROP_BOOLEAN, PROP_NONE);
3226   RNA_def_property_boolean_negative_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_BONES);
3227   RNA_def_property_ui_text(
3228       prop, "Show Bones", "Display bones (disable to show motion paths only)");
3229   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3230
3231   prop = RNA_def_property(srna, "show_face_orientation", PROP_BOOLEAN, PROP_NONE);
3232   RNA_def_property_boolean_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_FACE_ORIENTATION);
3233   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3234   RNA_def_property_ui_text(prop, "Face Orientation", "Show the Face Orientation Overlay");
3235   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3236
3237   prop = RNA_def_property(srna, "show_xray_bone", PROP_BOOLEAN, PROP_NONE);
3238   RNA_def_property_boolean_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_BONE_SELECT);
3239   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3240   RNA_def_property_ui_text(prop, "Show Bone X-Ray", "Show the bone selection overlay");
3241   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3242
3243   prop = RNA_def_property(srna, "xray_alpha_bone", PROP_FLOAT, PROP_FACTOR);
3244   RNA_def_property_float_sdna(prop, NULL, "overlay.xray_alpha_bone");
3245   RNA_def_property_float_default(prop, 0.5f);
3246   RNA_def_property_ui_text(prop, "Opacity", "Opacity to use for bone selection");
3247   RNA_def_property_range(prop, 0.0f, 1.0f);
3248   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3249   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3250
3251   prop = RNA_def_property(srna, "show_motion_paths", PROP_BOOLEAN, PROP_NONE);
3252   RNA_def_property_boolean_negative_sdna(
3253       prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_MOTION_PATHS);
3254   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3255   RNA_def_property_ui_text(prop, "Motion Paths", "Show the Motion Paths Overlay");
3256   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3257
3258   prop = RNA_def_property(srna, "show_onion_skins", PROP_BOOLEAN, PROP_NONE);
3259   RNA_def_property_boolean_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_ONION_SKINS);
3260   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3261   RNA_def_property_ui_text(prop, "Onion Skins", "Show the Onion Skinning Overlay");
3262   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3263
3264   prop = RNA_def_property(srna, "show_look_dev", PROP_BOOLEAN, PROP_NONE);
3265   RNA_def_property_boolean_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_LOOK_DEV);
3266   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3267   RNA_def_property_ui_text(prop, "Look Dev Preview", "Show look development balls and palette");
3268   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3269
3270   prop = RNA_def_property(srna, "show_wireframes", PROP_BOOLEAN, PROP_NONE);
3271   RNA_def_property_boolean_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_WIREFRAMES);
3272   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3273   RNA_def_property_ui_text(prop, "Wireframe", "Show face edges wires");
3274   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3275
3276   prop = RNA_def_property(srna, "wireframe_threshold", PROP_FLOAT, PROP_FACTOR);
3277   RNA_def_property_float_sdna(prop, NULL, "overlay.wireframe_threshold");
3278   RNA_def_property_float_default(prop, 0.5f);
3279   RNA_def_property_ui_text(
3280       prop, "Wireframe Threshold", "Adjust the number of wires displayed (1 for all wires)");
3281   RNA_def_property_range(prop, 0.0f, 1.0f);
3282   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3283   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3284
3285   prop = RNA_def_property(srna, "show_paint_wire", PROP_BOOLEAN, PROP_NONE);
3286   RNA_def_property_boolean_sdna(prop, NULL, "overlay.paint_flag", V3D_OVERLAY_PAINT_WIRE);
3287   RNA_def_property_ui_text(prop, "Show Wire", "Use wireframe display in painting modes");
3288   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3289
3290   prop = RNA_def_property(srna, "show_wpaint_contours", PROP_BOOLEAN, PROP_NONE);
3291   RNA_def_property_boolean_sdna(prop, NULL, "overlay.wpaint_flag", V3D_OVERLAY_WPAINT_CONTOURS);
3292   RNA_def_property_ui_text(
3293       prop,
3294       "Show Weight Contours",
3295       "Show contour lines formed by points with the same interpolated weight");
3296   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3297
3298   prop = RNA_def_property(srna, "show_weight", PROP_BOOLEAN, PROP_NONE);
3299   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_WEIGHT);
3300   RNA_def_property_ui_text(prop, "Show Weights", "Display weights in editmode");
3301   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3302
3303   prop = RNA_def_property(srna, "show_occlude_wire", PROP_BOOLEAN, PROP_NONE);
3304   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_OCCLUDE_WIRE);
3305   RNA_def_property_ui_text(prop, "Hidden Wire", "Use hidden wireframe display");
3306   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3307
3308   prop = RNA_def_property(srna, "show_face_normals", PROP_BOOLEAN, PROP_NONE);
3309   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_NORMALS);
3310   RNA_def_property_ui_text(prop, "Display Normals", "Display face normals as lines");
3311   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3312
3313   prop = RNA_def_property(srna, "show_vertex_normals", PROP_BOOLEAN, PROP_NONE);
3314   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_VERT_NORMALS);
3315   RNA_def_property_ui_text(prop, "Display Vertex Normals", "Display vertex normals as lines");
3316   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3317
3318   prop = RNA_def_property(srna, "show_split_normals", PROP_BOOLEAN, PROP_NONE);
3319   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_LOOP_NORMALS);
3320   RNA_def_property_ui_text(
3321       prop, "Display Split Normals", "Display vertex-per-face normals as lines");
3322   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3323
3324   prop = RNA_def_property(srna, "show_edges", PROP_BOOLEAN, PROP_NONE);
3325   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_EDGES);
3326   RNA_def_property_ui_text(
3327       prop, "Draw Edges", "Display selected edges using highlights in the 3D view and UV editor");
3328   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3329
3330   prop = RNA_def_property(srna, "show_faces", PROP_BOOLEAN, PROP_NONE);
3331   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACES);
3332   RNA_def_property_ui_text(
3333       prop, "Draw Faces", "Display all faces as shades in the 3D view and UV editor");
3334   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3335
3336   prop = RNA_def_property(srna, "show_face_center", PROP_BOOLEAN, PROP_NONE);
3337   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_DOT);
3338   RNA_def_property_ui_text(prop,
3339                            "Draw Face Center",
3340                            "Display face center "
3341                            "(when disabled, edges display wider in edge mode)");
3342   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3343
3344   prop = RNA_def_property(srna, "show_edge_crease", PROP_BOOLEAN, PROP_NONE);
3345   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_CREASES);
3346   RNA_def_property_ui_text(
3347       prop, "Draw Creases", "Display creases created for Subdivision Surface modifier");
3348   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3349
3350   prop = RNA_def_property(srna, "show_edge_bevel_weight", PROP_BOOLEAN, PROP_NONE);
3351   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_BWEIGHTS);
3352   RNA_def_property_ui_text(
3353       prop, "Draw Bevel Weights", "Display weights created for the Bevel modifier");
3354   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3355
3356   prop = RNA_def_property(srna, "show_edge_seams", PROP_BOOLEAN, PROP_NONE);
3357   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_SEAMS);
3358   RNA_def_property_ui_text(prop, "Draw Seams", "Display UV unwrapping seams");
3359   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3360
3361   prop = RNA_def_property(srna, "show_edge_sharp", PROP_BOOLEAN, PROP_NONE);
3362   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_SHARP);
3363   RNA_def_property_ui_text(
3364       prop, "Draw Sharp", "Display sharp edges, used with the Edge Split modifier");
3365   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3366
3367   prop = RNA_def_property(srna, "show_freestyle_edge_marks", PROP_BOOLEAN, PROP_NONE);
3368   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FREESTYLE_EDGE);
3369   RNA_def_property_ui_text(prop,
3370                            "Draw Freestyle Edge Marks",
3371                            "Display Freestyle edge marks, used with the Freestyle renderer");
3372   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3373
3374   prop = RNA_def_property(srna, "show_freestyle_face_marks", PROP_BOOLEAN, PROP_NONE);
3375   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FREESTYLE_FACE);
3376   RNA_def_property_ui_text(prop,
3377                            "Draw Freestyle Face Marks",
3378                            "Display Freestyle face marks, used with the Freestyle renderer");
3379   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3380
3381   prop = RNA_def_property(srna, "show_statvis", PROP_BOOLEAN, PROP_NONE);
3382   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_STATVIS);
3383   RNA_def_property_ui_text(prop, "Stat Vis", "Display statistical information about the mesh");
3384   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3385
3386   prop = RNA_def_property(srna, "show_extra_edge_length", PROP_BOOLEAN, PROP_NONE);
3387   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_EDGE_LEN);
3388   RNA_def_property_ui_text(
3389       prop,
3390       "Edge Length",
3391       "Display selected edge lengths, using global values when set in the transform panel");
3392   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3393
3394   prop = RNA_def_property(srna, "show_extra_edge_angle", PROP_BOOLEAN, PROP_NONE);
3395   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_EDGE_ANG);
3396   RNA_def_property_ui_text(
3397       prop,
3398       "Edge Angle",
3399       "Display selected edge angle, using global values when set in the transform panel");
3400   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3401
3402   prop = RNA_def_property(srna, "show_extra_face_angle", PROP_BOOLEAN, PROP_NONE);
3403   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_ANG);
3404   RNA_def_property_ui_text(prop,
3405                            "Face Angles",
3406                            "Display the angles in the selected edges, "
3407                            "using global values when set in the transform panel");
3408   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3409
3410   prop = RNA_def_property(srna, "show_extra_face_area", PROP_BOOLEAN, PROP_NONE);
3411   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_AREA);
3412   RNA_def_property_ui_text(prop,
3413                            "Face Area",
3414                            "Display the area of selected faces, "
3415                            "using global values when set in the transform panel");
3416   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3417
3418   prop = RNA_def_property(srna, "show_extra_indices", PROP_BOOLEAN, PROP_NONE);
3419   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_INDICES);
3420   RNA_def_property_ui_text(
3421       prop, "Indices", "Display the index numbers of selected vertices, edges, and faces");
3422   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3423
3424   prop = RNA_def_property(srna, "show_curve_handles", PROP_BOOLEAN, PROP_NONE);
3425   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_CU_HANDLES);
3426   RNA_def_property_ui_text(prop, "Draw Handles", "Display Bezier handles in editmode");
3427   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3428
3429   prop = RNA_def_property(srna, "show_curve_normals", PROP_BOOLEAN, PROP_NONE);
3430   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_CU_NORMALS);
3431   RNA_def_property_ui_text(prop, "Draw Normals", "Display 3D curve normals in editmode");
3432   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3433
3434   prop = RNA_def_property(srna, "normals_length", PROP_FLOAT, PROP_FACTOR);
3435   RNA_def_property_float_sdna(prop, NULL, "overlay.normals_length");
3436   RNA_def_property_ui_text(prop, "Normal Size", "Display size for normals in the 3D view");
3437   RNA_def_property_range(prop, 0.00001, 100000.0);
3438   RNA_def_property_ui_range(prop, 0.01, 2.0, 1, 2);
3439   RNA_def_property_float_default(prop, 0.02);
3440   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3441
3442   prop = RNA_def_property(srna, "backwire_opacity", PROP_FLOAT, PROP_FACTOR);
3443   RNA_def_property_float_sdna(prop, NULL, "overlay.backwire_opacity");
3444   RNA_def_property_ui_text(prop, "Backwire Opacity", "Opacity when rendering transparent wires");
3445   RNA_def_property_range(prop, 0.0f, 1.0f);
3446   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3447
3448   prop = RNA_def_property(srna, "texture_paint_mode_opacity", PROP_FLOAT, PROP_FACTOR);
3449   RNA_def_property_float_sdna(prop, NULL, "overlay.texture_paint_mode_opacity");
3450   RNA_def_property_float_default(prop, 1.0f);
3451   RNA_def_property_ui_text(prop, "Texture Opacity", "Opacity of the texture paint mode overlay");
3452   RNA_def_property_range(prop, 0.0f, 1.0f);
3453   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3454
3455   prop = RNA_def_property(srna, "vertex_paint_mode_opacity", PROP_FLOAT, PROP_FACTOR);
3456   RNA_def_property_float_sdna(prop, NULL, "overlay.vertex_paint_mode_opacity");
3457   RNA_def_property_float_default(prop, 1.0f);
3458   RNA_def_property_ui_text(
3459       prop, "Vertex Paint Opacity", "Opacity of the vertex paint mode overlay");
3460   RNA_def_property_range(prop, 0.0f, 1.0f);
3461   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3462
3463   prop = RNA_def_property(srna, "weight_paint_mode_opacity", PROP_FLOAT, PROP_FACTOR);
3464   RNA_def_property_float_sdna(prop, NULL, "overlay.weight_paint_mode_opacity");
3465   RNA_def_property_float_default(prop, 1.0f);
3466   RNA_def_property_ui_text(
3467       prop, "Weight Paint Opacity", "Opacity of the weight paint mode overlay");
3468   RNA_def_property_range(prop, 0.0f, 1.0f);
3469   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3470
3471   prop = RNA_def_property(srna, "sculpt_mode_mask_opacity", PROP_FLOAT, PROP_FACTOR);
3472   RNA_def_property_float_sdna(prop, NULL, "overlay.sculpt_mode_mask_opacity");
3473   RNA_def_property_float_default(prop, 1.0f);
3474   RNA_def_property_ui_text(prop, "Sculpt Mask Opacity", "");
3475   RNA_def_property_range(prop, 0.0f, 1.0f);
3476   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3477
3478   /* grease pencil paper settings */
3479   prop = RNA_def_property(srna, "show_annotation", PROP_BOOLEAN, PROP_NONE);
3480   RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_SHOW_ANNOTATION);
3481   RNA_def_property_ui_text(prop, "Show Annotation", "Show annotations for this view");
3482   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3483
3484   prop = RNA_def_property(srna, "use_gpencil_paper", PROP_BOOLEAN, PROP_NONE);
3485   RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_PAPER);
3486   RNA_def_property_ui_text(prop,
3487                            "Use Paper",
3488                            "Cover all viewport with a full color layer to improve visibility "
3489                            "while drawing over complex scenes");
3490   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3491
3492   prop = RNA_def_property(srna, "use_gpencil_grid", PROP_BOOLEAN, PROP_NONE);
3493   RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_GRID);
3494   RNA_def_property_ui_text(prop, "Use Grid", "Display a grid over grease pencil paper");
3495   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3496
3497   prop = RNA_def_property(srna, "use_gpencil_fade_layers", PROP_BOOLEAN, PROP_NONE);
3498   RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_FADE_NOACTIVE_LAYERS);
3499   RNA_def_property_ui_text(
3500       prop, "Fade Layers", "Toggle fading of Grease Pencil layers except the active one");
3501   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3502
3503   prop = RNA_def_property(srna, "gpencil_grid_opacity", PROP_FLOAT, PROP_NONE);
3504   RNA_def_property_float_sdna(prop, NULL, "overlay.gpencil_grid_opacity");
3505   RNA_def_property_range(prop, 0.1f, 1.0f);
3506   RNA_def_property_float_default(prop, 0.9f);
3507   RNA_def_property_ui_text(prop, "Opacity", "Canvas grid opacity");
3508   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3509
3510   /* Paper opacity factor */
3511   prop = RNA_def_property(srna, "gpencil_paper_opacity", PROP_FLOAT, PROP_NONE);
3512   RNA_def_property_float_sdna(prop, NULL, "overlay.gpencil_paper_opacity");
3513   RNA_def_property_range(prop, 0.0f, 1.0f);
3514   RNA_def_property_float_default(prop, 0.5f);
3515   RNA_def_property_ui_text(prop, "Opacity", "Paper opacity");
3516   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3517
3518   /* Paper opacity factor */
3519   prop = RNA_def_property(srna, "gpencil_fade_layer", PROP_FLOAT, PROP_NONE);
3520   RNA_def_property_float_sdna(prop, NULL, "overlay.gpencil_fade_layer");
3521   RNA_def_property_range(prop, 0.0f, 1.0f);
3522   RNA_def_property_float_default(prop, 0.5f);
3523   RNA_def_property_ui_text(
3524       prop, "Opacity", "Fade layer opacity for Grease Pencil layers except the active one");
3525   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3526
3527   /* show edit lines */
3528   prop = RNA_def_property(srna, "use_gpencil_edit_lines", PROP_BOOLEAN, PROP_NONE);
3529   RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_EDIT_LINES);
3530   RNA_def_property_ui_text(prop, "Show Edit Lines", "Show edit lines when editing strokes");
3531   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3532
3533   prop = RNA_def_property(srna, "use_gpencil_multiedit_line_only", PROP_BOOLEAN, PROP_NONE);
3534   RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_MULTIEDIT_LINES);
3535   RNA_def_property_ui_text(prop, "Lines Only", "Only show edit lines for additional frames");
3536   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3537
3538   /* main grease pencil onion switch */
3539   prop = RNA_def_property(srna, "use_gpencil_onion_skin", PROP_BOOLEAN, PROP_NONE);
3540   RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_ONION_SKIN);
3541   RNA_def_property_ui_text(
3542       prop, "Onion Skins", "Show ghosts of the keyframes before and after the current frame");
3543   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3544
3545   /* vertex opacity */
3546   prop = RNA_def_property(srna, "vertex_opacity", PROP_FLOAT, PROP_NONE);
3547   RNA_def_property_float_sdna(prop, NULL, "vertex_opacity");
3548   RNA_def_property_range(prop, 0.0f, 1.0f);
3549   RNA_def_property_ui_text(prop, "Vertex Opacity", "Opacity for edit vertices");
3550   RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
3551   RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, "rna_GPencil_update");
3552 }
3553
3554 static void rna_def_space_view3d(BlenderRNA *brna)
3555 {
3556   StructRNA *srna;
3557   PropertyRNA *prop;
3558
3559   static const EnumPropertyItem rv3d_persp_items[] = {
3560       {RV3D_PERSP, "PERSP", 0, "Perspective", ""},
3561       {RV3D_ORTHO, "ORTHO", 0, "Orthographic", ""},
3562       {RV3D_CAMOB, "CAMERA", 0, "Camera", ""},
3563       {0, NULL, 0, NULL, NULL},
3564   };
3565
3566   static const EnumPropertyItem bundle_drawtype_items[] = {
3567       {OB_PLAINAXES, "PLAIN_AXES", 0, "Plain Axes", ""},
3568       {OB_ARROWS, "ARROWS", 0, "Arrows", ""},
3569       {OB_SINGLE_ARROW, "SINGLE_ARROW", 0, "Single Arrow", ""},
3570       {OB_CIRCLE, "CIRCLE", 0, "Circle", ""},
3571       {OB_CUBE, "CUBE", 0, "Cube", ""},
3572       {OB_EMPTY_SPHERE, "SPHERE", 0, "Sphere", ""},
3573       {OB_EMPTY_CONE, "CONE", 0, "Cone", ""},
3574       {0, NULL, 0, NULL, NULL},
3575   };
3576
3577   srna = RNA_def_struct(brna, "SpaceView3D", "Space");
3578   RNA_def_struct_sdna(srna, "View3D");
3579   RNA_def_struct_ui_text(srna, "3D View Space", "3D View space data");
3580
3581   rna_def_space_generic_show_region_toggles(srna,
3582                                             ((1 << RGN_TYPE_TOOL_HEADER) | (1 << RGN_TYPE_TOOLS) |
3583                                              (1 << RGN_TYPE_UI) | (1 << RGN_TYPE_HUD)));
3584
3585   prop = RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE);
3586   RNA_def_property_flag(prop, PROP_EDITABLE);
3587   RNA_def_property_pointer_sdna(prop, NULL, "camera");
3588   RNA_def_property_ui_text(
3589       prop,
3590       "Camera",
3591       "Active camera used in this view (when unlocked from the scene's active camera)");
3592   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_SpaceView3D_camera_update");
3593
3594   /* render border */
3595   prop = RNA_def_property(srna, "use_render_border", PROP_BOOLEAN, PROP_NONE);
3596   RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_RENDER_BORDER);
3597   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3598   RNA_def_property_ui_text(prop,