gallery manager WIP

This commit is contained in:
Alex Bezdieniezhnykh
2024-08-30 18:15:02 +03:00
parent 8d8a78c9f5
commit 9436e96d81
13 changed files with 402 additions and 157 deletions
+87 -70
View File
@@ -8,17 +8,19 @@ using Microsoft.Extensions.Logging;
namespace Azaion.Annotator;
public class PlayerControlHandler(LibVLC libVLC,
MediaPlayer mediaPlayer,
MainWindow mainWindow,
FormState formState,
Config config,
ILogger<PlayerControlHandler> logger) :
public class PlayerControlHandler :
INotificationHandler<KeyEvent>,
INotificationHandler<AnnClassSelectedEvent>,
INotificationHandler<PlaybackControlEvent>,
INotificationHandler<VolumeChangedEvent>
{
private readonly LibVLC _libVLC;
private readonly MediaPlayer _mediaPlayer;
private readonly MainWindow _mainWindow;
private readonly FormState _formState;
private readonly Config _config;
private readonly ILogger<PlayerControlHandler> _logger;
private const int STEP = 20;
private const int LARGE_STEP = 5000;
private const int RESULT_WIDTH = 1280;
@@ -35,6 +37,21 @@ public class PlayerControlHandler(LibVLC libVLC,
{ Key.PageDown, PlaybackControlEnum.Next },
};
public PlayerControlHandler(LibVLC libVLC,
MediaPlayer mediaPlayer,
MainWindow mainWindow,
FormState formState,
Config config,
ILogger<PlayerControlHandler> logger)
{
_libVLC = libVLC;
_mediaPlayer = mediaPlayer;
_mainWindow = mainWindow;
_formState = formState;
_config = config;
_logger = logger;
}
public async Task Handle(AnnClassSelectedEvent notification, CancellationToken cancellationToken)
{
SelectClass(notification.AnnotationClass);
@@ -44,15 +61,15 @@ public class PlayerControlHandler(LibVLC libVLC,
private void SelectClass(AnnotationClass annClass)
{
mainWindow.Editor.CurrentAnnClass = annClass;
foreach (var ann in mainWindow.Editor.CurrentAnns.Where(x => x.IsSelected))
_mainWindow.Editor.CurrentAnnClass = annClass;
foreach (var ann in _mainWindow.Editor.CurrentAnns.Where(x => x.IsSelected))
ann.AnnotationClass = annClass;
mainWindow.LvClasses.SelectedIndex = annClass.Id;
_mainWindow.LvClasses.SelectedIndex = annClass.Id;
}
public async Task Handle(KeyEvent notification, CancellationToken cancellationToken)
{
logger.LogInformation($"Catch {notification.Args.Key} by {notification.Sender.GetType().Name}");
_logger.LogInformation($"Catch {notification.Args.Key} by {notification.Sender.GetType().Name}");
var key = notification.Args.Key;
var keyNumber = (int?)null;
@@ -62,7 +79,7 @@ public class PlayerControlHandler(LibVLC libVLC,
if ((int)key >= (int)Key.NumPad1 && (int)key <= (int)Key.NumPad9)
keyNumber = key - Key.NumPad1;
if (keyNumber.HasValue)
SelectClass(mainWindow.AnnotationClasses[keyNumber.Value]);
SelectClass(_mainWindow.AnnotationClasses[keyNumber.Value]);
if (_keysControlEnumDict.TryGetValue(key, out var value))
await ControlPlayback(value);
@@ -74,7 +91,7 @@ public class PlayerControlHandler(LibVLC libVLC,
{
switch (key)
{
case Key.VolumeMute when mediaPlayer.Volume == 0:
case Key.VolumeMute when _mediaPlayer.Volume == 0:
await ControlPlayback(PlaybackControlEnum.TurnOnVolume);
break;
case Key.VolumeMute:
@@ -82,15 +99,15 @@ public class PlayerControlHandler(LibVLC libVLC,
break;
case Key.Up:
case Key.VolumeUp:
var vUp = Math.Min(100, mediaPlayer.Volume + 5);
var vUp = Math.Min(100, _mediaPlayer.Volume + 5);
ChangeVolume(vUp);
mainWindow.Volume.Value = vUp;
_mainWindow.Volume.Value = vUp;
break;
case Key.Down:
case Key.VolumeDown:
var vDown = Math.Max(0, mediaPlayer.Volume - 5);
var vDown = Math.Max(0, _mediaPlayer.Volume - 5);
ChangeVolume(vDown);
mainWindow.Volume.Value = vDown;
_mainWindow.Volume.Value = vDown;
break;
}
}
@@ -98,7 +115,7 @@ public class PlayerControlHandler(LibVLC libVLC,
public async Task Handle(PlaybackControlEvent notification, CancellationToken cancellationToken)
{
await ControlPlayback(notification.PlaybackControl);
mainWindow.VideoView.Focus();
_mainWindow.VideoView.Focus();
}
private async Task ControlPlayback(PlaybackControlEnum controlEnum)
@@ -114,42 +131,42 @@ public class PlayerControlHandler(LibVLC libVLC,
await Play();
break;
case PlaybackControlEnum.Pause:
mediaPlayer.Pause();
if (!mediaPlayer.IsPlaying)
mainWindow.BlinkHelp(HelpTexts.HelpTextsDict[HelpTextEnum.AnnotationHelp]);
_mediaPlayer.Pause();
if (!_mediaPlayer.IsPlaying)
_mainWindow.BlinkHelp(HelpTexts.HelpTextsDict[HelpTextEnum.AnnotationHelp]);
break;
case PlaybackControlEnum.Stop:
mediaPlayer.Stop();
_mediaPlayer.Stop();
break;
case PlaybackControlEnum.PreviousFrame:
mediaPlayer.SetPause(true);
mediaPlayer.Time -= step;
mainWindow.VideoSlider.Value = mediaPlayer.Position * 100;
_mediaPlayer.SetPause(true);
_mediaPlayer.Time -= step;
_mainWindow.VideoSlider.Value = _mediaPlayer.Position * 100;
break;
case PlaybackControlEnum.NextFrame:
mediaPlayer.SetPause(true);
mediaPlayer.Time += step;
mainWindow.VideoSlider.Value = mediaPlayer.Position * 100;
_mediaPlayer.SetPause(true);
_mediaPlayer.Time += step;
_mainWindow.VideoSlider.Value = _mediaPlayer.Position * 100;
break;
case PlaybackControlEnum.SaveAnnotations:
await SaveAnnotations();
break;
case PlaybackControlEnum.RemoveSelectedAnns:
mainWindow.Editor.RemoveSelectedAnns();
_mainWindow.Editor.RemoveSelectedAnns();
break;
case PlaybackControlEnum.RemoveAllAnns:
mainWindow.Editor.RemoveAllAnns();
_mainWindow.Editor.RemoveAllAnns();
break;
case PlaybackControlEnum.TurnOnVolume:
mainWindow.TurnOnVolumeBtn.Visibility = Visibility.Collapsed;
mainWindow.TurnOffVolumeBtn.Visibility = Visibility.Visible;
mediaPlayer.Volume = formState.CurrentVolume;
_mainWindow.TurnOnVolumeBtn.Visibility = Visibility.Collapsed;
_mainWindow.TurnOffVolumeBtn.Visibility = Visibility.Visible;
_mediaPlayer.Volume = _formState.CurrentVolume;
break;
case PlaybackControlEnum.TurnOffVolume:
mainWindow.TurnOffVolumeBtn.Visibility = Visibility.Collapsed;
mainWindow.TurnOnVolumeBtn.Visibility = Visibility.Visible;
formState.CurrentVolume = mediaPlayer.Volume;
mediaPlayer.Volume = 0;
_mainWindow.TurnOffVolumeBtn.Visibility = Visibility.Collapsed;
_mainWindow.TurnOnVolumeBtn.Visibility = Visibility.Visible;
_formState.CurrentVolume = _mediaPlayer.Volume;
_mediaPlayer.Volume = 0;
break;
case PlaybackControlEnum.Previous:
await NextMedia(isPrevious: true);
@@ -173,11 +190,11 @@ public class PlayerControlHandler(LibVLC libVLC,
private async Task NextMedia(bool isPrevious = false)
{
var increment = isPrevious ? -1 : 1;
var check = isPrevious ? -1 : mainWindow.LvFiles.Items.Count;
if (mainWindow.LvFiles.SelectedIndex + increment == check)
var check = isPrevious ? -1 : _mainWindow.LvFiles.Items.Count;
if (_mainWindow.LvFiles.SelectedIndex + increment == check)
return;
mainWindow.LvFiles.SelectedIndex += increment;
_mainWindow.LvFiles.SelectedIndex += increment;
await Play();
}
@@ -189,63 +206,63 @@ public class PlayerControlHandler(LibVLC libVLC,
private void ChangeVolume(int volume)
{
formState.CurrentVolume = volume;
mediaPlayer.Volume = volume;
_formState.CurrentVolume = volume;
_mediaPlayer.Volume = volume;
}
private async Task Play()
{
if (mainWindow.LvFiles.SelectedItem == null)
if (_mainWindow.LvFiles.SelectedItem == null)
return;
var mediaInfo = (MediaFileInfo)mainWindow.LvFiles.SelectedItem;
var mediaInfo = (MediaFileInfo)_mainWindow.LvFiles.SelectedItem;
formState.CurrentMedia = mediaInfo;
mediaPlayer.Stop();
mainWindow.Title = $"Azaion Annotator - {mediaInfo.Name}";
mainWindow.BlinkHelp(HelpTexts.HelpTextsDict[HelpTextEnum.PauseForAnnotations]);
mediaPlayer.Play(new Media(libVLC, mediaInfo.Path));
_formState.CurrentMedia = mediaInfo;
_mediaPlayer.Stop();
_mainWindow.Title = $"Azaion Annotator - {mediaInfo.Name}";
_mainWindow.BlinkHelp(HelpTexts.HelpTextsDict[HelpTextEnum.PauseForAnnotations]);
_mediaPlayer.Play(new Media(_libVLC, mediaInfo.Path));
}
private async Task SaveAnnotations()
{
if (formState.CurrentMedia == null)
if (_formState.CurrentMedia == null)
return;
var time = TimeSpan.FromMilliseconds(mediaPlayer.Time);
var fName = formState.GetTimeName(time);
var time = TimeSpan.FromMilliseconds(_mediaPlayer.Time);
var fName = _formState.GetTimeName(time);
var currentAnns = mainWindow.Editor.CurrentAnns
.Select(x => new YoloLabel(x.Info, mainWindow.Editor.RenderSize, formState.CurrentVideoSize))
var currentAnns = _mainWindow.Editor.CurrentAnns
.Select(x => new YoloLabel(x.Info, _mainWindow.Editor.RenderSize, _formState.CurrentVideoSize))
.ToList();
var labels = string.Join(Environment.NewLine, currentAnns.Select(x => x.ToString()));
if (!Directory.Exists(config.LabelsDirectory))
Directory.CreateDirectory(config.LabelsDirectory);
if (!Directory.Exists(config.ImagesDirectory))
Directory.CreateDirectory(config.ImagesDirectory);
if (!Directory.Exists(config.ResultsDirectory))
Directory.CreateDirectory(config.ResultsDirectory);
if (!Directory.Exists(_config.LabelsDirectory))
Directory.CreateDirectory(_config.LabelsDirectory);
if (!Directory.Exists(_config.ImagesDirectory))
Directory.CreateDirectory(_config.ImagesDirectory);
if (!Directory.Exists(_config.ResultsDirectory))
Directory.CreateDirectory(_config.ResultsDirectory);
await File.WriteAllTextAsync(Path.Combine(config.LabelsDirectory, $"{fName}.txt"), labels);
var resultHeight = (uint)Math.Round(RESULT_WIDTH / formState.CurrentVideoSize.Width * formState.CurrentVideoSize.Height);
await File.WriteAllTextAsync(Path.Combine(_config.LabelsDirectory, $"{fName}.txt"), labels);
var resultHeight = (uint)Math.Round(RESULT_WIDTH / _formState.CurrentVideoSize.Width * _formState.CurrentVideoSize.Height);
await mainWindow.AddAnnotation(time, currentAnns);
await _mainWindow.AddAnnotation(time, currentAnns);
formState.CurrentMedia.HasAnnotations = mainWindow.Annotations.Count != 0;
mainWindow.LvFiles.Items.Refresh();
_formState.CurrentMedia.HasAnnotations = _mainWindow.Annotations.Count != 0;
_mainWindow.LvFiles.Items.Refresh();
var isVideo = formState.CurrentMedia.MediaType == MediaTypes.Video;
var destinationPath = Path.Combine(config.ImagesDirectory, $"{fName}{(isVideo ? ".jpg" : Path.GetExtension(formState.CurrentMedia.Path))}");
var isVideo = _formState.CurrentMedia.MediaType == MediaTypes.Video;
var destinationPath = Path.Combine(_config.ImagesDirectory, $"{fName}{(isVideo ? ".jpg" : Path.GetExtension(_formState.CurrentMedia.Path))}");
mainWindow.Editor.RemoveAllAnns();
_mainWindow.Editor.RemoveAllAnns();
if (isVideo)
{
mediaPlayer.TakeSnapshot(0, destinationPath, RESULT_WIDTH, resultHeight);
mediaPlayer.Play();
_mediaPlayer.TakeSnapshot(0, destinationPath, RESULT_WIDTH, resultHeight);
_mediaPlayer.Play();
}
else
{
File.Copy(formState.CurrentMedia.Path, destinationPath, overwrite: true);
File.Copy(_formState.CurrentMedia.Path, destinationPath, overwrite: true);
await NextMedia();
}
}