Added drag and drop to open script/theme functionality
This commit is contained in:
parent
32b0a0199f
commit
3727166a44
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
|
@ -6,6 +7,7 @@ using System.Reflection;
|
|||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Forms.VisualStyles;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using Filtration.Common.Services;
|
||||
|
@ -26,7 +28,6 @@ using Filtration.Views;
|
|||
using GalaSoft.MvvmLight.CommandWpf;
|
||||
using GalaSoft.MvvmLight.Messaging;
|
||||
using NLog;
|
||||
using Clipboard = System.Windows.Clipboard;
|
||||
using OpenFileDialog = Microsoft.Win32.OpenFileDialog;
|
||||
|
||||
namespace Filtration.ViewModels
|
||||
|
@ -35,7 +36,8 @@ namespace Filtration.ViewModels
|
|||
{
|
||||
RelayCommand OpenScriptCommand { get; }
|
||||
RelayCommand NewScriptCommand { get; }
|
||||
Task<bool> CloseAllDocuments();
|
||||
Task<bool> CloseAllDocumentsAsync();
|
||||
Task OpenDroppedFilesAsync(List<string> filenames);
|
||||
}
|
||||
|
||||
internal class MainWindowViewModel : FiltrationViewModelBase, IMainWindowViewModel
|
||||
|
@ -52,6 +54,7 @@ namespace Filtration.ViewModels
|
|||
private readonly IUpdateCheckService _updateCheckService;
|
||||
private readonly IUpdateAvailableViewModel _updateAvailableViewModel;
|
||||
private readonly IMessageBoxService _messageBoxService;
|
||||
private readonly IClipboardService _clipboardService;
|
||||
private bool _showLoadingBanner;
|
||||
|
||||
public MainWindowViewModel(IItemFilterScriptRepository itemFilterScriptRepository,
|
||||
|
@ -63,7 +66,8 @@ namespace Filtration.ViewModels
|
|||
IThemeService themeService,
|
||||
IUpdateCheckService updateCheckService,
|
||||
IUpdateAvailableViewModel updateAvailableViewModel,
|
||||
IMessageBoxService messageBoxService)
|
||||
IMessageBoxService messageBoxService,
|
||||
IClipboardService clipboardService)
|
||||
{
|
||||
_itemFilterScriptRepository = itemFilterScriptRepository;
|
||||
_itemFilterScriptTranslator = itemFilterScriptTranslator;
|
||||
|
@ -75,14 +79,15 @@ namespace Filtration.ViewModels
|
|||
_updateCheckService = updateCheckService;
|
||||
_updateAvailableViewModel = updateAvailableViewModel;
|
||||
_messageBoxService = messageBoxService;
|
||||
_clipboardService = clipboardService;
|
||||
|
||||
NewScriptCommand = new RelayCommand(OnNewScriptCommand);
|
||||
CopyScriptCommand = new RelayCommand(OnCopyScriptCommand, () => ActiveDocumentIsScript);
|
||||
OpenScriptCommand = new RelayCommand(async () => await OnOpenScriptCommand());
|
||||
OpenThemeCommand = new RelayCommand(async () => await OnOpenThemeCommand());
|
||||
OpenThemeCommand = new RelayCommand(async () => await OnOpenThemeCommandAsync());
|
||||
|
||||
SaveCommand = new RelayCommand(async () => await OnSaveDocumentCommand(), ActiveDocumentIsEditable);
|
||||
SaveAsCommand = new RelayCommand(async () => await OnSaveAsCommand(), ActiveDocumentIsEditable);
|
||||
SaveCommand = new RelayCommand(async () => await OnSaveDocumentCommandAsync(), ActiveDocumentIsEditable);
|
||||
SaveAsCommand = new RelayCommand(async () => await OnSaveAsCommandAsync(), ActiveDocumentIsEditable);
|
||||
CloseCommand = new RelayCommand(OnCloseDocumentCommand, ActiveDocumentIsEditable);
|
||||
|
||||
CopyBlockCommand = new RelayCommand(OnCopyBlockCommand, () => ActiveDocumentIsScript && ActiveScriptHasSelectedBlock);
|
||||
|
@ -106,7 +111,7 @@ namespace Filtration.ViewModels
|
|||
ReplaceColorsCommand = new RelayCommand(OnReplaceColorsCommand, () => ActiveDocumentIsScript);
|
||||
|
||||
CreateThemeCommand = new RelayCommand(OnCreateThemeCommand, () => ActiveDocumentIsScript);
|
||||
ApplyThemeToScriptCommand = new RelayCommand(async () => await OnApplyThemeToScriptCommand(), () => ActiveDocumentIsScript);
|
||||
ApplyThemeToScriptCommand = new RelayCommand(async () => await OnApplyThemeToScriptCommandAsync(), () => ActiveDocumentIsScript);
|
||||
EditMasterThemeCommand = new RelayCommand(OnEditMasterThemeCommand, () => ActiveDocumentIsScript);
|
||||
|
||||
AddTextColorThemeComponentCommand = new RelayCommand(OnAddTextColorThemeComponentCommand, () => ActiveDocumentIsTheme && ActiveThemeIsEditable);
|
||||
|
@ -185,7 +190,11 @@ namespace Filtration.ViewModels
|
|||
}
|
||||
}
|
||||
});
|
||||
CheckForUpdates();
|
||||
|
||||
Task.Run(async () =>
|
||||
{
|
||||
await CheckForUpdatesAsync();
|
||||
}).Wait();
|
||||
}
|
||||
|
||||
public RelayCommand OpenScriptCommand { get; private set; }
|
||||
|
@ -229,7 +238,7 @@ namespace Filtration.ViewModels
|
|||
public RelayCommand ClearFiltersCommand { get; private set; }
|
||||
|
||||
|
||||
public async void CheckForUpdates()
|
||||
public async Task CheckForUpdatesAsync()
|
||||
{
|
||||
var assemblyVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);
|
||||
|
||||
|
@ -346,6 +355,29 @@ namespace Filtration.ViewModels
|
|||
}
|
||||
}
|
||||
|
||||
public async Task OpenDroppedFilesAsync(List<string> filenames)
|
||||
{
|
||||
foreach (var filename in filenames)
|
||||
{
|
||||
var extension = Path.GetExtension(filename);
|
||||
if (extension == null) continue;
|
||||
|
||||
switch (extension.ToUpperInvariant())
|
||||
{
|
||||
case ".FILTER":
|
||||
{
|
||||
await LoadScriptAsync(filename);
|
||||
break;
|
||||
}
|
||||
case ".FILTERTHEME":
|
||||
{
|
||||
await LoadThemeAsync(filename);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnCreateThemeCommand()
|
||||
{
|
||||
var themeViewModel = _themeProvider.NewThemeForScript(AvalonDockWorkspaceViewModel.ActiveScriptViewModel.Script);
|
||||
|
@ -389,22 +421,26 @@ namespace Filtration.ViewModels
|
|||
|
||||
private async Task OnOpenScriptCommand()
|
||||
{
|
||||
var openFileDialog = new OpenFileDialog
|
||||
var filePath = ShowOpenScriptDialog();
|
||||
|
||||
if (string.IsNullOrEmpty(filePath))
|
||||
{
|
||||
Filter = "Filter Files (*.filter)|*.filter|All Files (*.*)|*.*",
|
||||
InitialDirectory = _itemFilterScriptRepository.GetItemFilterScriptDirectory()
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
if (openFileDialog.ShowDialog() != true) return;
|
||||
await LoadScriptAsync(filePath);
|
||||
}
|
||||
|
||||
private async Task LoadScriptAsync(string scriptFilename)
|
||||
{
|
||||
IItemFilterScriptViewModel loadedViewModel;
|
||||
|
||||
Messenger.Default.Send(new NotificationMessage("ShowLoadingBanner"));
|
||||
try
|
||||
{
|
||||
loadedViewModel = await _itemFilterScriptRepository.LoadScriptFromFileAsync(openFileDialog.FileName);
|
||||
loadedViewModel = await _itemFilterScriptRepository.LoadScriptFromFileAsync(scriptFilename);
|
||||
}
|
||||
catch(IOException e)
|
||||
catch (IOException e)
|
||||
{
|
||||
Messenger.Default.Send(new NotificationMessage("HideLoadingBanner"));
|
||||
if (_logger.IsErrorEnabled)
|
||||
|
@ -421,20 +457,24 @@ namespace Filtration.ViewModels
|
|||
_avalonDockWorkspaceViewModel.AddDocument(loadedViewModel);
|
||||
}
|
||||
|
||||
private async Task OnOpenThemeCommand()
|
||||
private async Task OnOpenThemeCommandAsync()
|
||||
{
|
||||
|
||||
var filePath = ShowOpenThemeDialog();
|
||||
if (string.IsNullOrEmpty(filePath))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
await LoadThemeAsync(filePath);
|
||||
}
|
||||
|
||||
private async Task LoadThemeAsync(string themeFilename)
|
||||
{
|
||||
IThemeEditorViewModel loadedViewModel;
|
||||
|
||||
try
|
||||
{
|
||||
loadedViewModel = await _themeProvider.LoadThemeFromFile(filePath);
|
||||
loadedViewModel = await _themeProvider.LoadThemeFromFile(themeFilename);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
|
@ -451,7 +491,7 @@ namespace Filtration.ViewModels
|
|||
_avalonDockWorkspaceViewModel.AddDocument(loadedViewModel);
|
||||
}
|
||||
|
||||
private async Task OnApplyThemeToScriptCommand()
|
||||
private async Task OnApplyThemeToScriptCommandAsync()
|
||||
{
|
||||
var filePath = ShowOpenThemeDialog();
|
||||
if (string.IsNullOrEmpty(filePath))
|
||||
|
@ -489,6 +529,16 @@ namespace Filtration.ViewModels
|
|||
AvalonDockWorkspaceViewModel.ActiveScriptViewModel.SetDirtyFlag();
|
||||
}
|
||||
|
||||
private string ShowOpenScriptDialog()
|
||||
{
|
||||
var openFileDialog = new OpenFileDialog
|
||||
{
|
||||
Filter = "Filter Files (*.filter)|*.filter|All Files (*.*)|*.*",
|
||||
InitialDirectory = _itemFilterScriptRepository.GetItemFilterScriptDirectory()
|
||||
};
|
||||
|
||||
return openFileDialog.ShowDialog() != true ? string.Empty : openFileDialog.FileName;
|
||||
}
|
||||
|
||||
private string ShowOpenThemeDialog()
|
||||
{
|
||||
|
@ -501,8 +551,6 @@ namespace Filtration.ViewModels
|
|||
return openFileDialog.ShowDialog() != true ? string.Empty : openFileDialog.FileName;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void SetItemFilterScriptDirectory()
|
||||
{
|
||||
var dlg = new FolderBrowserDialog
|
||||
|
@ -518,12 +566,12 @@ namespace Filtration.ViewModels
|
|||
}
|
||||
}
|
||||
|
||||
private async Task OnSaveDocumentCommand()
|
||||
private async Task OnSaveDocumentCommandAsync()
|
||||
{
|
||||
await ((IEditableDocument)_avalonDockWorkspaceViewModel.ActiveDocument).SaveAsync();
|
||||
}
|
||||
|
||||
private async Task OnSaveAsCommand()
|
||||
private async Task OnSaveAsCommandAsync()
|
||||
{
|
||||
await ((IEditableDocument)_avalonDockWorkspaceViewModel.ActiveDocument).SaveAsAsync();
|
||||
}
|
||||
|
@ -537,7 +585,18 @@ namespace Filtration.ViewModels
|
|||
|
||||
private void OnCopyScriptCommand()
|
||||
{
|
||||
Clipboard.SetText(_itemFilterScriptTranslator.TranslateItemFilterScriptToString(_avalonDockWorkspaceViewModel.ActiveScriptViewModel.Script));
|
||||
try
|
||||
{
|
||||
|
||||
_clipboardService.SetClipboardText(
|
||||
_itemFilterScriptTranslator.TranslateItemFilterScriptToString(
|
||||
_avalonDockWorkspaceViewModel.ActiveScriptViewModel.Script));
|
||||
}
|
||||
catch
|
||||
{
|
||||
_messageBoxService.Show("Clipboard Error", "Failed to access the clipboard, copy command not completed.",
|
||||
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnCopyBlockCommand()
|
||||
|
@ -657,7 +716,7 @@ namespace Filtration.ViewModels
|
|||
_avalonDockWorkspaceViewModel.ActiveThemeViewModel.SelectedThemeComponent);
|
||||
}
|
||||
|
||||
public async Task<bool> CloseAllDocuments()
|
||||
public async Task<bool> CloseAllDocumentsAsync()
|
||||
{
|
||||
var openDocuments = _avalonDockWorkspaceViewModel.OpenDocuments.OfType<IEditableDocument>().ToList();
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
mc:Ignorable="d"
|
||||
d:DataContext="{d:DesignInstance Type=viewModels:MainWindowViewModel}"
|
||||
Title="{Binding WindowTitle}" Height="762" Width="1126" IsIconVisible="True"
|
||||
Closing="MainWindow_OnClosing">
|
||||
Closing="MainWindow_OnClosing" Drop="MainWindow_OnDrop" AllowDrop="True">
|
||||
<fluent:RibbonWindow.InputBindings>
|
||||
<KeyBinding Command="{Binding SaveCommand}" Modifiers="Control" Key="S" />
|
||||
<KeyBinding Command="{Binding OpenScriptCommand}" Modifiers="Control" Key="O" />
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
using System.ComponentModel;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using Filtration.ViewModels;
|
||||
|
@ -39,12 +41,35 @@ namespace Filtration.Views
|
|||
|
||||
private void MainWindow_OnClosing(object sender, CancelEventArgs e)
|
||||
{
|
||||
var allDocumentsClosed = _mainWindowViewModel.CloseAllDocuments().Result;
|
||||
var allDocumentsClosed = _mainWindowViewModel.CloseAllDocumentsAsync().Result;
|
||||
if (!allDocumentsClosed)
|
||||
{
|
||||
e.Cancel = true;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private async void MainWindow_OnDrop(object sender, DragEventArgs e)
|
||||
{
|
||||
if (!e.Data.GetDataPresent(DataFormats.FileDrop)) return;
|
||||
|
||||
var filenames = (string[])e.Data.GetData(DataFormats.FileDrop);
|
||||
var droppedFilterFiles = new List<string>();
|
||||
|
||||
foreach (var filename in filenames)
|
||||
{
|
||||
var extension = Path.GetExtension(filename);
|
||||
if (extension != null &&
|
||||
(extension.ToUpperInvariant() == ".FILTER" || extension.ToUpperInvariant() == ".FILTERTHEME"))
|
||||
{
|
||||
droppedFilterFiles.Add(filename);
|
||||
}
|
||||
}
|
||||
|
||||
if (droppedFilterFiles.Count > 0)
|
||||
{
|
||||
await _mainWindowViewModel.OpenDroppedFilesAsync(droppedFilterFiles);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue