mlaumcherb/Mlaumcherb.Client.Avalonia/зримое/MainWindow.axaml.cs
2024-12-27 21:11:19 +05:00

299 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Avalonia;
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Interactivity;
using Avalonia.Platform.Storage;
using Avalonia.Threading;
using Mlaumcherb.Client.Avalonia.классы;
using Mlaumcherb.Client.Avalonia.холопы;
using MsBox.Avalonia;
using MsBox.Avalonia.Dto;
using MsBox.Avalonia.Models;
namespace Mlaumcherb.Client.Avalonia.зримое;
public partial class MainWindow : Window
{
public static readonly StyledProperty<string> PlayerNameProperty =
AvaloniaProperty.Register<MainWindow, string>(nameof(PlayerName),
defaultBindingMode: BindingMode.TwoWay);
public string PlayerName
{
get => GetValue(PlayerNameProperty);
set => SetValue(PlayerNameProperty, value);
}
public static readonly StyledProperty<int> MemoryLimitProperty =
AvaloniaProperty.Register<MainWindow, int>(nameof(MemoryLimit),
defaultBindingMode: BindingMode.TwoWay, defaultValue: 2048);
public int MemoryLimit
{
get => GetValue(MemoryLimitProperty);
set => SetValue(MemoryLimitProperty, value);
}
public static readonly StyledProperty<bool> CheckGameFilesProperty =
AvaloniaProperty.Register<MainWindow, bool>(nameof(CheckGameFiles),
defaultBindingMode: BindingMode.TwoWay, defaultValue: false);
public bool CheckGameFiles
{
get => GetValue(CheckGameFilesProperty);
set => SetValue(CheckGameFilesProperty, value);
}
public static readonly StyledProperty<bool> EnableJavaDownloadProperty =
AvaloniaProperty.Register<MainWindow, bool>(nameof(EnableJavaDownload),
defaultBindingMode: BindingMode.TwoWay, defaultValue: true);
public bool EnableJavaDownload
{
get => GetValue(EnableJavaDownloadProperty);
set => SetValue(EnableJavaDownloadProperty, value);
}
public MainWindow()
{
InitializeComponent();
}
protected override async void OnLoaded(RoutedEventArgs e)
{
try
{
LauncherApp.Logger.OnLogMessage += GuiLogMessage;
PlayerName = LauncherApp.Config.player_name;
MemoryLimit = LauncherApp.Config.max_memory;
EnableJavaDownload = LauncherApp.Config.download_java;
InstalledVersionComboBox.SelectedIndex = 0;
InstalledVersionComboBox.IsEnabled = false;
var versions = await GameVersion.GetAllVersionsAsync();
Dispatcher.UIThread.Invoke(() =>
{
foreach (var p in versions)
{
InstalledVersionComboBox.Items.Add(new VersionItemView(p));
// select last played version
if (LauncherApp.Config.last_launched_version != null &&
p.Name == LauncherApp.Config.last_launched_version)
InstalledVersionComboBox.SelectedIndex = InstalledVersionComboBox.Items.Count - 1;
}
InstalledVersionComboBox.IsEnabled = true;
foreach (var vc in LauncherApp.Config.version_catalogs)
{
VersionCatalogComboBox.Items.Add(vc);
}
VersionCatalogComboBox.SelectedIndex = 0;
});
}
catch (Exception ex)
{
ErrorHelper.ShowMessageBox(nameof(MainWindow), ex);
}
}
private void GuiLogMessage(LauncherLogger.LogMessage msg)
{
if (msg.severity == LogSeverity.Debug) return;
Dispatcher.UIThread.Invoke(() =>
{
double offsetFromBottom = LogScrollViewer.Extent.Height - LogScrollViewer.Offset.Y - LogScrollViewer.Viewport.Height;
bool is_scrolled_to_end = offsetFromBottom < 20.0; // scrolled less then one line up
LogPanel.Children.Add(new LogMessageView(msg));
if (is_scrolled_to_end) LogScrollViewer.ScrollToEnd();
});
}
private async void Запуск(object? sender, RoutedEventArgs e)
{
try
{
Dispatcher.UIThread.Invoke(() => LaunchButton.IsEnabled = false);
var selectedVersionView = (VersionItemView?)InstalledVersionComboBox.SelectedItem;
var selectedVersion = selectedVersionView?.Props;
LauncherApp.Config.last_launched_version = selectedVersion?.Name;
LauncherApp.Config.player_name = PlayerName;
LauncherApp.Config.max_memory = MemoryLimit;
LauncherApp.Config.download_java = EnableJavaDownload;
LauncherApp.Config.SaveToFile();
if (selectedVersion == null)
return;
var v = await GameVersion.CreateFromPropsAsync(selectedVersion);
await v.UpdateFiles(CheckGameFiles, nt =>
{
Dispatcher.UIThread.Invoke(() =>
{
DownloadsPanel.Children.Add(new NetworkTaskView(nt,
ntv => DownloadsPanel.Children.Remove(ntv)));
});
}
);
Dispatcher.UIThread.Invoke(() =>
{
CheckGameFiles = false;
});
await v.Launch();
}
catch (Exception ex)
{
ErrorHelper.ShowMessageBox(nameof(MainWindow), ex);
}
finally
{
Dispatcher.UIThread.Invoke(() =>
{
LaunchButton.IsEnabled = true;
});
}
}
private void ОткрытьПапкуЛаунчера(object? s, RoutedEventArgs e)
{
try
{
Launcher.LaunchDirectoryInfoAsync(new DirectoryInfo(Directory.GetCurrent().ToString()))
.ConfigureAwait(false);
}
catch (Exception ex)
{
ErrorHelper.ShowMessageBox(nameof(MainWindow), ex);
}
}
private void ОткрытьФайлЛогов(object? sender, RoutedEventArgs e)
{
try
{
Launcher.LaunchFileInfoAsync(new FileInfo(LauncherApp.Logger.LogfileName.ToString()))
.ConfigureAwait(false);
}
catch (Exception ex)
{
ErrorHelper.ShowMessageBox(nameof(MainWindow), ex);
}
}
private void ОткрытьРепозиторий(object? sender, RoutedEventArgs e)
{
try
{
Launcher.LaunchUriAsync(new Uri("https://timerix.ddns.net:3322/Timerix/mlaumcherb"))
.ConfigureAwait(false);
}
catch (Exception ex)
{
ErrorHelper.ShowMessageBox(nameof(MainWindow), ex);
}
}
private void ClearLogPanel(object? sender, RoutedEventArgs e)
{
LogPanel.Children.Clear();
}
private void ClearDownloadsPanel(object? sender, RoutedEventArgs e)
{
foreach (var control in DownloadsPanel.Children)
{
var nt = (NetworkTaskView)control;
nt.Task.Cancel();
}
DownloadsPanel.Children.Clear();
}
private async void DeleteVersionButton_OnClick(object? sender, RoutedEventArgs e)
{
try
{
VersionItemView? sel = InstalledVersionComboBox.SelectedItem as VersionItemView;
if(sel is null)
return;
var box = MessageBoxManager.GetMessageBoxCustom(new MessageBoxCustomParams
{
ButtonDefinitions = new List<ButtonDefinition> { new() { Name = "Да" }, new() { Name = "Нет" } },
ContentTitle = $"Удаление версии {sel.Props.Name}",
ContentMessage = $"Вы уверены, что хотите удалить версию {sel.Props.Name}? Все файлы, включая сохранения, будут удалены!",
Icon = MsBox.Avalonia.Enums.Icon.Question,
WindowStartupLocation = WindowStartupLocation.CenterOwner,
SizeToContent = SizeToContent.WidthAndHeight,
ShowInCenter = true,
Topmost = true
}
);
var result = await box.ShowAsync().ConfigureAwait(false);
if (result != "Да")
return;
sel.Props.DeleteFiles();
Dispatcher.UIThread.Invoke(() =>
{
InstalledVersionComboBox.Items.Remove(sel);
});
}
catch (Exception ex)
{
ErrorHelper.ShowMessageBox(nameof(MainWindow), ex);
}
}
private async void SearchVersionsButton_OnClick(object? sender, RoutedEventArgs e)
{
try
{
var catalogProps = VersionCatalogComboBox.SelectedItem as VersionCatalogProps;
if(catalogProps is null)
return;
var catalog = await catalogProps.GetVersionCatalogAsync();
var searchParams = new VersionSearchParams();
Dispatcher.UIThread.Invoke(() =>
{
searchParams.ReleaseTypeAllowed = ReleaseVersionTypeCheckBox.IsChecked ?? false;
searchParams.SnapshotTypeAllowed = SnapshotVersionTypeCheckBox.IsChecked ?? false;
searchParams.OldTypeAllowed = OldVersionTypeCheckBox.IsChecked ?? false;
searchParams.OtherTypeAllowed = OtherVersionTypeAlphaCheckBox.IsChecked ?? false;
});
var versions = catalog.GetDownloadableVersions(searchParams);
Dispatcher.UIThread.Invoke(() =>
{
VersionCatalogItemsComboBox.IsEnabled = false;
VersionCatalogItemsComboBox.Items.Clear();
foreach (var p in versions)
{
VersionCatalogItemsComboBox.Items.Add(new VersionItemView(p));
}
VersionCatalogItemsComboBox.IsEnabled = true;
AddVersionButton.IsEnabled = versions.Count > 0;
});
}
catch (Exception ex)
{
ErrorHelper.ShowMessageBox(nameof(MainWindow), ex);
}
}
private void AddVersionButton_OnClick(object? sender, RoutedEventArgs e)
{
try
{
var selectedVersionView = VersionCatalogItemsComboBox.SelectedItem as VersionItemView;
if(selectedVersionView is null)
return;
InstalledVersionComboBox.Items.Insert(0, new VersionItemView(selectedVersionView.Props));
InstalledVersionComboBox.SelectedIndex = 0;
}
catch (Exception ex)
{
ErrorHelper.ShowMessageBox(nameof(MainWindow), ex);
}
}
}