Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions src/Codebreaker.WPF/Helpers/PageExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using CommunityToolkit.Mvvm.Messaging;

namespace Codebreaker.WPF.Helpers;

internal static class PageExtensions
{
public static void UnregisterAllOnUnloaded(this IMessenger messenger, FrameworkElement page) =>
messenger.UnregisterAllOnUnloaded(page, page);

public static void UnregisterAllOnUnloaded(this IMessenger messenger, FrameworkElement page, object messageRecepient)
{
void UnloadedCallback(object sender, RoutedEventArgs args)
{
messenger.UnregisterAll(messageRecepient);
page.Unloaded -= UnloadedCallback;
}

page.Unloaded += UnloadedCallback;
}

public static void CallOnceOnUnloaded(this FrameworkElement page, Action<object, RoutedEventArgs> action)
{
void Callback(object sender, RoutedEventArgs args)
{
action?.Invoke(sender, args);
page.Unloaded -= Callback;
}

page.Unloaded += Callback;
}
}
95 changes: 51 additions & 44 deletions src/Codebreaker.WPF/Views/Pages/GamePage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,7 @@
<conv:ColorNameToBrushConverter x:Key="ColorConverter" />
</Page.Resources>

<StackPanel Orientation="Vertical">
<Button Click="Button_Click" Content="To TestPage" />

<Grid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
Expand All @@ -28,35 +25,35 @@

<!--<StackPanel Orientation="Vertical" Grid.Row="0">
--><!-- TODO: Create component for this, to make it (more) generic. --><!--
<Grid Visibility="{Binding Path=ViewModel.InfoMessage.IsVisible, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid Visibility="{Binding Path=ViewModel.InfoMessage.IsVisible, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

<TextBlock Text="Information: " VerticalAlignment="Center" Margin="8,0" />
<TextBlock Grid.Column="1" Text="{Binding ViewModel.InfoMessage.Message, Mode=OneWay}" VerticalAlignment="Center" Margin="8,0" />
<Button
Grid.Column="2"
Content="{Binding ViewModel.InfoMessage.ActionTitle, Mode=OneWay}" Padding="30,8"
Command="{Binding ViewModel.InfoMessage.ActionCommand, Mode=OneWay}" />
</Grid>
<Grid Visibility="{Binding Path=ViewModel.ErrorMessage.IsVisible, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="Information: " VerticalAlignment="Center" Margin="8,0" />
<TextBlock Grid.Column="1" Text="{Binding ViewModel.InfoMessage.Message, Mode=OneWay}" VerticalAlignment="Center" Margin="8,0" />
<Button
Grid.Column="2"
Content="{Binding ViewModel.InfoMessage.ActionTitle, Mode=OneWay}" Padding="30,8"
Command="{Binding ViewModel.InfoMessage.ActionCommand, Mode=OneWay}" />
</Grid>
<Grid Visibility="{Binding Path=ViewModel.ErrorMessage.IsVisible, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

<TextBlock Text="Error: " VerticalAlignment="Center" Margin="8,0" />
<TextBlock Grid.Column="1" Text="{Binding ViewModel.ErrorMessage.Message, Mode=OneWay}" VerticalAlignment="Center" Margin="8,0" />
<Button
Grid.Column="2"
Content="{Binding ViewModel.ErrorMessage.ActionTitle, Mode=OneWay}" Padding="30,8"
Command="{Binding ViewModel.ErrorMessage.ActionCommand, Mode=OneWay}" />
</Grid>
</StackPanel>-->
<TextBlock Text="Error: " VerticalAlignment="Center" Margin="8,0" />
<TextBlock Grid.Column="1" Text="{Binding ViewModel.ErrorMessage.Message, Mode=OneWay}" VerticalAlignment="Center" Margin="8,0" />
<Button
Grid.Column="2"
Content="{Binding ViewModel.ErrorMessage.ActionTitle, Mode=OneWay}" Padding="30,8"
Command="{Binding ViewModel.ErrorMessage.ActionCommand, Mode=OneWay}" />
</Grid>
</StackPanel>-->
<components:GameResultDisplay
Panel.ZIndex="1"
Grid.Row="0"/>
Expand Down Expand Up @@ -94,20 +91,30 @@
Margin="86,0,0,8"
ViewModel="{Binding ViewModel, ElementName=Self, Mode=OneWay}" />

<ListView
Height="Auto"
Visibility="{Binding ViewModel.GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibilityConverter}, ConverterParameter=Running}"
Grid.Row="2"
Background="LightGray"
ItemsSource="{Binding ViewModel.GameMoves, Mode=OneWay}"
ItemTemplate="{StaticResource PegsTemplate}" />
<ScrollViewer Grid.Row="2" Padding="0,0,0,15" x:Name="pegScrollViewer">
<ListView
BorderThickness="0"
SelectedIndex="-1"
IsHitTestVisible="False"
HorizontalContentAlignment="Stretch"
Visibility="{Binding ViewModel.GameStatus, Mode=OneWay, Converter={StaticResource GameStatusVisibilityConverter}, ConverterParameter=Running}"
ItemsSource="{Binding ViewModel.GameMoves, Mode=OneWay}"
ItemTemplate="{StaticResource PegsTemplate}" />
</ScrollViewer>

<TextBlock Grid.Row="3" Text="{Binding ViewModel.GameStatus,Mode=OneWay}" />
<Grid Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding ViewModel.GameStatus,Mode=OneWay}" />
<ProgressBar
Grid.Row="3"
Height="15"
Minimum="0" Maximum="100" IsIndeterminate="True"
Visibility="{Binding ViewModel.InProgress, Converter={StaticResource BooleanToVisibilityConverter}}" />
Grid.Column="1"
Height="15"
Minimum="0" Maximum="100" IsIndeterminate="True"
Visibility="{Binding ViewModel.InProgress, Converter={StaticResource BooleanToVisibilityConverter}}" />
<Button Grid.Column="2" Click="Button_Click" Content="To TestPage" Padding="15,2" />
</Grid>
</StackPanel>
</Grid>
</Page>
22 changes: 14 additions & 8 deletions src/Codebreaker.WPF/Views/Pages/GamePage.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,24 +1,21 @@
using Codebreaker.ViewModels.Contracts.Services;
using Codebreaker.WPF.Helpers;
using CommunityToolkit.Mvvm.Messaging;

