diff --git a/src/IntelOrca.OpenLauncher.Core/ConfigService.cs b/src/IntelOrca.OpenLauncher.Core/ConfigService.cs index 539fff0..2a3e2d8 100644 --- a/src/IntelOrca.OpenLauncher.Core/ConfigService.cs +++ b/src/IntelOrca.OpenLauncher.Core/ConfigService.cs @@ -58,6 +58,26 @@ public bool PreReleaseChecked SaveConfig(); } } + + public bool AutoUpdateOpenRCT2 + { + get => _config.AutoUpdateOpenRCT2; + set + { + _config.AutoUpdateOpenRCT2 = value; + SaveConfig(); + } + } + + public bool AutoUpdateOpenLoco + { + get => _config.AutoUpdateOpenLoco; + set + { + _config.AutoUpdateOpenLoco = value; + SaveConfig(); + } + } public int SelectingGame { @@ -73,6 +93,8 @@ public int SelectingGame internal struct Config { public bool PreReleaseChecked { get; set; } + public bool AutoUpdateOpenRCT2 { get; set; } + public bool AutoUpdateOpenLoco { get; set; } public int SelectingGame { get; set; } } } diff --git a/src/openlauncher/MainWindow.axaml b/src/openlauncher/MainWindow.axaml index e6ad659..4e2e7a9 100644 --- a/src/openlauncher/MainWindow.axaml +++ b/src/openlauncher/MainWindow.axaml @@ -97,11 +97,16 @@ Content="{x:Static p:Resources.Download}" Click="downloadButton_Click" /> - + Checked="showDevelopmentVersionsCheckbox_Changed" + Unchecked="showDevelopmentVersionsCheckbox_Changed" /> + diff --git a/src/openlauncher/MainWindow.axaml.cs b/src/openlauncher/MainWindow.axaml.cs index 71c6ee7..9434b15 100644 --- a/src/openlauncher/MainWindow.axaml.cs +++ b/src/openlauncher/MainWindow.axaml.cs @@ -47,8 +47,12 @@ public MainWindow() private async void Window_Opened(object sender, EventArgs e) { - showPreReleaseCheckbox.IsChecked = _configService.PreReleaseChecked; + showDevelopmentVersionsCheckbox.IsChecked = _configService.PreReleaseChecked; + autoUpdateGameCheckbox.IsChecked = AutoUpdateEnabled(); gameListView.SelectedIndex = _configService.SelectingGame; + versionDropdown.IsEnabled = !AutoUpdateEnabled(); + downloadButton.IsEnabled = !AutoUpdateEnabled(); + _ready = true; var selectedItem = gameListView.SelectedItem as GameMenuItem; await SetPageAsync(selectedItem); @@ -105,74 +109,99 @@ private async void gameListView_SelectionChanged(object sender, SelectionChanged await SetPageAsync(gameListView.SelectedItem as GameMenuItem); } - private async void showPreReleaseCheckbox_Changed(object sender, RoutedEventArgs e) + private async void showDevelopmentVersionsCheckbox_Changed(object sender, RoutedEventArgs e) { if (!_ready) return; - _configService.PreReleaseChecked = showPreReleaseCheckbox.IsChecked ?? false; + _configService.PreReleaseChecked = showDevelopmentVersionsCheckbox.IsChecked ?? false; await RefreshAvailableVersionsAsync(); } - - private async void downloadButton_Click(object sender, RoutedEventArgs e) + + private void autoUpdateGameCheckbox_Changed(object sender, RoutedEventArgs e) + { + if (!_ready) + return; + SetAutoUpdateEnabled(autoUpdateGameCheckbox.IsChecked ?? false); + SetAllInteractionEnabled(true); + + if (AutoUpdateEnabled()) + { + InstallLatestBuildFromVersionDropdown(); + } + } + + private void downloadButton_Click(object sender, RoutedEventArgs e) + { + InstallLatestBuildFromVersionDropdown(); + } + + private async void InstallLatestBuildFromVersionDropdown() { if (_selectedMenuItem == null) return; - - try + + var selectedItem = versionDropdown.SelectedItem as ComboBoxItem; + if (selectedItem?.Tag is Build build) { - downloadProgress.IsVisible = true; - SetAllInteractionEnabled(false); - - var selectedItem = versionDropdown.SelectedItem as ComboBoxItem; - if (selectedItem?.Tag is Build build) + try { + var currentVersion = await _selectedMenuItem.InstallService.GetCurrentVersionAsync(); + if (build.Version == currentVersion) + return; + + downloadProgress.IsVisible = true; + SetAllInteractionEnabled(false); + var assets = build.Assets .Where(x => x.IsPortable) .Where(x => x.IsApplicableForCurrentPlatform()) .OrderBy(x => x, BuildAssetComparer.Default) .ToArray(); + var asset = assets.FirstOrDefault(); - if (asset != null) + if (asset == null) + { + return; + } + + var progress = new Progress(); + progress.ProgressChanged += (s, report) => { - var progress = new Progress(); - progress.ProgressChanged += (s, report) => + Dispatcher.UIThread.Post(() => { - Dispatcher.UIThread.Post(() => + downloadButton.Content = report.Status; + if (report.Value is float value) { - downloadButton.Content = report.Status; - if (report.Value is float value) - { - downloadProgress.IsIndeterminate = false; - downloadProgress.Value = value; - } - else - { - downloadProgress.IsIndeterminate = true; - } - }); - }; - - var cts = new CancellationTokenSource(); - await _selectedMenuItem.InstallService.DownloadVersion( - new DownloadService(), - new Shell(), - build.Version, - asset.Uri, - progress, - cts.Token); - await RefreshInstalledVersionAsync(); - } + downloadProgress.IsIndeterminate = false; + downloadProgress.Value = value; + } + else + { + downloadProgress.IsIndeterminate = true; + } + }); + }; + + var cts = new CancellationTokenSource(); + await _selectedMenuItem.InstallService.DownloadVersion( + new DownloadService(), + new Shell(), + build.Version, + asset.Uri, + progress, + cts.Token); + await RefreshInstalledVersionAsync(); + } + catch (Exception ex) + { + ShowError(StringResources.DownloadBuildFailedTitle, ex); + } + finally + { + downloadButton.Content = StringResources.Download; + downloadProgress.IsVisible = false; + SetAllInteractionEnabled(true); } - } - catch (Exception ex) - { - ShowError(StringResources.DownloadBuildFailedTitle, ex); - } - finally - { - downloadButton.Content = StringResources.Download; - downloadProgress.IsVisible = false; - SetAllInteractionEnabled(true); } } @@ -232,7 +261,7 @@ private async Task RefreshAvailableVersionsAsync() versionDropdown.IsHitTestVisible = false; // Refresh builds - var showDevelop = showPreReleaseCheckbox.IsChecked ?? false; + var showDevelop = showDevelopmentVersionsCheckbox.IsChecked ?? false; var builds = _selectedMenuItem.Builds; if (builds.IsDefault || (showDevelop && !_selectedMenuItem.BuildsIncludeDevelop)) { @@ -262,8 +291,12 @@ private async Task RefreshAvailableVersionsAsync() versionDropdown.SelectedIndex = 0; if (!_isBusy) { - downloadButton.IsEnabled = true; + downloadButton.IsEnabled = !AutoUpdateEnabled(); versionDropdown.IsHitTestVisible = true; + if (AutoUpdateEnabled()) + { + InstallLatestBuildFromVersionDropdown(); + } } } } @@ -337,12 +370,14 @@ private void SetAllInteractionEnabled(bool value) gameListView.IsEnabled = value; updateButton.IsEnabled = value; versionDropdown.IsHitTestVisible = value && buildsAvailable; - showPreReleaseCheckbox.IsEnabled = value; + showDevelopmentVersionsCheckbox.IsEnabled = value; + autoUpdateGameCheckbox.IsEnabled = value; if (value) { playButton.IsEnabled = _selectedMenuItem?.InstallService.CanLaunch() ?? false; - downloadButton.IsEnabled = buildsAvailable; + downloadButton.IsEnabled = buildsAvailable && !AutoUpdateEnabled(); + versionDropdown.IsEnabled = !AutoUpdateEnabled(); } else { @@ -350,6 +385,32 @@ private void SetAllInteractionEnabled(bool value) downloadButton.IsEnabled = value; } } + + private bool AutoUpdateEnabled() + { + if (_selectedMenuItem == null) + return false; + + var propertyName = "AutoUpdate" + _selectedMenuItem.Game.Name; + var property = _configService.GetType().GetProperty(propertyName); + if (property == null) + return false; + + return (bool)(property.GetValue(_configService) ?? false); + } + + private void SetAutoUpdateEnabled(bool on) + { + if (_selectedMenuItem == null) + return; + + var propertyName = "AutoUpdate" + _selectedMenuItem.Game.Name; + var property = _configService.GetType().GetProperty(propertyName); + if (property == null) + return; + + property.SetValue(_configService, on); + } private static string GetAge(DateTime dt) { diff --git a/src/openlauncher/Properties/Resources.Designer.cs b/src/openlauncher/Properties/Resources.Designer.cs index abbdbfc..1a1b52b 100644 --- a/src/openlauncher/Properties/Resources.Designer.cs +++ b/src/openlauncher/Properties/Resources.Designer.cs @@ -87,6 +87,12 @@ public static string ShowDevelopmentVersions { } } + public static string AutoUpdateGame { + get { + return ResourceManager.GetString("AutoUpdateGame", resourceCulture); + } + } + public static string Update { get { return ResourceManager.GetString("Update", resourceCulture); diff --git a/src/openlauncher/Properties/Resources.nl.resx b/src/openlauncher/Properties/Resources.nl.resx index d9b9d56..9e88ef2 100644 --- a/src/openlauncher/Properties/Resources.nl.resx +++ b/src/openlauncher/Properties/Resources.nl.resx @@ -21,6 +21,9 @@ Ontwikkelversies tonen + + Updates automatisch installeren + Update diff --git a/src/openlauncher/Properties/Resources.resx b/src/openlauncher/Properties/Resources.resx index c788989..982c2df 100644 --- a/src/openlauncher/Properties/Resources.resx +++ b/src/openlauncher/Properties/Resources.resx @@ -21,6 +21,9 @@ Show development versions + + Automatically install updates + Update