* Moved item filter script directory handling code to new ItemFilterScriptDirectorySerivce class

* Fixed issue #94 where the user was prompted to select their Path of Exile data directory after every upgrade.
* The default Path of Exile data directory is now automatically chosen on first run if it exists
* Moved CommonOpenFileDialog usage to new DialogService class
* Changed Custom Sounds code in ItemFilterScriptViewModel to use ItemFilterScriptDirectory instead of DefaultPathOfExileDirectory
* Moved Custom Sounds code from constructor to Initialise method to prevent the files being enumerated before the directory is set during startup
This commit is contained in:
Ben Wallis 2018-11-27 20:40:00 +00:00
parent 63236769aa
commit fb37faa7bc
13 changed files with 249 additions and 139 deletions

View File

@ -41,6 +41,7 @@
<Reference Include="FluentAssertions.Core, Version=4.19.2.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> <Reference Include="FluentAssertions.Core, Version=4.19.2.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.19.2\lib\net45\FluentAssertions.Core.dll</HintPath> <HintPath>..\packages\FluentAssertions.4.19.2\lib\net45\FluentAssertions.Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="Microsoft.WindowsAPICodePack.Shell, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null" />
<Reference Include="Moq, Version=4.5.30.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL"> <Reference Include="Moq, Version=4.5.30.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\packages\Moq.4.5.30\lib\net45\Moq.dll</HintPath> <HintPath>..\packages\Moq.4.5.30\lib\net45\Moq.dll</HintPath>
</Reference> </Reference>
@ -66,6 +67,7 @@
<Compile Include="Repositories\TestItemFilterScriptRepository.cs" /> <Compile Include="Repositories\TestItemFilterScriptRepository.cs" />
<Compile Include="Services\TestHTTPService.cs" /> <Compile Include="Services\TestHTTPService.cs" />
<Compile Include="Services\TestItemFilterPersistenceService.cs" /> <Compile Include="Services\TestItemFilterPersistenceService.cs" />
<Compile Include="Services\TestItemFilterScriptDirectoryService.cs" />
<Compile Include="Services\TestUpdateService.cs" /> <Compile Include="Services\TestUpdateService.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -63,49 +63,6 @@ namespace Filtration.Tests.Repositories
result.ShouldThrow<IOException>(); result.ShouldThrow<IOException>();
} }
[Test]
public void SetItemFilterScriptDirectory_CallsPersistenceServiceSetItemFilterScriptDirectory()
{
// Arrange
var testInputPath = "C:\\Test\\Path";
var mockPersistenceService = new Mock<IItemFilterPersistenceService>();
mockPersistenceService.Setup(p => p.SetItemFilterScriptDirectory(testInputPath)).Verifiable();
var mockItemFilterScriptViewModelFactory = new Mock<IItemFilterScriptViewModelFactory>();
var repository = CreateItemFilterScriptRepository(itemFilterPersistenceService: mockPersistenceService.Object,
itemFilterScriptViewModelFactory: mockItemFilterScriptViewModelFactory.Object);
// Act
repository.SetItemFilterScriptDirectory(testInputPath);
// Assert
mockPersistenceService.Verify();
}
[Test]
public void GetItemFilterScriptDirectory_ReturnsItemFilterScriptDirectoryFromPersistenceService()
{
// Arrange
var testInputPath = "C:\\Test\\Path";
var mockPersistenceService = new Mock<IItemFilterPersistenceService>();
mockPersistenceService.SetupGet(p => p.ItemFilterScriptDirectory).Returns(testInputPath).Verifiable();
var mockItemFilterScriptViewModelFactory = new Mock<IItemFilterScriptViewModelFactory>();
var repository = CreateItemFilterScriptRepository(itemFilterPersistenceService: mockPersistenceService.Object,
itemFilterScriptViewModelFactory: mockItemFilterScriptViewModelFactory.Object);
// Act
string result = repository.GetItemFilterScriptDirectory();
// Assert
mockPersistenceService.Verify();
Assert.AreEqual(result, testInputPath);
}
[Test] [Test]
public void NewScript_ReturnsScriptFromViewModelFactory() public void NewScript_ReturnsScriptFromViewModelFactory()
{ {

View File

@ -0,0 +1,95 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Filtration.Common.Services;
using Filtration.Services;
using Microsoft.WindowsAPICodePack.Dialogs;
using Moq;
using NUnit.Framework;
namespace Filtration.Tests.Services
{
[TestFixture]
public class TestItemFilterScriptDirectoryService
{
[Test]
public void PromptForFilterScriptDirectoryIfRequired_ItemFilterScriptDirectoryNotNull_DoesNotSetItemFilterScriptDirectory()
{
//Arrange
var mockItemFilterPersistenceService = new Mock<IItemFilterPersistenceService>();
mockItemFilterPersistenceService.Setup(i => i.ItemFilterScriptDirectory)
.Returns("testdir");
var service = CreateItemFilterScriptDirectoryService(itemFilterPersistenceService: mockItemFilterPersistenceService.Object);
//Act
service.PromptForFilterScriptDirectoryIfRequired();
//Assert
mockItemFilterPersistenceService.Verify(i => i.SetItemFilterScriptDirectory(It.IsAny<string>()), Times.Never);
}
[Test]
public void PromptForFilterScriptDirectoryIfRequired_NotSet_DefaultDirectoryExists_SetsDirectoryToDefaultDirectory()
{
//Arrange
var mockItemFilterPersistenceService = new Mock<IItemFilterPersistenceService>();
var testInputDefaultDirectory = "testdefaultdirectory";
mockItemFilterPersistenceService.Setup(i => i.DefaultPathOfExileDirectory())
.Returns(testInputDefaultDirectory);
var mockFileSystemService = new Mock<IFileSystemService>();
mockFileSystemService.Setup(f => f.DirectoryExists(testInputDefaultDirectory))
.Returns(true);
var service = CreateItemFilterScriptDirectoryService(fileSystemService: mockFileSystemService.Object,
itemFilterPersistenceService: mockItemFilterPersistenceService.Object);
//Act
service.PromptForFilterScriptDirectoryIfRequired();
//Assert
mockItemFilterPersistenceService.Verify(i => i.SetItemFilterScriptDirectory(testInputDefaultDirectory));
}
[Test, Timeout(1000)]
public void PromptForFilterScriptDirectoryIfRequired_NotSet_DefaultDirectoryDoesNotExist_SetsDirectoryToUserSelected()
{
//Arrange
var testInputUserSelectedDirectory = "blah";
var mockItemFilterPersistenceService = new Mock<IItemFilterPersistenceService>();
var mockDialogService = new Mock<IDialogService>();
mockDialogService.Setup(d => d.ShowFolderPickerDialog(It.IsAny<string>(), out testInputUserSelectedDirectory))
.Returns(CommonFileDialogResult.Ok);
mockItemFilterPersistenceService.Setup(i => i.SetItemFilterScriptDirectory(testInputUserSelectedDirectory))
.Callback(() => mockItemFilterPersistenceService.Setup(f => f.ItemFilterScriptDirectory)
.Returns(testInputUserSelectedDirectory));
var service = CreateItemFilterScriptDirectoryService(dialogService: mockDialogService.Object,
itemFilterPersistenceService: mockItemFilterPersistenceService.Object);
//Act
service.PromptForFilterScriptDirectoryIfRequired();
//Assert
mockItemFilterPersistenceService.Verify(i => i.SetItemFilterScriptDirectory(testInputUserSelectedDirectory));
}
private ItemFilterScriptDirectoryService CreateItemFilterScriptDirectoryService(IDialogService dialogService = null,
IFileSystemService fileSystemService = null,
IItemFilterPersistenceService itemFilterPersistenceService = null,
IMessageBoxService messageBoxService = null)
{
return new ItemFilterScriptDirectoryService(dialogService ?? new Mock<IDialogService>().Object,
fileSystemService ?? new Mock<IFileSystemService>().Object,
itemFilterPersistenceService ?? new Mock<IItemFilterPersistenceService>().Object,
messageBoxService ?? new Mock<IMessageBoxService>().Object);
}
}
}

View File

@ -209,8 +209,10 @@
<Compile Include="Repositories\ItemFilterScriptRepository.cs" /> <Compile Include="Repositories\ItemFilterScriptRepository.cs" />
<Compile Include="Services\Bootstrapper.cs" /> <Compile Include="Services\Bootstrapper.cs" />
<Compile Include="Services\ClipboardService.cs" /> <Compile Include="Services\ClipboardService.cs" />
<Compile Include="Services\DialogService.cs" />
<Compile Include="Services\HTTPService.cs" /> <Compile Include="Services\HTTPService.cs" />
<Compile Include="Services\ItemFilterPersistenceService.cs" /> <Compile Include="Services\ItemFilterPersistenceService.cs" />
<Compile Include="Services\ItemFilterScriptDirectoryService.cs" />
<Compile Include="Services\SettingsService.cs" /> <Compile Include="Services\SettingsService.cs" />
<Compile Include="Services\StaticDataService.cs" /> <Compile Include="Services\StaticDataService.cs" />
<Compile Include="Services\UpdateService.cs" /> <Compile Include="Services\UpdateService.cs" />

View File

@ -1,5 +1,4 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Filtration.ObjectModel;
using Filtration.ObjectModel.Factories; using Filtration.ObjectModel.Factories;
using Filtration.Services; using Filtration.Services;
using Filtration.ViewModels; using Filtration.ViewModels;
@ -11,8 +10,6 @@ namespace Filtration.Repositories
{ {
Task<IItemFilterScriptViewModel> LoadScriptFromFileAsync(string path); Task<IItemFilterScriptViewModel> LoadScriptFromFileAsync(string path);
IItemFilterScriptViewModel NewScript(); IItemFilterScriptViewModel NewScript();
string GetItemFilterScriptDirectory();
void SetItemFilterScriptDirectory(string path);
} }
internal class ItemFilterScriptRepository : IItemFilterScriptRepository internal class ItemFilterScriptRepository : IItemFilterScriptRepository
@ -48,15 +45,6 @@ namespace Filtration.Repositories
return newViewModel; return newViewModel;
} }
public void SetItemFilterScriptDirectory(string path)
{
_itemFilterPersistenceService.SetItemFilterScriptDirectory(path);
}
public string GetItemFilterScriptDirectory()
{
return _itemFilterPersistenceService.ItemFilterScriptDirectory;
}
} }
} }
;