namespace Codebreaker.WPF.Views.Pages;

public partial class GamePage : Page
public partial class GamePage : Page, IRecipient<GameMoveMessage>
{
private readonly INavigationService _navigationService;

public GamePage()
{
ViewModel = App.Current.GetService<GamePageViewModel>();
_navigationService = App.Current.GetService<INavigationService>();

DataContext = this;

InitializeComponent();

//WeakReferenceMessenger.Default.Register<GameStateChangedMessage>(this, (r, m) =>
//{
// VisualStateManager.GoToElementState(MainGrid, m.GameMode.ToString(), true);
//});
WeakReferenceMessenger.Default.Register(this);
WeakReferenceMessenger.Default.UnregisterAllOnUnloaded(this);
}

public GamePageViewModel ViewModel
Expand All @@ -34,4 +31,13 @@ private async void Button_Click(object sender, RoutedEventArgs e)
{
await _navigationService.NavigateToAsync("TestPage");
}

public void Receive(GameMoveMessage message)
{
if (message.GameMoveValue is not GameMoveValue.Completed)
return;

pegScrollViewer.UpdateLayout();
pegScrollViewer.ScrollToBottom();
}
}
34 changes: 13 additions & 21 deletions src/Codebreaker.WPF/Views/Templates/CodeBreakerTemplates.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,9 @@

<conv:KeyPegColorNameToBrushConverter x:Key="KeyPegColorNameToBrushConverter" />
<conv:ColorNameToBrushConverter x:Key="ColorConverter" />
<!--<conv:ColorNameToBrushConverter x:Key="ColorConverter" />
<conv:SelectionAndKeyPegToKeyVisibilityConverter x:Key="KeyPegVisibilityConverter" />
<conv:IntToEnumerableConverter x:Key="IntToEnumerableConverter" />-->

<DataTemplate x:Key="PegsTemplate">
<Grid Background="Transparent">
<Grid Background="LightGray">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
Expand All @@ -29,23 +26,18 @@
</ItemsControl.ItemTemplate>
</ItemsControl>

<Grid Grid.Column="2">
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<ItemsControl Grid.Row="0" ItemsSource="{Binding Path=KeyPegs, Mode=OneTime}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Ellipse Width="16" Height="16" Fill="{Binding Converter={StaticResource KeyPegColorNameToBrushConverter}}" Margin="10,0" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
<ItemsControl Grid.Column="2" ItemsSource="{Binding Path=KeyPegs, Mode=OneTime}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Ellipse Width="16" Height="16" Fill="{Binding Converter={StaticResource KeyPegColorNameToBrushConverter}}" Margin="10,0" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</DataTemplate>
</ResourceDictionary>