Preferences: add new Viewport, Animation, Navigation, Save & Load sections.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Wed, 16 Jan 2019 17:49:31 +0000 (18:49 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Thu, 17 Jan 2019 10:44:33 +0000 (11:44 +0100)
This further changes the preferences organization, to avoid grouping unrelated
settings together. With more sections we can also expand more panels by default,
making it possible to quickly go through sections and see the settings of each.

Panels with less used settings are still collapsed by default, to keep all panel
headers visible without scrolling.

Differential Revision: https://developer.blender.org/D4216

release/scripts/startup/bl_ui/space_userpref.py
source/blender/blenloader/intern/versioning_defaults.c
source/blender/makesdna/DNA_userdef_types.h
source/blender/makesrna/intern/rna_userdef.c

index fbead50f1087c708d7d714310d33c809a8ca358f..b5a139e509bb260f37853452c11048f068d027d3 100644 (file)
@@ -36,7 +36,7 @@ class USERPREF_HT_header(Header):
         layout.template_header()
 
 
-class USERPREF_PT_navigation(Panel):
+class USERPREF_PT_navigation_bar(Panel):
     bl_label = "Preferences Navigation"
     bl_space_type = 'PREFERENCES'
     bl_region_type = 'NAVIGATION_BAR'
@@ -118,26 +118,19 @@ class USERPREF_PT_interface_display(PreferencePanel):
         flow.prop(view, "ui_scale", text="Resolution Scale")
         flow.prop(view, "ui_line_width", text="Line Width")
 
-
-class USERPREF_PT_interface_display_info(PreferencePanel):
-    bl_label = "Information"
-    bl_parent_id = "USERPREF_PT_interface_display"
-
-    def draw_props(self, context, layout):
-        prefs = context.preferences
-        view = prefs.view
+        layout.separator()
 
         flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
 
+        flow.prop(view, "show_splash", text="Splash Screen")
         flow.prop(view, "show_tooltips")
-        flow.prop(view, "show_object_info", text="Object Info")
+        flow.prop(view, "show_tooltips_python")
+        flow.prop(view, "show_developer_ui")
         flow.prop(view, "show_large_cursors")
-        flow.prop(view, "show_view_name", text="View Name")
-        flow.prop(view, "show_playback_fps", text="Playback FPS")
 
 
 class USERPREF_PT_interface_text(PreferencePanel):
-    bl_label = "Text"
+    bl_label = "Text Rendering"
     bl_options = {'DEFAULT_CLOSED'}
 
     @classmethod
@@ -160,15 +153,13 @@ class USERPREF_PT_interface_text(PreferencePanel):
         flow.prop(view, "font_path_ui_mono")
 
 
-class USERPREF_PT_interface_text_translate(PreferencePanel):
-    bl_label = "Translate UI"
-    bl_parent_id = "USERPREF_PT_interface_text"
+class USERPREF_PT_interface_translation(PreferencePanel):
+    bl_label = "Translation"
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
-        if bpy.app.build_options.international:
-            return (prefs.active_section == 'INTERFACE')
+        return (prefs.active_section == 'INTERFACE') and bpy.app.build_options.international
 
     def draw_header(self, context):
         prefs = context.preferences
@@ -182,115 +173,34 @@ class USERPREF_PT_interface_text_translate(PreferencePanel):
 
         layout.active = view.use_international_fonts
 
-        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
-
-        flow.prop(view, "language")
-
-        flow.prop(view, "use_translate_tooltips", text="Translate Tooltips")
-        flow.prop(view, "use_translate_interface", text="Translate Interface")
-        flow.prop(view, "use_translate_new_dataname", text="Translate New Data")
-
-
-class USERPREF_PT_interface_develop(PreferencePanel):
-    bl_label = "Develop"
-    bl_options = {'DEFAULT_CLOSED'}
-
-    @classmethod
-    def poll(cls, context):
-        prefs = context.preferences
-        return (prefs.active_section == 'INTERFACE')
-
-    def draw_props(self, context, layout):
-        prefs = context.preferences
-        view = prefs.view
+        layout.prop(view, "language")
 
         flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
 
-        flow.prop(view, "show_tooltips_python")
-        flow.prop(view, "show_developer_ui")
+        flow.prop(view, "use_translate_tooltips", text="Tooltips")
+        flow.prop(view, "use_translate_interface", text="Interface")
+        flow.prop(view, "use_translate_new_dataname", text="New Data")
 
 
-class USERPREF_PT_interface_viewports(PreferencePanel):
-    bl_label = "Viewports"
-    bl_options = {'DEFAULT_CLOSED'}
+class USERPREF_PT_interface_editors(PreferencePanel):
+    bl_label = "Editors"
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
         return (prefs.active_section == 'INTERFACE')
 
-    def draw(self, context):
-        pass
-
-
-class USERPREF_PT_interface_viewports_3d(PreferencePanel):
-    bl_label = "3D Viewports"
-    bl_parent_id = "USERPREF_PT_interface_viewports"
-
-    def draw_props(self, context, layout):
-        prefs = context.preferences
-        view = prefs.view
-
-        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
-
-        col = flow.column()
-
-        col.prop(view, "smooth_view")
-        col.prop(view, "rotation_angle")
-        col.separator()
-
-        col = flow.column()
-
-        col.prop(view, "object_origin_size")
-        col.prop(view, "gizmo_size", text="Gizmo Size")
-        col.separator()
-
-        col = flow.column()
-
-        col.prop(view, "mini_axis_type", text="3D Viewport Axis")
-
-        sub = col.column()
-        sub.active = view.mini_axis_type == 'MINIMAL'
-        sub.prop(view, "mini_axis_size", text="Size")
-        sub.prop(view, "mini_axis_brightness", text="Brightness")
-
-
-class USERPREF_PT_interface_viewports_3d_weight_paint(PreferencePanel):
-    bl_label = "Custom Weight Paint Range"
-    bl_options = {'DEFAULT_CLOSED'}
-    bl_parent_id = "USERPREF_PT_interface_viewports_3d"
-
-    def draw_header(self, context):
-        prefs = context.preferences
-        view = prefs.view
-
-        self.layout.prop(view, "use_weight_color_range", text="")
-
-    def draw_props(self, context, layout):
-        prefs = context.preferences
-        view = prefs.view
-
-        layout.active = view.use_weight_color_range
-        layout.template_color_ramp(view, "weight_color_range", expand=True)
-
-
-class USERPREF_PT_interface_viewports_2d(PreferencePanel):
-    bl_label = "2D Viewports"
-    bl_parent_id = "USERPREF_PT_interface_viewports"
-
     def draw_props(self, context, layout):
         prefs = context.preferences
         view = prefs.view
+        system = prefs.system
 
         flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
 
-        flow.prop(view, "view2d_grid_spacing_min", text="Minimum Grid Spacing")
-        flow.prop(view, "timecode_style")
-        flow.prop(view, "view_frame_type")
-        if view.view_frame_type == 'SECONDS':
-            flow.prop(view, "view_frame_seconds")
-        elif view.view_frame_type == 'KEYFRAMES':
-            flow.prop(view, "view_frame_keyframes")
+        flow.row().prop(view, "header_align_default", expand=True)
+        flow.prop(system, "use_region_overlap")
+        flow.prop(view, "show_layout_ui", text="Corner Splitting")
+        flow.prop(view, "color_picker_type")
 
 
 class USERPREF_PT_interface_menus(PreferencePanel):
@@ -309,16 +219,13 @@ class USERPREF_PT_interface_menus(PreferencePanel):
 
         flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
 
-        flow.prop(view, "color_picker_type")
-        flow.row().prop(view, "header_align_default", expand=True)
-        flow.prop(system, "use_region_overlap")
-        flow.prop(view, "show_splash")
         flow.prop(view, "use_quit_dialog")
 
 
 class USERPREF_PT_interface_menus_mouse_over(PreferencePanel):
     bl_label = "Open on Mouse Over"
     bl_parent_id = "USERPREF_PT_interface_menus"
+    bl_options = {'DEFAULT_CLOSED'}
 
     def draw_header(self, context):
         prefs = context.preferences
@@ -357,24 +264,6 @@ class USERPREF_PT_interface_menus_pie(PreferencePanel):
         flow.prop(view, "pie_menu_confirm")
 
 
-class USERPREF_PT_interface_templates(PreferencePanel):
-    bl_label = "Application Templates"
-    bl_options = {'DEFAULT_CLOSED'}
-    bl_parent_id = "USERPREF_PT_interface_develop"
-
-    @classmethod
-    def poll(cls, context):
-        prefs = context.preferences
-        return (prefs.active_section == 'INTERFACE')
-
-    def draw_props(self, context, layout):
-        prefs = context.preferences
-        view = prefs.view
-
-        layout.label(text="Options intended for developing application templates only")
-        layout.prop(view, "show_layout_ui")
-
-
 class USERPREF_PT_edit_objects(PreferencePanel):
     bl_label = "Objects"
 
@@ -394,9 +283,8 @@ class USERPREF_PT_edit_objects(PreferencePanel):
         flow.prop(edit, "use_enter_edit_mode", text="Enter Edit Mode for New Objects")
 
 
-class USERPREF_PT_edit_animation(PreferencePanel):
-    bl_label = "Animation"
-    bl_options = {'DEFAULT_CLOSED'}
+class USERPREF_PT_edit_cursor(PreferencePanel):
+    bl_label = "3D Cursor"
 
     @classmethod
     def poll(cls, context):
@@ -409,45 +297,8 @@ class USERPREF_PT_edit_animation(PreferencePanel):
 
         flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
 
-        flow.prop(edit, "use_negative_frames")
-        flow.prop(edit, "use_visual_keying")
-        flow.prop(edit, "use_keyframe_insert_needed", text="Only Insert Needed")
-
-
-class USERPREF_PT_edit_animation_autokey(PreferencePanel):
-    bl_label = "Auto-Keyframing"
-    bl_parent_id = "USERPREF_PT_edit_animation"
-
-    def draw_header(self, context):
-        prefs = context.preferences
-        edit = prefs.edit
-
-        self.layout.prop(edit, "use_auto_keying", text="")
-
-    def draw_props(self, context, layout):
-        prefs = context.preferences
-        edit = prefs.edit
-
-        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
-
-        flow.prop(edit, "use_auto_keying_warning")
-        flow.prop(edit, "use_keyframe_insert_available", text="Only Insert Available")
-
-
-class USERPREF_PT_edit_animation_fcurves(PreferencePanel):
-    bl_label = "F-Curves"
-    bl_parent_id = "USERPREF_PT_edit_animation"
-
-    def draw_props(self, context, layout):
-        prefs = context.preferences
-        edit = prefs.edit
-
-        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
-
-        flow.prop(edit, "fcurve_unselected_alpha", text="F-Curve Visibility")
-        flow.prop(edit, "keyframe_new_interpolation_type", text="Default Interpolation")
-        flow.prop(edit, "keyframe_new_handle_type", text="Default Handles")
-        flow.prop(edit, "use_insertkey_xyz_to_rgb", text="XYZ to RGB")
+        flow.prop(edit, "use_mouse_depth_cursor")
+        flow.prop(edit, "use_cursor_lock_adjust")
 
 
 class USERPREF_PT_edit_duplicate_data(PreferencePanel):
@@ -504,7 +355,6 @@ class USERPREF_PT_edit_gpencil(PreferencePanel):
 
 class USERPREF_PT_edit_annotations(PreferencePanel):
     bl_label = "Annotations"
-    bl_options = {'DEFAULT_CLOSED'}
 
     @classmethod
     def poll(cls, context):
@@ -521,6 +371,24 @@ class USERPREF_PT_edit_annotations(PreferencePanel):
         flow.prop(edit, "grease_pencil_eraser_radius", text="Eraser Radius")
         flow.prop(edit, "use_grease_pencil_simplify_stroke", text="Simplify Stroke")
 
+class USERPREF_PT_edit_weight_paint(PreferencePanel):
+    bl_label = "Weight Paint"
+
+    @classmethod
+    def poll(cls, context):
+        prefs = context.preferences
+        return (prefs.active_section == 'EDITING')
+
+    def draw_props(self, context, layout):
+        prefs = context.preferences
+        view = prefs.view
+
+        layout.prop(view, "use_weight_color_range", text="Use Custom Colors")
+
+        col = layout.column()
+        col.active = view.use_weight_color_range
+        col.template_color_ramp(view, "weight_color_range", expand=True)
+
 
 class USERPREF_PT_edit_misc(PreferencePanel):
     bl_label = "Miscellaneous"
@@ -541,14 +409,36 @@ class USERPREF_PT_edit_misc(PreferencePanel):
         flow.prop(edit, "node_margin", text="Node Auto-offset Margin")
 
 
-class USERPREF_PT_edit_cursor(PreferencePanel):
-    bl_label = "3D Cursor"
-    bl_options = {'DEFAULT_CLOSED'}
+class USERPREF_PT_animation_timeline(PreferencePanel):
+    bl_label = "Timeline"
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
-        return (prefs.active_section == 'EDITING')
+        return (prefs.active_section == 'ANIMATION')
+
+    def draw_props(self, context, layout):
+        prefs = context.preferences
+        view = prefs.view
+
+        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+
+        flow.prop(view, "view2d_grid_spacing_min", text="Minimum Grid Spacing")
+        flow.prop(view, "timecode_style")
+        flow.prop(view, "view_frame_type")
+        if view.view_frame_type == 'SECONDS':
+            flow.prop(view, "view_frame_seconds")
+        elif view.view_frame_type == 'KEYFRAMES':
+            flow.prop(view, "view_frame_keyframes")
+
+
+class USERPREF_PT_animation_keyframes(PreferencePanel):
+    bl_label = "Keyframes"
+
+    @classmethod
+    def poll(cls, context):
+        prefs = context.preferences
+        return (prefs.active_section == 'ANIMATION')
 
     def draw_props(self, context, layout):
         prefs = context.preferences
@@ -556,27 +446,66 @@ class USERPREF_PT_edit_cursor(PreferencePanel):
 
         flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
 
-        flow.prop(edit, "use_mouse_depth_cursor")
-        flow.prop(edit, "use_cursor_lock_adjust")
+        flow.prop(edit, "use_negative_frames")
+        flow.prop(edit, "use_visual_keying")
+        flow.prop(edit, "use_keyframe_insert_needed", text="Only Insert Needed")
+
+
+class USERPREF_PT_animation_autokey(PreferencePanel):
+    bl_label = "Auto-Keyframing"
+    bl_parent_id = "USERPREF_PT_animation_keyframes"
+
+    def draw_header(self, context):
+        prefs = context.preferences
+        edit = prefs.edit
+
+        self.layout.prop(edit, "use_auto_keying", text="")
+
+    def draw_props(self, context, layout):
+        prefs = context.preferences
+        edit = prefs.edit
+
+        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+
+        flow.prop(edit, "use_auto_keying_warning", text="Show Warning")
+        flow.prop(edit, "use_keyframe_insert_available", text="Only Insert Available")
+
+
+class USERPREF_PT_animation_fcurves(PreferencePanel):
+    bl_label = "F-Curves"
+
+    @classmethod
+    def poll(cls, context):
+        prefs = context.preferences
+        return (prefs.active_section == 'ANIMATION')
+
+    def draw_props(self, context, layout):
+        prefs = context.preferences
+        edit = prefs.edit
+
+        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+
+        flow.prop(edit, "fcurve_unselected_alpha", text="F-Curve Visibility")
+        flow.prop(edit, "keyframe_new_interpolation_type", text="Default Interpolation")
+        flow.prop(edit, "keyframe_new_handle_type", text="Default Handles")
+        flow.prop(edit, "use_insertkey_xyz_to_rgb", text="XYZ to RGB")
 
 
 class USERPREF_PT_system_sound(PreferencePanel):
     bl_label = "Sound"
-    bl_options = {'DEFAULT_CLOSED'}
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
-        return (prefs.active_section == 'SYSTEM_GENERAL')
+        return (prefs.active_section == 'SYSTEM')
 
     def draw_props(self, context, layout):
         prefs = context.preferences
         system = prefs.system
 
-        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+        layout.prop(system, "audio_device", expand=False)
 
-        flow.prop(system, "audio_device", expand=False)
-        sub = flow.grid_flow(row_major=False, columns=0, even_columns=False, even_rows=False, align=False)
+        sub = layout.grid_flow(row_major=False, columns=0, even_columns=False, even_rows=False, align=False)
         sub.active = system.audio_device not in {'NONE', 'Null'}
         sub.prop(system, "audio_channels", text="Channels")
         sub.prop(system, "audio_mixing_buffer", text="Mixing Buffer")
@@ -584,19 +513,19 @@ class USERPREF_PT_system_sound(PreferencePanel):
         sub.prop(system, "audio_sample_format", text="Sample Format")
 
 
-class USERPREF_PT_system_compute_device(PreferencePanel):
-    bl_label = "Cycles Compute Device"
-    bl_options = {'DEFAULT_CLOSED'}
+class USERPREF_PT_system_cycles_devices(PreferencePanel):
+    bl_label = "Cycles Render Devices"
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
-        return (prefs.active_section == 'SYSTEM_GENERAL')
+        return (prefs.active_section == 'SYSTEM')
 
     def draw_props(self, context, layout):
         prefs = context.preferences
 
         col = layout.column()
+        col.use_property_split = False
 
         if bpy.app.build_options.cycles:
             addon = prefs.addons.get("cycles")
@@ -611,13 +540,52 @@ class USERPREF_PT_system_compute_device(PreferencePanel):
         #     col.row().prop(system, "opensubdiv_compute_type", text="")
 
 
-class USERPREF_PT_system_opengl(PreferencePanel):
-    bl_label = "OpenGL"
+class USERPREF_PT_viewport_display(PreferencePanel):
+    bl_label = "Display"
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
-        return (prefs.active_section == 'SYSTEM_GENERAL')
+        return (prefs.active_section == 'VIEWPORT')
+
+    def draw_props(self, context, layout):
+        prefs = context.preferences
+        view = prefs.view
+
+        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+
+        flow.prop(view, "show_object_info", text="Object Info")
+        flow.prop(view, "show_view_name", text="View Name")
+        flow.prop(view, "show_playback_fps", text="Playback FPS")
+
+        layout.separator()
+
+        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+
+        col = flow.column()
+        col.prop(view, "gizmo_size", text="Gizmo Size")
+        col.prop(view, "object_origin_size")
+        col.separator()
+
+        flow.separator()
+
+        col = flow.column()
+        col.prop(view, "mini_axis_type", text="3D Viewport Axis")
+
+        if view.mini_axis_type == 'MINIMAL':
+            sub = col.column()
+            sub.active = view.mini_axis_type == 'MINIMAL'
+            sub.prop(view, "mini_axis_size", text="Size")
+            sub.prop(view, "mini_axis_brightness", text="Brightness")
+
+
+class USERPREF_PT_viewport_quality(PreferencePanel):
+    bl_label = "Quality"
+
+    @classmethod
+    def poll(cls, context):
+        prefs = context.preferences
+        return (prefs.active_section == 'VIEWPORT')
 
     def draw_props(self, context, layout):
         import sys
@@ -627,7 +595,6 @@ class USERPREF_PT_system_opengl(PreferencePanel):
         flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
 
         flow.prop(system, "gpu_viewport_quality")
-        flow.prop(system, "gl_clip_alpha", slider=True)
         flow.prop(system, "multi_sample", text="Multisampling")
         flow.prop(system, "gpencil_multi_sample", text="Grease Pencil Multisampling")
 
@@ -635,14 +602,13 @@ class USERPREF_PT_system_opengl(PreferencePanel):
             layout.label(text="Might fail for Mesh editing selection!")
 
 
-class USERPREF_PT_system_opengl_textures(PreferencePanel):
+class USERPREF_PT_viewport_textures(PreferencePanel):
     bl_label = "Textures"
-    bl_parent_id = "USERPREF_PT_system_opengl"
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
-        return (prefs.active_section == 'SYSTEM_GENERAL')
+        return (prefs.active_section == 'VIEWPORT')
 
     def draw_props(self, context, layout):
         prefs = context.preferences
@@ -652,14 +618,18 @@ class USERPREF_PT_system_opengl_textures(PreferencePanel):
 
         flow.prop(system, "gl_texture_limit", text="Limit Size")
         flow.prop(system, "anisotropic_filter")
-        flow.prop(system, "texture_time_out", text="Time Out")
-        flow.prop(system, "texture_collection_rate", text="Garbage Collection Rate")
+        flow.prop(system, "gl_clip_alpha", slider=True)
         flow.prop(system, "image_draw_method", text="Image Display Method")
 
 
-class USERPREF_PT_system_opengl_selection(PreferencePanel):
+class USERPREF_PT_viewport_selection(PreferencePanel):
     bl_label = "Selection"
-    bl_parent_id = "USERPREF_PT_system_opengl"
+    bl_options = {'DEFAULT_CLOSED'}
+
+    @classmethod
+    def poll(cls, context):
+        prefs = context.preferences
+        return (prefs.active_section == 'VIEWPORT')
 
     def draw_props(self, context, layout):
         prefs = context.preferences
@@ -672,12 +642,11 @@ class USERPREF_PT_system_opengl_selection(PreferencePanel):
 
 class USERPREF_PT_system_memory(PreferencePanel):
     bl_label = "Memory/Limits"
-    bl_options = {'DEFAULT_CLOSED'}
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
-        return (prefs.active_section == 'SYSTEM_GENERAL')
+        return (prefs.active_section == 'SYSTEM')
 
     def draw_props(self, context, layout):
         prefs = context.preferences
@@ -697,6 +666,13 @@ class USERPREF_PT_system_memory(PreferencePanel):
         flow.prop(system, "memory_cache_limit", text="Sequencer Cache Limit")
         flow.prop(system, "scrollback", text="Console Scrollback Lines")
 
+        layout.separator()
+
+        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+
+        flow.prop(system, "texture_time_out", text="Texture Time Out")
+        flow.prop(system, "texture_collection_rate", text="Garbage Collection Rate")
+
 
 class USERPREF_MT_interface_theme_presets(Menu):
     bl_label = "Presets"
@@ -1155,51 +1131,82 @@ class ThemeGenericClassGenerator():
                 theme_area, theme_area.identifier.lower())
 
 
