diff --git a/Mystify/MainModel.cs b/Mystify/MainModel.cs index ea48c1f..968b4dc 100644 --- a/Mystify/MainModel.cs +++ b/Mystify/MainModel.cs @@ -20,11 +20,12 @@ namespace Mystify private IDevice? _device; private IControllableCollector? _controllableCollector; - public MainModel(IDriverLoaderFactory driverLoaderFactory, IDeviceFactory deviceFactory, IControllableCollectorFactory controllableCollectorFactory) + public MainModel(IDriverLoaderFactory driverLoaderFactory, IDeviceFactory deviceFactory, IControllableCollectorFactory controllableCollectorFactory, IControllableFactory controllableFactory) { _driverLoader = driverLoaderFactory.Create(); _deviceFactory = deviceFactory; _controllableCollectorFactory = controllableCollectorFactory; + ControllableFactory = controllableFactory; } public string? DeviceName => _device?.Name; @@ -32,6 +33,8 @@ namespace Mystify public List? Controllables => _controllableCollector?.Controllables; public bool UseMidiView { get; set; } + + public IControllableFactory ControllableFactory { get; } public void LoadDriverAndDevice(string driverPath) { diff --git a/Mystify/ViewModels/ChannelViewModel.cs b/Mystify/ViewModels/ChannelViewModel.cs index 159be1f..cebb89d 100644 --- a/Mystify/ViewModels/ChannelViewModel.cs +++ b/Mystify/ViewModels/ChannelViewModel.cs @@ -44,7 +44,7 @@ namespace Mystify.ViewModels private async Task SelectControllable() { ControllableSelectionWindow controllableSelectionWindow = new(); - ControllableSelectionViewModel controllableSelectionViewModel = new(_mainModel.Controllables, controllableSelectionWindow); + ControllableSelectionViewModel controllableSelectionViewModel = new(_mainModel.Controllables, controllableSelectionWindow, _mainModel.ControllableFactory); controllableSelectionWindow.DataContext = controllableSelectionViewModel; Controllable = await controllableSelectionWindow.ShowDialog(_mainWindow); diff --git a/Mystify/ViewModels/ControllableSelectionViewModel.cs b/Mystify/ViewModels/ControllableSelectionViewModel.cs index f27b1e5..cefa48b 100644 --- a/Mystify/ViewModels/ControllableSelectionViewModel.cs +++ b/Mystify/ViewModels/ControllableSelectionViewModel.cs @@ -6,8 +6,12 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; +using System.Threading.Tasks; using System.Windows.Input; +using Avalonia.Controls; +using Lib.Audio.Factories; using Lib.Audio.Interfaces; +using Lib.Logging; using Lib.Tools; using Mystify.Views; using ReactiveUI; @@ -16,7 +20,10 @@ namespace Mystify.ViewModels { public class ControllableSelectionViewModel : ViewModelBase { + private readonly IControllableFactory? _controllableFactory; private readonly ControllableSelectionWindow? _window; + + private string _customControllableExecutablePath = ""; public ControllableSelectionViewModel() { @@ -26,9 +33,10 @@ namespace Mystify.ViewModels Controllables = new ObservableCollection(); } - public ControllableSelectionViewModel(List? controllables, ControllableSelectionWindow window) + public ControllableSelectionViewModel(List? controllables, ControllableSelectionWindow window, IControllableFactory controllableFactory) { _window = window; + _controllableFactory = controllableFactory; Controllables = controllables == null ? new ObservableCollection() : controllables.Select(c => new ControllableViewModel(c)).ToObservableCollection(); @@ -40,9 +48,44 @@ namespace Mystify.ViewModels public ObservableCollection Controllables { get; } private ControllableViewModel? SelectedControllable { get; set; } + private string CustomControllableExecutablePath + { + get => _customControllableExecutablePath; + set + { + _customControllableExecutablePath = value; + RaisePropertyChanged(() => CustomControllableExecutablePath); + } + } + public ICommand CloseCommand => ReactiveCommand.Create(CloseWindow); + public ICommand SelectCustomControllableCommand => ReactiveCommand.CreateFromTask(SelectCustomControllable); private void CloseWindow() => _window?.Close(SelectedControllable); + private async Task SelectCustomControllable() + { + if (_controllableFactory == null) + return; + + OpenFileDialog openFileDialog = new() + { + Filters = new List {new() {Extensions = new List {"exe"}, Name = "Executable"}} + }; + + string[] selectedPaths = await openFileDialog.ShowAsync(_window); + if (selectedPaths.Length == 0) + { + await Log.Write("No Executable selected."); + return; + } + + CustomControllableExecutablePath = selectedPaths[0]; + IControllable controllable = _controllableFactory.Create(CustomControllableExecutablePath); + SelectedControllable = new ControllableViewModel(controllable); + + CloseWindow(); + } + private void OnControllableSelected(object? sender, bool isSelected) { if (!isSelected) diff --git a/Mystify/Views/ControllableSelectionWindow.axaml b/Mystify/Views/ControllableSelectionWindow.axaml index e4db66a..a3b3eb2 100644 --- a/Mystify/Views/ControllableSelectionWindow.axaml +++ b/Mystify/Views/ControllableSelectionWindow.axaml @@ -37,6 +37,19 @@ - + + + + + + + + + +