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