-class USERPREF_PT_file_paths(Panel):
+class FilePathsPanel(Panel):
     bl_space_type = 'PREFERENCES'
     bl_region_type = 'WINDOW'
-    bl_label = "File Paths"
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
-        return (prefs.active_section == 'SYSTEM_FILES')
+        return (prefs.active_section == 'FILE_PATHS')
 
     def draw(self, context):
         layout = self.layout
-        prefs = context.preferences
-        paths = prefs.filepaths
 
         layout.use_property_split = True
-        layout.use_property_decorate = False  # No animation.
+        layout.use_property_decorate = False
 
-        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+        self.draw_props(context, layout)
+
+
+class USERPREF_PT_file_paths_data(FilePathsPanel):
+    bl_label = "Data"
+
+    def draw_props(self, context, layout):
+        paths = context.preferences.filepaths
+
+        col = self.layout.column()
+        col.prop(paths, "font_directory", text="Fonts")
+        col.prop(paths, "texture_directory", text="Textures")
+        col.prop(paths, "script_directory", text="Scripts")
+        col.prop(paths, "sound_directory", text="Sounds")
+        col.prop(paths, "temporary_directory", text="Temporary Files")
+
+
+class USERPREF_PT_file_paths_render(FilePathsPanel):
+    bl_label = "Render"
+
+    def draw_props(self, context, layout):
+        paths = context.preferences.filepaths
+
+        col = self.layout.column()
+        col.prop(paths, "render_output_directory", text="Render Output")
+        col.prop(paths, "render_cache_directory", text="Render Cache")
+
+
+class USERPREF_PT_file_paths_applications(FilePathsPanel):
+    bl_label = "Applications"
 
