diff --git a/Ryujinx.Common/Configuration/ConfigurationFileFormat.cs b/Ryujinx.Common/Configuration/ConfigurationFileFormat.cs index e2431ac62..e00e1eaa7 100644 --- a/Ryujinx.Common/Configuration/ConfigurationFileFormat.cs +++ b/Ryujinx.Common/Configuration/ConfigurationFileFormat.cs @@ -13,7 +13,7 @@ namespace Ryujinx.Configuration /// /// The current version of the file format /// - public const int CurrentVersion = 8; + public const int CurrentVersion = 9; public int Version { get; set; } @@ -137,6 +137,11 @@ namespace Ryujinx.Configuration /// public GuiColumns GuiColumns { get; set; } + /// + /// Used to configure column sort settings in the GUI + /// + public ColumnSort ColumnSort { get; set; } + /// /// A list of directories containing games to be used to load games into the games list /// @@ -157,6 +162,11 @@ namespace Ryujinx.Configuration /// public bool EnableKeyboard { get; set; } + /// + /// Hotkey Keyboard Bindings + /// + public KeyboardHotkeys Hotkeys { get; set; } + /// /// Keyboard control bindings /// diff --git a/Ryujinx.Common/Configuration/ConfigurationState.cs b/Ryujinx.Common/Configuration/ConfigurationState.cs index 26bbabc7b..2a85f7e19 100644 --- a/Ryujinx.Common/Configuration/ConfigurationState.cs +++ b/Ryujinx.Common/Configuration/ConfigurationState.cs @@ -44,11 +44,28 @@ namespace Ryujinx.Configuration } } + public class ColumnSortSettings + { + public ReactiveObject SortColumnId { get; private set; } + public ReactiveObject SortAscending { get; private set; } + + public ColumnSortSettings() + { + SortColumnId = new ReactiveObject(); + SortAscending = new ReactiveObject(); + } + } + /// /// Used to toggle columns in the GUI /// public Columns GuiColumns { get; private set; } + /// + /// Used to configure column sort settings in the GUI + /// + public ColumnSortSettings ColumnSort { get; private set; } + /// /// A list of directories containing games to be used to load games into the games list /// @@ -67,6 +84,7 @@ namespace Ryujinx.Configuration public UiSection() { GuiColumns = new Columns(); + ColumnSort = new ColumnSortSettings(); GameDirs = new ReactiveObject>(); EnableCustomTheme = new ReactiveObject(); CustomThemePath = new ReactiveObject(); @@ -217,6 +235,11 @@ namespace Ryujinx.Configuration /// public ReactiveObject EnableKeyboard { get; private set; } + /// + /// Hotkey Keyboard Bindings + /// + public ReactiveObject Hotkeys { get; private set; } + /// /// Input device configuration. /// NOTE: This ReactiveObject won't issue an event when the List has elements added or removed. @@ -227,6 +250,7 @@ namespace Ryujinx.Configuration public HidSection() { EnableKeyboard = new ReactiveObject(); + Hotkeys = new ReactiveObject(); InputConfig = new ReactiveObject>(); } } @@ -347,7 +371,7 @@ namespace Ryujinx.Configuration EnableFsIntegrityChecks = System.EnableFsIntegrityChecks, FsGlobalAccessLogMode = System.FsGlobalAccessLogMode, IgnoreMissingServices = System.IgnoreMissingServices, - GuiColumns = new GuiColumns() + GuiColumns = new GuiColumns { FavColumn = Ui.GuiColumns.FavColumn, IconColumn = Ui.GuiColumns.IconColumn, @@ -360,10 +384,16 @@ namespace Ryujinx.Configuration FileSizeColumn = Ui.GuiColumns.FileSizeColumn, PathColumn = Ui.GuiColumns.PathColumn, }, + ColumnSort = new ColumnSort + { + SortColumnId = Ui.ColumnSort.SortColumnId, + SortAscending = Ui.ColumnSort.SortAscending + }, GameDirs = Ui.GameDirs, EnableCustomTheme = Ui.EnableCustomTheme, CustomThemePath = Ui.CustomThemePath, EnableKeyboard = Hid.EnableKeyboard, + Hotkeys = Hid.Hotkeys, KeyboardConfig = keyboardConfigList, ControllerConfig = controllerConfigList }; @@ -406,10 +436,17 @@ namespace Ryujinx.Configuration Ui.GuiColumns.FileExtColumn.Value = true; Ui.GuiColumns.FileSizeColumn.Value = true; Ui.GuiColumns.PathColumn.Value = true; + Ui.ColumnSort.SortColumnId.Value = 0; + Ui.ColumnSort.SortAscending.Value = false; Ui.GameDirs.Value = new List(); Ui.EnableCustomTheme.Value = false; Ui.CustomThemePath.Value = ""; Hid.EnableKeyboard.Value = false; + + Hid.Hotkeys.Value = new KeyboardHotkeys + { + ToggleVsync = Key.Tab + }; Hid.InputConfig.Value = new List { @@ -451,10 +488,6 @@ namespace Ryujinx.Configuration ButtonZr = Key.O, ButtonSl = Key.PageUp, ButtonSr = Key.PageDown - }, - Hotkeys = new KeyboardHotkeys - { - ToggleVsync = Key.Tab } } }; @@ -553,10 +586,6 @@ namespace Ryujinx.Configuration ButtonZr = Key.O, ButtonSl = Key.Unbound, ButtonSr = Key.Unbound - }, - Hotkeys = new KeyboardHotkeys - { - ToggleVsync = Key.Tab } } }; @@ -587,6 +616,24 @@ namespace Ryujinx.Configuration configurationFileUpdated = true; } + if (configurationFileFormat.Version < 9) + { + Common.Logging.Logger.PrintWarning(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 9."); + + configurationFileFormat.ColumnSort = new ColumnSort + { + SortColumnId = 0, + SortAscending = false + }; + + configurationFileFormat.Hotkeys = new KeyboardHotkeys + { + ToggleVsync = Key.Tab + }; + + configurationFileUpdated = true; + } + List inputConfig = new List(); foreach (ControllerConfig controllerConfig in configurationFileFormat.ControllerConfig) { @@ -631,10 +678,13 @@ namespace Ryujinx.Configuration Ui.GuiColumns.FileExtColumn.Value = configurationFileFormat.GuiColumns.FileExtColumn; Ui.GuiColumns.FileSizeColumn.Value = configurationFileFormat.GuiColumns.FileSizeColumn; Ui.GuiColumns.PathColumn.Value = configurationFileFormat.GuiColumns.PathColumn; + Ui.ColumnSort.SortColumnId.Value = configurationFileFormat.ColumnSort.SortColumnId; + Ui.ColumnSort.SortAscending.Value = configurationFileFormat.ColumnSort.SortAscending; Ui.GameDirs.Value = configurationFileFormat.GameDirs; Ui.EnableCustomTheme.Value = configurationFileFormat.EnableCustomTheme; Ui.CustomThemePath.Value = configurationFileFormat.CustomThemePath; Hid.EnableKeyboard.Value = configurationFileFormat.EnableKeyboard; + Hid.Hotkeys.Value = configurationFileFormat.Hotkeys; Hid.InputConfig.Value = inputConfig; if (configurationFileUpdated) diff --git a/Ryujinx.Common/Configuration/Hid/KeyboardConfig.cs b/Ryujinx.Common/Configuration/Hid/KeyboardConfig.cs index 7dfbcb87e..4e217ae5d 100644 --- a/Ryujinx.Common/Configuration/Hid/KeyboardConfig.cs +++ b/Ryujinx.Common/Configuration/Hid/KeyboardConfig.cs @@ -14,10 +14,5 @@ namespace Ryujinx.Common.Configuration.Hid /// Right JoyCon Keyboard Bindings /// public NpadKeyboardRight RightJoycon { get; set; } - - /// - /// Hotkey Keyboard Bindings - /// - public KeyboardHotkeys Hotkeys { get; set; } } } \ No newline at end of file diff --git a/Ryujinx.Common/Configuration/Ui/ColumnSort.cs b/Ryujinx.Common/Configuration/Ui/ColumnSort.cs new file mode 100644 index 000000000..fd8b5da1a --- /dev/null +++ b/Ryujinx.Common/Configuration/Ui/ColumnSort.cs @@ -0,0 +1,8 @@ +namespace Ryujinx.Configuration.Ui +{ + public struct ColumnSort + { + public int SortColumnId { get; set; } + public bool SortAscending { get; set; } + } +} \ No newline at end of file diff --git a/Ryujinx/Config.json b/Ryujinx/Config.json index e87d34b10..a23df338e 100644 --- a/Ryujinx/Config.json +++ b/Ryujinx/Config.json @@ -1,5 +1,5 @@ { - "version": 8, + "version": 9, "max_anisotropy": -1, "graphics_shaders_dump_path": "", "logging_enable_debug": false, @@ -35,10 +35,17 @@ "file_size_column": true, "path_column": true }, + "column_sort": { + "sort_column_id": 0, + "sort_ascending": false + }, "game_dirs": [], "enable_custom_theme": false, "custom_theme_path": "", "enable_keyboard": false, + "hotkeys": { + "toggle_vsync": "Tab" + }, "keyboard_config": [ { "index": 0, @@ -75,9 +82,6 @@ "button_zr": "O", "button_sl": "Unbound", "button_sr": "Unbound" - }, - "hotkeys": { - "toggle_vsync": "Tab" } } ], diff --git a/Ryujinx/Ui/ApplicationData.cs b/Ryujinx/Ui/ApplicationData.cs index 49d7dfaad..34784c6c9 100644 --- a/Ryujinx/Ui/ApplicationData.cs +++ b/Ryujinx/Ui/ApplicationData.cs @@ -17,7 +17,6 @@ namespace Ryujinx.Ui public string FileExtension { get; set; } public string FileSize { get; set; } public string Path { get; set; } - public string SaveDataPath { get; set; } public BlitStruct ControlHolder { get; set; } } } diff --git a/Ryujinx/Ui/ApplicationLibrary.cs b/Ryujinx/Ui/ApplicationLibrary.cs index 776f4fa4c..5e8a24327 100644 --- a/Ryujinx/Ui/ApplicationLibrary.cs +++ b/Ryujinx/Ui/ApplicationLibrary.cs @@ -131,7 +131,6 @@ namespace Ryujinx.Ui string titleId = "0000000000000000"; string developer = "Unknown"; string version = "0"; - string saveDataPath = null; byte[] applicationIcon = null; BlitStruct controlHolder = new BlitStruct(1); @@ -389,20 +388,6 @@ namespace Ryujinx.Ui ApplicationMetadata appMetadata = LoadAndSaveMetaData(titleId); - if (ulong.TryParse(titleId, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ulong titleIdNum)) - { - SaveDataFilter filter = new SaveDataFilter(); - filter.SetUserId(new UserId(1, 0)); - filter.SetProgramId(new TitleId(titleIdNum)); - - Result result = virtualFileSystem.FsClient.FindSaveDataWithFilter(out SaveDataInfo saveDataInfo, SaveDataSpaceId.User, ref filter); - - if (result.IsSuccess()) - { - saveDataPath = Path.Combine(virtualFileSystem.GetNandPath(), "user", "save", saveDataInfo.SaveDataId.ToString("x16")); - } - } - ApplicationData data = new ApplicationData { Favorite = appMetadata.Favorite, @@ -416,7 +401,6 @@ namespace Ryujinx.Ui FileExtension = Path.GetExtension(applicationPath).ToUpper().Remove(0, 1), FileSize = (fileSize < 1) ? (fileSize * 1024).ToString("0.##") + "MB" : fileSize.ToString("0.##") + "GB", Path = applicationPath, - SaveDataPath = saveDataPath, ControlHolder = controlHolder }; diff --git a/Ryujinx/Ui/ControllerWindow.cs b/Ryujinx/Ui/ControllerWindow.cs index 47d6db196..35c3859fc 100644 --- a/Ryujinx/Ui/ControllerWindow.cs +++ b/Ryujinx/Ui/ControllerWindow.cs @@ -419,10 +419,6 @@ namespace Ryujinx.Ui ButtonZr = rButtonZr, ButtonSl = rButtonSl, ButtonSr = rButtonSr - }, - Hotkeys = new KeyboardHotkeys - { - ToggleVsync = Key.Tab //TODO: Make this an option in the GUI } }; } @@ -754,10 +750,6 @@ namespace Ryujinx.Ui ButtonZr = Key.O, ButtonSl = Key.Unbound, ButtonSr = Key.Unbound - }, - Hotkeys = new KeyboardHotkeys - { - ToggleVsync = Key.Tab } }; } diff --git a/Ryujinx/Ui/GLRenderer.cs b/Ryujinx/Ui/GLRenderer.cs index 6651358d3..17b592a70 100644 --- a/Ryujinx/Ui/GLRenderer.cs +++ b/Ryujinx/Ui/GLRenderer.cs @@ -449,17 +449,6 @@ namespace Ryujinx.Ui { _device.Hid.Keyboard.Update(hidKeyboard.Value); } - - // Toggle vsync - HotkeyButtons currentHotkeyButtons = keyboardController.GetHotkeyButtons(); - - if (currentHotkeyButtons.HasFlag(HotkeyButtons.ToggleVSync) && - !_prevHotkeyButtons.HasFlag(HotkeyButtons.ToggleVSync)) - { - _device.EnableDeviceVsync = !_device.EnableDeviceVsync; - } - - _prevHotkeyButtons = currentHotkeyButtons; } } else if (inputConfig is Common.Configuration.Hid.ControllerConfig controllerConfig) @@ -498,6 +487,17 @@ namespace Ryujinx.Ui _device.Hid.Npads.SetGamepadsInput(gamepadInputs.ToArray()); + // Hotkeys + HotkeyButtons currentHotkeyButtons = KeyboardController.GetHotkeyButtons(OpenTK.Input.Keyboard.GetState()); + + if (currentHotkeyButtons.HasFlag(HotkeyButtons.ToggleVSync) && + !_prevHotkeyButtons.HasFlag(HotkeyButtons.ToggleVSync)) + { + _device.EnableDeviceVsync = !_device.EnableDeviceVsync; + } + + _prevHotkeyButtons = currentHotkeyButtons; + //Touchscreen bool hasTouch = false; diff --git a/Ryujinx/Ui/KeyboardController.cs b/Ryujinx/Ui/KeyboardController.cs index efa7bf566..f52642e3e 100644 --- a/Ryujinx/Ui/KeyboardController.cs +++ b/Ryujinx/Ui/KeyboardController.cs @@ -1,6 +1,7 @@ using System; using OpenTK.Input; using Ryujinx.Common.Configuration.Hid; +using Ryujinx.Configuration; using Ryujinx.HLE.HOS.Services.Hid; namespace Ryujinx.Ui @@ -91,20 +92,21 @@ namespace Ryujinx.Ui return (dx, dy); } - public HotkeyButtons GetHotkeyButtons() + public static HotkeyButtons GetHotkeyButtons(KeyboardState keyboard) { - KeyboardState keyboard = GetKeyboardState(_config.Index); - HotkeyButtons buttons = 0; - if (keyboard[(Key)_config.Hotkeys.ToggleVsync]) buttons |= HotkeyButtons.ToggleVSync; + if (keyboard[(Key)ConfigurationState.Instance.Hid.Hotkeys.Value.ToggleVsync]) + { + buttons |= HotkeyButtons.ToggleVSync; + } return buttons; } class KeyMappingEntry { - public Key TargetKey; + public Key TargetKey; public byte Target; } diff --git a/Ryujinx/Ui/MainWindow.cs b/Ryujinx/Ui/MainWindow.cs index 342acc9f8..3bfeee557 100644 --- a/Ryujinx/Ui/MainWindow.cs +++ b/Ryujinx/Ui/MainWindow.cs @@ -167,7 +167,11 @@ namespace Ryujinx.Ui _tableStore.SetSortFunc(5, TimePlayedSort); _tableStore.SetSortFunc(6, LastPlayedSort); _tableStore.SetSortFunc(8, FileSizeSort); - _tableStore.SetSortColumnId(0, SortType.Descending); + + int columnId = ConfigurationState.Instance.Ui.ColumnSort.SortColumnId; + bool ascending = ConfigurationState.Instance.Ui.ColumnSort.SortAscending; + + _tableStore.SetSortColumnId(columnId, ascending ? SortType.Ascending : SortType.Descending); _gameTable.EnableSearch = true; _gameTable.SearchColumn = 2; @@ -254,15 +258,45 @@ namespace Ryujinx.Ui foreach (TreeViewColumn column in _gameTable.Columns) { - if (column.Title == "Fav" && ConfigurationState.Instance.Ui.GuiColumns.FavColumn) column.SortColumnId = 0; - else if (column.Title == "Application" && ConfigurationState.Instance.Ui.GuiColumns.AppColumn) column.SortColumnId = 2; - else if (column.Title == "Developer" && ConfigurationState.Instance.Ui.GuiColumns.DevColumn) column.SortColumnId = 3; - else if (column.Title == "Version" && ConfigurationState.Instance.Ui.GuiColumns.VersionColumn) column.SortColumnId = 4; - else if (column.Title == "Time Played" && ConfigurationState.Instance.Ui.GuiColumns.TimePlayedColumn) column.SortColumnId = 5; - else if (column.Title == "Last Played" && ConfigurationState.Instance.Ui.GuiColumns.LastPlayedColumn) column.SortColumnId = 6; - else if (column.Title == "File Ext" && ConfigurationState.Instance.Ui.GuiColumns.FileExtColumn) column.SortColumnId = 7; - else if (column.Title == "File Size" && ConfigurationState.Instance.Ui.GuiColumns.FileSizeColumn) column.SortColumnId = 8; - else if (column.Title == "Path" && ConfigurationState.Instance.Ui.GuiColumns.PathColumn) column.SortColumnId = 9; + switch (column.Title) + { + case "Fav": + column.SortColumnId = 0; + column.Clicked += Column_Clicked; + break; + case "Application": + column.SortColumnId = 2; + column.Clicked += Column_Clicked; + break; + case "Developer": + column.SortColumnId = 3; + column.Clicked += Column_Clicked; + break; + case "Version": + column.SortColumnId = 4; + column.Clicked += Column_Clicked; + break; + case "Time Played": + column.SortColumnId = 5; + column.Clicked += Column_Clicked; + break; + case "Last Played": + column.SortColumnId = 6; + column.Clicked += Column_Clicked; + break; + case "File Ext": + column.SortColumnId = 7; + column.Clicked += Column_Clicked; + break; + case "File Size": + column.SortColumnId = 8; + column.Clicked += Column_Clicked; + break; + case "Path": + column.SortColumnId = 9; + column.Clicked += Column_Clicked; + break; + } } } @@ -666,6 +700,11 @@ namespace Ryujinx.Ui } _progressBar.Value = barValue; + + if (args.NumAppsLoaded == args.NumAppsFound) // Reset the vertical scrollbar to the top when titles finish loading + { + _gameTableWindow.Vadjustment.Value = 0; + } }); } @@ -707,6 +746,16 @@ namespace Ryujinx.Ui }); } + private void Column_Clicked(object sender, EventArgs args) + { + TreeViewColumn column = (TreeViewColumn)sender; + + ConfigurationState.Instance.Ui.ColumnSort.SortColumnId.Value = column.SortColumnId; + ConfigurationState.Instance.Ui.ColumnSort.SortAscending.Value = column.SortOrder == SortType.Ascending; + + SaveConfig(); + } + private void Row_Activated(object sender, RowActivatedArgs args) { _gameTableSelection.GetSelected(out TreeIter treeIter); diff --git a/Ryujinx/_schema.json b/Ryujinx/_schema.json index c940d4c90..6d57b7887 100644 --- a/Ryujinx/_schema.json +++ b/Ryujinx/_schema.json @@ -22,10 +22,9 @@ "enable_ptc", "enable_fs_integrity_checks", "fs_global_access_log_mode", - "controller_type", "enable_keyboard", - "keyboard_controls", - "joystick_controls" + "keyboard_config", + "controller_config" ], "definitions": { "key": { @@ -222,9 +221,498 @@ "Hat2Left", "Hat2Right" ] + }, + "keyboard_config": { + "type": "object", + "properties": { + "index": { + "$id": "#/definitions/keyboard_config/properties/index", + "type": "integer", + "title": "Keyboard Index", + "description": "Keyboard Device Index", + "default": 0, + "minimum": 0, + "examples": [ + 0, + 1, + 2 + ] + }, + "controller_type": { + "$id": "#/properties/keyboard_config/properties/controller_type", + "type": "string", + "title": "Controller Type", + "default": "Handheld", + "enum": [ + "Handheld", + "ProController", + "JoyconPair", + "JoyconLeft", + "JoyconRight" + ], + "examples": [ + "Handheld", + "ProController", + "JoyconPair", + "JoyconLeft", + "JoyconRight" + ] + }, + "player_index": { + "$id": "#/properties/keyboard_config/properties/player_index", + "type": "string", + "title": "Player Index", + "default": "Player1", + "enum": [ + "Player1", + "Player2", + "Player3", + "Player4", + "Player5", + "Player6", + "Player7", + "Player8", + "Handheld" + ] + }, + "left_joycon": { + "$id": "#/definitions/keyboard_config/properties/left_joycon", + "type": "object", + "title": "Left JoyCon Controls", + "required": [ + "stick_up", + "stick_down", + "stick_left", + "stick_right", + "stick_button", + "dpad_up", + "dpad_down", + "dpad_left", + "dpad_right", + "button_minus", + "button_l", + "button_zl" + ], + "properties": { + "stick_up": { + "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/stick_up", + "$ref": "#/definitions/key", + "title": "Stick Up", + "default": "w" + }, + "stick_down": { + "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/stick_down", + "$ref": "#/definitions/key", + "title": "Stick Down", + "default": "S" + }, + "stick_left": { + "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/stick_left", + "$ref": "#/definitions/key", + "title": "Stick Left", + "default": "A" + }, + "stick_right": { + "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/stick_right", + "$ref": "#/definitions/key", + "title": "Stick Right", + "default": "D" + }, + "stick_button": { + "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/stick_button", + "$ref": "#/definitions/key", + "title": "Stick Button", + "default": "F" + }, + "dpad_up": { + "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/dpad_up", + "$ref": "#/definitions/key", + "title": "Dpad Up", + "default": "Up" + }, + "dpad_down": { + "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/dpad_down", + "$ref": "#/definitions/key", + "title": "Dpad Down", + "default": "Down" + }, + "dpad_left": { + "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/dpad_left", + "$ref": "#/definitions/key", + "title": "Dpad Left", + "default": "Left" + }, + "dpad_right": { + "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/dpad_right", + "$ref": "#/definitions/key", + "title": "Dpad Right", + "default": "Right" + }, + "button_minus": { + "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/button_minus", + "$ref": "#/definitions/key", + "title": "Button Minus", + "default": "Minus" + }, + "button_l": { + "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/button_l", + "$ref": "#/definitions/key", + "title": "Button L", + "default": "E" + }, + "button_zl": { + "$id": "#/definitions/keyboard_config/properties/left_joycon/properties/button_zl", + "$ref": "#/definitions/key", + "title": "Button ZL", + "default": "Q" + } + } + }, + "right_joycon": { + "$id": "#/definitions/keyboard_config/properties/right_joycon", + "type": "object", + "title": "Right JoyCon Controls", + "required": [ + "stick_up", + "stick_down", + "stick_left", + "stick_right", + "stick_button", + "button_a", + "button_b", + "button_x", + "button_y", + "button_plus", + "button_r", + "button_zr" + ], + "properties": { + "stick_up": { + "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/stick_up", + "$ref": "#/definitions/key", + "title": "Stick Up", + "default": "I" + }, + "stick_down": { + "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/stick_down", + "$ref": "#/definitions/key", + "title": "Stick Down", + "default": "K" + }, + "stick_left": { + "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/stick_left", + "$ref": "#/definitions/key", + "title": "Stick Left", + "default": "J" + }, + "stick_right": { + "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/stick_right", + "$ref": "#/definitions/key", + "title": "Stick Right", + "default": "L" + }, + "stick_button": { + "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/stick_button", + "$ref": "#/definitions/key", + "title": "Stick Button", + "default": "H" + }, + "button_a": { + "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_a", + "$ref": "#/definitions/key", + "title": "Button A", + "default": "Z" + }, + "button_b": { + "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_b", + "$ref": "#/definitions/key", + "title": "Button B", + "default": "X" + }, + "button_x": { + "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_x", + "$ref": "#/definitions/key", + "title": "Button X", + "default": "C" + }, + "button_y": { + "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_y", + "$ref": "#/definitions/key", + "title": "Button Y", + "default": "V" + }, + "button_plus": { + "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_plus", + "$ref": "#/definitions/key", + "title": "Button Plus", + "default": "Plus" + }, + "button_r": { + "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_r", + "$ref": "#/definitions/key", + "title": "Button R", + "default": "U" + }, + "button_zr": { + "$id": "#/definitions/keyboard_config/properties/right_joycon/properties/button_zr", + "$ref": "#/definitions/key", + "title": "Button Zr", + "default": "O" + } + } + } + } + }, + "controller_config": { + "type": "object", + "properties": { + "index": { + "$id": "#/definitions/controller_config/properties/index", + "type": "integer", + "title": "Controller Index", + "description": "Controller Device Index", + "default": 0, + "minimum": 0, + "examples": [ + 0, + 1, + 2 + ] + }, + "controller_type": { + "$id": "#/properties/controller_config/properties/controller_type", + "type": "string", + "title": "Controller Type", + "default": "Handheld", + "enum": [ + "Handheld", + "ProController", + "JoyconPair", + "JoyconLeft", + "JoyconRight" + ], + "examples": [ + "Handheld", + "ProController", + "JoyconPair", + "JoyconLeft", + "JoyconRight" + ] + }, + "player_index": { + "$id": "#/properties/controller_config/properties/player_index", + "type": "string", + "title": "Player Index", + "default": "Player1", + "enum": [ + "Player1", + "Player2", + "Player3", + "Player4", + "Player5", + "Player6", + "Player7", + "Player8", + "Handheld" + ] + }, + "deadzone_left": { + "$id": "#/definitions/controller_config/properties/deadzone_left", + "type": "number", + "title": "Left Joystick Deadzone", + "description": "Controller Left Analog Stick Deadzone", + "default": 0.05, + "minimum": 0.00, + "maximum": 1.00, + "examples": [ + 0.05 + ] + }, + "deadzone_right": { + "$id": "#/definitions/controller_config/properties/deadzone_right", + "type": "number", + "title": "Right Joystick Deadzone", + "description": "Controller Right Analog Stick Deadzone", + "default": 0.05, + "minimum": 0.00, + "maximum": 1.00, + "examples": [ + 0.05 + ] + }, + "trigger_threshold": { + "$id": "#/definitions/controller_config/properties/trigger_threshold", + "type": "number", + "title": "Controller Trigger Threshold", + "description": "The value of how pressed down each trigger has to be in order to register a button press", + "default": 0.5, + "minimum": 0.0, + "maximum": 1.0, + "examples": [ + 0.5 + ] + }, + "left_joycon": { + "$id": "#/definitions/controller_config/properties/left_joycon", + "type": "object", + "title": "Left JoyCon Controls", + "required": [ + "stick", + "stick_button", + "dpad_up", + "dpad_down", + "dpad_left", + "dpad_right", + "button_minus", + "button_l", + "button_zl" + ], + "properties": { + "stick": { + "$id": "#/definitions/controller_config/properties/left_joycon/properties/stick", + "$ref": "#/definitions/input", + "title": "Stick", + "default": "Axis0" + }, + "stick_button": { + "$id": "#/definitions/controller_config/properties/left_joycon/properties/stick_button", + "$ref": "#/definitions/input", + "title": "Stick Button", + "default": "Button13" + }, + "dpad_up": { + "$id": "#/definitions/controller_config/properties/left_joycon/properties/dpad_up", + "$ref": "#/definitions/input", + "title": "Dpad Up", + "default": "Hat0Up" + }, + "dpad_down": { + "$id": "#/definitions/controller_config/properties/left_joycon/properties/dpad_down", + "$ref": "#/definitions/input", + "title": "Dpad Down", + "default": "Hat0Down" + }, + "dpad_left": { + "$id": "#/definitions/controller_config/properties/left_joycon/properties/dpad_left", + "$ref": "#/definitions/input", + "title": "Dpad Left", + "default": "Hat0Left" + }, + "dpad_right": { + "$id": "#/definitions/controller_config/properties/left_joycon/properties/dpad_right", + "$ref": "#/definitions/input", + "title": "Dpad Right", + "default": "Hat0Right" + }, + "button_minus": { + "$id": "#/definitions/controller_config/properties/left_joycon/properties/button_minus", + "$ref": "#/definitions/input", + "title": "Button Minus", + "default": "Button10" + }, + "button_l": { + "$id": "#/definitions/controller_config/properties/left_joycon/properties/button_l", + "$ref": "#/definitions/input", + "title": "Button L", + "default": "Button6" + }, + "button_zl": { + "$id": "#/definitions/controller_config/properties/left_joycon/properties/button_zl", + "$ref": "#/definitions/input", + "title": "Button ZL", + "default": "Button8" + } + } + }, + "right_joycon": { + "$id": "#/definitions/controller_config/properties/right_joycon", + "type": "object", + "title": "Right JoyCon Controls", + "required": [ + "stick", + "stick_button", + "button_a", + "button_b", + "button_x", + "button_y", + "button_plus", + "button_r", + "button_zr" + ], + "properties": { + "stick": { + "$id": "#/definitions/controller_config/properties/right_joycon/properties/stick", + "$ref": "#/definitions/input", + "title": "Stick", + "default": "Axis2" + }, + "stick_button": { + "$id": "#/definitions/controller_config/properties/right_joycon/properties/stick_button", + "$ref": "#/definitions/input", + "title": "Stick Button", + "default": "Button14" + }, + "button_a": { + "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_a", + "$ref": "#/definitions/input", + "title": "Button A", + "default": "Button0" + }, + "button_b": { + "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_b", + "$ref": "#/definitions/input", + "title": "Button B", + "default": "Button1" + }, + "button_x": { + "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_x", + "$ref": "#/definitions/input", + "title": "Button X", + "default": "Button3" + }, + "button_y": { + "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_y", + "$ref": "#/definitions/input", + "title": "Button Y", + "default": "Button4" + }, + "button_plus": { + "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_plus", + "$ref": "#/definitions/input", + "title": "Button Plus", + "default": "Button11" + }, + "button_r": { + "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_r", + "$ref": "#/definitions/input", + "title": "Button R", + "default": "Button7" + }, + "button_zr": { + "$id": "#/definitions/controller_config/properties/right_joycon/properties/button_zr", + "$ref": "#/definitions/input", + "title": "Button ZR", + "default": "Button9" + } + } + } + } } }, "properties": { + "max_anisotropy": { + "$id": "#/properties/max_anisotropy", + "type": "integer", + "title": "Max Anisotropy. Values range from 0 - 16. Set to -1 to let the game decide.", + "description": "Max Anisotropy. Values range from 0 - 16. Set to -1 to let the game decide.", + "default": -1, + "examples": [ + -1, + 4, + 8, + 16 + ] + }, "graphics_shaders_dump_path": { "$id": "#/properties/graphics_shaders_dump_path", "type": "string", @@ -526,6 +1014,94 @@ false ] }, + "gui_columns": { + "$id": "#/properties/gui_columns", + "type": "object", + "title": "Used to toggle columns in the GUI", + "description": "Used to toggle columns in the GUI", + "properties": { + "fav_column": { + "$id": "#/properties/gui_columns/properties/fav_column", + "type": "boolean", + "title": "", + "default": true + }, + "icon_column": { + "$id": "#/properties/gui_columns/properties/icon_column", + "type": "boolean", + "title": "", + "default": true + }, + "app_column": { + "$id": "#/properties/gui_columns/properties/app_column", + "type": "boolean", + "title": "", + "default": true + }, + "dev_column": { + "$id": "#/properties/gui_columns/properties/dev_column", + "type": "boolean", + "title": "", + "default": true + }, + "version_column": { + "$id": "#/properties/gui_columns/properties/version_column", + "type": "boolean", + "title": "", + "default": true + }, + "time_played_column": { + "$id": "#/properties/gui_columns/properties/time_played_column", + "type": "boolean", + "title": "", + "default": true + }, + "last_played_column": { + "$id": "#/properties/gui_columns/properties/last_played_column", + "type": "boolean", + "title": "", + "default": true + }, + "file_ext_column": { + "$id": "#/properties/gui_columns/properties/file_ext_column", + "type": "boolean", + "title": "", + "default": true + }, + "file_size_column": { + "$id": "#/properties/gui_columns/properties/file_size_column", + "type": "boolean", + "title": "", + "default": true + }, + "path_column": { + "$id": "#/properties/gui_columns/properties/path_column", + "type": "boolean", + "title": "", + "default": true + } + } + }, + "column_sort": { + "$id": "#/properties/column_sort", + "type": "object", + "title": "Used to configure column sort settings in the GUI", + "description": "Used to configure column sort settings in the GUI", + "properties": { + "sort_column_id": { + "$id": "#/properties/column_sort/properties/sort_column_id", + "type": "integer", + "title": "", + "default": 0 + }, + "sort_ascending": { + "$id": "#/properties/column_sort/properties/sort_ascending", + "type": "boolean", + "title": "", + "default": false + } + } + }, "game_dirs": { "$id": "#/properties/game_dirs", "type": "array", @@ -533,24 +1109,6 @@ "description": "A list of directories containing games to be used to load games into the games list", "default": [] }, - "gui_columns": { - "$id": "#/properties/gui_columns", - "type": "array", - "title": "Used to toggle columns in the GUI", - "description": "Used to toggle columns in the GUI", - "default": { - "fav_column": true, - "icon_column": true, - "app_column": true, - "dev_column": true, - "version_column": true, - "time_played_column": true, - "last_played_column": true, - "file_ext_column": true, - "file_size_column": true, - "path_column": true - } - }, "enable_custom_theme": { "$id": "#/properties/enable_custom_theme", "type": "boolean", @@ -569,26 +1127,6 @@ "description": "Path to custom GUI theme", "default": "" }, - "controller_type": { - "$id": "#/properties/controller_type", - "type": "string", - "title": "Controller Type", - "default": "Handheld", - "enum": [ - "Handheld", - "ProController", - "NpadPair", - "NpadLeft", - "NpadRight" - ], - "examples": [ - "Handheld", - "ProController", - "NpadPair", - "NpadLeft", - "NpadRight" - ] - }, "enable_keyboard": { "$id": "#/properties/enable_keyboard", "type": "boolean", @@ -600,421 +1138,77 @@ false ] }, - "keyboard_controls": { - "$id": "#/properties/keyboard_controls", + "hotkeys": { + "$id": "#/properties/hotkeys", "type": "object", - "title": "Keyboard Controls", + "title": "Hotkey Controls", "required": [ - "left_joycon", - "right_joycon" + "toggle_vsync" ], "properties": { - "left_joycon": { - "$id": "#/properties/keyboard_controls/properties/left_joycon", - "type": "object", - "title": "Left JoyCon Controls", - "required": [ - "stick_up", - "stick_down", - "stick_left", - "stick_right", - "stick_button", - "dpad_up", - "dpad_down", - "dpad_left", - "dpad_right", - "button_minus", - "button_l", - "button_zl" - ], - "properties": { - "stick_up": { - "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/stick_up", - "$ref": "#/definitions/key", - "title": "Stick Up", - "default": "w" - }, - "stick_down": { - "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/stick_down", - "$ref": "#/definitions/key", - "title": "Stick Down", - "default": "S" - }, - "stick_left": { - "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/stick_left", - "$ref": "#/definitions/key", - "title": "Stick Left", - "default": "A" - }, - "stick_right": { - "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/stick_right", - "$ref": "#/definitions/key", - "title": "Stick Right", - "default": "D" - }, - "stick_button": { - "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/stick_button", - "$ref": "#/definitions/key", - "title": "Stick Button", - "default": "F" - }, - "dpad_up": { - "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/dpad_up", - "$ref": "#/definitions/key", - "title": "Dpad Up", - "default": "Up" - }, - "dpad_down": { - "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/dpad_down", - "$ref": "#/definitions/key", - "title": "Dpad Down", - "default": "Down" - }, - "dpad_left": { - "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/dpad_left", - "$ref": "#/definitions/key", - "title": "Dpad Left", - "default": "Left" - }, - "dpad_right": { - "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/dpad_right", - "$ref": "#/definitions/key", - "title": "Dpad Right", - "default": "Right" - }, - "button_minus": { - "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/button_minus", - "$ref": "#/definitions/key", - "title": "Button Minus", - "default": "Minus" - }, - "button_l": { - "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/button_l", - "$ref": "#/definitions/key", - "title": "Button L", - "default": "E" - }, - "button_zl": { - "$id": "#/properties/keyboard_controls/properties/left_joycon/properties/button_zl", - "$ref": "#/definitions/key", - "title": "Button ZL", - "default": "Q" - } - } - }, - "right_joycon": { - "$id": "#/properties/keyboard_controls/properties/right_joycon", - "type": "object", - "title": "Right JoyCon Controls", - "required": [ - "stick_up", - "stick_down", - "stick_left", - "stick_right", - "stick_button", - "button_a", - "button_b", - "button_x", - "button_y", - "button_plus", - "button_r", - "button_zr" - ], - "properties": { - "stick_up": { - "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/stick_up", - "$ref": "#/definitions/key", - "title": "Stick Up", - "default": "I" - }, - "stick_down": { - "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/stick_down", - "$ref": "#/definitions/key", - "title": "Stick Down", - "default": "K" - }, - "stick_left": { - "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/stick_left", - "$ref": "#/definitions/key", - "title": "Stick Left", - "default": "J" - }, - "stick_right": { - "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/stick_right", - "$ref": "#/definitions/key", - "title": "Stick Right", - "default": "L" - }, - "stick_button": { - "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/stick_button", - "$ref": "#/definitions/key", - "title": "Stick Button", - "default": "H" - }, - "button_a": { - "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_a", - "$ref": "#/definitions/key", - "title": "Button A", - "default": "Z" - }, - "button_b": { - "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_b", - "$ref": "#/definitions/key", - "title": "Button B", - "default": "X" - }, - "button_x": { - "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_x", - "$ref": "#/definitions/key", - "title": "Button X", - "default": "C" - }, - "button_y": { - "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_y", - "$ref": "#/definitions/key", - "title": "Button Y", - "default": "V" - }, - "button_plus": { - "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_plus", - "$ref": "#/definitions/key", - "title": "Button Plus", - "default": "Plus" - }, - "button_r": { - "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_r", - "$ref": "#/definitions/key", - "title": "Button R", - "default": "U" - }, - "button_zr": { - "$id": "#/properties/keyboard_controls/properties/right_joycon/properties/button_zr", - "$ref": "#/definitions/key", - "title": "Button Zr", - "default": "O" - } - } - }, - "hotkeys": { - "$id": "#/properties/keyboard_controls/properties/hotkeys", - "type": "object", - "title": "Hotkey Controls", - "required": [ - "toggle_vsync" - ], - "properties": { - "toggle_vsync": { - "$id": "#/properties/keyboard_controls/properties/hotkeys/properties/toggle_vsync", - "$ref": "#/definitions/key", - "title": "Toggle VSync", - "default": "Tab" - } - } + "toggle_vsync": { + "$id": "#/properties/hotkeys/properties/toggle_vsync", + "$ref": "#/definitions/key", + "title": "Toggle VSync", + "default": "Tab" } } }, - "joystick_controls": { - "$id": "#/properties/joystick_controls", - "type": "object", - "title": "Joystick Controls", - "required": [ - "left_joycon", - "right_joycon" - ], - "properties": { - "enable": { - "$id": "#/properties/joystick_controls/properties/enable", - "type": "boolean", - "title": "Joystick Enable", - "description": "Enables or disables controller support", - "default": true, - "examples": [ - true, - false - ] - }, - "index": { - "$id": "#/properties/joystick_controls/properties/index", - "type": "integer", - "title": "Joystick Index", - "description": "Controller Device Index", - "default": 0, - "minimum": 0, - "examples": [ - 0, - 1, - 2 - ] - }, - "deadzone": { - "$id": "#/properties/joystick_controls/properties/deadzone", - "type": "number", - "title": "Joystick Deadzone", - "description": "Controller Analog Stick Deadzone", - "default": 0.05, - "minimum": 0.00, - "maximum": 1.00, - "examples": [ - 0.05 - ] - }, - "trigger_threshold": { - "$id": "#/properties/joystick_controls/properties/trigger_threshold", - "type": "number", - "title": "Controller Trigger Threshold", - "description": "The value of how pressed down each trigger has to be in order to register a button press", - "default": 0.5, - "minimum": 0.0, - "maximum": 1.0, - "examples": [ - 0.5 - ] - }, - "left_joycon": { - "$id": "#/properties/joystick_controls/properties/left_joycon", - "type": "object", - "title": "Left JoyCon Controls", - "required": [ - "stick", - "stick_button", - "dpad_up", - "dpad_down", - "dpad_left", - "dpad_right", - "button_minus", - "button_l", - "button_zl" - ], - "properties": { - "stick": { - "$id": "#/properties/joystick_controls/properties/left_joycon/properties/stick", - "$ref": "#/definitions/input", - "title": "Stick", - "default": "Axis0" - }, - "stick_button": { - "$id": "#/properties/joystick_controls/properties/left_joycon/properties/stick_button", - "$ref": "#/definitions/input", - "title": "Stick Button", - "default": "Button13" - }, - "dpad_up": { - "$id": "#/properties/joystick_controls/properties/left_joycon/properties/dpad_up", - "$ref": "#/definitions/input", - "title": "Dpad Up", - "default": "Hat0Up" - }, - "dpad_down": { - "$id": "#/properties/joystick_controls/properties/left_joycon/properties/dpad_down", - "$ref": "#/definitions/input", - "title": "Dpad Down", - "default": "Hat0Down" - }, - "dpad_left": { - "$id": "#/properties/joystick_controls/properties/left_joycon/properties/dpad_left", - "$ref": "#/definitions/input", - "title": "Dpad Left", - "default": "Hat0Left" - }, - "dpad_right": { - "$id": "#/properties/joystick_controls/properties/left_joycon/properties/dpad_right", - "$ref": "#/definitions/input", - "title": "Dpad Right", - "default": "Hat0Right" - }, - "button_minus": { - "$id": "#/properties/joystick_controls/properties/left_joycon/properties/button_minus", - "$ref": "#/definitions/input", - "title": "Button Minus", - "default": "Button10" - }, - "button_l": { - "$id": "#/properties/joystick_controls/properties/left_joycon/properties/button_l", - "$ref": "#/definitions/input", - "title": "Button L", - "default": "Button6" - }, - "button_zl": { - "$id": "#/properties/joystick_controls/properties/left_joycon/properties/button_zl", - "$ref": "#/definitions/input", - "title": "Button ZL", - "default": "Button8" - } - } - }, - "right_joycon": { - "$id": "#/properties/joystick_controls/properties/right_joycon", - "type": "object", - "title": "Right JoyCon Controls", - "required": [ - "stick", - "stick_button", - "button_a", - "button_b", - "button_x", - "button_y", - "button_plus", - "button_r", - "button_zr" - ], - "properties": { - "stick": { - "$id": "#/properties/joystick_controls/properties/right_joycon/properties/stick", - "$ref": "#/definitions/input", - "title": "Stick", - "default": "Axis2" - }, - "stick_button": { - "$id": "#/properties/joystick_controls/properties/right_joycon/properties/stick_button", - "$ref": "#/definitions/input", - "title": "Stick Button", - "default": "Button14" - }, - "button_a": { - "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_a", - "$ref": "#/definitions/input", - "title": "Button A", - "default": "Button0" - }, - "button_b": { - "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_b", - "$ref": "#/definitions/input", - "title": "Button B", - "default": "Button1" - }, - "button_x": { - "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_x", - "$ref": "#/definitions/input", - "title": "Button X", - "default": "Button3" - }, - "button_y": { - "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_y", - "$ref": "#/definitions/input", - "title": "Button Y", - "default": "Button4" - }, - "button_plus": { - "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_plus", - "$ref": "#/definitions/input", - "title": "Button Plus", - "default": "Button11" - }, - "button_r": { - "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_r", - "$ref": "#/definitions/input", - "title": "Button R", - "default": "Button7" - }, - "button_zr": { - "$id": "#/properties/joystick_controls/properties/right_joycon/properties/button_zr", - "$ref": "#/definitions/input", - "title": "Button ZR", - "default": "Button9" - } + "keyboard_config": { + "$id": "#/properties/keyboard_config", + "type": "array", + "title": "Keyboard Config", + "items": { + "$ref": "#/definitions/keyboard_config" + }, + "default": [ + { + "index": 0, + "controller_type": "JoyconPair", + "player_index": "Player1", + "left_joycon": { + "stick_up": "W", + "stick_down": "S", + "stick_left": "A", + "stick_right": "D", + "stick_button": "F", + "dpad_up": "Up", + "dpad_down": "Down", + "dpad_left": "Left", + "dpad_right": "Right", + "button_minus": "Minus", + "button_l": "E", + "button_zl": "Q", + "button_sl": "Unbound", + "button_sr": "Unbound" + }, + "right_joycon": { + "stick_up": "I", + "stick_down": "K", + "stick_left": "J", + "stick_right": "L", + "stick_button": "H", + "button_a": "Z", + "button_b": "X", + "button_x": "C", + "button_y": "V", + "button_plus": "Plus", + "button_r": "U", + "button_zr": "O", + "button_sl": "Unbound", + "button_sr": "Unbound" } } - } + ] + }, + "controller_config": { + "$id": "#/properties/controller_config", + "type": "array", + "title": "Controller Config", + "items": { + "$ref": "#/definitions/controller_config" + }, + "default": [] } } -} +} \ No newline at end of file