wip
This commit is contained in:
parent
0f931aa2d4
commit
9184c8d8ea
@ -3,6 +3,7 @@
|
||||
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:liveView="clr-namespace:CamBooth.App.Features.LiveView"
|
||||
mc:Ignorable="d"
|
||||
Title="LiveViewPage" Width="1350" Height="900"
|
||||
Background="PaleVioletRed">
|
||||
|
||||
@ -58,7 +58,6 @@ public partial class LiveViewPage : Page
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
this._cameraService.Dispose();
|
||||
|
||||
@ -0,0 +1,29 @@
|
||||
<UserControl x:Class="CamBooth.App.Features.LiveView.ModernTimerControl"
|
||||
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"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="400" d:DesignWidth="400">
|
||||
<Grid>
|
||||
<!-- Hintergrund für den Timer -->
|
||||
<Border CornerRadius="20" Background="#1E1E1E" Padding="10" Opacity="60" x:Name="TimerContainer">
|
||||
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<!-- Countdown-Anzeige -->
|
||||
<TextBlock x:Name="TimerText"
|
||||
FontSize="288"
|
||||
Foreground="White"
|
||||
HorizontalAlignment="Center"
|
||||
Text="5"
|
||||
Margin="0,10"/>
|
||||
<!-- Status-Text -->
|
||||
<TextBlock x:Name="StatusText"
|
||||
FontSize="32"
|
||||
Foreground="Gray"
|
||||
HorizontalAlignment="Center"
|
||||
Text="Skunkface machen" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
|
||||
@ -0,0 +1,75 @@
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Media.Animation;
|
||||
using System.Windows.Threading;
|
||||
|
||||
namespace CamBooth.App.Features.LiveView;
|
||||
|
||||
public partial class ModernTimerControl : UserControl
|
||||
{
|
||||
private DispatcherTimer _timer;
|
||||
|
||||
private int _remainingTime; // Zeit in Sekunden
|
||||
|
||||
|
||||
public ModernTimerControl()
|
||||
{
|
||||
InitializeComponent();
|
||||
InitializeTimer();
|
||||
}
|
||||
|
||||
|
||||
private void InitializeTimer()
|
||||
{
|
||||
_timer = new DispatcherTimer
|
||||
{
|
||||
Interval = TimeSpan.FromSeconds(1)
|
||||
};
|
||||
_timer.Tick += Timer_Tick;
|
||||
}
|
||||
|
||||
|
||||
private void Timer_Tick(object sender, EventArgs e)
|
||||
{
|
||||
if (_remainingTime > 0)
|
||||
{
|
||||
_remainingTime--;
|
||||
TimerText.Text = TimeSpan.FromSeconds(_remainingTime).ToString(@"mm\:ss");
|
||||
}
|
||||
else
|
||||
{
|
||||
_timer.Stop();
|
||||
StatusText.Text = "Zeit abgelaufen!";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void StartTimer(int durationInSeconds)
|
||||
{
|
||||
_remainingTime = durationInSeconds;
|
||||
TimerText.Text = TimeSpan.FromSeconds(_remainingTime).ToString(@"mm\:ss");
|
||||
StatusText.Text = "Timer läuft...";
|
||||
_timer.Start();
|
||||
ShowTimer();
|
||||
}
|
||||
|
||||
|
||||
public void StopTimer()
|
||||
{
|
||||
_timer.Stop();
|
||||
StatusText.Text = "Timer angehalten";
|
||||
}
|
||||
|
||||
|
||||
public void ShowTimer()
|
||||
{
|
||||
var fadeInAnimation = new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(300));
|
||||
TimerContainer.BeginAnimation(OpacityProperty, fadeInAnimation);
|
||||
}
|
||||
|
||||
|
||||
public void HideTimer()
|
||||
{
|
||||
var fadeOutAnimation = new DoubleAnimation(1, 0, TimeSpan.FromMilliseconds(300));
|
||||
TimerContainer.BeginAnimation(OpacityProperty, fadeOutAnimation);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,38 @@
|
||||
<UserControl x:Class="CamBooth.App.Features.LiveView.TimerControlRectangleAnimation"
|
||||
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:CamBooth.App.Features.LiveView"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="100" d:DesignWidth="1350">
|
||||
<Grid>
|
||||
<!-- Hintergrund für den Timer -->
|
||||
<Border CornerRadius="10" Background="Black" Padding="0" Opacity="0" x:Name="TimerContainer">
|
||||
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<!-- Fortschrittsanzeige -->
|
||||
<Grid Height="100" Width="1350" Background="Gray" Margin="0,0,0,0">
|
||||
<Rectangle x:Name="ProgressBar"
|
||||
Fill="#4CAF50"
|
||||
Height="100"
|
||||
HorizontalAlignment="Left"/>
|
||||
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="72">HIER EINE ANWEISUNG ANZEIGEN</TextBlock>
|
||||
</Grid>
|
||||
|
||||
<!-- ~1~ Countdown-Anzeige @1@ -->
|
||||
<!-- <TextBlock x:Name="TimerText" -->
|
||||
<!-- FontSize="32" -->
|
||||
<!-- Foreground="White" -->
|
||||
<!-- HorizontalAlignment="Center" -->
|
||||
<!-- Text="00:00" -->
|
||||
<!-- Margin="0,10"/> -->
|
||||
<!-- ~1~ Status-Text @1@ -->
|
||||
<!-- <TextBlock x:Name="StatusText" -->
|
||||
<!-- FontSize="14" -->
|
||||
<!-- Foreground="Gray" -->
|
||||
<!-- HorizontalAlignment="Center" -->
|
||||
<!-- Text="Timer läuft..."/> -->
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@ -0,0 +1,123 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Media.Animation;
|
||||
using System.Windows.Shapes;
|
||||
using System.Windows.Threading;
|
||||
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace CamBooth.App.Features.LiveView;
|
||||
|
||||
public partial class TimerControlRectangleAnimation : UserControl
|
||||
{
|
||||
public delegate void TimerElapsedEventHandler();
|
||||
|
||||
public static event TimerElapsedEventHandler OnTimerEllapsed;
|
||||
|
||||
private DispatcherTimer _timer;
|
||||
|
||||
private int _remainingTime; // Zeit in Sekunden
|
||||
|
||||
private double _totalDuration; // Gesamtzeit in Sekunden
|
||||
|
||||
private Storyboard _progressBarAnimation;
|
||||
|
||||
|
||||
public TimerControlRectangleAnimation()
|
||||
{
|
||||
InitializeComponent();
|
||||
InitializeTimer();
|
||||
}
|
||||
|
||||
private void InitializeTimer()
|
||||
{
|
||||
_timer = new DispatcherTimer
|
||||
{
|
||||
Interval = TimeSpan.FromSeconds(1)
|
||||
};
|
||||
_timer.Tick += OnTimerTick;
|
||||
}
|
||||
|
||||
|
||||
private void OnTimerTick(object sender, EventArgs e)
|
||||
{
|
||||
if (_remainingTime > 0)
|
||||
{
|
||||
_remainingTime--;
|
||||
|
||||
// TimerText.Text = TimeSpan.FromSeconds(_remainingTime).ToString(@"mm\:ss");
|
||||
}
|
||||
else
|
||||
{
|
||||
_timer.Stop();
|
||||
|
||||
// StatusText.Text = "Zeit abgelaufen!";
|
||||
StopProgressBarAnimation();
|
||||
|
||||
OnTimerEllapsed?.Invoke();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void StartTimer(int durationInSeconds)
|
||||
{
|
||||
_totalDuration = durationInSeconds;
|
||||
_remainingTime = durationInSeconds;
|
||||
|
||||
// TimerText.Text = TimeSpan.FromSeconds(_remainingTime).ToString(@"mm\:ss");
|
||||
// StatusText.Text = "Timer läuft...";
|
||||
_timer.Start();
|
||||
|
||||
StartProgressBarAnimation();
|
||||
ShowTimer();
|
||||
}
|
||||
|
||||
|
||||
public void StopTimer()
|
||||
{
|
||||
_timer.Stop();
|
||||
StopProgressBarAnimation();
|
||||
|
||||
// StatusText.Text = "Timer angehalten";
|
||||
}
|
||||
|
||||
|
||||
public void ShowTimer()
|
||||
{
|
||||
var fadeInAnimation = new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(300));
|
||||
TimerContainer.BeginAnimation(OpacityProperty, fadeInAnimation);
|
||||
}
|
||||
|
||||
|
||||
public void HideTimer()
|
||||
{
|
||||
var fadeOutAnimation = new DoubleAnimation(1, 0, TimeSpan.FromMilliseconds(300));
|
||||
TimerContainer.BeginAnimation(OpacityProperty, fadeOutAnimation);
|
||||
}
|
||||
|
||||
|
||||
private void StartProgressBarAnimation()
|
||||
{
|
||||
// Fortschrittsbalken-Animation
|
||||
_progressBarAnimation = new Storyboard();
|
||||
var widthAnimation = new DoubleAnimation
|
||||
{
|
||||
From = 1350, // Volle Breite des Containers
|
||||
To = 0, // Endet bei 0 Breite
|
||||
Duration = TimeSpan.FromSeconds(_totalDuration),
|
||||
FillBehavior = FillBehavior.Stop
|
||||
};
|
||||
|
||||
Storyboard.SetTarget(widthAnimation, ProgressBar);
|
||||
Storyboard.SetTargetProperty(widthAnimation, new PropertyPath(Rectangle.WidthProperty));
|
||||
|
||||
_progressBarAnimation.Children.Add(widthAnimation);
|
||||
_progressBarAnimation.Begin();
|
||||
}
|
||||
|
||||
|
||||
private void StopProgressBarAnimation()
|
||||
{
|
||||
_progressBarAnimation?.Stop();
|
||||
}
|
||||
}
|
||||
@ -5,6 +5,7 @@
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||
xmlns:local="clr-namespace:CamBooth.App"
|
||||
xmlns:liveView="clr-namespace:CamBooth.App.Features.LiveView"
|
||||
mc:Ignorable="d"
|
||||
Title="MainWindow"
|
||||
Background="Black"
|
||||
@ -49,19 +50,18 @@
|
||||
VerticalAlignment="Bottom"
|
||||
Panel.ZIndex="1" />
|
||||
|
||||
<StackPanel x:Name="GenericPanelCtl"
|
||||
Panel.ZIndex="10"
|
||||
Grid.Row="0">
|
||||
</StackPanel>
|
||||
|
||||
<!-- Inhalt der dritten Zeile -->
|
||||
<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"
|
||||
<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Hidden" Name="TimerPanel"
|
||||
Margin="0 0 5 5">
|
||||
<liveView:TimerControlRectangleAnimation x:Name="TimerControlRectangleAnimation" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Name="ButtonPanel"
|
||||
Margin="0 0 5 5">
|
||||
<ui:Button Content="Start" Click="NavToLiveView" Width="200" Height="50" VerticalAlignment="Bottom"
|
||||
Margin="0 0 5 5" />
|
||||
<ui:Button Content="Hide Debug" Click="SetVisibilityDebugConsole" Width="200" Height="50"
|
||||
VerticalAlignment="Bottom" Margin="0 0 5 5" />
|
||||
<ui:Button Content="Take Photo" Click="TakePhoto" Width="200" Height="50" VerticalAlignment="Bottom"
|
||||
<ui:Button Content="Take Photo" Click="StartTakePhotoProcess" Width="200" Height="50" VerticalAlignment="Bottom"
|
||||
Margin="0 0 5 5" />
|
||||
<ui:Button Content="Pictures" Click="SetVisibilityPicturePanel" Width="200" Height="50"
|
||||
VerticalAlignment="Bottom" Margin="0 0 5 5" />
|
||||
|
||||
@ -30,7 +30,8 @@ public partial class MainWindow : Window
|
||||
private LiveViewPage? _liveViewPage;
|
||||
|
||||
|
||||
public MainWindow(Logger logger,
|
||||
public MainWindow(
|
||||
Logger logger,
|
||||
AppSettingsService appSettings,
|
||||
PictureGalleryService pictureGalleryService,
|
||||
CameraService cameraService)
|
||||
@ -44,9 +45,27 @@ public partial class MainWindow : Window
|
||||
this.SetVisibilityPicturePanel(this._isPicturePanelVisible);
|
||||
_ = this._pictureGalleryService.LoadThumbnailsToCache();
|
||||
this.Closing += OnClosing;
|
||||
TimerControlRectangleAnimation.OnTimerEllapsed += TimerControlRectangleAnimation_OnTimerEllapsed;
|
||||
logger.Info("MainWindow initialized");
|
||||
}
|
||||
|
||||
|
||||
private void TimerControlRectangleAnimation_OnTimerEllapsed()
|
||||
{
|
||||
try
|
||||
{
|
||||
this._cameraService.TakePhoto();
|
||||
SwitchButtonAndTimerPanel();
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
//TODO: mit content dialog ersetzen
|
||||
System.Windows.MessageBox.Show("Sorry, da ging was schief!");
|
||||
this._logger.Info(exception.Message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void SetVisibilityPicturePanel(bool visibility)
|
||||
{
|
||||
if (visibility)
|
||||
@ -96,19 +115,17 @@ public partial class MainWindow : Window
|
||||
}
|
||||
|
||||
|
||||
private void TakePhoto(object sender, RoutedEventArgs e)
|
||||
private void StartTakePhotoProcess(object sender, RoutedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
this._cameraService.TakePhoto();
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
System.Windows.MessageBox.Show("Sorry, da ging was schief!");
|
||||
this._logger.Info(exception.Message);
|
||||
}
|
||||
TimerControlRectangleAnimation.StartTimer(5);
|
||||
SwitchButtonAndTimerPanel();
|
||||
}
|
||||
|
||||
private void SwitchButtonAndTimerPanel()
|
||||
{
|
||||
this.ButtonPanel.Visibility = this.ButtonPanel.Visibility == Visibility.Hidden ? Visibility.Visible : Visibility.Hidden;
|
||||
this.TimerPanel.Visibility = this.TimerPanel.Visibility == Visibility.Hidden ? Visibility.Visible : Visibility.Hidden;
|
||||
}
|
||||
|
||||
private void SetVisibilityPicturePanel(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
@ -11,5 +11,6 @@
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEventRoute_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F4bda76b5cc453e1edf5d5c754c4a8215edbd3d3e4f80706dcf4f52a4f68979_003FEventRoute_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F793c644a163b4a9992123fa9cc1562efbf3908_003F4a_003Fd28af422_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fbd1d5c50194fea68ff3559c160230b0ab50f5acf4ce3061bffd6d62958e2182_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATimerElapsedEventArgs_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F84fc76ffb0d44a0784938f79e15bb37217928_003F20_003Fb02e4ce4_003FTimerElapsedEventArgs_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindow_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F0713c794b56e4feca091d5981a6f5967f60930_003Fc8_003F61b7e802_003FWindow_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindow_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fd0db11e55b76dc7f234163f6cee32b297b8ddb591fb0b5cbad1b46ed17343e18_003FWindow_002Ecs_002Fz_003A2_002D1/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
|
||||
Loading…
Reference in New Issue
Block a user