-        flow.prop(paths, "render_output_directory", text="Render Output")
-        flow.prop(paths, "render_cache_directory", text="Render Cache")
-        flow.prop(paths, "font_directory", text="Fonts")
-        flow.prop(paths, "texture_directory", text="Textures")
-        flow.prop(paths, "script_directory", text="Scripts")
-        flow.prop(paths, "sound_directory", text="Sounds")
-        flow.prop(paths, "temporary_directory", text="Temp")
-        flow.prop(paths, "i18n_branches_directory", text="I18n Branches")
-        flow.prop(paths, "image_editor", text="Image Editor")
-        flow.prop(paths, "animation_player_preset", text="Playback Preset")
+    def draw_props(self, context, layout):
+        paths = context.preferences.filepaths
 
+        col = layout.column()
+        col.prop(paths, "image_editor", text="Image Editor")
+        col.prop(paths, "animation_player_preset", text="Animation Player")
         if paths.animation_player_preset == 'CUSTOM':
-            flow.prop(paths, "animation_player", text="Animation Player")
+            col.prop(paths, "animation_player", text="Player")
 
 
-class USERPREF_PT_file_autorun(Panel):
-    bl_space_type = 'PREFERENCES'
-    bl_region_type = 'WINDOW'
+class USERPREF_PT_file_paths_development(FilePathsPanel):
+    bl_label = "Development"
+
+    @classmethod
+    def poll(cls, context):
+        prefs = context.preferences
+        return (prefs.active_section == 'FILE_PATHS') and prefs.view.show_developer_ui
+
+    def draw_props(self, context, layout):
+        paths = context.preferences.filepaths
+        layout.prop(paths, "i18n_branches_directory", text="I18n Branches")
+
+
+class USERPREF_PT_saveload_autorun(PreferencePanel):
     bl_label = "Auto Run Python Scripts"
