diff --git a/ModernKeePass/App.xaml.cs b/ModernKeePass/App.xaml.cs index ff4b050..3c2d49f 100644 --- a/ModernKeePass/App.xaml.cs +++ b/ModernKeePass/App.xaml.cs @@ -84,10 +84,11 @@ namespace ModernKeePass if (realException is SaveException) { + var innerException = realException.InnerException; unhandledExceptionEventArgs.Handled = true; - HockeyClient.Current.TrackException(realException.InnerException); + HockeyClient.Current.TrackException(innerException); await MessageDialogHelper.ShowActionDialog(_resource.GetResourceValue("MessageDialogSaveErrorTitle"), - realException.InnerException.Message, + innerException?.Message, _resource.GetResourceValue("MessageDialogSaveErrorButtonSaveAs"), _resource.GetResourceValue("MessageDialogSaveErrorButtonDiscard"), async command => diff --git a/ModernKeePass/ViewModels/EntryDetailVm.cs b/ModernKeePass/ViewModels/EntryDetailVm.cs index 1581290..ca03228 100644 --- a/ModernKeePass/ViewModels/EntryDetailVm.cs +++ b/ModernKeePass/ViewModels/EntryDetailVm.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Linq; using System.Threading.Tasks; using System.Windows.Input; using Windows.UI.Xaml.Controls; @@ -241,7 +242,7 @@ namespace ModernKeePass.ViewModels SelectedItem = _mediator.Send(new GetEntryQuery { Id = entryId }).GetAwaiter().GetResult(); _parent = _mediator.Send(new GetGroupQuery { Id = SelectedItem.ParentGroupId }).GetAwaiter().GetResult(); History = new ObservableCollection { SelectedItem }; - foreach (var entry in SelectedItem.History) + foreach (var entry in SelectedItem.History.Skip(1)) { History.Add(entry); } @@ -296,7 +297,7 @@ namespace ModernKeePass.ViewModels private async Task RestoreHistory() { - await _mediator.Send(new RestoreHistoryCommand { Entry = History[0], HistoryIndex = History.Count - SelectedIndex - 1 }); + await _mediator.Send(new RestoreHistoryCommand { Entry = History[0], HistoryIndex = History.Count - SelectedIndex }); History.Insert(0, SelectedItem); SelectedIndex = 0; ((RelayCommand)SaveCommand).RaiseCanExecuteChanged(); @@ -304,7 +305,7 @@ namespace ModernKeePass.ViewModels public async Task DeleteHistory() { - await _mediator.Send(new DeleteHistoryCommand { Entry = History[0], HistoryIndex = History.Count - SelectedIndex - 1 }); + await _mediator.Send(new DeleteHistoryCommand { Entry = History[0], HistoryIndex = History.Count - SelectedIndex }); History.RemoveAt(SelectedIndex); SelectedIndex = 0; ((RelayCommand)SaveCommand).RaiseCanExecuteChanged(); diff --git a/ModernKeePass/ViewModels/GroupDetailVm.cs b/ModernKeePass/ViewModels/GroupDetailVm.cs index 0f5b926..f4033b9 100644 --- a/ModernKeePass/ViewModels/GroupDetailVm.cs +++ b/ModernKeePass/ViewModels/GroupDetailVm.cs @@ -50,13 +50,21 @@ namespace ModernKeePass.ViewModels public string Title { get { return _group.Title; } - set { _mediator.Send(new UpdateGroupCommand {Group = _group, Title = value, Icon = _group.Icon}).Wait(); } + set + { + _mediator.Send(new UpdateGroupCommand {Group = _group, Title = value, Icon = _group.Icon}).Wait(); + ((RelayCommand)SaveCommand).RaiseCanExecuteChanged(); + } } public Symbol Icon { get { return (Symbol) Enum.Parse(typeof(Symbol), _group.Icon.ToString()); } - set { _mediator.Send(new UpdateGroupCommand { Group = _group, Title = _group.Title, Icon = (Icon)Enum.Parse(typeof(Icon), value.ToString()) }).Wait(); } + set + { + _mediator.Send(new UpdateGroupCommand { Group = _group, Title = _group.Title, Icon = (Icon)Enum.Parse(typeof(Icon), value.ToString()) }).Wait(); + ((RelayCommand)SaveCommand).RaiseCanExecuteChanged(); + } } public bool IsEditMode diff --git a/ModernKeePass/ViewModels/SaveVm.cs b/ModernKeePass/ViewModels/SaveVm.cs index 1294eff..e2b2695 100644 --- a/ModernKeePass/ViewModels/SaveVm.cs +++ b/ModernKeePass/ViewModels/SaveVm.cs @@ -1,38 +1,54 @@ using System.Threading.Tasks; using Windows.Storage; using Windows.Storage.AccessCache; +using Windows.UI.Xaml.Controls; using MediatR; using Microsoft.Extensions.DependencyInjection; using ModernKeePass.Application.Database.Commands.CloseDatabase; using ModernKeePass.Application.Database.Commands.SaveDatabase; +using ModernKeePass.Application.Database.Queries.GetDatabase; +using ModernKeePass.Common; +using ModernKeePass.Views; namespace ModernKeePass.ViewModels { public class SaveVm { + public bool IsSaveEnabled => _mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult().IsDirty; + + public RelayCommand SaveCommand { get; } + public RelayCommand CloseCommand { get; } + public Frame Frame { get; set; } + private readonly IMediator _mediator; + public SaveVm() : this(App.Services.GetRequiredService()) { } public SaveVm(IMediator mediator) { _mediator = mediator; + SaveCommand = new RelayCommand(async () => await Save(), () => IsSaveEnabled); + CloseCommand = new RelayCommand(async () => await Close()); } public async Task Save(bool close = true) { await _mediator.Send(new SaveDatabaseCommand()); - if (close) await Close(); + if (close) await _mediator.Send(new CloseDatabaseCommand()); + Frame.Navigate(typeof(MainPage)); } public async Task Save(StorageFile file) { var token = StorageApplicationPermissions.FutureAccessList.Add(file); await _mediator.Send(new SaveDatabaseCommand { FilePath = token }); + Frame.Navigate(typeof(MainPage)); } public async Task Close() { await _mediator.Send(new CloseDatabaseCommand()); + Frame.Navigate(typeof(MainPage)); } } } \ No newline at end of file diff --git a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml index 38213cb..eff6ec0 100644 --- a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml +++ b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml @@ -4,6 +4,8 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewModels="using:ModernKeePass.ViewModels" + xmlns:core="using:Microsoft.Xaml.Interactions.Core" + xmlns:interactivity="using:Microsoft.Xaml.Interactivity" x:Class="ModernKeePass.Views.SaveDatabasePage" mc:Ignorable="d"> @@ -11,11 +13,11 @@ - + - + diff --git a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs index cdcec13..52097fb 100644 --- a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs @@ -15,7 +15,6 @@ namespace ModernKeePass.Views /// public sealed partial class SaveDatabasePage { - private Frame _mainFrame; public SaveVm Model => (SaveVm)DataContext; public SaveDatabasePage() { @@ -25,15 +24,9 @@ namespace ModernKeePass.Views protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); - _mainFrame = e.Parameter as Frame; + Model.Frame = e.Parameter as Frame; } - - private async void SaveButton_OnClick(object sender, RoutedEventArgs e) - { - await Model.Save(); - _mainFrame.Navigate(typeof(MainPage)); - } - + private async void SaveAsButton_OnClick(object sender, RoutedEventArgs e) { var savePicker = new FileSavePicker @@ -46,14 +39,6 @@ namespace ModernKeePass.Views var file = await savePicker.PickSaveFileAsync().AsTask(); if (file == null) return; await Model.Save(file); - - _mainFrame.Navigate(typeof(MainPage)); - } - - private async void CloseButton_OnClick(object sender, RoutedEventArgs e) - { - await Model.Close(); - _mainFrame.Navigate(typeof(MainPage)); } } } diff --git a/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml.cs b/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml.cs index c792391..a93da0e 100644 --- a/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml.cs +++ b/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml.cs @@ -122,7 +122,7 @@ namespace ModernKeePass.Views.UserControls nameof(IsOpen), typeof(bool), typeof(HamburgerMenuUserControl), - new PropertyMetadata(true, (o, args) => { })); + new PropertyMetadata(false, (o, args) => { })); public event EventHandler SelectionChanged; private void Selector_OnSelectionChanged(object sender, SelectionChangedEventArgs e)