Allow loading multiple images at once

This commit is contained in:
Matt Nadareski
2021-10-05 11:17:19 -07:00
parent 2bbfd2b2a7
commit 321490bbb4
3 changed files with 108 additions and 12 deletions

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Linq;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Input; using Avalonia.Input;
using RedBookPlayer.GUI.Views; using RedBookPlayer.GUI.Views;
@@ -163,19 +164,35 @@ namespace RedBookPlayer.GUI.ViewModels
} }
/// <summary> /// <summary>
/// Load the first valid drag-and-dropped disc image /// Load the all valid drag-and-dropped disc images
/// </summary> /// </summary>
/// <remarks>If more than the number of discs in the changer are added, it will begin to overwrite</remarks>
public async void ExecuteLoadDragDrop(object sender, DragEventArgs e) public async void ExecuteLoadDragDrop(object sender, DragEventArgs e)
{ {
if(PlayerView?.ViewModel == null) if(PlayerView?.ViewModel == null)
return; return;
IEnumerable<string> fileNames = e.Data.GetFileNames(); IEnumerable<string> fileNames = e.Data.GetFileNames();
foreach(string filename in fileNames) if(fileNames == null || fileNames.Count() == 0)
{ {
bool loaded = await PlayerView.ViewModel.LoadImage(filename); return;
if(loaded) }
break; else if(fileNames.Count() == 1)
{
await PlayerView.ViewModel.LoadImage(fileNames.FirstOrDefault());
}
else
{
int lastDisc = PlayerView.ViewModel.CurrentDisc;
foreach(string path in fileNames)
{
await PlayerView.ViewModel.LoadImage(path);
if(PlayerView.ViewModel.Initialized)
PlayerView.ViewModel.ExecuteNextDisc();
}
PlayerView.ViewModel.SelectDisc(lastDisc);
} }
} }

View File

@@ -17,6 +17,7 @@ using RedBookPlayer.Models.Hardware;
namespace RedBookPlayer.GUI.ViewModels namespace RedBookPlayer.GUI.ViewModels
{ {
// TODO: Add direct index selection by number
public class PlayerViewModel : ReactiveObject public class PlayerViewModel : ReactiveObject
{ {
/// <summary> /// <summary>
@@ -583,11 +584,28 @@ namespace RedBookPlayer.GUI.ViewModels
/// </summary> /// </summary>
public async void ExecuteLoad() public async void ExecuteLoad()
{ {
string path = await GetPath(); string[] paths = await GetPaths();
if(path == null) if(paths == null || paths.Length == 0)
{
return; return;
}
else if(paths.Length == 1)
{
await LoadImage(paths[0]);
}
else
{
int lastDisc = CurrentDisc;
foreach(string path in paths)
{
await LoadImage(path);
if(Initialized)
ExecuteNextDisc();
}
await LoadImage(path); SelectDisc(lastDisc);
}
} }
/// <summary> /// <summary>
@@ -680,6 +698,16 @@ namespace RedBookPlayer.GUI.ViewModels
/// <param name="outputDirectory">Output path to write data to</param> /// <param name="outputDirectory">Output path to write data to</param>
public void ExtractAllTracksToWav(string outputDirectory) => _player?.ExtractAllTracksToWav(outputDirectory); public void ExtractAllTracksToWav(string outputDirectory) => _player?.ExtractAllTracksToWav(outputDirectory);
/// <summary>
/// Select a particular disc by number
/// </summary>
public void SelectDisc(int discNumber) => _player?.SelectDisc(discNumber);
/// <summary>
/// Select a particular track by number
/// </summary>
public void SelectTrack(int trackNumber) => _player?.SelectTrack(trackNumber);
/// <summary> /// <summary>
/// Set data playback method [CompactDisc only] /// Set data playback method [CompactDisc only]
/// </summary> /// </summary>
@@ -780,12 +808,12 @@ namespace RedBookPlayer.GUI.ViewModels
/// <summary> /// <summary>
/// Generate a path selection dialog box /// Generate a path selection dialog box
/// </summary> /// </summary>
/// <returns>User-selected path, if possible</returns> /// <returns>User-selected paths, if possible</returns>
private async Task<string> GetPath() private async Task<string[]> GetPaths()
{ {
return await Dispatcher.UIThread.InvokeAsync(async () => return await Dispatcher.UIThread.InvokeAsync(async () =>
{ {
var dialog = new OpenFileDialog { AllowMultiple = false }; var dialog = new OpenFileDialog { AllowMultiple = true };
List<string> knownExtensions = new Aaru.DiscImages.AaruFormat().KnownExtensions.ToList(); List<string> knownExtensions = new Aaru.DiscImages.AaruFormat().KnownExtensions.ToList();
dialog.Filters.Add(new FileDialogFilter() dialog.Filters.Add(new FileDialogFilter()
{ {
@@ -793,7 +821,7 @@ namespace RedBookPlayer.GUI.ViewModels
Extensions = knownExtensions.ConvertAll(e => e.TrimStart('.')) Extensions = knownExtensions.ConvertAll(e => e.TrimStart('.'))
}); });
return (await dialog.ShowAsync(App.MainWindow))?.FirstOrDefault(); return (await dialog.ShowAsync(App.MainWindow));
}); });
} }

View File

@@ -6,6 +6,7 @@ using RedBookPlayer.Models.Factories;
namespace RedBookPlayer.Models.Hardware namespace RedBookPlayer.Models.Hardware
{ {
// TODO: Add direct index selection by number
public class Player : ReactiveObject public class Player : ReactiveObject
{ {
/// <summary> /// <summary>
@@ -404,6 +405,32 @@ namespace RedBookPlayer.Models.Hardware
Initialized = false; Initialized = false;
} }
/// <summary>
/// Select a particular disc by number
/// </summary>
public void SelectDisc(int discNumber)
{
PlayerState wasPlaying = PlayerState;
if (wasPlaying == PlayerState.Playing)
Stop();
CurrentDisc = discNumber;
if (_opticalDiscs[CurrentDisc] != null && _opticalDiscs[CurrentDisc].Initialized)
{
Initialized = true;
OpticalDiscStateChanged(this, null);
SoundOutputStateChanged(this, null);
if(wasPlaying == PlayerState.Playing)
Play();
}
else
{
PlayerState = PlayerState.NoDisc;
Initialized = false;
}
}
/// <summary> /// <summary>
/// Move to the next disc /// Move to the next disc
/// </summary> /// </summary>
@@ -456,6 +483,30 @@ namespace RedBookPlayer.Models.Hardware
} }
} }
/// <summary>
/// Select a particular track by number
/// </summary>
public void SelectTrack(int trackNumber)
{
if(_opticalDiscs[CurrentDisc] == null || !_opticalDiscs[CurrentDisc].Initialized)
return;
PlayerState wasPlaying = PlayerState;
if(wasPlaying == PlayerState.Playing)
Pause();
if(trackNumber < (HiddenTrack ? 0 : 1) || trackNumber > TotalTracks)
_opticalDiscs[CurrentDisc].LoadFirstTrack();
else
_opticalDiscs[CurrentDisc].LoadTrack(trackNumber);
if(_opticalDiscs[CurrentDisc] is CompactDisc compactDisc)
_soundOutputs[CurrentDisc].SetDeEmphasis(compactDisc.TrackHasEmphasis);
if(wasPlaying == PlayerState.Playing)
Play();
}
/// <summary> /// <summary>
/// Move to the next playable track /// Move to the next playable track
/// </summary> /// </summary>