-    bl_options = {'DEFAULT_CLOSED'}
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
-        return (prefs.active_section == 'SYSTEM_FILES')
+        return (prefs.active_section == 'SAVE_LOAD')
 
     def draw_header(self, context):
         prefs = context.preferences
@@ -1228,14 +1235,13 @@ class USERPREF_PT_file_autorun(Panel):
             row.operator("wm.userpref_autoexec_path_remove", text="", icon='X', emboss=False).index = i
 
 
-class USERPREF_PT_file_saveload(PreferencePanel):
-    bl_label = "Save & Load"
-    bl_options = {'DEFAULT_CLOSED'}
+class USERPREF_PT_saveload_blend(PreferencePanel):
+    bl_label = "Blend Files"
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
-        return (prefs.active_section == 'SYSTEM_FILES')
+        return (prefs.active_section == 'SAVE_LOAD')
 
     def draw_props(self, context, layout):
         prefs = context.preferences
@@ -1246,11 +1252,6 @@ class USERPREF_PT_file_saveload(PreferencePanel):
         flow.prop(paths, "use_relative_paths")
         flow.prop(paths, "use_file_compression")
         flow.prop(paths, "use_load_ui")
-        flow.prop(paths, "use_filter_files")
-        flow.prop(paths, "show_hidden_files_datablocks")
-        flow.prop(paths, "hide_recent_locations")
-        flow.prop(paths, "hide_system_bookmarks")
-        flow.prop(paths, "show_thumbnails")
         flow.prop(paths, "use_save_preview_images")
         flow.prop(paths, "use_tabs_as_spaces")
 
