// // MaaWpfGui - A part of the MaaCoreArknights project // Copyright (C) 2021 MistEO and Contributors // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License v3.0 only as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY // #nullable enable using System; using System.Collections.Generic; using System.Linq; using System.Windows; using MaaWpfGui.Configuration; using MaaWpfGui.Constants; using MaaWpfGui.Helper; using MaaWpfGui.Main; using MaaWpfGui.Utilities.ValueType; using MaaWpfGui.ViewModels.UI; using Stylet; using DarkModeType = MaaWpfGui.Configuration.GUI.DarkModeType; namespace MaaWpfGui.ViewModels.UserControl.Settings; public class GuiSettingsUserControlModel : PropertyChangedBase { static GuiSettingsUserControlModel() { Instance = new(); } public static GuiSettingsUserControlModel Instance { get; } /// /// Gets or sets the language list. /// public List LanguageList { get; set; } = []; /// /// Gets or sets the list of operator name language settings /// public List OperNameLanguageModeList { get; set; } = [ new() { Display = LocalizationHelper.GetString("OperNameLanguageMAA"), Value = "OperNameLanguageMAA" }, new() { Display = LocalizationHelper.GetString("OperNameLanguageClient"), Value = "OperNameLanguageClient" } ]; /// /// Gets the list of dark mode. /// public List> DarkModeList { get; } = [ new() { Display = LocalizationHelper.GetString("Light"), Value = DarkModeType.Light }, new() { Display = LocalizationHelper.GetString("Dark"), Value = DarkModeType.Dark }, new() { Display = LocalizationHelper.GetString("SyncWithOs"), Value = DarkModeType.SyncWithOs }, ]; /// /// Gets the list of inverse clear modes. /// public List InverseClearModeList { get; } = [ new() { Display = LocalizationHelper.GetString("Clear"), Value = "Clear" }, new() { Display = LocalizationHelper.GetString("Inverse"), Value = "Inverse" }, new() { Display = LocalizationHelper.GetString("Switchable"), Value = "ClearInverse" }, ]; private bool _useTray = Convert.ToBoolean(ConfigurationHelper.GetGlobalValue(ConfigurationKeys.UseTray, bool.TrueString)); /// /// Gets or sets a value indicating whether to use tray icon. /// public bool UseTray { get => _useTray; set { if (!value) { MinimizeToTray = false; } SetAndNotify(ref _useTray, value); ConfigurationHelper.SetGlobalValue(ConfigurationKeys.UseTray, value.ToString()); Instances.MainWindowManager.SetUseTrayIcon(value); } } private bool _minimizeToTray = Convert.ToBoolean(ConfigurationHelper.GetGlobalValue(ConfigurationKeys.MinimizeToTray, bool.FalseString)); /// /// Gets or sets a value indicating whether to minimize to tray. /// public bool MinimizeToTray { get => _minimizeToTray; set { SetAndNotify(ref _minimizeToTray, value); ConfigurationHelper.SetGlobalValue(ConfigurationKeys.MinimizeToTray, value.ToString()); Instances.MainWindowManager.SetMinimizeToTray(value); } } private bool _windowTitleScrollable = Convert.ToBoolean(ConfigurationHelper.GetGlobalValue(ConfigurationKeys.WindowTitleScrollable, bool.FalseString)); /// /// Gets or sets a value indicating whether to make window title scrollable. /// public bool WindowTitleScrollable { get => _windowTitleScrollable; set { SetAndNotify(ref _windowTitleScrollable, value); ConfigurationHelper.SetGlobalValue(ConfigurationKeys.WindowTitleScrollable, value.ToString()); var rvm = (RootViewModel)Instances.SettingsViewModel.Parent; rvm.WindowTitleScrollable = value; } } private bool _hideCloseButton = Convert.ToBoolean(ConfigurationHelper.GetGlobalValue(ConfigurationKeys.HideCloseButton, bool.FalseString)); /// /// Gets or sets a value indicating whether to hide close button. /// public bool HideCloseButton { get => _hideCloseButton; set { SetAndNotify(ref _hideCloseButton, value); ConfigurationHelper.SetGlobalValue(ConfigurationKeys.HideCloseButton, value.ToString()); var rvm = (RootViewModel)Instances.SettingsViewModel.Parent; rvm.ShowCloseButton = !value; } } /// /// Gets or sets a value indicating whether to use notification. /// public bool UseNotify { get => ConfigFactory.Root.GUI.UseNotify; set { ConfigFactory.Root.GUI.UseNotify = value; NotifyOfPropertyChange(); if (value) { ToastNotification.ShowDirect("Test test"); } } } public bool MainTasksInvertNullFunction { get => ConfigFactory.Root.GUI.MainTasksInvertNullFunction; set { ConfigFactory.Root.GUI.MainTasksInvertNullFunction = value; NotifyOfPropertyChange(); } } public List LogItemDateFormatStringList { get; } = [ "HH:mm:ss", "MM-dd HH:mm:ss", "MM/dd HH:mm:ss", "MM.dd HH:mm:ss", "dd-MM HH:mm:ss", "dd/MM HH:mm:ss", "dd.MM HH:mm:ss", ]; private string _logItemDateFormatString = ConfigurationHelper.GetGlobalValue(ConfigurationKeys.LogItemDateFormat, "HH:mm:ss"); public string LogItemDateFormatString { get => _logItemDateFormatString; set { SetAndNotify(ref _logItemDateFormatString, value); ConfigurationHelper.SetGlobalValue(ConfigurationKeys.LogItemDateFormat, value); } } /// /// Gets or sets the dark mode. /// public DarkModeType DarkMode { get => ConfigFactory.Root.GUI.DarkMode; set { ConfigFactory.Root.GUI.DarkMode = value; NotifyOfPropertyChange(); SwitchDarkMode(); /* AskToRestartToApplySettings(); */ } } public void SwitchDarkMode() { DarkModeType darkModeType = ConfigFactory.Root.GUI.DarkMode; switch (darkModeType) { case DarkModeType.Light: ThemeHelper.SwitchToLightMode(); break; case DarkModeType.Dark: ThemeHelper.SwitchToDarkMode(); break; case DarkModeType.SyncWithOs: ThemeHelper.SwitchToSyncWithOsMode(); break; default: throw new ArgumentOutOfRangeException(); } } private enum InverseClearType { Clear, Inverse, ClearInverse, } private InverseClearType _inverseClearMode = Enum.TryParse(ConfigurationHelper.GetGlobalValue(ConfigurationKeys.InverseClearMode, InverseClearType.Clear.ToString()), out InverseClearType temp) ? temp : InverseClearType.Clear; /// /// Gets or sets the inverse clear mode. /// public string InverseClearMode { get => _inverseClearMode.ToString(); set { if (!Enum.TryParse(value, out InverseClearType tempEnumValue)) { return; } SetAndNotify(ref _inverseClearMode, tempEnumValue); ConfigurationHelper.SetGlobalValue(ConfigurationKeys.InverseClearMode, value); switch (tempEnumValue) { case InverseClearType.Clear: Instances.TaskQueueViewModel.InverseMode = false; Instances.TaskQueueViewModel.ShowInverse = false; Instances.TaskQueueViewModel.SelectedAllWidth = 90; break; case InverseClearType.Inverse: Instances.TaskQueueViewModel.InverseMode = true; Instances.TaskQueueViewModel.ShowInverse = false; Instances.TaskQueueViewModel.SelectedAllWidth = 90; break; case InverseClearType.ClearInverse: Instances.TaskQueueViewModel.ShowInverse = true; Instances.TaskQueueViewModel.SelectedAllWidth = TaskQueueViewModel.SelectedAllWidthWhenBoth; break; default: throw new ArgumentOutOfRangeException(); } } } private static readonly Dictionary _windowTitleAllShowDict = new() { { "1", LocalizationHelper.GetString("ConfigurationName") }, { "2", LocalizationHelper.GetString("ConnectionPreset") }, { "3", LocalizationHelper.GetString("ConnectionAddress") }, { "4", LocalizationHelper.GetString("ClientType") }, }; public static Dictionary WindowTitleAllShowDict { get => _windowTitleAllShowDict; } private static object[] _windowTitleSelectShowList = ConfigurationHelper.GetGlobalValue(ConfigurationKeys.WindowTitleSelectShowList, "1 2 3 4") .Split(' ') .Where(s => _windowTitleAllShowDict.ContainsKey(s.ToString())) .Select(s => (object)new KeyValuePair(s, _windowTitleAllShowDict[s])) .ToArray(); public object[] WindowTitleSelectShowList { get => _windowTitleSelectShowList; set { SetAndNotify(ref _windowTitleSelectShowList, value); Instances.SettingsViewModel.UpdateWindowTitle(); var config = string.Join(' ', _windowTitleSelectShowList.Cast>().Select(pair => pair.Key).ToList()); ConfigurationHelper.SetGlobalValue(ConfigurationKeys.WindowTitleSelectShowList, config); } } private string _language = ConfigurationHelper.GetGlobalValue(ConfigurationKeys.Localization, LocalizationHelper.DefaultLanguage); /// /// Gets or sets the language. /// public string Language { get => _language; set { if (value == _language) { return; } if (_language == SettingsViewModel.PallasLangKey) { Instances.SettingsViewModel.Hangover = true; Instances.SettingsViewModel.Cheers = false; } if (value != SettingsViewModel.PallasLangKey) { Instances.SettingsViewModel.SoberLanguage = value; } // var backup = _language; ConfigurationHelper.SetGlobalValue(ConfigurationKeys.Localization, value); var mainWindow = Application.Current.MainWindow; if (mainWindow != null) { mainWindow.Show(); mainWindow.WindowState = mainWindow.WindowState = WindowState.Normal; mainWindow.Activate(); } var result = MessageBoxHelper.Show( FormatText("{0}\n{1}", "LanguageChangedTip"), FormatText("{0}({1})", "Tip"), MessageBoxButton.OKCancel, MessageBoxImage.Question, ok: FormatText("{0}({1})", "Ok"), cancel: FormatText("{0}({1})", "ManualRestart")); if (result == MessageBoxResult.OK) { Bootstrapper.ShutdownAndRestartWithoutArgs(); } SetAndNotify(ref _language, value); return; string FormatText(string text, string key) => string.Format(text, LocalizationHelper.GetString(key, value), LocalizationHelper.GetString(key, _language)); } } /// /// Gets the language info. /// public string LanguageInfo { get { var language = (string?)Application.Current.Resources["Language"]; return language == "Language" ? language : language + " / Language"; } } /// /// Opername display language, can set force display when it was set as "OperNameLanguageForce.en-us" /// private string _operNameLanguage = ConfigurationHelper.GetGlobalValue(ConfigurationKeys.OperNameLanguage, "OperNameLanguageMAA"); public string OperNameLanguage { get { if (!_operNameLanguage.Contains('.')) { return _operNameLanguage; } if (_operNameLanguage.Split('.')[0] != "OperNameLanguageForce" || !LocalizationHelper.SupportedLanguages.ContainsKey(_operNameLanguage.Split('.')[1])) { return _operNameLanguage; } OperNameLanguageModeList.Add(new CombinedData { Display = LocalizationHelper.GetString("OperNameLanguageForce"), Value = "OperNameLanguageForce" }); return "OperNameLanguageForce"; } set { if (value == _operNameLanguage.Split('.')[0]) { return; } switch (value) { case "OperNameLanguageClient": ConfigurationHelper.SetGlobalValue(ConfigurationKeys.OperNameLanguage, value); break; case "OperNameLanguageMAA": default: ConfigurationHelper.SetGlobalValue(ConfigurationKeys.OperNameLanguage, "OperNameLanguageMAA"); break; } var mainWindow = Application.Current.MainWindow; if (mainWindow != null) { mainWindow.Show(); mainWindow.WindowState = mainWindow.WindowState = WindowState.Normal; mainWindow.Activate(); } var result = MessageBoxHelper.Show( LocalizationHelper.GetString("LanguageChangedTip"), LocalizationHelper.GetString("Tip"), MessageBoxButton.OKCancel, MessageBoxImage.Question, ok: LocalizationHelper.GetString("Ok"), cancel: LocalizationHelper.GetString("ManualRestart")); if (result == MessageBoxResult.OK) { Bootstrapper.ShutdownAndRestartWithoutArgs(); } SetAndNotify(ref _operNameLanguage, value); } } public string OperNameLocalization { get { if (_operNameLanguage == "OperNameLanguageClient") { return DataHelper.ClientLanguageMapper[SettingsViewModel.GameSettings.ClientType]; } if (!_operNameLanguage.Contains('.')) { return _language; } if (_operNameLanguage.Split('.')[0] == "OperNameLanguageForce" && LocalizationHelper.SupportedLanguages.ContainsKey(_operNameLanguage.Split('.')[1])) { return _operNameLanguage.Split('.')[1]; } return _language; } } }