diff --git a/src/CodeBreaker.WPF.sln b/src/CodeBreaker.WPF.sln index fb23cecd..a32f7f92 100644 --- a/src/CodeBreaker.WPF.sln +++ b/src/CodeBreaker.WPF.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 17.7.33927.210 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Codebreaker.WPF", "Codebreaker.WPF\Codebreaker.WPF.csproj", "{10FD3CBC-D263-49B3-9320-49AA2D522C0E}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0F0847C3-59CA-4C02-87B7-C37A161BC067}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/src/Codebreaker.WPF/App.xaml b/src/Codebreaker.WPF/App.xaml index c29d320e..581c88b0 100644 --- a/src/Codebreaker.WPF/App.xaml +++ b/src/Codebreaker.WPF/App.xaml @@ -1,7 +1,7 @@ - diff --git a/src/Codebreaker.WPF/App.xaml.cs b/src/Codebreaker.WPF/App.xaml.cs index 9767b953..3a2a5275 100644 --- a/src/Codebreaker.WPF/App.xaml.cs +++ b/src/Codebreaker.WPF/App.xaml.cs @@ -1,15 +1,4 @@ -using CodeBreaker.Services; -using CodeBreaker.Services.Authentication; -using CodeBreaker.ViewModels; -using CodeBreaker.ViewModels.Services; - -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -using System.Configuration; -using System.Windows; - -namespace CodeBreaker.WPF; +namespace Codebreaker.WPF; /// /// Interaction logic for App.xaml @@ -34,11 +23,10 @@ public App() }) .ConfigureServices((context, services) => { - services.Configure(options => options.EnableDialogs = false); + services.Configure(options => options.EnableDialogs = true); services.AddTransient(); services.AddScoped(); - services.AddScoped(); - services.AddHttpClient(client => + services.AddHttpClient(client => { string uriString = context.Configuration["ApiBase"] ?? throw new ConfigurationErrorsException("ApiBase not configured"); client.BaseAddress = new Uri(uriString); diff --git a/src/Codebreaker.WPF/Codebreaker.WPF.csproj b/src/Codebreaker.WPF/Codebreaker.WPF.csproj index e0fee82b..03da3c9b 100644 --- a/src/Codebreaker.WPF/Codebreaker.WPF.csproj +++ b/src/Codebreaker.WPF/Codebreaker.WPF.csproj @@ -7,6 +7,7 @@ enable true CN innovation + Codebreaker.WPF.App @@ -28,7 +29,7 @@ - + diff --git a/src/Codebreaker.WPF/Converters/BoolToVisibilityConverter.cs b/src/Codebreaker.WPF/Converters/BoolToVisibilityConverter.cs deleted file mode 100644 index 774f5d84..00000000 --- a/src/Codebreaker.WPF/Converters/BoolToVisibilityConverter.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Globalization; -using System.Windows; -using System.Windows.Data; - -namespace CodeBreaker.WPF.Converters; - -internal class BoolToVisibilityConverter : IValueConverter -{ - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - bool inProgress = (bool)value; - return inProgress ? Visibility.Visible : Visibility.Collapsed; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } -} diff --git a/src/Codebreaker.WPF/Converters/ColorNameToBrushConverter.cs b/src/Codebreaker.WPF/Converters/ColorNameToBrushConverter.cs index cb42bb09..38d1f11e 100644 --- a/src/Codebreaker.WPF/Converters/ColorNameToBrushConverter.cs +++ b/src/Codebreaker.WPF/Converters/ColorNameToBrushConverter.cs @@ -1,23 +1,17 @@ -using System.Globalization; -using System.Windows.Data; -using System.Windows.Media; - -using static CodeBreaker.Shared.Models.Data.Colors; - -namespace CodeBreaker.WPF.Converters; +namespace Codebreaker.WPF.Converters; public class ColorNameToBrushConverter : IValueConverter { - private static readonly Brush s_blackBrush = new SolidColorBrush(Colors.Black); - private static readonly Brush s_whiteBrush = new SolidColorBrush(Colors.White); + private static readonly Brush s_orangeBrush = new SolidColorBrush(Colors.Orange); + private static readonly Brush s_PurpleBrush = new SolidColorBrush(Colors.Purple); private static readonly Brush s_redBrush = new SolidColorBrush(Color.FromRgb(209, 52, 56)); private static readonly Brush s_greenBrush = new SolidColorBrush(Color.FromRgb(0, 173, 86)); private static readonly Brush s_blueBrush = new SolidColorBrush(Color.FromRgb(79, 107, 237)); private static readonly Brush s_yellowBrush = new SolidColorBrush(Color.FromRgb(252, 225, 0)); private static readonly Brush s_emptyBrush = new SolidColorBrush(Color.FromRgb(160, 174, 178)); - public Brush BlackBrush { get; set; } = s_blackBrush; - public Brush WhiteBrush { get; set; } = s_whiteBrush; + public Brush OrangeBrush { get; set; } = s_orangeBrush; + public Brush PurpleBrush { get; set; } = s_PurpleBrush; public Brush RedBrush { get; set; } = s_redBrush; public Brush GreenBrush { get; set; } = s_greenBrush; public Brush BlueBrush { get; set; } = s_blueBrush; @@ -26,14 +20,15 @@ public class ColorNameToBrushConverter : IValueConverter public object? Convert(object value, Type targetType, object parameter, CultureInfo culture) { + return value switch { - Black => BlackBrush, - White => WhiteBrush, - Red => RedBrush, - Green => GreenBrush, - Blue => BlueBrush, - Yellow => YellowBrush, + "Purple" => OrangeBrush, + "Orange" => PurpleBrush, + "Red" => RedBrush, + "Green" => GreenBrush, + "Blue" => BlueBrush, + "Yellow" => YellowBrush, _ => EmptyBrush }; } diff --git a/src/Codebreaker.WPF/Converters/FieldValuesToColorsConverter.cs b/src/Codebreaker.WPF/Converters/FieldValuesToColorsConverter.cs new file mode 100644 index 00000000..3b911e97 --- /dev/null +++ b/src/Codebreaker.WPF/Converters/FieldValuesToColorsConverter.cs @@ -0,0 +1,18 @@ +namespace Codebreaker.WPF.Converters; + +public class FieldValuesToColorsConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is IDictionary data) + { + return data["colors"]; + } + else + { + return value; + } + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new NotImplementedException(); +} diff --git a/src/Codebreaker.WPF/Converters/GameStatusToVisibilityConverter.cs b/src/Codebreaker.WPF/Converters/GameStatusToVisibilityConverter.cs index e9b469f5..a7052d68 100644 --- a/src/Codebreaker.WPF/Converters/GameStatusToVisibilityConverter.cs +++ b/src/Codebreaker.WPF/Converters/GameStatusToVisibilityConverter.cs @@ -1,10 +1,4 @@ -using CodeBreaker.ViewModels; - -using System.Globalization; -using System.Windows; -using System.Windows.Data; - -namespace CodeBreaker.WPF.Converters; +namespace Codebreaker.WPF.Converters; internal class GameStatusToVisibilityConverter : IValueConverter { diff --git a/src/Codebreaker.WPF/Converters/IntToEnumerableConverter.cs b/src/Codebreaker.WPF/Converters/IntToEnumerableConverter.cs index 8c358273..54f9cf05 100644 --- a/src/Codebreaker.WPF/Converters/IntToEnumerableConverter.cs +++ b/src/Codebreaker.WPF/Converters/IntToEnumerableConverter.cs @@ -1,7 +1,4 @@ -using System.Globalization; -using System.Windows.Data; - -namespace CodeBreaker.WPF.Converters; +namespace Codebreaker.WPF.Converters; internal class IntToEnumerableConverter : IValueConverter { diff --git a/src/Codebreaker.WPF/Converters/KeyPegColorNameToBrushConverter.cs b/src/Codebreaker.WPF/Converters/KeyPegColorNameToBrushConverter.cs new file mode 100644 index 00000000..f6e4763e --- /dev/null +++ b/src/Codebreaker.WPF/Converters/KeyPegColorNameToBrushConverter.cs @@ -0,0 +1,18 @@ +namespace Codebreaker.WPF.Converters; + +public class KeyPegColorNameToBrushConverter : IValueConverter +{ + public Brush BlackBrush { get; set; } = new SolidColorBrush(Colors.Black); + public Brush WhiteBrush { get; set; } = new SolidColorBrush(Colors.White); + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value switch + { + "Black" => BlackBrush, + "White" => WhiteBrush, + _ => value + }; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new NotImplementedException(); +} diff --git a/src/Codebreaker.WPF/Converters/SelectionAndKeyPegToKeyVisibilityConverter.cs b/src/Codebreaker.WPF/Converters/SelectionAndKeyPegToKeyVisibilityConverter.cs index 57db68f7..36fd163f 100644 --- a/src/Codebreaker.WPF/Converters/SelectionAndKeyPegToKeyVisibilityConverter.cs +++ b/src/Codebreaker.WPF/Converters/SelectionAndKeyPegToKeyVisibilityConverter.cs @@ -1,32 +1,25 @@ -using CodeBreaker.Shared.Models.Extensions; -using CodeBreaker.ViewModels; +namespace Codebreaker.WPF.Converters; -using System.Globalization; -using System.Windows; -using System.Windows.Data; +//public class SelectionAndKeyPegToKeyVisibilityConverter : IValueConverter +//{ +// public object Convert(object value, Type targetType, object parameter, CultureInfo culture) +// { +// ArgumentNullException.ThrowIfNull(parameter); -namespace CodeBreaker.WPF.Converters; +// if (value is SelectionAndKeyPegs selection && int.TryParse(parameter.ToString(), out int ix)) +// { +// return (ix < selection.KeyPegs.ToModel().Total) +// ? Visibility.Visible +// : Visibility.Collapsed; +// } +// else +// { +// return Visibility.Hidden; +// } +// } -public class SelectionAndKeyPegToKeyVisibilityConverter : IValueConverter -{ - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - ArgumentNullException.ThrowIfNull(parameter); - - if (value is SelectionAndKeyPegs selection && int.TryParse(parameter.ToString(), out int ix)) - { - return (ix < selection.KeyPegs.ToModel().Total) - ? Visibility.Visible - : Visibility.Collapsed; - } - else - { - return Visibility.Hidden; - } - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } -} +// public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) +// { +// throw new NotImplementedException(); +// } +//} diff --git a/src/Codebreaker.WPF/GlobalUsings.cs b/src/Codebreaker.WPF/GlobalUsings.cs new file mode 100644 index 00000000..e51a3ef6 --- /dev/null +++ b/src/Codebreaker.WPF/GlobalUsings.cs @@ -0,0 +1,14 @@ +global using Codebreaker.GameAPIs.Client; +global using Codebreaker.ViewModels; +global using Codebreaker.ViewModels.Services; + +global using Microsoft.Extensions.DependencyInjection; +global using Microsoft.Extensions.Hosting; + +global using System.Configuration; +global using System.Globalization; +global using System.Windows; +global using System.Windows.Data; +global using System.Windows.Media; + +global using System.Windows.Controls; \ No newline at end of file diff --git a/src/Codebreaker.WPF/Services/WPFDialogService.cs b/src/Codebreaker.WPF/Services/WPFDialogService.cs index 5a4582a6..3fe9cb6d 100644 --- a/src/Codebreaker.WPF/Services/WPFDialogService.cs +++ b/src/Codebreaker.WPF/Services/WPFDialogService.cs @@ -1,8 +1,6 @@ -using CodeBreaker.ViewModels.Services; + -using System.Windows; - -namespace CodeBreaker.WPF.Services; +namespace Codebreaker.WPF.Services; public class WPFDialogService : IDialogService { diff --git a/src/Codebreaker.WPF/Views/Components/KeyPegsView.xaml b/src/Codebreaker.WPF/Views/Components/KeyPegsView.xaml index b92d56be..27678f55 100644 --- a/src/Codebreaker.WPF/Views/Components/KeyPegsView.xaml +++ b/src/Codebreaker.WPF/Views/Components/KeyPegsView.xaml @@ -1,4 +1,4 @@ - /// Interaction logic for KeyPegs.xaml diff --git a/src/Codebreaker.WPF/Views/Components/PegSelectionView.xaml b/src/Codebreaker.WPF/Views/Components/PegSelectionView.xaml index 3925aa18..13cec377 100644 --- a/src/Codebreaker.WPF/Views/Components/PegSelectionView.xaml +++ b/src/Codebreaker.WPF/Views/Components/PegSelectionView.xaml @@ -1,12 +1,15 @@ - + + @@ -15,7 +18,7 @@ Margin="0,0,8,0" MinWidth="88" MinHeight="60" - ItemsSource="{Binding ElementName=PegSelectionViewControl, Path=ViewModel.Game.Type.Fields, Mode=OneWay}" + ItemsSource="{Binding ElementName=PegSelectionViewControl, Path=ViewModel.Game.FieldValues, Converter={StaticResource FieldValuesToColorsConverter}, Mode=OneWay}" ItemTemplate="{StaticResource SelectColorTemplate}" SelectedItem="{Binding Value, Mode=TwoWay}" /> diff --git a/src/Codebreaker.WPF/Views/Components/PegSelectionView.xaml.cs b/src/Codebreaker.WPF/Views/Components/PegSelectionView.xaml.cs index cf769857..7beb1c22 100644 --- a/src/Codebreaker.WPF/Views/Components/PegSelectionView.xaml.cs +++ b/src/Codebreaker.WPF/Views/Components/PegSelectionView.xaml.cs @@ -1,9 +1,4 @@ -using CodeBreaker.ViewModels; - -using System.Windows; -using System.Windows.Controls; - -namespace CodeBreaker.WPF.Views.Components; +namespace Codebreaker.WPF.Views.Components; public partial class PegSelectionView : UserControl { diff --git a/src/Codebreaker.WPF/Views/Pages/GameWindow.xaml b/src/Codebreaker.WPF/Views/Pages/GameWindow.xaml index ec034ef1..cb190e2f 100644 --- a/src/Codebreaker.WPF/Views/Pages/GameWindow.xaml +++ b/src/Codebreaker.WPF/Views/Pages/GameWindow.xaml @@ -1,17 +1,17 @@ - + Title="Codebreaker" Height="450" Width="800"> - - + + @@ -23,9 +23,9 @@ - - - + @@ -101,6 +101,6 @@ Grid.Row="3" Height="15" Minimum="0" Maximum="100" IsIndeterminate="True" - Visibility="{Binding ViewModel.InProgress, Converter={StaticResource BoolToVisibilityConverter}}" /> + Visibility="{Binding ViewModel.InProgress, Converter={StaticResource BooleanToVisibilityConverter}}" /> diff --git a/src/Codebreaker.WPF/Views/Pages/GameWindow.xaml.cs b/src/Codebreaker.WPF/Views/Pages/GameWindow.xaml.cs index 61e9eed7..e58fddcc 100644 --- a/src/Codebreaker.WPF/Views/Pages/GameWindow.xaml.cs +++ b/src/Codebreaker.WPF/Views/Pages/GameWindow.xaml.cs @@ -1,8 +1,4 @@ -using CodeBreaker.ViewModels; -using CommunityToolkit.Mvvm.Messaging; -using System.Windows; - -namespace CodeBreaker.WPF.Views.Pages; +namespace Codebreaker.WPF.Views.Pages; public partial class GameWindow : Window { diff --git a/src/Codebreaker.WPF/Views/Templates/CodeBreakerTemplates.xaml b/src/Codebreaker.WPF/Views/Templates/CodeBreakerTemplates.xaml index 068d6337..60252585 100644 --- a/src/Codebreaker.WPF/Views/Templates/CodeBreakerTemplates.xaml +++ b/src/Codebreaker.WPF/Views/Templates/CodeBreakerTemplates.xaml @@ -1,10 +1,12 @@  + + @@ -30,21 +32,8 @@ - - - - - - - - - - - - - - + @@ -52,7 +41,7 @@ - + diff --git a/src/Codebreaker.WPF/appsettings.Development.json b/src/Codebreaker.WPF/appsettings.Development.json index 507228a6..d82d2bbd 100644 --- a/src/Codebreaker.WPF/appsettings.Development.json +++ b/src/Codebreaker.WPF/appsettings.Development.json @@ -1,3 +1,3 @@ { - "ApiBase": "http://localhost:9400" + "ApiBase": "https://codebreaker-gamesapi-3.purplebush-9a246700.westeurope.azurecontainerapps.io" } diff --git a/src/GlobalUsings.cs b/src/GlobalUsings.cs new file mode 100644 index 00000000..5f1cc77c --- /dev/null +++ b/src/GlobalUsings.cs @@ -0,0 +1,3 @@ +global using Codebreaker.ViewModels; + +global using System.Windows; \ No newline at end of file