@@ -1262,9 +1263,9 @@ class USERPREF_PT_file_saveload(PreferencePanel):
         flow.prop(paths, "recent_files")
 
 
-class USERPREF_PT_file_saveload_autosave(PreferencePanel):
+class USERPREF_PT_saveload_blend_autosave(PreferencePanel):
     bl_label = "Auto Save"
-    bl_parent_id = "USERPREF_PT_file_saveload"
+    bl_parent_id = "USERPREF_PT_saveload_blend"
 
     def draw_props(self, context, layout):
         prefs = context.preferences
@@ -1279,6 +1280,27 @@ class USERPREF_PT_file_saveload_autosave(PreferencePanel):
         sub.prop(paths, "auto_save_time", text="Timer (mins)")
 
 
+class USERPREF_PT_saveload_file_browser(PreferencePanel):
+    bl_label = "File Browser"
+
+    @classmethod
+    def poll(cls, context):
+        prefs = context.preferences
+        return (prefs.active_section == 'SAVE_LOAD')
+
+    def draw_props(self, context, layout):
+        prefs = context.preferences
+        paths = prefs.filepaths
+
+        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+
+        flow.prop(paths, "use_filter_files")
+        flow.prop(paths, "show_hidden_files_datablocks")
+        flow.prop(paths, "hide_recent_locations")
+        flow.prop(paths, "hide_system_bookmarks")
+        flow.prop(paths, "show_thumbnails")
+
+
 class USERPREF_MT_ndof_settings(Menu):
     # accessed from the window key-bindings in C (only)
     bl_label = "3D Mouse Settings"
@@ -1326,35 +1348,29 @@ class USERPREF_MT_ndof_settings(Menu):
             layout.prop(input_prefs, "ndof_lock_horizon", icon='NDOF_DOM')
 
 
-class USERPREF_PT_input_devices(PreferencePanel):
-    bl_label = "Devices"
+class USERPREF_PT_input_keyboard(PreferencePanel):
+    bl_label = "Keyboard"
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
         return (prefs.active_section == 'INPUT')
 