View File

@ -15,14 +15,17 @@ namespace Filtration.Services
{ {
private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private readonly IItemFilterScriptDirectoryService _itemFilterScriptDirectoryService;
private readonly IMainWindow _mainWindow; private readonly IMainWindow _mainWindow;
private readonly ISettingsService _settingsService; private readonly ISettingsService _settingsService;
private readonly IUpdateService _updateService; private readonly IUpdateService _updateService;
public Bootstrapper(IMainWindow mainWindow, public Bootstrapper(IItemFilterScriptDirectoryService itemFilterScriptDirectoryService,
IMainWindow mainWindow,
ISettingsService settingsService, ISettingsService settingsService,
IUpdateService updateService) IUpdateService updateService)
{ {
_itemFilterScriptDirectoryService = itemFilterScriptDirectoryService;
_mainWindow = mainWindow; _mainWindow = mainWindow;
_settingsService = settingsService; _settingsService = settingsService;
_updateService = updateService; _updateService = updateService;
@ -37,6 +40,8 @@ namespace Filtration.Services
// with each update // with each update
_settingsService.RestoreSettings(); _settingsService.RestoreSettings();
_itemFilterScriptDirectoryService.PromptForFilterScriptDirectoryIfRequired();
_mainWindow.Show(); _mainWindow.Show();
await _updateService.CheckForUpdatesAsync(); await _updateService.CheckForUpdatesAsync();

View File

@ -0,0 +1,25 @@
using Microsoft.WindowsAPICodePack.Dialogs;
namespace Filtration.Services
{
internal interface IDialogService
{
CommonFileDialogResult ShowFolderPickerDialog(string dialogTitle, out string folderName);
}
internal sealed class DialogService : IDialogService
{
public CommonFileDialogResult ShowFolderPickerDialog(string dialogTitle, out string folderName)
{
using (var dialog = new CommonOpenFileDialog(dialogTitle))
{
dialog.IsFolderPicker = true;
var result = dialog.ShowDialog();
folderName = result == CommonFileDialogResult.Ok ? dialog.FileName : string.Empty;
return result;
}
}
}
}

View File

@ -25,16 +25,6 @@ namespace Filtration.Services
{ {
_fileSystemService = fileSystemService; _fileSystemService = fileSystemService;
_itemFilterScriptTranslator = itemFilterScriptTranslator; _itemFilterScriptTranslator = itemFilterScriptTranslator;
if (string.IsNullOrEmpty(Settings.Default.DefaultFilterDirectory))
{
ItemFilterScriptDirectory = DefaultPathOfExileDirectory();
Settings.Default.DefaultFilterDirectory = ItemFilterScriptDirectory;
}
else
{
ItemFilterScriptDirectory = Settings.Default.DefaultFilterDirectory;
}
} }
public string ItemFilterScriptDirectory { get; private set; } public string ItemFilterScriptDirectory { get; private set; }

View File

@ -0,0 +1,78 @@
using System.IO;
using System.Windows;
using Filtration.Common.Services;
using Microsoft.WindowsAPICodePack.Dialogs;
namespace Filtration.Services
{
internal interface IItemFilterScriptDirectoryService
{
string ItemFilterScriptDirectory { get; }
void PromptForFilterScriptDirectoryIfRequired();
void SetItemFilterScriptDirectory();
}
internal sealed class ItemFilterScriptDirectoryService : IItemFilterScriptDirectoryService
{
private readonly IDialogService _dialogService;
private readonly IFileSystemService _fileSystemService;
private readonly IItemFilterPersistenceService _itemFilterPersistenceService;
private readonly IMessageBoxService _messageBoxService;
public ItemFilterScriptDirectoryService(IDialogService dialogService,
IFileSystemService fileSystemService,
IItemFilterPersistenceService itemFilterPersistenceService,
IMessageBoxService messageBoxService)
{
_dialogService = dialogService;
_fileSystemService = fileSystemService;
_itemFilterPersistenceService = itemFilterPersistenceService;
_messageBoxService = messageBoxService;
}
public string ItemFilterScriptDirectory => _itemFilterPersistenceService.ItemFilterScriptDirectory;
public void PromptForFilterScriptDirectoryIfRequired()
{
// If the directory is already set, do nothing
if (!string.IsNullOrEmpty(_itemFilterPersistenceService.ItemFilterScriptDirectory))
{
return;
}
// If the directory is not set but the default directory exists, set the directory to the default directory
if (_fileSystemService.DirectoryExists(_itemFilterPersistenceService.DefaultPathOfExileDirectory()))
{
_itemFilterPersistenceService.SetItemFilterScriptDirectory(_itemFilterPersistenceService.DefaultPathOfExileDirectory());
return;
}
// Otherwise, prompt the user to select the directory
_messageBoxService.Show("Data directory required", @"The Path of Exile user data directory was not found in the default location (Documents\My Games\Path of Exile), please select it manually.", MessageBoxButton.OK, MessageBoxImage.Information);
while (string.IsNullOrEmpty(_itemFilterPersistenceService.ItemFilterScriptDirectory))
{
SetItemFilterScriptDirectory();
}
}
public void SetItemFilterScriptDirectory()
{
var result = _dialogService.ShowFolderPickerDialog(@"Select Path of Exile user data directory", out var filepath);
if (result != CommonFileDialogResult.Ok)
{
return;
}
try
{
_itemFilterPersistenceService.SetItemFilterScriptDirectory(filepath);
}
catch (DirectoryNotFoundException)
{
_messageBoxService.Show("Error", "The entered Default Filter Directory is invalid or does not exist.",
MessageBoxButton.OK, MessageBoxImage.Exclamation);
}
}
}
}

View File

@ -6,7 +6,6 @@ using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Data; using System.Windows.Data;
@ -16,7 +15,6 @@ using Filtration.Common.Services;
using Filtration.Common.ViewModels; using Filtration.Common.ViewModels;
using Filtration.Interface; using Filtration.Interface;
using Filtration.ObjectModel; using Filtration.ObjectModel;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.BlockItemTypes; using Filtration.ObjectModel.BlockItemTypes;
using Filtration.ObjectModel.Commands; using Filtration.ObjectModel.Commands;
using Filtration.ObjectModel.Commands.ItemFilterScript; using Filtration.ObjectModel.Commands.ItemFilterScript;
@ -185,23 +183,6 @@ namespace Filtration.ViewModels
icon.UriSource = new Uri("pack://application:,,,/Filtration;component/Resources/Icons/script_icon.png"); icon.UriSource = new Uri("pack://application:,,,/Filtration;component/Resources/Icons/script_icon.png");
icon.EndInit(); icon.EndInit();
IconSource = icon; IconSource = icon;
_customSoundsAvailable = new ObservableCollection<string>();
var poeFolderFiles = Directory.GetFiles(persistenceService.DefaultPathOfExileDirectory() + "\\").Where(
s => s.EndsWith(".mp3")
|| s.EndsWith(".wav")
|| s.EndsWith(".wma")
|| s.EndsWith(".3gp")
|| s.EndsWith(".aag")
|| s.EndsWith(".m4a")
|| s.EndsWith(".ogg")
).OrderBy(f => f);
foreach(var file in poeFolderFiles)
{
_customSoundsAvailable.Add(file.Replace(persistenceService.DefaultPathOfExileDirectory() + "\\", ""));
}
} }
public void Initialise(IItemFilterScript itemFilterScript, bool newScript) public void Initialise(IItemFilterScript itemFilterScript, bool newScript)
@ -226,6 +207,23 @@ namespace Filtration.ViewModels
} }
} }
_customSoundsAvailable = new ObservableCollection<string>();
var poeFolderFiles = Directory.GetFiles(_persistenceService.ItemFilterScriptDirectory + "\\").Where(
s => s.EndsWith(".mp3")
|| s.EndsWith(".wav")
|| s.EndsWith(".wma")
|| s.EndsWith(".3gp")
|| s.EndsWith(".aag")
|| s.EndsWith(".m4a")
|| s.EndsWith(".ogg")
).OrderBy(f => f);
foreach (var file in poeFolderFiles)
{
_customSoundsAvailable.Add(file.Replace(_persistenceService.ItemFilterScriptDirectory + "\\", ""));
}
Script.ItemFilterBlocks.CollectionChanged += ItemFilterBlocksOnCollectionChanged; Script.ItemFilterBlocks.CollectionChanged += ItemFilterBlocksOnCollectionChanged;
_customSoundsAvailable.CollectionChanged += CustomSoundsAvailableOnCollectionChanged; _customSoundsAvailable.CollectionChanged += CustomSoundsAvailableOnCollectionChanged;

