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