mirror of
https://github.com/aaru-dps/RedBookPlayer.git
synced 2025-12-16 19:24:41 +00:00
Allow loading multiple images at once
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user