213 lines
6.7 KiB
C#
213 lines
6.7 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Windows;
|
|
using System.Windows.Forms;
|
|
using System.Windows.Media;
|
|
using System.Windows.Media.Imaging;
|
|
using Filtration.Common.Services;
|
|
using Filtration.Common.ViewModels;
|
|
using Filtration.Interface;
|
|
using Filtration.ObjectModel;
|
|
using Filtration.ObjectModel.Enums;
|
|
using Filtration.ObjectModel.ThemeEditor;
|
|
using Filtration.ThemeEditor.Messages;
|
|
using Filtration.ThemeEditor.Providers;
|
|
using GalaSoft.MvvmLight.CommandWpf;
|
|
using GalaSoft.MvvmLight.Messaging;
|
|
using NLog;
|
|
|
|
namespace Filtration.ThemeEditor.ViewModels
|
|
{
|
|
public interface IThemeEditorViewModel : IEditableDocument
|
|
{
|
|
RelayCommand<ThemeComponentType> AddThemeComponentCommand { get; }
|
|
RelayCommand<ThemeComponent> DeleteThemeComponentCommand { get; }
|
|
RelayCommand CloseCommand { get; }
|
|
|
|
void InitialiseForNewTheme(ThemeComponentCollection themeComponentCollection);
|
|
void InitialiseForMasterTheme(ItemFilterScript script);
|
|
bool IsMasterTheme { get; }
|
|
ItemFilterScript IsMasterThemeForScript { get; }
|
|
string Title { get; }
|
|
string FilePath { get; set; }
|
|
string Filename { get; }
|
|
string Name { get; set; }
|
|
ThemeComponentCollection Components { get; set; }
|
|
ThemeComponent SelectedThemeComponent { get; }
|
|
}
|
|
|
|
public class ThemeEditorViewModel : PaneViewModel, IThemeEditorViewModel
|
|
{
|
|
private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
|
|
|
|
private readonly IThemeProvider _themeProvider;
|
|
private readonly IMessageBoxService _messageBoxService;
|
|
private bool _filenameIsFake;
|
|
private string _filePath;
|
|
private ThemeComponent _selectedThemeComponent;
|
|
|
|
public ThemeEditorViewModel(IThemeProvider themeProvider,
|
|
IMessageBoxService messageBoxService)
|
|
{
|
|
_themeProvider = themeProvider;
|
|
_messageBoxService = messageBoxService;
|
|
|
|
AddThemeComponentCommand = new RelayCommand<ThemeComponentType>(OnAddThemeComponentCommand, t => IsMasterTheme);
|
|
DeleteThemeComponentCommand = new RelayCommand<ThemeComponent>(OnDeleteThemeComponentCommand,
|
|
t => IsMasterTheme && SelectedThemeComponent != null);
|
|
CloseCommand = new RelayCommand(OnCloseCommand);
|
|
|
|
var icon = new BitmapImage();
|
|
icon.BeginInit();
|
|
icon.UriSource = new Uri("pack://application:,,,/Filtration;component/Resources/Icons/Theme.ico");
|
|
icon.EndInit();
|
|
IconSource = icon;
|
|
|
|
}
|
|
|
|
public RelayCommand<ThemeComponentType> AddThemeComponentCommand { get; private set; }
|
|
public RelayCommand<ThemeComponent> DeleteThemeComponentCommand { get; private set; }
|
|
public RelayCommand CloseCommand { get; private set; }
|
|
|
|
public bool IsMasterTheme
|
|
{
|
|
get { return Components.IsMasterCollection; }
|
|
}
|
|
|
|
public ItemFilterScript IsMasterThemeForScript { get; private set; }
|
|
|
|
public void InitialiseForNewTheme(ThemeComponentCollection themeComponentCollection)
|
|
{
|
|
Components = themeComponentCollection;
|
|
_filenameIsFake = true;
|
|
}
|
|
|
|
public void InitialiseForMasterTheme(ItemFilterScript script)
|
|
{
|
|
Components = script.ThemeComponents;
|
|
IsMasterThemeForScript = script;
|
|
_filenameIsFake = true;
|
|
|
|
}
|
|
|
|
public bool IsScript { get { return false; } }
|
|
public bool IsTheme { get { return true; } }
|
|
public bool IsDirty { get; private set; }
|
|
|
|
public string FilePath
|
|
{
|
|
get { return _filePath; }
|
|
set
|
|
{
|
|
_filePath = value;
|
|
Title = Filename;
|
|
}
|
|
}
|
|
|
|
public string Filename
|
|
{
|
|
get { return _filenameIsFake ? FilePath : Path.GetFileName(FilePath); }
|
|
}
|
|
|
|
public string Name { get; set; }
|
|
|
|
public ThemeComponentCollection Components { get; set; }
|
|
|
|
public ThemeComponent SelectedThemeComponent
|
|
{
|
|
get { return _selectedThemeComponent; }
|
|
set
|
|
{
|
|
_selectedThemeComponent = value;
|
|
RaisePropertyChanged();
|
|
}
|
|
}
|
|
|
|
public void Save()
|
|
{
|
|
if (IsMasterTheme) return;
|
|
|
|
if (_filenameIsFake)
|
|
{
|
|
SaveAs();
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
_themeProvider.SaveTheme(this, FilePath);
|
|
//RemoveDirtyFlag();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
if (_logger.IsErrorEnabled)
|
|
{
|
|
_logger.Error(e);
|
|
}
|
|
|
|
_messageBoxService.Show("Save Error", "Error saving filter theme - " + e.Message, MessageBoxButton.OK, MessageBoxImage.Error);
|
|
}
|
|
}
|
|
|
|
public void SaveAs()
|
|
{
|
|
if (IsMasterTheme) return;
|
|
|
|
var saveDialog = new SaveFileDialog
|
|
{
|
|
DefaultExt = ".filter",
|
|
Filter = @"Filter Theme Files (*.filtertheme)|*.filtertheme|All Files (*.*)|*.*"
|
|
};
|
|
|
|
var result = saveDialog.ShowDialog();
|
|
|
|
if (result != DialogResult.OK) return;
|
|
|
|
var previousFilePath = FilePath;
|
|
try
|
|
{
|
|
FilePath = saveDialog.FileName;
|
|
_themeProvider.SaveTheme(this, FilePath);
|
|
_filenameIsFake = false;
|
|
Title = Filename;
|
|
//RemoveDirtyFlag();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
if (_logger.IsErrorEnabled)
|
|
{
|
|
_logger.Error(e);
|
|
}
|
|
|
|
_messageBoxService.Show("Save Error", "Error saving theme file - " + e.Message, MessageBoxButton.OK,
|
|
MessageBoxImage.Error);
|
|
FilePath = previousFilePath;
|
|
}
|
|
}
|
|
|
|
public void OnCloseCommand()
|
|
{
|
|
Close();
|
|
}
|
|
|
|
public void Close()
|
|
{
|
|
Messenger.Default.Send(new ThemeClosedMessage { ClosedViewModel = this });
|
|
}
|
|
|
|
private void OnAddThemeComponentCommand(ThemeComponentType themeComponentType)
|
|
{
|
|
Components.Add(new ThemeComponent(themeComponentType, "Untitled Component",
|
|
new Color {A = 255, R = 255, G = 255, B = 255}));
|
|
}
|
|
|
|
private void OnDeleteThemeComponentCommand(ThemeComponent themeComponent)
|
|
{
|
|
if (themeComponent == null) return;
|
|
|
|
themeComponent.TerminateComponent();
|
|
Components.Remove(themeComponent);
|
|
}
|
|
}
|
|
}
|