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 PlayerNameProperty = AvaloniaProperty.Register(nameof(PlayerName), defaultBindingMode: BindingMode.TwoWay); public string PlayerName { get => GetValue(PlayerNameProperty); set => SetValue(PlayerNameProperty, value); } public static readonly StyledProperty MemoryLimitProperty = AvaloniaProperty.Register(nameof(MemoryLimit), defaultBindingMode: BindingMode.TwoWay, defaultValue: 2048); public int MemoryLimit { get => GetValue(MemoryLimitProperty); set => SetValue(MemoryLimitProperty, value); } public static readonly StyledProperty CheckGameFilesProperty = AvaloniaProperty.Register(nameof(CheckGameFiles), defaultBindingMode: BindingMode.TwoWay, defaultValue: false); public bool CheckGameFiles { get => GetValue(CheckGameFilesProperty); set => SetValue(CheckGameFilesProperty, value); } public static readonly StyledProperty EnableJavaDownloadProperty = AvaloniaProperty.Register(nameof(EnableJavaDownload), defaultBindingMode: BindingMode.TwoWay, defaultValue: true); public bool EnableJavaDownload { get => GetValue(EnableJavaDownloadProperty); set => SetValue(EnableJavaDownloadProperty, value); } public static readonly StyledProperty RedirectGameOutputProperty = AvaloniaProperty.Register(nameof(RedirectGameOutput), defaultBindingMode: BindingMode.TwoWay, defaultValue: false); public bool RedirectGameOutput { get => GetValue(RedirectGameOutputProperty); set => SetValue(RedirectGameOutputProperty, 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; RedirectGameOutput = LauncherApp.Config.redirect_game_output; 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.redirect_game_output = RedirectGameOutput; 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 { 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); } } }