View File

@ -6,7 +6,6 @@ using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Forms;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using Filtration.Common.Services; using Filtration.Common.Services;
@ -45,6 +44,7 @@ namespace Filtration.ViewModels
{ {
private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private readonly IItemFilterScriptDirectoryService _itemFilterScriptDirectoryService;
private readonly IItemFilterScriptRepository _itemFilterScriptRepository; private readonly IItemFilterScriptRepository _itemFilterScriptRepository;
private readonly IItemFilterScriptTranslator _itemFilterScriptTranslator; private readonly IItemFilterScriptTranslator _itemFilterScriptTranslator;
private readonly IReplaceColorsViewModel _replaceColorsViewModel; private readonly IReplaceColorsViewModel _replaceColorsViewModel;
@ -58,7 +58,8 @@ namespace Filtration.ViewModels
private int _windowWidth; private int _windowWidth;
private int _windowHeight; private int _windowHeight;
public MainWindowViewModel(IItemFilterScriptRepository itemFilterScriptRepository, public MainWindowViewModel(IItemFilterScriptDirectoryService itemFilterScriptDirectoryService,
IItemFilterScriptRepository itemFilterScriptRepository,
IItemFilterScriptTranslator itemFilterScriptTranslator, IItemFilterScriptTranslator itemFilterScriptTranslator,
IReplaceColorsViewModel replaceColorsViewModel, IReplaceColorsViewModel replaceColorsViewModel,
IAvalonDockWorkspaceViewModel avalonDockWorkspaceViewModel, IAvalonDockWorkspaceViewModel avalonDockWorkspaceViewModel,
@ -69,6 +70,7 @@ namespace Filtration.ViewModels
IClipboardService clipboardService, IClipboardService clipboardService,
IUpdateViewModel updateViewModel) IUpdateViewModel updateViewModel)
{ {
_itemFilterScriptDirectoryService = itemFilterScriptDirectoryService;
_itemFilterScriptRepository = itemFilterScriptRepository; _itemFilterScriptRepository = itemFilterScriptRepository;
_itemFilterScriptTranslator = itemFilterScriptTranslator; _itemFilterScriptTranslator = itemFilterScriptTranslator;
_replaceColorsViewModel = replaceColorsViewModel; _replaceColorsViewModel = replaceColorsViewModel;
@ -144,11 +146,6 @@ namespace Filtration.ViewModels
ClearFiltersCommand = new RelayCommand(OnClearFiltersCommand, () => ActiveDocumentIsScript); ClearFiltersCommand = new RelayCommand(OnClearFiltersCommand, () => ActiveDocumentIsScript);
ClearStylesCommand = new RelayCommand(OnClearStylesCommand, () => ActiveDocumentIsScript); ClearStylesCommand = new RelayCommand(OnClearStylesCommand, () => ActiveDocumentIsScript);
if (string.IsNullOrEmpty(_itemFilterScriptRepository.GetItemFilterScriptDirectory()))
{
SetItemFilterScriptDirectory();
}
var icon = new BitmapImage(); var icon = new BitmapImage();
icon.BeginInit(); icon.BeginInit();
icon.UriSource = new Uri("pack://application:,,,/Filtration;component/Resources/Icons/filtration_icon.png"); icon.UriSource = new Uri("pack://application:,,,/Filtration;component/Resources/Icons/filtration_icon.png");
@ -547,7 +544,7 @@ namespace Filtration.ViewModels
var openFileDialog = new OpenFileDialog var openFileDialog = new OpenFileDialog
{ {
Filter = "Filter Files (*.filter)|*.filter|All Files (*.*)|*.*", Filter = "Filter Files (*.filter)|*.filter|All Files (*.*)|*.*",
InitialDirectory = _itemFilterScriptRepository.GetItemFilterScriptDirectory() InitialDirectory = _itemFilterScriptDirectoryService.ItemFilterScriptDirectory
}; };
return openFileDialog.ShowDialog() != true ? string.Empty : openFileDialog.FileName; return openFileDialog.ShowDialog() != true ? string.Empty : openFileDialog.FileName;
@ -558,27 +555,12 @@ namespace Filtration.ViewModels
var openFileDialog = new OpenFileDialog var openFileDialog = new OpenFileDialog
{ {
Filter = "Filter Theme Files (*.filtertheme)|*.filtertheme|All Files (*.*)|*.*", Filter = "Filter Theme Files (*.filtertheme)|*.filtertheme|All Files (*.*)|*.*",
InitialDirectory = _itemFilterScriptRepository.GetItemFilterScriptDirectory() InitialDirectory = _itemFilterScriptDirectoryService.ItemFilterScriptDirectory
}; };
return openFileDialog.ShowDialog() != true ? string.Empty : openFileDialog.FileName; return openFileDialog.ShowDialog() != true ? string.Empty : openFileDialog.FileName;
} }
private void SetItemFilterScriptDirectory()
{
var dlg = new FolderBrowserDialog
{
Description = @"Select your Path of Exile data directory, usually in Documents\My Games",
ShowNewFolderButton = false
};
var result = dlg.ShowDialog();
if (result == DialogResult.OK)
{
_itemFilterScriptRepository.SetItemFilterScriptDirectory(dlg.SelectedPath);
}
}
private async Task OnSaveDocumentCommandAsync() private async Task OnSaveDocumentCommandAsync()
{ {
await ((IEditableDocument)_avalonDockWorkspaceViewModel.ActiveDocument).SaveAsync(); await ((IEditableDocument)_avalonDockWorkspaceViewModel.ActiveDocument).SaveAsync();

View File

@ -1,11 +1,7 @@
using System.IO; using Filtration.Properties;
using System.Windows;
using Filtration.Common.Services;
using Filtration.Properties;
using Filtration.Services; using Filtration.Services;
using GalaSoft.MvvmLight; using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.CommandWpf; using GalaSoft.MvvmLight.CommandWpf;
using Microsoft.WindowsAPICodePack.Dialogs;
namespace Filtration.ViewModels namespace Filtration.ViewModels
{ {
@ -20,13 +16,11 @@ namespace Filtration.ViewModels
internal class SettingsPageViewModel : ViewModelBase, ISettingsPageViewModel internal class SettingsPageViewModel : ViewModelBase, ISettingsPageViewModel
{ {
private readonly IItemFilterPersistenceService _itemFilterPersistenceService; private readonly IItemFilterScriptDirectoryService _itemFilterScriptDirectoryService;
private readonly IMessageBoxService _messageBoxService;
public SettingsPageViewModel(IItemFilterPersistenceService itemFilterPersistenceService, IMessageBoxService messageBoxService) public SettingsPageViewModel(IItemFilterScriptDirectoryService itemFilterScriptDirectoryService)
{ {
_itemFilterPersistenceService = itemFilterPersistenceService; _itemFilterScriptDirectoryService = itemFilterScriptDirectoryService;
_messageBoxService = messageBoxService;
SetItemFilterScriptDirectoryCommand = new RelayCommand(OnSetItemFilterScriptDirectoryCommand); SetItemFilterScriptDirectoryCommand = new RelayCommand(OnSetItemFilterScriptDirectoryCommand);
} }
@ -48,24 +42,8 @@ namespace Filtration.ViewModels
private void OnSetItemFilterScriptDirectoryCommand() private void OnSetItemFilterScriptDirectoryCommand()
{ {
using (var dialog = new CommonOpenFileDialog()) _itemFilterScriptDirectoryService.SetItemFilterScriptDirectory();
{
dialog.IsFolderPicker = true;
var result = dialog.ShowDialog();
if (result == CommonFileDialogResult.Ok)
{
try
{
_itemFilterPersistenceService.SetItemFilterScriptDirectory(dialog.FileName);
RaisePropertyChanged(nameof(DefaultFilterDirectory)); RaisePropertyChanged(nameof(DefaultFilterDirectory));
} }
catch (DirectoryNotFoundException)
{
_messageBoxService.Show("Error", "The entered Default Filter Directory is invalid or does not exist.",
MessageBoxButton.OK, MessageBoxImage.Exclamation);
}
}
}
}
} }
} }

View File

@ -14,6 +14,11 @@ namespace Filtration.WindsorInstallers
.ImplementedBy<ItemFilterPersistenceService>() .ImplementedBy<ItemFilterPersistenceService>()
.LifeStyle.Singleton); .LifeStyle.Singleton);
container.Register(
Component.For<IItemFilterScriptDirectoryService>()
.ImplementedBy<ItemFilterScriptDirectoryService>()
.LifeStyle.Singleton);
container.Register( container.Register(
Component.For<IStaticDataService>() Component.For<IStaticDataService>()
.ImplementedBy<StaticDataService>() .ImplementedBy<StaticDataService>()
@ -43,6 +48,11 @@ namespace Filtration.WindsorInstallers
Component.For<ISettingsService>() Component.For<ISettingsService>()
.ImplementedBy<SettingsService>() .ImplementedBy<SettingsService>()
.LifeStyle.Singleton); .LifeStyle.Singleton);
container.Register(
Component.For<IDialogService>()
.ImplementedBy<DialogService>()
.LifeStyle.Singleton);
} }
} }
} }