perf: 优化参数解析

This commit is contained in:
uye
2024-11-21 00:22:13 +08:00
parent 214a3021b0
commit 8bed0b9705
4 changed files with 88 additions and 77 deletions

View File

@@ -44,10 +44,6 @@ namespace MaaWpfGui
}
}
// TODO: 现在的启动顺序是OnStartup -> Bootstrapper.OnStart -> TaskQueueViewModel.OnInitialActivate
// 在 OnInitialActivate 中会初始化 StageManager但是 StageManager 中会异步下载更新OnInitialActivate 不会等待这个异步操作
// 导致这里切换了配置之后StageManager 异步结束后调用 UpdateStageList 时会把 UI 现在的关卡配置存到新配置中
// 先把 StageManager 的联网更新放到这里,之后看看有没有什么更好的办法
protected override void OnStartup(StartupEventArgs e)
{
if (WineRuntimeInformation.IsRunningUnderWine && MaaDesktopIntegration.Availabile)
@@ -56,72 +52,7 @@ namespace MaaWpfGui
FontConfigIntegration.Install();
}
ConfigurationHelper.Load();
base.OnStartup(e);
string[] args = e.Args;
const string ConfigFlag = "--config";
string configArgs = string.Empty;
for (int i = 0; i < args.Length; ++i)
{
switch (args[i])
{
case ConfigFlag when i + 1 < args.Length:
configArgs = args[i + 1];
i += 1;
break;
}
}
if (Config(configArgs))
{
return;
}
_ = Instances.TaskQueueViewModel.UpdateDatePromptAndStagesWeb();
}
/// <summary>
/// 检查配置并切换,如果成功切换则重启
/// </summary>
/// <param name="desiredConfig">配置名</param>
/// <returns>切换并重启</returns>
private static bool Config(string desiredConfig)
{
const string ConfigFile = @".\config\gui.json";
if (!File.Exists(ConfigFile) || string.IsNullOrEmpty(desiredConfig))
{
return false;
}
try
{
if (UpdateConfiguration(desiredConfig))
{
Bootstrapper.ShutdownAndRestartWithoutArgs();
return true;
}
}
catch (Exception ex)
{
_logger.Error($"Error updating configuration: {desiredConfig}, ex: {ex.Message}");
}
return false;
}
/// <summary>
/// 切换配置
/// </summary>
/// <param name="desiredConfig">配置名</param>
/// <returns>是否成功切换配置</returns>
private static bool UpdateConfiguration(string desiredConfig)
{
// 配置名可能就包在引号中,需要转义符,如 \"a\"
string currentConfig = ConfigurationHelper.GetCurrentConfiguration();
return currentConfig != desiredConfig && ConfigurationHelper.SwitchConfiguration(desiredConfig);
}
}
}

View File

