diff --git a/CURRENTRELEASE.md b/CURRENTRELEASE.md
index 4d0349a..bf381b8 100644
--- a/CURRENTRELEASE.md
+++ b/CURRENTRELEASE.md
@@ -1,13 +1,25 @@
-# OpenSpartan Workshop 1.0.3 (`ESCHARUM-03052024`)
+# OpenSpartan Workshop 1.0.4 (`URDIDACT-03112024`)
-- [#2] Fixed a bug where the battle pass navigation was not correctly done on smaller window sizes.
-- [#3] Medal name ID is now shown in medal details, so that a user can note it for SQL queries.
-- [#5] Medals are now shown for each of the matches.
-- User can navigate to matches where they earned medals from the match view.
-- [#10] Ranked information displayed in match view and match details.
-- [#12] **Battle Pass** is now listed as **Operations** in the navigation view.
-- Fixed a bug where the service record might not correctly load.
-- [#14] Title now correctly displays the tier and tier type.
-- Onyx Cadet Grade 3 now correctly renders the large icon in the service record. Caused by Halo Infinite API game CMS misconfiguration.
+- [#4] Battle pass item metadata is now shown whenever the user taps on an item.
+- [#16] Tier counterfactuals are now displayed for all ranked matches.
+- [#18] Ranked data now displayed in its own tab.
+- [#21] Added an experimental loose search setting, that speeds up match updates. It's disabled by default but can significantly improve match update performance after matches are already populated in the database.
+- [#23] Fixes missing medals not rendered in match stats.
+- [#24] For matches where there are no expected kills or deaths, the performance arrow indicators are not shown.
+- [#25] Fixed the issue where medals are not refreshed on application launch.
+- [#27] Unnecessary medal label not rendered in match overview when no medals are earned.
+- [#28] Add support for authenticating without using the authentication broker.
+- [#31] Data from [The Exchange](https://www.halowaypoint.com/news/welcome-to-the-exchange) is now rendered in a separate tab, allowing convenient tracking of what's currently on the market.
+- [#35] Event progress is now shown the same way you would see it for operations.
+- Improvements to logging for match acquisition, enabling faster diagnostics for failed calls.
+- Improvements to re-trying match acquisition for failed matches.
+- Logging out now shows a dialog that matches the design of everything else in the window.
+- Events are now listed alongside typical operations (battle pass progression).
+- Minigame modes (e.g., [Survive The Undead](https://www.halowaypoint.com/news/combat-workshop-survive-the-undead)) now correctly render in the match list and don't show an integer representation.
+- Improved logging - it's now easier to trace where exactly an issue surfaced.
+- All currency now displays titles in the battle pass view.
+- Fixed the bug where the nameplate was not being rendered even though the image is available.
+- Matches in the matches list are now ordered by their end time, making it easier to parse the last games.
+- Fixed an issue where Bronze ranks were not displayed in match metadata.
Refer to [**getting started guide**](https://openspartan.com/docs/workshop/guides/get-started/) to start using OpenSpartan Workshop.
diff --git a/src/OpenSpartan.Workshop.Installer.Bundle/Dependencies/WindowsAppRuntimeInstall-x64.exe b/src/OpenSpartan.Workshop.Installer.Bundle/Dependencies/WindowsAppRuntimeInstall-x64.exe
index 0410e5e..33e1e15 100644
Binary files a/src/OpenSpartan.Workshop.Installer.Bundle/Dependencies/WindowsAppRuntimeInstall-x64.exe and b/src/OpenSpartan.Workshop.Installer.Bundle/Dependencies/WindowsAppRuntimeInstall-x64.exe differ
diff --git a/src/OpenSpartan.Workshop/App.xaml b/src/OpenSpartan.Workshop/App.xaml
index bbe1626..3954714 100644
--- a/src/OpenSpartan.Workshop/App.xaml
+++ b/src/OpenSpartan.Workshop/App.xaml
@@ -152,6 +152,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/OpenSpartan.Workshop/App.xaml.cs b/src/OpenSpartan.Workshop/App.xaml.cs
index 98c8280..dc0f4ce 100644
--- a/src/OpenSpartan.Workshop/App.xaml.cs
+++ b/src/OpenSpartan.Workshop/App.xaml.cs
@@ -1,6 +1,7 @@
using Microsoft.UI.Xaml;
using NLog;
using OpenSpartan.Workshop.Core;
+using OpenSpartan.Workshop.Models;
using OpenSpartan.Workshop.ViewModels;
using System;
using System.IO;
@@ -9,8 +10,6 @@ namespace OpenSpartan.Workshop
{
public partial class App : Application
{
- private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
-
public Window MainWindow { get => m_window; }
///
@@ -35,8 +34,7 @@ protected override async void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventA
LogManager.Setup().LoadConfigurationFromFile("NLog.config");
LoadSettings();
-
- var authResult = await UserContextManager.InitializeAllDataOnLaunch();
+ _ = await UserContextManager.InitializeAllDataOnLaunch();
}
private async static void LoadSettings()
@@ -44,35 +42,46 @@ private async static void LoadSettings()
var settingsPath = Path.Combine(Configuration.AppDataDirectory, Configuration.SettingsFileName);
if (File.Exists(settingsPath))
{
+ // Make sure that we default logging to true prior to settings
+ // being loaded so that we can capture any errors that might be
+ // happening with settings initialization.
SettingsViewModel.Instance.Settings = SettingsManager.LoadSettings();
- if (SettingsViewModel.Instance.Settings.SyncSettings)
+
+ if ((bool)SettingsViewModel.Instance.Settings.SyncSettings)
{
try
{
var settings = await UserContextManager.GetWorkshopSettings();
+
if (settings != null)
{
- // For now, we only have two settings that are returned by the API, so
- // no need to overwrite the entire object.
SettingsViewModel.Instance.Settings.Release = settings.Release;
SettingsViewModel.Instance.Settings.HeaderImagePath = settings.HeaderImagePath;
+ SettingsViewModel.Instance.Settings.Build = settings.Build;
+ SettingsViewModel.Instance.Settings.Sandbox = settings.Sandbox;
+ SettingsViewModel.Instance.Settings.UseObanClearance = settings.UseObanClearance;
}
}
catch (Exception ex)
{
- if (SettingsViewModel.Instance.EnableLogging) Logger.Error($"Could not load settings remotely. {ex.Message}\nWill use previously-configured settings..");
+ LogEngine.Log($"Could not load settings remotely. {ex.Message}\nWill use previously-configured settings..", LogSeverity.Error);
}
}
}
else
{
- SettingsViewModel.Instance.Settings = new Models.WorkshopSettings
+ SettingsViewModel.Instance.Settings = new WorkshopSettings
{
APIVersion = Configuration.DefaultAPIVersion,
HeaderImagePath = Configuration.DefaultHeaderImage,
Release = Configuration.DefaultRelease,
+ Sandbox = Configuration.DefaultSandbox,
+ Build = Configuration.DefaultBuild,
SyncSettings = true,
EnableLogging = false,
+ UseBroker = true,
+ UseObanClearance = false,
+ EnableLooseMatchSearch = false,
};
}
}
diff --git a/src/OpenSpartan.Workshop/Controls/MatchesGridControl.xaml b/src/OpenSpartan.Workshop/Controls/MatchesGridControl.xaml
index a735a06..75c3c98 100644
--- a/src/OpenSpartan.Workshop/Controls/MatchesGridControl.xaml
+++ b/src/OpenSpartan.Workshop/Controls/MatchesGridControl.xaml
@@ -4,8 +4,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:models="using:OpenSpartan.Workshop.Models"
- xmlns:converters="using:OpenSpartan.Workshop.Converters"
- xmlns:winuiconverters="using:CommunityToolkit.WinUI.UI.Converters"
+ xmlns:winuiconverters="using:CommunityToolkit.WinUI.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:controls="using:CommunityToolkit.WinUI.UI.Controls"
xmlns:localcontrols="using:OpenSpartan.Workshop.Controls"
@@ -14,21 +13,9 @@
x:Name="MatchesGridControlEntity"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
+
-
+
@@ -66,7 +53,7 @@
-
+
@@ -81,7 +68,7 @@
-
+
@@ -125,7 +112,7 @@
-
+
@@ -232,12 +219,14 @@
-
+
+
+
@@ -266,15 +255,183 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
diff --git a/src/OpenSpartan.Workshop/Controls/MatchesGridControl.xaml.cs b/src/OpenSpartan.Workshop/Controls/MatchesGridControl.xaml.cs
index 1bc7a2a..7c4bb97 100644
--- a/src/OpenSpartan.Workshop/Controls/MatchesGridControl.xaml.cs
+++ b/src/OpenSpartan.Workshop/Controls/MatchesGridControl.xaml.cs
@@ -1,10 +1,8 @@
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
-using CommunityToolkit.WinUI.UI.Controls;
using System.Collections;
using OpenSpartan.Workshop.Core;
-using System;
-using Microsoft.UI.Xaml.Media;
+using CommunityToolkit.WinUI.UI.Controls;
namespace OpenSpartan.Workshop.Controls
{
@@ -39,7 +37,7 @@ public RelayCommand MedalNavigationCommand
}
public MatchesGridControl()
- {
+ {
this.InitializeComponent();
}
diff --git a/src/OpenSpartan.Workshop/Controls/SeasonCalendarControl.xaml b/src/OpenSpartan.Workshop/Controls/SeasonCalendarControl.xaml
new file mode 100644
index 0000000..2c0e191
--- /dev/null
+++ b/src/OpenSpartan.Workshop/Controls/SeasonCalendarControl.xaml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/OpenSpartan.Workshop/Controls/SeasonCalendarControl.xaml.cs b/src/OpenSpartan.Workshop/Controls/SeasonCalendarControl.xaml.cs
new file mode 100644
index 0000000..d0ff1bb
--- /dev/null
+++ b/src/OpenSpartan.Workshop/Controls/SeasonCalendarControl.xaml.cs
@@ -0,0 +1,64 @@
+using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Controls;
+using OpenSpartan.Workshop.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace OpenSpartan.Workshop.Controls
+{
+
+ public sealed partial class SeasonCalendarControl : UserControl
+ {
+ public static readonly DependencyProperty DayItemsProperty = DependencyProperty.Register(
+ nameof(DayItems),
+ typeof(IEnumerable),
+ typeof(SeasonCalendarControl),
+ new PropertyMetadata(default));
+
+ public SeasonCalendarControl()
+ {
+ InitializeComponent();
+ this.CalendarViewControl.CalendarViewDayItemChanging += CalendarViewControl_CalendarViewDayItemChanging;
+ }
+
+ public IEnumerable DayItems
+ {
+ get => (IEnumerable)GetValue(DayItemsProperty);
+ set => SetValue(DayItemsProperty, value);
+ }
+
+ private void CalendarViewControl_CalendarViewDayItemChanging(CalendarView sender, CalendarViewDayItemChangingEventArgs args)
+ {
+ if (args.Phase == 0)
+ {
+ // Register callback for next phase.
+ args.RegisterUpdateCallback(CalendarViewControl_CalendarViewDayItemChanging);
+ }
+ else if (args.Phase == 1)
+ {
+ // Blackout dates in the past, Sundays, and dates that are fully booked.
+ if (args.Item.Date < DateTimeOffset.Now)
+ {
+ args.Item.IsBlackout = true;
+ }
+ // Register callback for next phase.
+ args.RegisterUpdateCallback(CalendarViewControl_CalendarViewDayItemChanging);
+ }
+
+ if (DayItems != null)
+ {
+ var item = DayItems.Where(x => DateOnly.FromDateTime(x.DateTime) == DateOnly.FromDateTime(args.Item.Date.Date)).FirstOrDefault();
+
+ if (item != null)
+ {
+ args.Item.DataContext = item;
+ }
+ else
+ {
+ args.Item.DataContext = null;
+ }
+ }
+ }
+ }
+}
diff --git a/src/OpenSpartan.Workshop/Converters/CommaAfterThousandsConverter.cs b/src/OpenSpartan.Workshop/Converters/CommaAfterThousandsConverter.cs
index 3eec62d..878be26 100644
--- a/src/OpenSpartan.Workshop/Converters/CommaAfterThousandsConverter.cs
+++ b/src/OpenSpartan.Workshop/Converters/CommaAfterThousandsConverter.cs
@@ -1,5 +1,6 @@
using Microsoft.UI.Xaml.Data;
using System;
+using System.Globalization;
namespace OpenSpartan.Workshop.Converters
{
@@ -7,7 +8,7 @@ internal sealed class CommaAfterThousandsConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
- return string.Format("{0:n0}", value);
+ return string.Format(CultureInfo.InvariantCulture, "{0:n0}", value);
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
diff --git a/src/OpenSpartan.Workshop/Converters/ComplexTimeToSimpleTimeConverter.cs b/src/OpenSpartan.Workshop/Converters/ComplexTimeToSimpleTimeConverter.cs
index 35229f1..24e04b7 100644
--- a/src/OpenSpartan.Workshop/Converters/ComplexTimeToSimpleTimeConverter.cs
+++ b/src/OpenSpartan.Workshop/Converters/ComplexTimeToSimpleTimeConverter.cs
@@ -1,5 +1,6 @@
using Microsoft.UI.Xaml.Data;
using System;
+using System.Globalization;
namespace OpenSpartan.Workshop.Converters
{
@@ -8,7 +9,7 @@ internal sealed class ComplexTimeToSimpleTimeConverter : IValueConverter
public object Convert(object value, Type targetType, object parameter, string language)
{
TimeSpan interval = (TimeSpan)value;
- return string.Format("{0:D2}d {1:D2}hr {2:D2}min {3:D2}sec", interval.Days, interval.Hours, interval.Minutes, interval.Seconds);
+ return string.Format(CultureInfo.InvariantCulture, "{0:D2}d {1:D2}hr {2:D2}min {3:D2}sec", interval.Days, interval.Hours, interval.Minutes, interval.Seconds);
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
diff --git a/src/OpenSpartan.Workshop/Converters/CsrToPathConverter.cs b/src/OpenSpartan.Workshop/Converters/CsrToPathConverter.cs
new file mode 100644
index 0000000..4d336b2
--- /dev/null
+++ b/src/OpenSpartan.Workshop/Converters/CsrToPathConverter.cs
@@ -0,0 +1,32 @@
+using Den.Dev.Orion.Models.HaloInfinite;
+using Microsoft.UI.Xaml.Data;
+using System;
+using System.IO;
+
+namespace OpenSpartan.Workshop.Converters
+{
+ internal class CsrToPathConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, string language)
+ {
+ Csr csr = (Csr)value;
+ string tierPath = string.Empty;
+ // Tier is zero-indexed, but the images are starting from 1, so we need to ensure
+ // that we increment the tier to get the right image.
+ if (!string.IsNullOrEmpty(csr.Tier))
+ {
+ tierPath = Path.Combine(Core.Configuration.AppDataDirectory, "imagecache", "csr", $"{csr.Tier.ToLowerInvariant()}_{csr.SubTier + 1}.png");
+ }
+ else
+ {
+ tierPath = Path.Combine(Core.Configuration.AppDataDirectory, "imagecache", "csr", $"unranked_{csr.InitialMeasurementMatches - csr.MeasurementMatchesRemaining}.png");
+ }
+ return tierPath;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, string language)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/src/OpenSpartan.Workshop/Converters/CsrToProgressConverter.cs b/src/OpenSpartan.Workshop/Converters/CsrToProgressConverter.cs
new file mode 100644
index 0000000..540785f
--- /dev/null
+++ b/src/OpenSpartan.Workshop/Converters/CsrToProgressConverter.cs
@@ -0,0 +1,36 @@
+using Den.Dev.Orion.Models.HaloInfinite;
+using Microsoft.UI.Xaml.Data;
+using System;
+
+namespace OpenSpartan.Workshop.Converters
+{
+ internal class CsrToProgressConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, string language)
+ {
+ Csr currentCsr = (Csr)value;
+ if (currentCsr != null)
+ {
+ // When the Value is -1 that means the user is not ranked - there is no
+ // progress to report on.
+ if (currentCsr.Value > -1)
+ {
+ return (double)currentCsr.Value / (double)currentCsr.NextTierStart;
+ }
+ else
+ {
+ return (double)0;
+ }
+ }
+ else
+ {
+ return (double)0;
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, string language)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/src/OpenSpartan.Workshop/Converters/CsrToTextRankConverter.cs b/src/OpenSpartan.Workshop/Converters/CsrToTextRankConverter.cs
new file mode 100644
index 0000000..cebfc5b
--- /dev/null
+++ b/src/OpenSpartan.Workshop/Converters/CsrToTextRankConverter.cs
@@ -0,0 +1,30 @@
+using Den.Dev.Orion.Models.HaloInfinite;
+using Microsoft.UI.Xaml.Data;
+using System;
+
+namespace OpenSpartan.Workshop.Converters
+{
+ internal class CsrToTextRankConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, string language)
+ {
+ Csr csr = (Csr)value;
+
+ // Tier is zero-indexed, but the images are starting from 1, so we need to ensure
+ // that we increment the tier to get the right image.
+ if (!string.IsNullOrEmpty(csr.Tier))
+ {
+ return $"{csr.Tier} {csr.SubTier + 1}";
+ }
+ else
+ {
+ return "Unranked";
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, string language)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/src/OpenSpartan.Workshop/Converters/CsrToTooltipValueConverter.cs b/src/OpenSpartan.Workshop/Converters/CsrToTooltipValueConverter.cs
new file mode 100644
index 0000000..abcd4b6
--- /dev/null
+++ b/src/OpenSpartan.Workshop/Converters/CsrToTooltipValueConverter.cs
@@ -0,0 +1,36 @@
+using Den.Dev.Orion.Models.HaloInfinite;
+using Microsoft.UI.Xaml.Data;
+using System;
+
+namespace OpenSpartan.Workshop.Converters
+{
+ internal class CsrToTooltipValueConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, string language)
+ {
+ Csr currentCsr = (Csr)value;
+ if (currentCsr != null)
+ {
+ // When the Value is -1 that means the user is not ranked - there is no
+ // progress to report on.
+ if (currentCsr.Value > -1)
+ {
+ return $"{currentCsr.Value}/{currentCsr.NextTierStart} ({((double)currentCsr.Value/(double)currentCsr.NextTierStart)*100:0.00}%)";
+ }
+ else
+ {
+ return "Unranked";
+ }
+ }
+ else
+ {
+ return "Unranked";
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, string language)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/src/OpenSpartan.Workshop/Converters/DirectValueToPercentageStringConverter.cs b/src/OpenSpartan.Workshop/Converters/DirectValueToPercentageStringConverter.cs
index d6b35ec..990e045 100644
--- a/src/OpenSpartan.Workshop/Converters/DirectValueToPercentageStringConverter.cs
+++ b/src/OpenSpartan.Workshop/Converters/DirectValueToPercentageStringConverter.cs
@@ -1,5 +1,6 @@
using Microsoft.UI.Xaml.Data;
using System;
+using System.Globalization;
namespace OpenSpartan.Workshop.Converters
{
@@ -7,7 +8,7 @@ internal class DirectValueToPercentageStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
- return $"{System.Convert.ToDouble(value) / 100.0:P02}";
+ return $"{System.Convert.ToDouble(value, CultureInfo.InvariantCulture) / 100.0:P02}";
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
diff --git a/src/OpenSpartan.Workshop/Converters/DoubleToPercentageStringConverter.cs b/src/OpenSpartan.Workshop/Converters/DoubleToPercentageStringConverter.cs
index 386d73e..79b3fbd 100644
--- a/src/OpenSpartan.Workshop/Converters/DoubleToPercentageStringConverter.cs
+++ b/src/OpenSpartan.Workshop/Converters/DoubleToPercentageStringConverter.cs
@@ -1,5 +1,6 @@
using Microsoft.UI.Xaml.Data;
using System;
+using System.Globalization;
namespace OpenSpartan.Workshop.Converters
{
@@ -7,7 +8,7 @@ internal sealed class DoubleToPercentageStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
- return $"{System.Convert.ToDouble(value):P2}";
+ return $"{System.Convert.ToDouble(value, CultureInfo.InvariantCulture):P2}";
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
diff --git a/src/OpenSpartan.Workshop/Converters/ISO8601ToLocalDateStringConverter.cs b/src/OpenSpartan.Workshop/Converters/ISO8601ToLocalDateStringConverter.cs
new file mode 100644
index 0000000..d65f8b0
--- /dev/null
+++ b/src/OpenSpartan.Workshop/Converters/ISO8601ToLocalDateStringConverter.cs
@@ -0,0 +1,24 @@
+using Microsoft.UI.Xaml.Data;
+using System;
+using System.Globalization;
+
+namespace OpenSpartan.Workshop.Converters
+{
+ public class ISO8601ToLocalDateStringConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, string language)
+ {
+ if (value is DateTime dateTime)
+ {
+ return dateTime.ToString("MMMM d, yyyy h:mm tt", CultureInfo.CurrentCulture);
+ }
+
+ return value;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, string language)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/src/OpenSpartan.Workshop/Converters/ListCountToVisibilityConverter.cs b/src/OpenSpartan.Workshop/Converters/ListCountToVisibilityConverter.cs
new file mode 100644
index 0000000..e495f11
--- /dev/null
+++ b/src/OpenSpartan.Workshop/Converters/ListCountToVisibilityConverter.cs
@@ -0,0 +1,26 @@
+using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Data;
+using System;
+using System.Collections;
+using System.Linq;
+
+namespace OpenSpartan.Workshop.Converters
+{
+ internal class ListCountToVisibilityConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, string language)
+ {
+ if (value is IEnumerable enumerable)
+ {
+ return enumerable.Cast
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
- OpenSpartan Workshop
-
- Version:
-
-
Report issues or request features on GitHub.
Built with ❤️ by Den Delimarsky as an unofficial Halo Infinite companion app.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Gamertag:
-
-
- XUID:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Logging is enabled
- Logging is disabled
-
-
-
-
-
-
-
-
-
- Sync with OpenSpartan Workshop API settings
- Set directly
-
-
-
-
-
-
-
-
-
-
-
- Release:
-
-
-
-
-
-
-
+
This application is not an official Halo Infinite client. Use at your own risk.
The author of this application is not liable for any damages, including the termination or banning of Xbox Live/Microsoft accounts.
diff --git a/src/OpenSpartan.Workshop/Views/SettingsView.xaml.cs b/src/OpenSpartan.Workshop/Views/SettingsView.xaml.cs
index 5ccb174..f811895 100644
--- a/src/OpenSpartan.Workshop/Views/SettingsView.xaml.cs
+++ b/src/OpenSpartan.Workshop/Views/SettingsView.xaml.cs
@@ -6,14 +6,11 @@
using System;
using System.Diagnostics;
using System.IO;
-using System.Windows.Forms;
namespace OpenSpartan.Workshop.Views
{
public sealed partial class SettingsView : Page
{
- private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
-
public SettingsView()
{
InitializeComponent();
@@ -21,9 +18,21 @@ public SettingsView()
private async void btnLogOut_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
{
- var result = MessageBox.Show("Are you sure you want to log out?", "OpenSpartan Workshop", MessageBoxButtons.YesNo);
+ ContentDialog deleteFileDialog = new ContentDialog
+ {
+ Title = "Log out",
+ Content = "Are you sure you want to log out?",
+ PrimaryButtonText = "Yes",
+ CloseButtonText = "No",
+ DefaultButton = ContentDialogButton.Close,
+ XamlRoot = this.Content.XamlRoot
+ };
+
+ ContentDialogResult result = await deleteFileDialog.ShowAsync();
- if (result == DialogResult.Yes)
+ // Delete the file if the user clicked the primary button.
+ /// Otherwise, do nothing.
+ if (result == ContentDialogResult.Primary)
{
try
{
@@ -50,7 +59,7 @@ await UserContextManager.DispatcherWindow.DispatcherQueue.EnqueueAsync(() =>
}
catch (Exception ex)
{
- if (SettingsViewModel.Instance.EnableLogging) Logger.Error($"Could not log out by deleting the credential cache file. {ex.Message}");
+ LogEngine.Log($"Could not log out by deleting the credential cache file. {ex.Message}", Models.LogSeverity.Error);
}
}
}