-    def draw(self, context):
-        pass
-
-
-class USERPREF_PT_input_devices_keyboard(PreferencePanel):
-    bl_label = "Keyboard"
-    bl_parent_id = "USERPREF_PT_input_devices"
-
     def draw_props(self, context, layout):
         prefs = context.preferences
         inputs = prefs.inputs
 
-        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+        layout.prop(inputs, "use_emulate_numpad")
+        layout.prop(inputs, "use_numeric_input_advanced")
 
-        flow.prop(inputs, "use_emulate_numpad")
-        flow.prop(inputs, "use_numeric_input_advanced")
 
-
-class USERPREF_PT_input_devices_mouse(PreferencePanel):
+class USERPREF_PT_input_mouse(PreferencePanel):
     bl_label = "Mouse"
-    bl_parent_id = "USERPREF_PT_input_devices"
+
+    @classmethod
+    def poll(cls, context):
+        prefs = context.preferences
+        return (prefs.active_section == 'INPUT')
 
     def draw_props(self, context, layout):
         prefs = context.preferences
@@ -1362,35 +1378,27 @@ class USERPREF_PT_input_devices_mouse(PreferencePanel):
 
         flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
 
-        flow.prop(inputs, "drag_threshold")
-        flow.prop(inputs, "tweak_threshold")
-        flow.prop(inputs, "mouse_double_click_time", text="Double Click Speed")
         flow.prop(inputs, "use_mouse_emulate_3_button")
         flow.prop(inputs, "use_mouse_continuous")
         flow.prop(inputs, "use_drag_immediately")
+        flow.prop(inputs, "drag_threshold")
+        flow.prop(inputs, "tweak_threshold")
+        flow.prop(inputs, "mouse_double_click_time", text="Double Click Speed")
 
 
-class USERPREF_PT_input_view(PreferencePanel):
-    bl_label = "View Navigation"
-    bl_options = {'DEFAULT_CLOSED'}
+class USERPREF_PT_navigation_orbit(PreferencePanel):
+    bl_label = "Orbit & Pan"
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
-        return (prefs.active_section == 'INPUT')
-
-    def draw(self, context):
-        pass
-
-
-class USERPREF_PT_input_view_orbit(PreferencePanel):
-    bl_label = "Orbit & Pan"
-    bl_parent_id = "USERPREF_PT_input_view"
+        return (prefs.active_section == 'NAVIGATION')
 
     def draw_props(self, context, layout):
         import sys
         prefs = context.preferences
         inputs = prefs.inputs
+        view = prefs.view
 
         flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
 
@@ -1399,13 +1407,23 @@ class USERPREF_PT_input_view_orbit(PreferencePanel):
         flow.prop(inputs, "use_auto_perspective")
         flow.prop(inputs, "use_mouse_depth_navigate")
 
+        flow.separator()
+
+        flow.prop(view, "smooth_view")
+        flow.prop(view, "rotation_angle")
+
         if sys.platform == "darwin":
+            flow.separator()
             flow.prop(inputs, "use_trackpad_natural", text="Natural Trackpad Direction")
 
 
-class USERPREF_PT_input_view_zoom(PreferencePanel):
+class USERPREF_PT_navigation_zoom(PreferencePanel):
     bl_label = "Zoom"
-    bl_parent_id = "USERPREF_PT_input_view"
+
+    @classmethod
+    def poll(cls, context):
+        prefs = context.preferences
+        return (prefs.active_section == 'NAVIGATION')
 
     def draw_props(self, context, layout):
         prefs = context.preferences
@@ -1423,23 +1441,27 @@ class USERPREF_PT_input_view_zoom(PreferencePanel):
         flow.prop(inputs, "use_zoom_to_mouse")
 
 
-class USERPREF_PT_input_view_fly_walk(PreferencePanel):
+class USERPREF_PT_navigation_fly_walk(PreferencePanel):
     bl_label = "Fly & Walk"
-    bl_parent_id = "USERPREF_PT_input_view"
+
+    @classmethod
+    def poll(cls, context):
+        prefs = context.preferences
+        return (prefs.active_section == 'NAVIGATION')
 
     def draw_props(self, context, layout):
         prefs = context.preferences
         inputs = prefs.inputs
 
-        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+        layout.row().prop(inputs, "navigation_mode", expand=True)
 
-        flow.row().prop(inputs, "navigation_mode", expand=True)
+        flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
         flow.prop(inputs, "use_camera_lock_parent")
 
 
-class USERPREF_PT_input_view_fly_walk_navigation(PreferencePanel):
+class USERPREF_PT_navigation_fly_walk_navigation(PreferencePanel):
     bl_label = "Walk"
-    bl_parent_id = "USERPREF_PT_input_view_fly_walk"
+    bl_parent_id = "USERPREF_PT_navigation_fly_walk"
     bl_options = {'DEFAULT_CLOSED'}
 
     @classmethod
@@ -1463,9 +1485,9 @@ class USERPREF_PT_input_view_fly_walk_navigation(PreferencePanel):
         sub.prop(walk, "walk_speed_factor")
 
 
-class USERPREF_PT_input_view_fly_walk_gravity(PreferencePanel):
+class USERPREF_PT_navigation_fly_walk_gravity(PreferencePanel):
     bl_label = "Gravity"
-    bl_parent_id = "USERPREF_PT_input_view_fly_walk"
+    bl_parent_id = "USERPREF_PT_navigation_fly_walk"
     bl_options = {'DEFAULT_CLOSED'}
 
     @classmethod
@@ -1493,9 +1515,14 @@ class USERPREF_PT_input_view_fly_walk_gravity(PreferencePanel):
         flow.prop(walk, "jump_height")
 
 
-class USERPREF_PT_input_devices_tablet(PreferencePanel):
+class USERPREF_PT_input_tablet(PreferencePanel):
     bl_label = "Tablet"
