199 lines
6.8 KiB
C#
199 lines
6.8 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.холопы;
|
||
|
||
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;
|
||
|
||
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();
|
||
}
|
||
} |