299 lines
11 KiB
C#
299 lines
11 KiB
C#
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);
|
||
}
|
||
}
|
||
} |