-    bl_parent_id = "USERPREF_PT_input_devices"
+
+    @classmethod
+    def poll(cls, context):
+        prefs = context.preferences
+        inputs = prefs.inputs
+        return prefs.active_section == 'INPUT'
 
     def draw_props(self, context, layout):
         prefs = context.preferences
@@ -1512,17 +1539,15 @@ class USERPREF_PT_input_devices_tablet(PreferencePanel):
         flow.prop(inputs, "pressure_softness")
 
 
-class USERPREF_PT_input_devices_ndof(PreferencePanel):
+class USERPREF_PT_input_ndof(PreferencePanel):
     bl_label = "NDOF"
     bl_options = {'DEFAULT_CLOSED'}
-    bl_parent_id = "USERPREF_PT_input_devices"
 
     @classmethod
     def poll(cls, context):
         prefs = context.preferences
         inputs = prefs.inputs
-        if inputs.use_ndof:
-            return (prefs.active_section == 'INPUT')
+        return prefs.active_section == 'INPUT' and inputs.use_ndof
 
     def draw_props(self, context, layout):
         prefs = context.preferences
@@ -1989,39 +2014,38 @@ classes = (USERPREF_PT_theme_user_interface,) + tuple(ThemeGenericClassGenerator
 
 classes += (
     USERPREF_HT_header,
-    USERPREF_PT_navigation,
+    USERPREF_PT_navigation_bar,
     USERPREF_PT_save_preferences,
 
     USERPREF_PT_interface_display,
-    USERPREF_PT_interface_display_info,
+    USERPREF_PT_interface_editors,
+    USERPREF_PT_interface_translation,
     USERPREF_PT_interface_text,
-    USERPREF_PT_interface_text_translate,
-    USERPREF_PT_interface_viewports,
-    USERPREF_PT_interface_viewports_3d,
-    USERPREF_PT_interface_viewports_3d_weight_paint,
-    USERPREF_PT_interface_viewports_2d,
     USERPREF_PT_interface_menus,
     USERPREF_PT_interface_menus_mouse_over,
     USERPREF_PT_interface_menus_pie,
-    USERPREF_PT_interface_develop,
-    USERPREF_PT_interface_templates,
+
+    USERPREF_PT_viewport_display,
+    USERPREF_PT_viewport_quality,
+    USERPREF_PT_viewport_textures,
+    USERPREF_PT_viewport_selection,
 
     USERPREF_PT_edit_objects,
-    USERPREF_PT_edit_animation,
-    USERPREF_PT_edit_animation_autokey,
-    USERPREF_PT_edit_animation_fcurves,
+    USERPREF_PT_edit_cursor,
     USERPREF_PT_edit_duplicate_data,
-    USERPREF_PT_edit_gpencil,
     USERPREF_PT_edit_annotations,
-    USERPREF_PT_edit_cursor,
+    USERPREF_PT_edit_weight_paint,
+    USERPREF_PT_edit_gpencil,
     USERPREF_PT_edit_misc,
 
-    USERPREF_PT_system_opengl,
-    USERPREF_PT_system_opengl_textures,
-    USERPREF_PT_system_opengl_selection,
-    USERPREF_PT_system_sound,
-    USERPREF_PT_system_compute_device,
+    USERPREF_PT_animation_timeline,
+    USERPREF_PT_animation_keyframes,
+    USERPREF_PT_animation_autokey,
+    USERPREF_PT_animation_fcurves,
+
+    USERPREF_PT_system_cycles_devices,
     USERPREF_PT_system_memory,
+    USERPREF_PT_system_sound,
 
     USERPREF_MT_interface_theme_presets,
     USERPREF_PT_theme,
@@ -2032,25 +2056,28 @@ classes += (
     USERPREF_PT_theme_text_style,
     USERPREF_PT_theme_bone_color_sets,
 
-    USERPREF_PT_file_paths,
-    USERPREF_PT_file_autorun,
-    USERPREF_PT_file_saveload,
-    USERPREF_PT_file_saveload_autosave,
+    USERPREF_PT_file_paths_data,
+    USERPREF_PT_file_paths_render,
+    USERPREF_PT_file_paths_applications,
+    USERPREF_PT_file_paths_development,
+
+    USERPREF_PT_saveload_blend,
+    USERPREF_PT_saveload_blend_autosave,
+    USERPREF_PT_saveload_autorun,
+    USERPREF_PT_saveload_file_browser,
 
     USERPREF_MT_ndof_settings,
     USERPREF_MT_keyconfigs,
 
-    USERPREF_PT_input_devices,
-    USERPREF_PT_input_devices_keyboard,
-    USERPREF_PT_input_devices_mouse,
-    USERPREF_PT_input_devices_tablet,
-    USERPREF_PT_input_devices_ndof,
-    USERPREF_PT_input_view,
-    USERPREF_PT_input_view_orbit,
-    USERPREF_PT_input_view_zoom,
-    USERPREF_PT_input_view_fly_walk,
-    USERPREF_PT_input_view_fly_walk_navigation,
-    USERPREF_PT_input_view_fly_walk_gravity,
+    USERPREF_PT_input_keyboard,
+    USERPREF_PT_input_mouse,
+    USERPREF_PT_input_tablet,
+    USERPREF_PT_input_ndof,
+    USERPREF_PT_navigation_orbit,
+    USERPREF_PT_navigation_zoom,
+    USERPREF_PT_navigation_fly_walk,
+    USERPREF_PT_navigation_fly_walk_navigation,
+    USERPREF_PT_navigation_fly_walk_gravity,
 
     USERPREF_PT_keymap,
     USERPREF_PT_addons,
index 6eb5bf23a6c34fb5eabd9858bd36fefb14c2ec09..c2e2d19d883243a3501cbff6a71ac6e528e0661b 100644 (file)
@@ -107,6 +107,9 @@ void BLO_update_defaults_userpref_blend(void)
        /* Init weight paint range. */
        BKE_colorband_init(&U.coba_weight, true);
 
+       /* Default visible section. */
+       U.userpref = USER_SECTION_INTERFACE;
+
        /* Default to left click select. */
        BKE_keyconfig_pref_set_select_mouse(&U, 0, true);
 }
index f27166775936f4b9934155055b78c6cfd4973daf..da9aa3f4343b26da5c15e49f8b15f3bae6aef0aa 100644 (file)
@@ -784,14 +784,13 @@ extern UserDef U;
 
 /* Toggles for unfinished 2.8 UserPref design. */
 //#define WITH_USERDEF_WORKSPACES
-//#define WITH_USERDEF_SYSTEM_SPLIT
 
 /* UserDef.userpref (UI active_section) */
 typedef enum eUserPref_Section {
        USER_SECTION_INTERFACE         = 0,
-       USER_SECTION_EDIT              = 1,
-       USER_SECTION_SYSTEM_FILES      = 2,
-       USER_SECTION_SYSTEM_GENERAL    = 3,
+       USER_SECTION_EDITING           = 1,
+       USER_SECTION_SAVE_LOAD         = 2,
+       USER_SECTION_SYSTEM            = 3,
        USER_SECTION_THEME             = 4,
        USER_SECTION_INPUT             = 5,
        USER_SECTION_ADDONS            = 6,
@@ -802,10 +801,10 @@ typedef enum eUserPref_Section {
        USER_SECTION_WORKSPACE_ADDONS  = 10,
        USER_SECTION_WORKSPACE_KEYMAPS = 11,
 #endif
-#ifdef WITH_USERDEF_SYSTEM_SPLIT
-       USER_SECTION_SYSTEM_DISPLAY    = 12,
-       USER_SECTION_SYSTEM_DEVICES    = 13,
-#endif
+       USER_SECTION_VIEWPORT          = 12,
+       USER_SECTION_ANIMATION         = 13,
+       USER_SECTION_NAVIGATION        = 14,
+       USER_SECTION_FILE_PATHS        = 15,
 } eUserPref_Section;
 
 /* UserDef.userpref_flag (State of the user preferences UI). */
index 5f5450e3045d9f1c34c607099c5a592ed218430f..82bc384a6ebc4324160ab76342cfd96afc5d3c0d 100644 (file)
@@ -4875,7 +4875,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "show_hidden_files_datablocks", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_HIDE_DOT);
-       RNA_def_property_ui_text(prop, "Hide Dot Files/Data-Blocks", "Hide files/data-blocks that start with a dot (.*)");
+       RNA_def_property_ui_text(prop, "Hide Dot Files/Libraries", "Hide files and data-blocks if their name start with a dot (.*)");
 
        prop = RNA_def_property(srna, "use_filter_files", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_FILTERFILEEXTS);
@@ -5068,27 +5068,28 @@ void RNA_def_userdef(BlenderRNA *brna)
        PropertyRNA *prop;
 
        static const EnumPropertyItem preference_section_items[] = {
-               {0, "", ICON_USER, "User", ""},
                {USER_SECTION_INTERFACE, "INTERFACE", 0, "Interface", ""},
                {USER_SECTION_THEME, "THEMES", 0, "Themes", ""},
+               {USER_SECTION_VIEWPORT, "VIEWPORT", 0, "Viewport", ""},
                {USER_SECTION_LIGHT, "LIGHTS", 0, "Lights", ""},
-               {USER_SECTION_EDIT, "EDITING", 0, "Editing", ""},
-               {USER_SECTION_INPUT, "INPUT", 0, "Input", ""},
-               {USER_SECTION_KEYMAP, "KEYMAP", 0, "Keymap", ""},
+               {USER_SECTION_EDITING, "EDITING", 0, "Editing", ""},
+               {USER_SECTION_ANIMATION, "ANIMATION", 0, "Animation", ""},
+               {0, "", 0, NULL, NULL},
                {USER_SECTION_ADDONS, "ADDONS", 0, "Add-ons", ""},
-#ifdef WITH_USERDEF_WORKSPACES
-               {0, "", ICON_WORKSPACE, "Workspaces", ""},
+#if 0 //def WITH_USERDEF_WORKSPACES
+               {0, "", 0, NULL, NULL},
                {USER_SECTION_WORKSPACE_CONFIG, "WORKSPACE_CONFIG", 0, "Configuration File", ""},
                {USER_SECTION_WORKSPACE_ADDONS, "WORKSPACE_ADDONS", 0, "Add-on Overrides", ""},
                {USER_SECTION_WORKSPACE_KEYMAPS, "WORKSPACE_KEYMAPS", 0, "Keymap Overrides", ""},
 #endif
-               {0, "", ICON_SYSTEM, "System", ""},
-               {USER_SECTION_SYSTEM_GENERAL, "SYSTEM_GENERAL", 0, "General", ""},
-               {USER_SECTION_SYSTEM_FILES,   "SYSTEM_FILES",   0, "Files",   ""},
-#ifdef WITH_USERDEF_SYSTEM_SPLIT
-               {USER_SECTION_SYSTEM_DISPLAY, "SYSTEM_DISPLAY", 0, "Display", ""},
-               {USER_SECTION_SYSTEM_DEVICES, "SYSTEM_DEVICES", 0, "Devices", ""},
-#endif
+               {0, "", 0, NULL, NULL},
+               {USER_SECTION_INPUT, "INPUT", 0, "Input", ""},
+               {USER_SECTION_NAVIGATION, "NAVIGATION", 0, "Navigation", ""},
+               {USER_SECTION_KEYMAP, "KEYMAP", 0, "Keymap", ""},
+               {0, "", 0, NULL, NULL},
+               {USER_SECTION_SYSTEM, "SYSTEM", 0, "System", ""},
+               {USER_SECTION_SAVE_LOAD, "SAVE_LOAD",   0, "Save & Load",   ""},
+               {USER_SECTION_FILE_PATHS, "FILE_PATHS",   0, "File Paths",   ""},
                {0, NULL, 0, NULL, NULL}
        };