private void ToTheme(string themeName) { var parser = new IniFileParser.IniFileParser(); IniData data; using (var sr = new StreamReader(Config.PathToQtCreatorConfigFile)) { data = parser.ReadData(sr); } data["Core"]["CreatorTheme"] = themeName; using (var sw = new StreamWriter(Config.PathToQtCreatorConfigFile)) { parser.WriteData(sw, data); } }
/// <summary> /// Loads up the config file and its default elements. /// </summary> private void LoadConfig() { const string name = "skin.ini"; if (!File.Exists($"{Dir}/{name}")) { return; } Config = new IniFileParser.IniFileParser(new ConcatenateDuplicatedKeysIniDataParser()).ReadFile($"{Dir}/{name}"); // Parse very general things in config. Name = ConfigHelper.ReadString(Name, Config["General"]["Name"]); Author = ConfigHelper.ReadString(Author, Config["General"]["Author"]); Version = ConfigHelper.ReadString(Version, Config["General"]["Version"]); CenterCursor = ConfigHelper.ReadBool(false, Config["General"]["CenterCursor"]); }
/// <summary> /// Reads config file for skin.ini elements. /// /// REMEMBER TO SET YOUR DEFAULTS FOR BOTH 4K AND 7K /// AND ALL DEFAULT SKINS (BARS/ARROWS) /// </summary> private void ReadConfig(bool loadFromResources) { IniData config; if (loadFromResources) { using (var stream = new StreamReader(GameBase.Game.Resources.GetStream($"Quaver.Resources/Textures/Skins/{ConfigManager.DefaultSkin.Value}/skin.ini"))) config = new IniFileParser.IniFileParser(new ConcatenateDuplicatedKeysIniDataParser()).ReadData(stream); } else { if (Store.Config == null) { return; } config = Store.Config; } var ini = config[ModeHelper.ToShortHand(Mode).ToUpper()]; StageReceptorPadding = ConfigHelper.ReadInt32(StageReceptorPadding, ini["StageReceptorPadding"]); HitPosOffsetY = ConfigHelper.ReadInt32(HitPosOffsetY, ini["HitPosOffsetY"]); NotePadding = ConfigHelper.ReadInt32(NotePadding, ini["NotePadding"]); ColumnLightingScale = ConfigHelper.ReadFloat(ColumnLightingScale, ini["ColumnLightingScale"]); ColumnLightingOffsetY = ConfigHelper.ReadInt32(ColumnLightingOffsetY, ini["ColumnLightingOffsetY"]); ColumnSize = ConfigHelper.ReadInt32(ColumnSize, ini["ColumnSize"]); ReceptorPosOffsetY = ConfigHelper.ReadInt32(ReceptorPosOffsetY, ini["ReceptorPosOffsetY"]); ColumnAlignment = ConfigHelper.ReadInt32(ColumnAlignment, ini["ColumnAlignment"]); ColorObjectsBySnapDistance = ConfigHelper.ReadBool(ColorObjectsBySnapDistance, ini["ColorObjectsBySnapDistance"]); JudgementHitBurstScale = ConfigHelper.ReadByte(JudgementHitBurstScale, ini["JudgementHitBurstScale"]); ReceptorsOverHitObjects = ConfigHelper.ReadBool(ReceptorsOverHitObjects, ini["ReceptorsOverHitObjects"]); JudgeColors[Judgement.Marv] = ConfigHelper.ReadColor(JudgeColors[Judgement.Marv], ini["JudgeColorMarv"]); JudgeColors[Judgement.Perf] = ConfigHelper.ReadColor(JudgeColors[Judgement.Perf], ini["JudgeColorPerf"]); JudgeColors[Judgement.Great] = ConfigHelper.ReadColor(JudgeColors[Judgement.Great], ini["JudgeColorGreat"]); JudgeColors[Judgement.Good] = ConfigHelper.ReadColor(JudgeColors[Judgement.Good], ini["JudgeColorGood"]); JudgeColors[Judgement.Okay] = ConfigHelper.ReadColor(JudgeColors[Judgement.Okay], ini["JudgeColorOkay"]); JudgeColors[Judgement.Miss] = ConfigHelper.ReadColor(JudgeColors[Judgement.Miss], ini["JudgeColorMiss"]); BgMaskAlpha = ConfigHelper.ReadFloat(BgMaskAlpha, ini["BgMaskAlpha"]); FlipNoteImagesOnUpscroll = ConfigHelper.ReadBool(FlipNoteImagesOnUpscroll, ini["FlipNoteImagesOnUpscroll"]); FlipNoteEndImagesOnUpscroll = ConfigHelper.ReadBool(FlipNoteEndImagesOnUpscroll, ini["FlipNoteEndImagesOnUpscroll"]); HitLightingY = ConfigHelper.ReadInt32(HitLightingY, ini["HitLightingY"]); HitLightingX = ConfigHelper.ReadInt32(HitLightingX, ini["HitLightingX"]); HitLightingFps = ConfigHelper.ReadInt32(HitLightingFps, ini["HitLightingFps"]); HoldLightingFps = ConfigHelper.ReadInt32(HoldLightingFps, ini["HoldLightingFps"]); HitLightingWidth = ConfigHelper.ReadInt32(HitLightingWidth, ini["HitLightingWidth"]); HitLightingHeight = ConfigHelper.ReadInt32(HitLightingHeight, ini["HitLightingHeight"]); ScoreDisplayPosX = ConfigHelper.ReadInt32(ScoreDisplayPosX, ini["ScoreDisplayPosX"]); ScoreDisplayPosY = ConfigHelper.ReadInt32(ScoreDisplayPosY, ini["ScoreDisplayPosY"]); RatingDisplayPosX = ConfigHelper.ReadInt32(RatingDisplayPosX, ini["RatingDisplayPosX"]); RatingDisplayPosY = ConfigHelper.ReadInt32(RatingDisplayPosY, ini["RatingDisplayPosY"]); AccuracyDisplayPosX = ConfigHelper.ReadInt32(AccuracyDisplayPosX, ini["AccuracyDisplayPosX"]); AccuracyDisplayPosY = ConfigHelper.ReadInt32(AccuracyDisplayPosY, ini["AccuracyDisplayPosY"]); KpsDisplayPosX = ConfigHelper.ReadInt32(KpsDisplayPosX, ini["KpsDisplayPosX"]); KpsDisplayPosY = ConfigHelper.ReadInt32(KpsDisplayPosY, ini["KpsDisplayPosY"]); ComboPosX = ConfigHelper.ReadInt32(ComboPosX, ini["ComboPosX"]); ComboPosY = ConfigHelper.ReadInt32(ComboPosY, ini["ComboPosY"]); JudgementBurstPosY = ConfigHelper.ReadInt32(JudgementBurstPosY, ini["JudgementBurstPosY"]); HealthBarType = ConfigHelper.ReadEnum(HealthBarType, ini["HealthBarType"]); HealthBarKeysAlignment = ConfigHelper.ReadEnum(HealthBarKeysAlignment, ini["HealthBarKeysAlignment"]); HitErrorPosX = ConfigHelper.ReadInt32(HitErrorPosX, ini["HitErrorPosX"]); HitErrorPosY = ConfigHelper.ReadInt32(HitErrorPosY, ini["HitErrorPosY"]); HitErrorHeight = ConfigHelper.ReadInt32(HitErrorHeight, ini["HitErrorHeight"]); HitErrorChevronSize = ConfigHelper.ReadInt32(HitErrorChevronSize, ini["HitErrorChevronSize"]); TimingLineColor = ConfigHelper.ReadColor(TimingLineColor, ini["TimingLineColor"]); SongTimeProgressInactiveColor = ConfigHelper.ReadColor(SongTimeProgressInactiveColor, ini["SongTimeProgressInactiveColor"]); SongTimeProgressActiveColor = ConfigHelper.ReadColor(SongTimeProgressActiveColor, ini["SongTimeProgressActiveColor"]); JudgementCounterAlpha = ConfigHelper.ReadFloat(JudgementCounterAlpha, ini["JudgementCounterAlpha"]); JudgementCounterFontColor = ConfigHelper.ReadColor(JudgementCounterFontColor, ini["JudgementCounterFontColor"]); JudgementCounterSize = ConfigHelper.ReadInt32(JudgementCounterSize, ini["JudgementCounterSize"]); DrawLongNoteEnd = ConfigHelper.ReadBool(DrawLongNoteEnd, ini["DrawLongNoteEnd"]); ScoreDisplayScale = ConfigHelper.ReadInt32(ScoreDisplayScale, ini["ScoreDisplayScale"]); RatingDisplayScale = ConfigHelper.ReadInt32(RatingDisplayScale, ini["RatingDisplayScale"]); AccuracyDisplayScale = ConfigHelper.ReadInt32(AccuracyDisplayScale, ini["AccuracyDisplayScale"]); ComboDisplayScale = ConfigHelper.ReadInt32(ComboDisplayScale, ini["ComboDisplayScale"]); KpsDisplayScale = ConfigHelper.ReadInt32(KpsDisplayScale, ini["KpsDisplayScale"]); SongTimeProgressScale = ConfigHelper.ReadInt32(SongTimeProgressScale, ini["SongTimeProgressScale"]); DeadNoteColor = ConfigHelper.ReadColor(DeadNoteColor, ini["DeadNoteColor"]); BattleRoyaleAlertPosX = ConfigHelper.ReadInt32(BattleRoyaleAlertPosX, ini["BattleRoyaleAlertPosX"]); BattleRoyaleAlertPosY = ConfigHelper.ReadInt32(BattleRoyaleAlertPosY, ini["BattleRoyaleAlertPosY"]); BattleRoyaleAlertScale = ConfigHelper.ReadInt32(BattleRoyaleAlertScale, ini["BattleRoyaleAlertScale"]); BattleRoyaleEliminatedPosX = ConfigHelper.ReadInt32(BattleRoyaleEliminatedPosX, ini["BattleRoyaleEliminatedPosX"]); BattleRoyaleEliminatedPosY = ConfigHelper.ReadInt32(BattleRoyaleEliminatedPosY, ini["BattleRoyaleEliminatedPosY"]); }
/// <summary> /// Reads a quaver.cfg file and sets all of the successfully read values. /// At the end of reading, we write the config file, changing any invalid data/ /// </summary> private static void ReadConfigFile() { // We'll want to write a quaver.cfg file if it doesn't already exist. // There's no need to read the config file afterwards, since we already have // all of the default values. if (!File.Exists(_gameDirectory + "/quaver.cfg")) { File.WriteAllText(_gameDirectory + "/quaver.cfg", "; Quaver Configuration File"); } var data = new IniFileParser.IniFileParser(new ConcatenateDuplicatedKeysIniDataParser()).ReadFile(_gameDirectory + "/quaver.cfg")["Config"]; // Read / Set Config Values // NOTE: MAKE SURE TO SET THE VALUE TO AUTO-SAVE WHEN CHANGING! THIS ISN'T DONE AUTOMATICALLY. // YOU CAN DO THIS DOWN BELOW, AFTER THE CONFIG HAS WRITTEN FOR THE FIRST TIME. GameDirectory = ReadSpecialConfigType(SpecialConfigType.Directory, @"GameDirectory", _gameDirectory, data); SkinDirectory = ReadSpecialConfigType(SpecialConfigType.Directory, @"SkinDirectory", _skinDirectory, data); ScreenshotDirectory = ReadSpecialConfigType(SpecialConfigType.Directory, @"ScreenshotDirectory", _screenshotDirectory, data); ReplayDirectory = ReadSpecialConfigType(SpecialConfigType.Directory, @"ReplayDirectory", _replayDirectory, data); LogsDirectory = ReadSpecialConfigType(SpecialConfigType.Directory, @"LogsDirectory", _logsDirectory, data); DataDirectory = ReadSpecialConfigType(SpecialConfigType.Directory, @"DataDirectory", _dataDirectory, data); SongDirectory = ReadSpecialConfigType(SpecialConfigType.Directory, @"SongDirectory", _songDirectory, data); SelectedGameMode = ReadValue(@"SelectedGameMode", GameMode.Keys4, data); Username = ReadValue(@"Username", "Player", data); VolumeGlobal = ReadInt(@"VolumeGlobal", 50, 0, 100, data); VolumeEffect = ReadInt(@"VolumeEffect", 20, 0, 100, data); VolumeMusic = ReadInt(@"VolumeMusic", 50, 0, 100, data); BackgroundBrightness = ReadInt(@"BackgroundBrightness", 50, 0, 100, data); WindowHeight = ReadInt(@"WindowHeight", 768, 600, short.MaxValue, data); WindowWidth = ReadInt(@"WindowWidth", 1366, 800, short.MaxValue, data); DisplaySongTimeProgress = ReadValue(@"DisplaySongTimeProgress", true, data); WindowFullScreen = ReadValue(@"WindowFullScreen", false, data); FpsCounter = ReadValue(@"FpsCounter", false, data); FpsLimiterType = ReadValue(@"FpsLimiterType", FpsLimitType.Unlimited, data); CustomFpsLimit = ReadInt(@"CustomFpsLimit", 240, 60, int.MaxValue, data); ScrollSpeed4K = ReadInt(@"ScrollSpeed4K", 15, 5, 100, data); ScrollSpeed7K = ReadInt(@"ScrollSpeed7K", 15, 5, 100, data); ScrollDirection4K = ReadValue(@"ScrollDirection4K", ScrollDirection.Down, data); ScrollDirection7K = ReadValue(@"ScrollDirection7K", ScrollDirection.Down, data); GlobalAudioOffset = ReadInt(@"GlobalAudioOffset", 0, -300, 300, data); Skin = ReadSpecialConfigType(SpecialConfigType.Skin, @"Skin", "", data); DefaultSkin = ReadValue(@"DefaultSkin", DefaultSkins.Bar, data); Pitched = ReadValue(@"Pitched", true, data); ScoreboardVisible = ReadValue(@"ScoreboardVisible", true, data); SelectOrderMapsetsBy = ReadValue(@"SelectOrderMapsetsBy", OrderMapsetsBy.Artist, data); SelectedOnlineUserFilterType = ReadValue(@"OnlineUserFilterType", OnlineUserFilterType.All, data); LeaderboardSection = ReadValue(@"LeaderboardSection", LeaderboardType.Local, data); OsuDbPath = ReadSpecialConfigType(SpecialConfigType.Path, @"OsuDbPath", "", data); AutoLoadOsuBeatmaps = ReadValue(@"AutoLoadOsuBeatmaps", false, data); AutoLoginToServer = ReadValue(@"AutoLoginToServer", true, data); DisplayTimingLines = ReadValue(@"DisplayTimingLines", true, data); DisplayMenuAudioVisualizer = ReadValue(@"DisplayMenuAudioVisualizer", true, data); EnableHitsounds = ReadValue(@"EnableHitsounds", true, data); KeyNavigateLeft = ReadValue(@"KeyNavigateLeft", Keys.Left, data); KeyNavigateRight = ReadValue(@"KeyNavigateRight", Keys.Right, data); KeyNavigateUp = ReadValue(@"KeyNavigateUp", Keys.Up, data); KeyNavigateDown = ReadValue(@"KeyNavigateDown", Keys.Down, data); KeyNavigateBack = ReadValue(@"KeyNavigateBack", Keys.Escape, data); KeyNavigateSelect = ReadValue(@"KeyNavigateSelect", Keys.Enter, data); KeyMania4K1 = ReadValue(@"KeyMania4K1", Keys.A, data); KeyMania4K2 = ReadValue(@"KeyMania4K2", Keys.S, data); KeyMania4K3 = ReadValue(@"KeyMania4K3", Keys.K, data); KeyMania4K4 = ReadValue(@"KeyMania4K4", Keys.L, data); KeyMania7K1 = ReadValue(@"KeyMania7K1", Keys.A, data); KeyMania7K2 = ReadValue(@"KeyMania7K2", Keys.S, data); KeyMania7K3 = ReadValue(@"KeyMania7K3", Keys.D, data); KeyMania7K4 = ReadValue(@"KeyMania7K4", Keys.Space, data); KeyMania7K5 = ReadValue(@"KeyMania7K5", Keys.J, data); KeyMania7K6 = ReadValue(@"KeyMania7K6", Keys.K, data); KeyMania7K7 = ReadValue(@"KeyMania7K7", Keys.L, data); KeySkipIntro = ReadValue(@"KeySkipIntro", Keys.RightAlt, data); KeyPause = ReadValue(@"KeyPause", Keys.Escape, data); KeyToggleOverlay = ReadValue(@"KeyToggleOverlay", Keys.F8, data); KeyRestartMap = ReadValue(@"KeyRestartMap", Keys.OemTilde, data); KeyDecreaseScrollSpeed = ReadValue(@"KeyDecreaseScrollSpeed", Keys.F3, data); KeyIncreaseScrollSpeed = ReadValue(@"KeyIncreaseScrollSpeed", Keys.F4, data); KeyDecreaseMapOffset = ReadValue(@"KeyDecreaseMapOffset", Keys.OemMinus, data); KeyIncreaseMapOffset = ReadValue(@"KeyIncreaseMapOffset", Keys.OemPlus, data); KeyScoreboardVisible = ReadValue(@"KeyHideScoreboard", Keys.Tab, data); KeyQuickExit = ReadValue(@"KeyQuickExit", Keys.F1, data); BlurBackgroundInGameplay = ReadValue(@"BlurBackgroundInGameplay", false, data); TapToPause = ReadValue(@"TapToPause", false, data); DisplayFailedLocalScores = ReadValue(@"DisplayFailedLocalScores", true, data); EditorScrollSpeedKeys = ReadInt(@"EditorScrollSpeedKeys", 16, 5, 100, data); KeyEditorPausePlay = ReadValue(@"KeyEditorPausePlay", Keys.Space, data); KeyEditorDecreaseAudioRate = ReadValue(@"KeyEditorDecreaseAudioRate", Keys.OemMinus, data); KeyEditorIncreaseAudioRate = ReadValue(@"KeyEditorIncreaseAudioRate", Keys.OemPlus, data); EditorEnableHitsounds = ReadValue(@"EditorEnableHitsounds", true, data); EditorBeatSnapColorType = ReadValue(@"EditorBeatSnapColorType", EditorBeatSnapColor.Default, data); EditorOnlyShowMeasureLines = ReadValue(@"EditorOnlyShowMeasureLines", false, data); EditorShowLaneDividerLines = ReadValue(@"EditorShowDividerLines", true, data); EditorHitObjectsMidpointAnchored = ReadValue(@"EditorHitObjectsMidpointAnchored", false, data); EditorPlayMetronome = ReadValue(@"EditorPlayMetronome", true, data); EditorMetronomePlayHalfBeats = ReadValue(@"EditorMetronomePlayHalfBeats", false, data); DisplaySongTimeProgressNumbers = ReadValue(@"DisplaySongTimeProgressNumbers", true, data); DisplayJudgementCounter = ReadValue(@"DisplayJudgementCounter", true, data); SkipResultsScreenAfterQuit = ReadValue(@"SkipResultsScreenAfterQuit", false, data); DisplayComboAlerts = ReadValue(@"DisplayComboAlerts", true, data); LaneCoverTopHeight = ReadInt(@"LaneCoverTopHeight", 25, 0, 75, data); LaneCoverBottomHeight = ReadInt(@"LaneCoverBottomHeight", 25, 0, 75, data); LaneCoverTop = ReadValue(@"LaneCoverTop", false, data); LaneCoverBottom = ReadValue(@"LaneCoverBottom", false, data); UIElementsOverLaneCover = ReadValue(@"UIElementsOverLaneCover", true, data); EditorVisualizationGraph = ReadValue(@"EditorVisualizationGraph", EditorVisualizationGraphType.Tick, data); EditorViewLayers = ReadValue(@"EditorViewLayers", false, data); // Have to do this manually. if (string.IsNullOrEmpty(Username.Value)) { Username.Value = "Player"; } // Write the config file with all of the changed/invalidated data. Task.Run(async() => await WriteConfigFileAsync()) .ContinueWith(t => { // SET AUTO-SAVE FUNCTIONALITY FOR EACH BINDED VALUE. // This is so shit tbcfh, lol. GameDirectory.ValueChanged += AutoSaveConfiguration; SkinDirectory.ValueChanged += AutoSaveConfiguration; ScreenshotDirectory.ValueChanged += AutoSaveConfiguration; ReplayDirectory.ValueChanged += AutoSaveConfiguration; LogsDirectory.ValueChanged += AutoSaveConfiguration; DataDirectory.ValueChanged += AutoSaveConfiguration; SongDirectory.ValueChanged += AutoSaveConfiguration; OsuDbPath.ValueChanged += AutoSaveConfiguration; AutoLoadOsuBeatmaps.ValueChanged += AutoSaveConfiguration; Username.ValueChanged += AutoSaveConfiguration; VolumeGlobal.ValueChanged += AutoSaveConfiguration; VolumeEffect.ValueChanged += AutoSaveConfiguration; VolumeMusic.ValueChanged += AutoSaveConfiguration; BackgroundBrightness.ValueChanged += AutoSaveConfiguration; WindowHeight.ValueChanged += AutoSaveConfiguration; WindowWidth.ValueChanged += AutoSaveConfiguration; WindowFullScreen.ValueChanged += AutoSaveConfiguration; FpsCounter.ValueChanged += AutoSaveConfiguration; FpsLimiterType.ValueChanged += AutoSaveConfiguration; CustomFpsLimit.ValueChanged += AutoSaveConfiguration; DisplaySongTimeProgress.ValueChanged += AutoSaveConfiguration; ScrollSpeed4K.ValueChanged += AutoSaveConfiguration; ScrollSpeed7K.ValueChanged += AutoSaveConfiguration; ScrollDirection4K.ValueChanged += AutoSaveConfiguration; ScrollDirection7K.ValueChanged += AutoSaveConfiguration; GlobalAudioOffset.ValueChanged += AutoSaveConfiguration; Skin.ValueChanged += AutoSaveConfiguration; DefaultSkin.ValueChanged += AutoSaveConfiguration; Pitched.ValueChanged += AutoSaveConfiguration; ScoreboardVisible.ValueChanged += AutoSaveConfiguration; AutoLoginToServer.ValueChanged += AutoSaveConfiguration; DisplayTimingLines.ValueChanged += AutoSaveConfiguration; DisplayMenuAudioVisualizer.ValueChanged += AutoSaveConfiguration; EnableHitsounds.ValueChanged += AutoSaveConfiguration; KeyNavigateLeft.ValueChanged += AutoSaveConfiguration; KeyNavigateRight.ValueChanged += AutoSaveConfiguration; KeyNavigateUp.ValueChanged += AutoSaveConfiguration; KeyNavigateDown.ValueChanged += AutoSaveConfiguration; KeyNavigateBack.ValueChanged += AutoSaveConfiguration; KeyNavigateSelect.ValueChanged += AutoSaveConfiguration; KeyMania4K1.ValueChanged += AutoSaveConfiguration; KeyMania4K2.ValueChanged += AutoSaveConfiguration; KeyMania4K3.ValueChanged += AutoSaveConfiguration; KeyMania4K4.ValueChanged += AutoSaveConfiguration; KeyMania7K1.ValueChanged += AutoSaveConfiguration; KeyMania7K2.ValueChanged += AutoSaveConfiguration; KeyMania7K3.ValueChanged += AutoSaveConfiguration; KeyMania7K4.ValueChanged += AutoSaveConfiguration; KeyMania7K5.ValueChanged += AutoSaveConfiguration; KeyMania7K6.ValueChanged += AutoSaveConfiguration; KeyMania7K7.ValueChanged += AutoSaveConfiguration; KeySkipIntro.ValueChanged += AutoSaveConfiguration; KeyPause.ValueChanged += AutoSaveConfiguration; KeyToggleOverlay.ValueChanged += AutoSaveConfiguration; KeyRestartMap.ValueChanged += AutoSaveConfiguration; KeyIncreaseScrollSpeed.ValueChanged += AutoSaveConfiguration; KeyDecreaseScrollSpeed.ValueChanged += AutoSaveConfiguration; KeyIncreaseMapOffset.ValueChanged += AutoSaveConfiguration; KeyDecreaseMapOffset.ValueChanged += AutoSaveConfiguration; KeyScoreboardVisible.ValueChanged += AutoSaveConfiguration; SelectOrderMapsetsBy.ValueChanged += AutoSaveConfiguration; KeyQuickExit.ValueChanged += AutoSaveConfiguration; SelectedGameMode.ValueChanged += AutoSaveConfiguration; SelectedOnlineUserFilterType.ValueChanged += AutoSaveConfiguration; BlurBackgroundInGameplay.ValueChanged += AutoSaveConfiguration; TapToPause.ValueChanged += AutoSaveConfiguration; DisplayFailedLocalScores.ValueChanged += AutoSaveConfiguration; EditorScrollSpeedKeys.ValueChanged += AutoSaveConfiguration; KeyEditorPausePlay.ValueChanged += AutoSaveConfiguration; KeyEditorDecreaseAudioRate.ValueChanged += AutoSaveConfiguration; KeyEditorIncreaseAudioRate.ValueChanged += AutoSaveConfiguration; EditorBeatSnapColorType.ValueChanged += AutoSaveConfiguration; EditorShowLaneDividerLines.ValueChanged += AutoSaveConfiguration; EditorHitObjectsMidpointAnchored.ValueChanged += AutoSaveConfiguration; EditorPlayMetronome.ValueChanged += AutoSaveConfiguration; EditorMetronomePlayHalfBeats.ValueChanged += AutoSaveConfiguration; DisplaySongTimeProgressNumbers.ValueChanged += AutoSaveConfiguration; DisplayJudgementCounter.ValueChanged += AutoSaveConfiguration; SkipResultsScreenAfterQuit.ValueChanged += AutoSaveConfiguration; DisplayComboAlerts.ValueChanged += AutoSaveConfiguration; LaneCoverTopHeight.ValueChanged += AutoSaveConfiguration; LaneCoverBottomHeight.ValueChanged += AutoSaveConfiguration; LaneCoverTop.ValueChanged += AutoSaveConfiguration; LaneCoverBottom.ValueChanged += AutoSaveConfiguration; EditorViewLayers.ValueChanged += AutoSaveConfiguration; UIElementsOverLaneCover.ValueChanged += AutoSaveConfiguration; EditorVisualizationGraph.ValueChanged += AutoSaveConfiguration; }); }