Add project files.

This commit is contained in:
Daniel Clark
2022-11-01 15:26:08 +00:00
parent daa7b59f22
commit 7e4f880821
408 changed files with 16863 additions and 0 deletions
+143
View File
@@ -0,0 +1,143 @@
<UserControl
x:Class="WeddingBooth.Views.CameraView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:camera="clr-namespace:TheXamlGuy.Framework.Camera;assembly=Camera"
xmlns:markup="clr-namespace:WeddingBooth.Markups"
x:Name="Camera"
VisualStateExtension.IsStateTriggersAttached="True">
<UserControl.Resources>
<BindingProxy x:Key="BindingProxy" DataContext="{Binding}" />
<BindingProxy x:Key="CountdownProxy" DataContext="{Binding ElementName=Countdown}" />
<BindingProxy x:Key="CameraProxy" DataContext="{Binding ElementName=Camera}" />
<BindingProxy x:Key="ImageProxy" DataContext="{Binding ElementName=Image}" />
</UserControl.Resources>
<Grid>
<CameraPreview x:Name="CameraPreview">
<CameraPreview.LayoutTransform>
<RotateTransform Angle="90" />
</CameraPreview.LayoutTransform>
</CameraPreview>
<ProgressRing
x:Name="ProgressRing"
Width="500"
Height="500"
HorizontalAlignment="Center"
VerticalAlignment="Center"
IsActive="True"
IsIndeterminate="True"
Opacity="0"
Thickness="12" />
<Countdown
x:Name="Countdown"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Completed="{Composite {State {Binding Source={StaticResource CameraProxy}, Path=DataContext},
Completed},
{ChangeProperty {Binding},
CanCapture,
false},
{Invoke Capture}}"
CountdownIdentifier="FiveSecond"
FontFamily="{StaticResource ContentControlFontFamily}"
FontSize="300"
Foreground="White"
TextBlock.FontWeight="Thin" />
<Image
x:Name="Image"
Opacity="0"
Stretch="Fill">
<Image.LayoutTransform>
<RotateTransform Angle="90" />
</Image.LayoutTransform>
</Image>
<Border
x:Name="FlashOverlay"
Background="White"
Opacity="0"
RenderTransformOrigin="0.5,0.5">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="{StaticResource AccentFontFamily}"
FontSize="288"
Text="Smile!" />
<Border.RenderTransform>
<ScaleTransform x:Name="ScaleTransform" />
</Border.RenderTransform>
</Border>
</Grid>
<Interaction.XamlEventAggregator>
<XamlEventAggregator EventAggregator="{Binding Source={StaticResource BindingProxy}, Path=DataContext.EventAggregator}">
<EventSubscriber Invoked="{Composite {ChangeProperty {Binding Source={StaticResource ImageProxy}, Path=DataContext}, Source, {EventParameter Invoked, {markup:CapturedConverter}}}, {State {Binding Source={StaticResource CameraProxy}, Path=DataContext}, Captured}, {ChangeProperty {Binding}, CanCapture, true}}" Type="{x:Type camera:Captured}" />
</XamlEventAggregator>
</Interaction.XamlEventAggregator>
<Interaction.InteractiveFrame>
<InteractiveFrame EventAggregator="{Binding Source={StaticResource BindingProxy}, Path=DataContext.EventAggregator}">
<InteractiveFrameButton Invoked="{Composite {Condition {Binding CanCapture}, {Invoke Start, BindingTarget={Binding Source={StaticResource CountdownProxy}, Path=DataContext}}, {State {Binding Source={StaticResource CameraProxy}, Path=DataContext}, Started}}}" Placement="Top" />
</InteractiveFrame>
</Interaction.InteractiveFrame>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="PhotoStates">
<VisualState x:Name="Started">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ProgressRing" Storyboard.TargetProperty="(UIElement.Opacity)">
<DiscreteDoubleKeyFrame KeyTime="00:00:00" Value="1" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Completed">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ScaleTransform" Storyboard.TargetProperty="ScaleX">
<DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="2.05" />
<SplineDoubleKeyFrame
KeySpline="0,0,0,1"
KeyTime="00:00:00.250"
Value="1.0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ScaleTransform" Storyboard.TargetProperty="ScaleY">
<DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="2.05" />
<SplineDoubleKeyFrame
KeySpline="0,0,0,1"
KeyTime="00:00:00.250"
Value="1.0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="FlashOverlay" Storyboard.TargetProperty="(UIElement.Opacity)">
<DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="0.0" />
<LinearDoubleKeyFrame KeyTime="00:00:00.167" Value="1.0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ProgressRing" Storyboard.TargetProperty="(UIElement.Opacity)">
<DiscreteDoubleKeyFrame KeyTime="00:00:00" Value="0" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Captured">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="Image" Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="1" />
<SplineDoubleKeyFrame KeyTime="00:00:04" Value="1" />
<SplineDoubleKeyFrame KeyTime="00:00:04.168" Value="0" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ScaleTransform" Storyboard.TargetProperty="ScaleX">
<DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="1.0" />
<SplineDoubleKeyFrame
KeySpline="0,0,0,1"
KeyTime="00:00:00.167"
Value="1.05" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ScaleTransform" Storyboard.TargetProperty="ScaleY">
<DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="1.0" />
<SplineDoubleKeyFrame
KeySpline="0,0,0,1"
KeyTime="00:00:00.167"
Value="1.05" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="FlashOverlay" Storyboard.TargetProperty="(UIElement.Opacity)">
<DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="1.0" />
<LinearDoubleKeyFrame KeyTime="00:00:00.083" Value="0.0" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</UserControl>
+16
View File
@@ -0,0 +1,16 @@
namespace WeddingBooth.Views;
public partial class CameraView
{
public CameraView()
{
InitializeComponent();
Loaded += CameraView_Loaded;
}
private void CameraView_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
CameraPreview.StartAsync();
}
}
+22
View File
@@ -0,0 +1,22 @@
using System;
using TheXamlGuy.Framework.Camera;
using TheXamlGuy.Framework.Core;
namespace WeddingBooth.Views;
public class CameraViewModel : ObservableViewModel
{
public CameraViewModel(IPropertyBuilder propertyBuilder,
IEventAggregator eventAggregator,
IServiceFactory serviceFactory,
IDisposer disposer) : base(propertyBuilder, eventAggregator, serviceFactory, disposer)
{
}
public bool CanCapture { get; set; } = true;
public void Capture()
{
EventAggregator.Publish<Capture>();
}
}
+14
View File
@@ -0,0 +1,14 @@
<UserControl x:Class="WeddingBooth.Views.GalleryView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WeddingBooth.Views"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="100"
Text="GALLERY VIEW" />
</UserControl>
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WeddingBooth.Views
{
/// <summary>
/// Interaction logic for GalleryView.xaml
/// </summary>
public partial class GalleryView : UserControl
{
public GalleryView()
{
InitializeComponent();
}
}
}
@@ -0,0 +1,14 @@
using TheXamlGuy.Framework.Core;
namespace WeddingBooth.Views;
public class GalleryViewModel : ObservableViewModel
{
public GalleryViewModel(IPropertyBuilder propertyBuilder,
IEventAggregator eventAggregator,
IServiceFactory serviceFactory,
IDisposer disposer) : base(propertyBuilder, eventAggregator, serviceFactory, disposer)
{
}
}
+17
View File
@@ -0,0 +1,17 @@
using TheXamlGuy.Framework.Core;
namespace WeddingBooth.Views;
public class GuestViewModel : ObservableViewModel
{
public GuestViewModel(IPropertyBuilder propertyBuilder,
IEventAggregator eventAggregator,
IServiceFactory serviceFactory,
IDisposer disposer,
string name) : base(propertyBuilder, eventAggregator, serviceFactory, disposer)
{
Name = name;
}
public string Name { get; }
}
+10
View File
@@ -0,0 +1,10 @@
<Window
x:Class="WeddingBooth.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Content="{Route {Binding Route},
Root}"
Loaded="{Navigate {Binding EventAggregator},
Root,
Navigation}"
WindowStyle="None" />
+23
View File
@@ -0,0 +1,23 @@
using System.Linq;
namespace WeddingBooth.Views;
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
//var DeviceManager = new CameraDeviceManager();
//DeviceManager.ConnectToCamera();
//DeviceManager.AddDevice(d[3].Connect("192.168.1.1"));
//DeviceManager.CameraConnected += DeviceManager_CameraConnected;
//DeviceManager.SelectedCameraDevice.PhotoCaptured += SelectedCameraDevice_PhotoCaptured;
//DeviceManager.SelectedCameraDevice.CapturePhoto();
}
}
@@ -0,0 +1,18 @@
using TheXamlGuy.Framework.Core;
using TheXamlGuy.Framework.WPF;
namespace WeddingBooth.Views;
public class MainWindowViewModel : ObservableViewModel
{
public MainWindowViewModel(IPropertyBuilder propertyBuilder,
IEventAggregator eventAggregator,
IServiceFactory serviceFactory,
IDisposer disposer,
IRoute route) : base(propertyBuilder, eventAggregator, serviceFactory, disposer)
{
Route = route;
}
public IRoute Route { get; }
}
@@ -0,0 +1,20 @@
<UserControl
x:Class="WeddingBooth.Views.NavigationView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
<BindingProxy x:Key="BindingProxy" DataContext="{Binding}" />
<BindingProxy x:Key="FlipViewProxy" DataContext="{Binding ElementName=FlipView}" />
</UserControl.Resources>
<FlipView
x:Name="FlipView"
ItemContainerTemplateSelector="{Binding TemplateSelector}"
ItemsSource="{Binding}"
UsesItemContainerTemplateSelector="True" />
<Interaction.InteractiveFrame>
<InteractiveFrame EventAggregator="{Binding Source={StaticResource BindingProxy}, Path=DataContext.EventAggregator}">
<InteractiveFrameButton Invoked="{Invoke Previous, BindingTarget={Binding Source={StaticResource FlipViewProxy}, Path=DataContext}}" Placement="Left" />
<InteractiveFrameButton Invoked="{Invoke Next, BindingTarget={Binding Source={StaticResource FlipViewProxy}, Path=DataContext}}" Placement="Right" />
</InteractiveFrame>
</Interaction.InteractiveFrame>
</UserControl>
@@ -0,0 +1,9 @@
namespace WeddingBooth.Views;
public partial class NavigationView
{
public NavigationView()
{
InitializeComponent();
}
}
@@ -0,0 +1,17 @@
using TheXamlGuy.Framework.Core;
namespace WeddingBooth.Views;
public class NavigationViewModel : ObservableViewModelCollection<IObservableViewModel>
{
public NavigationViewModel(IPropertyBuilder propertyBuilder,
IEventAggregator eventAggregator,
IServiceFactory serviceFactory,
IDisposer disposer,
ITemplateSelector templateSelector) : base(propertyBuilder, eventAggregator, serviceFactory, disposer)
{
TemplateSelector = templateSelector;
}
public ITemplateSelector TemplateSelector { get; }
}
@@ -0,0 +1,9 @@
using System.Collections.Generic;
namespace WeddingBooth.LifeCycles
{
public class SeatingChartConfiguration : List<Table>
{
}
}
@@ -0,0 +1,30 @@
using TheXamlGuy.Framework.Core;
using TheXamlGuy.Framework.WPF;
using WeddingBooth.Views;
namespace WeddingBooth.LifeCycles
{
public class SeatingChartNavigatedHandler : IMediatorHandler<Navigated<SeatingChartView, SeatingChartViewModel>>
{
private readonly SeatingChartConfiguration configuration;
public SeatingChartNavigatedHandler(SeatingChartConfiguration configuration)
{
this.configuration = configuration;
}
public void Handle(Navigated<SeatingChartView, SeatingChartViewModel> request)
{
foreach (Table table in configuration)
{
if(request.DataContext?.Add(table.Name) is TableViewModel tableViewModel)
{
foreach (string guest in table.Guests)
{
tableViewModel.Add(guest);
}
}
}
}
}
}
@@ -0,0 +1,30 @@
<UserControl
x:Class="WeddingBooth.Views.SeatingChartView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Margin="40,40,16,16">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="18" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
HorizontalAlignment="Center"
FontFamily="{StaticResource AccentFontFamily}"
FontWeight="Normal"
Style="{StaticResource LargeDisplayTextBlockStyle}"
Text="find your seat" />
<ItemsControl
Grid.Row="2"
ItemTemplateSelector="{Binding TemplateSelector}"
ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="3" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
</UserControl>
@@ -0,0 +1,11 @@
using System.Windows.Controls;
namespace WeddingBooth.Views;
public partial class SeatingChartView : UserControl
{
public SeatingChartView()
{
InitializeComponent();
}
}
@@ -0,0 +1,17 @@
using TheXamlGuy.Framework.Core;
namespace WeddingBooth.Views;
public class SeatingChartViewModel : ObservableViewModelCollection<TableViewModel>
{
public SeatingChartViewModel(IPropertyBuilder propertyBuilder,
IEventAggregator eventAggregator,
IServiceFactory serviceFactory,
IDisposer disposer,
ITemplateSelector templateSelector) : base(propertyBuilder, eventAggregator, serviceFactory, disposer)
{
TemplateSelector = templateSelector;
}
public ITemplateSelector TemplateSelector { get; }
}
+43
View File
@@ -0,0 +1,43 @@
<UserControl
x:Class="WeddingBooth.Views.TableView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
<SolidColorBrush x:Key="BorderBrush" Color="#FF8C8C8C" />
</UserControl.Resources>
<Border
Margin="0,0,24,24"
BorderBrush="{StaticResource BorderBrush}"
BorderThickness="1">
<Grid Margin="24">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
HorizontalAlignment="Center"
FontFamily="{StaticResource AccentFontFamily}"
FontWeight="Normal"
FontSize="92"
Margin="0 0 0 -28"
Text="{Binding Name}" />
<ItemsControl
Grid.Row="2"
HorizontalAlignment="Center"
ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock
Margin="0,0,0,2"
FontWeight="Thin"
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{Binding Name}"
TextAlignment="Center" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</Border>
</UserControl>
+9
View File
@@ -0,0 +1,9 @@
namespace WeddingBooth.Views;
public partial class TableView
{
public TableView()
{
InitializeComponent();
}
}
+17
View File
@@ -0,0 +1,17 @@
using TheXamlGuy.Framework.Core;
namespace WeddingBooth.Views;
public class TableViewModel : ObservableViewModelCollection<GuestViewModel>
{
public TableViewModel(IPropertyBuilder propertyBuilder,
IEventAggregator eventAggregator,
IServiceFactory serviceFactory,
IDisposer disposer,
string name) : base(propertyBuilder, eventAggregator, serviceFactory, disposer)
{
Name = name;
}
public string Name { get; }
}
+40
View File
@@ -0,0 +1,40 @@
<UserControl
x:Class="WeddingBooth.Views.WelcomeView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock
Margin="0,-0,0,-60"
HorizontalAlignment="Center"
FontFamily="{StaticResource AccentFontFamily}"
FontSize="288"
FontWeight="Light"
Text="Welcome" />
<TextBlock
HorizontalAlignment="Center"
FontStretch="ExtraExpanded"
FontWeight="Thin"
Style="{StaticResource TitleTextBlockStyle}"
Text="TO OUR WEDDING" />
<TextBlock
HorizontalAlignment="Center"
FontStretch="ExtraExpanded"
FontWeight="Thin"
Style="{StaticResource DisplayTextBlockStyle}"
Text="LAURA &amp; DANIEL" />
<TextBlock
Margin="0,0,0,12"
HorizontalAlignment="Center"
FontStretch="ExtraExpanded"
FontWeight="Thin"
Style="{StaticResource TitleTextBlockStyle}"
Text="OCTOBER 6ᵗʰ, 2022" />
<TextBlock
HorizontalAlignment="Center"
FontStretch="ExtraExpanded"
FontWeight="Thin"
Style="{StaticResource TitleTextBlockStyle}"
Text="LET US MAKE MEMORIES OF OUR SPECIAL EVENING"
TextAlignment="Center" />
</StackPanel>
</UserControl>
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WeddingBooth.Views
{
/// <summary>
/// Interaction logic for WelcomeView.xaml
/// </summary>
public partial class WelcomeView : UserControl
{
public WelcomeView()
{
InitializeComponent();
}
}
}
@@ -0,0 +1,15 @@
using TheXamlGuy.Framework.Core;
namespace WeddingBooth.Views;
public class WelcomeViewModel : ObservableViewModel
{
public WelcomeViewModel(IPropertyBuilder propertyBuilder,
IEventAggregator eventAggregator,
IServiceFactory serviceFactory,
IDisposer disposer) : base(propertyBuilder, eventAggregator, serviceFactory, disposer)
{
}
}