Files
MRCC/launcher/PCL-CE/Plain Craft Launcher 2/Pages/PageLogRight.xaml.cs
T

200 lines
7.6 KiB
C#
Raw Normal View History

using System.IO;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;
using PCL.Core.App;
using PCL.Core.App.Localization;
using PCL.Core.UI;
using System.Globalization;
namespace PCL;
public partial class PageLogRight
{
public Run labDebug;
public Run labError;
public Run labFatal;
public Run labInfo;
public Run labWarn;
public PageLogRight()
{
Initialized += (_, _) => Init();
Loaded += PageLogRight_Loaded;
InitializeComponent();
}
public void Init()
{
PanLogCard.Inlines.Clear();
PanLogCard.Inlines.Add(new Run(Lang.Text("LogPage.Title")));
PanLogCard.Inlines.Add(new Run(" | "));
labDebug = new Run($"0 {Lang.Text("LogPage.Level.Debug")}")
{ Foreground = (Brush)System.Windows.Application.Current.Resources["ColorBrushDebug"] };
PanLogCard.Inlines.Add(labDebug);
PanLogCard.Inlines.Add(new Run(" | "));
labInfo = new Run($"0 {Lang.Text("LogPage.Level.Info")}")
{
Foreground =
(Brush)System.Windows.Application.Current.Resources[
ThemeManager.IsDarkMode ? "ColorBrushInfoDark" : "ColorBrushInfo"]
};
PanLogCard.Inlines.Add(labInfo);
PanLogCard.Inlines.Add(new Run(" | "));
labWarn = new Run($"0 {Lang.Text("LogPage.Level.Warn")}")
{ Foreground = (Brush)System.Windows.Application.Current.Resources["ColorBrushWarn"] };
PanLogCard.Inlines.Add(labWarn);
PanLogCard.Inlines.Add(new Run(" | "));
labError = new Run($"0 {Lang.Text("LogPage.Level.Error")}")
{ Foreground = (Brush)System.Windows.Application.Current.Resources["ColorBrushError"] };
PanLogCard.Inlines.Add(labError);
PanLogCard.Inlines.Add(new Run(" | "));
labFatal = new Run($"0 {Lang.Text("LogPage.Level.Fatal")}")
{ Foreground = (Brush)System.Windows.Application.Current.Resources["ColorBrushFatal"] };
PanLogCard.Inlines.Add(labFatal);
}
private void PageLogRight_Loaded(object sender, RoutedEventArgs e)
{
ModAnimation.AniControlEnabled += 1;
Reload();
ModAnimation.AniControlEnabled -= 1;
}
public void Reload()
{
// 初始化
if (ModMain.frmLogLeft.currentLog is null || ModMain.frmLogLeft.currentUuid <= 0 ||
ModMain.frmLogLeft.shownLogs.Count == 0)
{
ModMain.frmMain.PageChange(ModMain.frmMain.pageCurrent);
return;
}
PanAllBack.Visibility = Visibility.Visible;
CardOperation.Visibility = Visibility.Visible;
BtnOperationKill.IsEnabled = !ModMain.frmLogLeft.currentLog.gameProcess.HasExited;
BtnOperationExportStackDump.IsEnabled = !ModMain.frmLogLeft.currentLog.gameProcess.HasExited &&
!string.IsNullOrWhiteSpace(ModMain.frmLogLeft.currentLog.jStackPath);
SliderMaxLog.Value = Config.System.MaxGameLog;
// y = 10x + 50 (0 <= x <= 5, 50 <= y <= 100)
// y = 50x - 150 (5 < x <= 13, 100 < y <= 500)
// y = 100x - 800 (13 < x <= 28, 500 < y <= 2000)
SliderMaxLog.getHintText = new Func<object, object>(v =>
{
return v switch
{
_ when (int)v <= 5 => ((int)v * 10 + 50).ToString(),
_ when (int)v <= 13 => ((int)v * 50 - 150).ToString(),
_ when (int)v <= 28 => ((int)v * 100 - 800).ToString(),
_ => Lang.Text("LogPage.MaxLines.Unlimited")
};
});
// 绑定日志输出
PanLog.Document = ModMain.frmLogLeft.flowDocuments[ModMain.frmLogLeft.currentUuid];
// 绑定事件
ModMain.frmLogLeft.currentLog.LogOutput += OnLogOutput;
ModMain.frmLogLeft.currentLog.GameExit += OnGameExit;
RefreshLabText();
}
private void RefreshLabText()
{
// 刷新计数器
labFatal.Text = $"{ModMain.frmLogLeft.currentLog.countFatal} {Lang.Text("LogPage.Level.Fatal")}";
labError.Text = $"{ModMain.frmLogLeft.currentLog.countError} {Lang.Text("LogPage.Level.Error")}";
labWarn.Text = $"{ModMain.frmLogLeft.currentLog.countWarn} {Lang.Text("LogPage.Level.Warn")}";
labInfo.Text = $"{ModMain.frmLogLeft.currentLog.countInfo} {Lang.Text("LogPage.Level.Info")}";
labDebug.Text = $"{ModMain.frmLogLeft.currentLog.countDebug} {Lang.Text("LogPage.Level.Debug")}";
}
private void OnLogOutput(ModWatcher.Watcher sender, ModWatcher.LogOutputEventArgs e)
{
ModBase.RunInUi(() =>
{
if (ModMain.frmLogLeft.currentLog is not null)
{
if (CheckAutoScroll.Checked == true) PanBack.ScrollToBottom();
RefreshLabText();
}
});
}
#region 滑动条
private void SliderMaxLog_ValueChanged(object o, bool user)
{
var sender = (MySlider)o;
Config.System.MaxGameLog = sender.Value;
if (ModMain.frmSetupLauncherMisc is null)
return;
ModMain.frmSetupLauncherMisc.SliderMaxLog.Value = sender.Value;
}
#endregion
#region 卡片按钮
private void BtnOperationClear_Click(object sender, ModBase.RouteEventArgs e)
{
ModMain.frmLogLeft.flowDocuments[ModMain.frmLogLeft.currentUuid].Blocks.Clear();
}
private void BtnOperationExport_Click(object sender, ModBase.RouteEventArgs e)
{
var savePath = SystemDialogs.SelectSaveFile(Lang.Text("LogPage.Export.SelectLocation"),
Lang.Text("LogPage.Export.GameLog.FileName", ModMain.frmLogLeft.currentLog.version.Name),
Lang.Text("LogPage.Export.GameLog.Filter"));
if (savePath.Length < 3)
return;
File.WriteAllLines(savePath, ModMain.frmLogLeft.currentLog.fullLog);
HintService.Hint(Lang.Text("LogPage.Export.Success"), HintType.Success);
ModBase.OpenExplorer(savePath);
}
private void BtnOperationKill_Click(object sender, ModBase.RouteEventArgs e)
{
if (ModMain.frmLogLeft.currentLog.State <= ModWatcher.Watcher.MinecraftState.Running)
{
ModMain.frmLogLeft.currentLog.Kill();
HintService.Hint(Lang.Text("LogPage.Action.GameClosed", ModMain.frmLogLeft.currentLog.version.Name),
HintType.Success);
}
}
private void BtnOperationExportStackDump_Click(object sender, ModBase.RouteEventArgs e)
{
var formattedDate = DateTime.Now.ToString("G", CultureInfo.InvariantCulture)
.Replace("/", "-")
.Replace(":", ".")
.Replace(" ", "_");
var savePath = SystemDialogs.SelectSaveFile(Lang.Text("LogPage.Export.SelectLocation"),
Lang.Text("LogPage.ExportStack.FileName", formattedDate),
Lang.Text("LogPage.ExportStack.Filter"));
if (savePath.Length < 3)
return;
HintService.Hint(Lang.Text("LogPage.ExportStack.Progress"));
BtnOperationExportStackDump.IsEnabled = false;
ModBase.RunInNewThread(() =>
{
var dump = ModMain.frmLogLeft.currentLog.ExportStackDump(savePath);
File.WriteAllLines(savePath, dump);
ModBase.RunInUi(() =>
{
HintService.Hint(Lang.Text("LogPage.ExportStack.Success"), HintType.Success);
BtnOperationExportStackDump.IsEnabled = true;
});
ModBase.OpenExplorer(savePath);
});
}
private void OnGameExit()
{
ModBase.RunInUi(() => BtnOperationKill.IsEnabled = false);
ModBase.RunInUi(() => BtnOperationExportStackDump.IsEnabled = false);
}
#endregion
}