@@ -33,10 +33,10 @@ namespace MaaWpfGui.Helper
private static readonly ILogger _logger = Log.ForContext<WindowManager>();
private readonly bool _loadWindowPlacement = Convert.ToBoolean(ConfigurationHelper.GetValue(ConfigurationKeys.LoadWindowPlacement, bool.TrueString));
private readonly bool _saveWindowPlacement = Convert.ToBoolean(ConfigurationHelper.GetValue(ConfigurationKeys.SaveWindowPlacement, bool.TrueString));
private readonly bool _minimizeDirectly = Convert.ToBoolean(ConfigurationHelper.GetValue(ConfigurationKeys.MinimizeDirectly, bool.FalseString));
private readonly bool _minimizeToTray = Convert.ToBoolean(ConfigurationHelper.GetValue(ConfigurationKeys.MinimizeToTray, bool.FalseString));
private readonly bool _loadWindowPlacement = Convert.ToBoolean(ConfigurationHelper.GetGlobalValue(ConfigurationKeys.LoadWindowPlacement, bool.TrueString));
private readonly bool _saveWindowPlacement = Convert.ToBoolean(ConfigurationHelper.GetGlobalValue(ConfigurationKeys.SaveWindowPlacement, bool.TrueString));
private readonly bool _minimizeDirectly = Convert.ToBoolean(ConfigurationHelper.GetGlobalValue(ConfigurationKeys.MinimizeDirectly, bool.FalseString));
private readonly bool _minimizeToTray = Convert.ToBoolean(ConfigurationHelper.GetGlobalValue(ConfigurationKeys.MinimizeToTray, bool.FalseString));
/// <summary>
/// Center other windows in MaaWpfGui.RootView
@@ -81,6 +81,13 @@ namespace MaaWpfGui.Helper
_logger.Error("Failed to get window placement");
}
WindowPlacement defaultPlacement = default;
if (Equals(windowPlacement, defaultPlacement))
{
_logger.Information("Window placement is the default value; skipping save.");
return;
}
if (!SetConfiguration(windowPlacement))
{
_logger.Error("Failed to save window placement");
@@ -114,10 +121,10 @@ namespace MaaWpfGui.Helper
{
// 请在配置文件中修改该部分配置暂不支持从GUI设置
// Please modify this part of configuration in the configuration file.
ConfigurationHelper.SetValue(ConfigurationKeys.LoadWindowPlacement, _loadWindowPlacement.ToString());
ConfigurationHelper.SetValue(ConfigurationKeys.SaveWindowPlacement, _saveWindowPlacement.ToString());
ConfigurationHelper.SetGlobalValue(ConfigurationKeys.LoadWindowPlacement, _loadWindowPlacement.ToString());
ConfigurationHelper.SetGlobalValue(ConfigurationKeys.SaveWindowPlacement, _saveWindowPlacement.ToString());
return ConfigurationHelper.SetValue(ConfigurationKeys.WindowPlacement, JsonConvert.SerializeObject(wp));
return ConfigurationHelper.SetGlobalValue(ConfigurationKeys.WindowPlacement, JsonConvert.SerializeObject(wp));
}
catch (Exception e)
{
@@ -130,7 +137,7 @@ namespace MaaWpfGui.Helper
private static bool GetConfiguration(out WindowPlacement wp)
{
wp = default;
var jsonStr = ConfigurationHelper.GetValue(ConfigurationKeys.WindowPlacement, string.Empty);
var jsonStr = ConfigurationHelper.GetGlobalValue(ConfigurationKeys.WindowPlacement, string.Empty);
if (string.IsNullOrEmpty(jsonStr))
{
return false;

View File

@@ -12,6 +12,7 @@
// </copyright>
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
@@ -93,6 +94,7 @@ namespace MaaWpfGui.Main
var maaEnv = Environment.GetEnvironmentVariable("MAA_ENVIRONMENT") == "Debug"
? "Debug"
: "Production";
var args = Environment.GetCommandLineArgs();
var withDebugFile = File.Exists("DEBUG") || File.Exists("DEBUG.txt");
loggerConfiguration = (maaEnv == "Debug" || withDebugFile)
? loggerConfiguration.MinimumLevel.Verbose()
@@ -105,6 +107,7 @@ namespace MaaWpfGui.Main
_logger.Information($"Version {uiVersion}");
_logger.Information($"Built at {builtDate:O}");
_logger.Information($"Maa ENV: {maaEnv}");
_logger.Information($"Command Line: {string.Join(' ', args)}");
_logger.Information($"User Dir {Directory.GetCurrentDirectory()}");
if (withDebugFile)
{
@@ -157,6 +160,16 @@ namespace MaaWpfGui.Main
return;
}
const string ConfigFlag = "--config";
const string AnotherFlag = "--another"; // 示例,之后如果有其他参数,可以继续添加
var parsedArgs = ParseArgs(args, ConfigFlag, AnotherFlag);
if (parsedArgs.TryGetValue(ConfigFlag, out string configArgs) && Config(configArgs))
{
return;
}
_hasMutex = true;
ETagCache.Load();
@@ -361,5 +374,63 @@ namespace MaaWpfGui.Main
errorView.ShowDialog();
});
}
private static Dictionary<string, string> ParseArgs(string[] args, params string[] flags)
{
var result = new Dictionary<string, string>();
var flagSet = new HashSet<string>(flags);
for (int i = 0; i < args.Length; ++i)
{
if (flagSet.Contains(args[i]) && i + 1 < args.Length)
{
result[args[i]] = args[i + 1];
++i;
}
}
return result;
}
/// <summary>
/// 检查配置并切换,如果成功切换则重启
/// </summary>
/// <param name="desiredConfig">配置名</param>
/// <returns>切换并重启</returns>
private static bool Config(string desiredConfig)
{
const string ConfigFile = @".\config\gui.json";
if (!File.Exists(ConfigFile) || string.IsNullOrEmpty(desiredConfig))
{
return false;
}
try
{
if (UpdateConfiguration(desiredConfig))
{
ShutdownAndRestartWithoutArgs();
return true;
}
}
catch (Exception ex)
{
_logger.Error($"Error updating configuration: {desiredConfig}, ex: {ex.Message}");
}
return false;
}
/// <summary>
/// 切换配置
/// </summary>
/// <param name="desiredConfig">配置名</param>
/// <returns>是否成功切换配置</returns>
private static bool UpdateConfiguration(string desiredConfig)
{
// 配置名可能就包在引号中,需要转义符,如 \"a\"
string currentConfig = ConfigurationHelper.GetCurrentConfiguration();
return currentConfig != desiredConfig && ConfigurationHelper.SwitchConfiguration(desiredConfig);
}
}
}

View File

@@ -281,6 +281,8 @@ namespace MaaWpfGui.ViewModels.UI
LogItemViewModels = [];
InitializeItems();
InitTimer();
_ = UpdateDatePromptAndStagesWeb();
}
/*