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.холопы; 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 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; VersionComboBox.SelectedIndex = 0; VersionComboBox.IsEnabled = false; var versions = await GameVersion.GetAllVersionsAsync(); Dispatcher.UIThread.Invoke(() => { foreach (var p in versions) { VersionComboBox.Items.Add(new VersionItemView(p)); if (LauncherApp.Config.last_launched_version != null && p.Name == LauncherApp.Config.last_launched_version) VersionComboBox.SelectedIndex = VersionComboBox.Items.Count - 1; } VersionComboBox.IsEnabled = true; }); } 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?)VersionComboBox.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(); } }