From 98ecb0b8a1f31ff305323dc86a12306f0774d862 Mon Sep 17 00:00:00 2001 From: Geoffroy Bonneville Date: Mon, 9 Oct 2017 18:40:02 +0200 Subject: [PATCH] Better Entry URL go to button Migrated code from code behind pages to view models Auto select Recents if there are any recent items WIP auto focus on password box when opening database --- .../Controls/OpenDatabaseUserControl.xaml | 8 +-- .../Controls/OpenDatabaseUserControl.xaml.cs | 12 +++- ModernKeePass/MainPage.xaml | 1 + ModernKeePass/MainPage.xaml.cs | 38 ++---------- ModernKeePass/ModernKeePass.csproj | 5 ++ ModernKeePass/Pages/EntryDetailPage.xaml | 16 +++-- ModernKeePass/Pages/GroupDetailPage.xaml | 4 +- ModernKeePass/Pages/GroupDetailPage.xaml.cs | 8 +++ ModernKeePass/Pages/RecentDatabasesPage.xaml | 11 ++-- .../Pages/RecentDatabasesPage.xaml.cs | 10 +--- .../Styles/TextBoxWithButtonStyle.xaml | 7 +++ .../ViewModels/Items/MainMenuItemVm.cs | 10 +++- .../ViewModels/Items/RecentItemVm.cs | 4 +- ModernKeePass/ViewModels/MainVm.cs | 59 ++++++++++++++++++- ModernKeePass/ViewModels/RecentVm.cs | 12 ++++ 15 files changed, 134 insertions(+), 71 deletions(-) create mode 100644 ModernKeePass/Styles/TextBoxWithButtonStyle.xaml diff --git a/ModernKeePass/Controls/OpenDatabaseUserControl.xaml b/ModernKeePass/Controls/OpenDatabaseUserControl.xaml index 6f36170..23f1941 100644 --- a/ModernKeePass/Controls/OpenDatabaseUserControl.xaml +++ b/ModernKeePass/Controls/OpenDatabaseUserControl.xaml @@ -7,14 +7,14 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="65" - d:DesignWidth="400"> + d:DesignWidth="335" Loaded="UserControl_Loaded"> - + - - + diff --git a/ModernKeePass/Controls/OpenDatabaseUserControl.xaml.cs b/ModernKeePass/Controls/OpenDatabaseUserControl.xaml.cs index 7442bce..ca1831b 100644 --- a/ModernKeePass/Controls/OpenDatabaseUserControl.xaml.cs +++ b/ModernKeePass/Controls/OpenDatabaseUserControl.xaml.cs @@ -1,5 +1,7 @@ using System; +using System.Threading.Tasks; using Windows.System; +using Windows.UI.Core; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Input; @@ -13,11 +15,10 @@ namespace ModernKeePass.Controls public OpenDatabaseUserControl() { InitializeComponent(); - PasswordBox.Focus(FocusState.Programmatic); } - public delegate void PasswordCheckedEventHandler(object sender, EventArgs e); public event PasswordCheckedEventHandler ValidationChecked; + public delegate void PasswordCheckedEventHandler(object sender, EventArgs e); private void OpenButton_OnClick(object sender, RoutedEventArgs e) { @@ -30,5 +31,12 @@ namespace ModernKeePass.Controls { if (e.Key == VirtualKey.Enter) OpenButton_OnClick(null, null); } + + private void UserControl_Loaded(object sender, RoutedEventArgs e) + { + Task.Factory.StartNew( + () => Dispatcher.RunAsync(CoreDispatcherPriority.Low, + () => PasswordBox.Focus(FocusState.Programmatic))); + } } } diff --git a/ModernKeePass/MainPage.xaml b/ModernKeePass/MainPage.xaml index e791cf7..c562222 100644 --- a/ModernKeePass/MainPage.xaml +++ b/ModernKeePass/MainPage.xaml @@ -30,6 +30,7 @@ SelectionChanged="ListView_SelectionChanged" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" ItemsSource="{Binding Source={StaticResource MenuItemsSource}}" + SelectedItem="{Binding SelectedItem, Mode=TwoWay}" IsSynchronizedWithCurrentItem="False"> diff --git a/ModernKeePass/MainPage.xaml.cs b/ModernKeePass/MainPage.xaml.cs index 9908d5b..57409a1 100644 --- a/ModernKeePass/MainPage.xaml.cs +++ b/ModernKeePass/MainPage.xaml.cs @@ -1,10 +1,5 @@ -using System.Collections.ObjectModel; -using System.Linq; -using Windows.Storage.AccessCache; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; -using ModernKeePass.Pages; using ModernKeePass.ViewModels; // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 @@ -24,38 +19,13 @@ namespace ModernKeePass protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); - var mainMenuItems = new ObservableCollection - { - new MainMenuItemVm {Title = "Open", PageType = typeof(OpenDatabasePage), Destination = MenuFrame, Parameter = Frame, SymbolIcon = Symbol.Page2}, - new MainMenuItemVm {Title = "New" /*, PageType = typeof(NewDatabasePage)*/, Destination = MenuFrame, SymbolIcon = Symbol.Add}, - new MainMenuItemVm {Title = "Save" , PageType = typeof(SaveDatabasePage), Destination = MenuFrame, Parameter = Frame, SymbolIcon = Symbol.Save}, - new MainMenuItemVm {Title = "Recent" , PageType = typeof(RecentDatabasesPage), Destination = MenuFrame, Parameter = Frame, SymbolIcon = Symbol.Copy} - }; - var app = (App)Application.Current; - if (app.Database != null && app.Database.IsOpen) - mainMenuItems.Add(new MainMenuItemVm - { - Title = app.Database.Name, - PageType = typeof(GroupDetailPage), - Destination = Frame, - Parameter = app.Database.RootGroup, - Group = 1, - SymbolIcon = Symbol.ProtectedDocument - }); - var mainVm = DataContext as MainVm; - mainVm.MainMenuItems = from item in mainMenuItems group item by item.Group into grp orderby grp.Key select grp; - /*if (app.Database == null || !app.Database.IsOpen) - { - var mru = StorageApplicationPermissions.MostRecentlyUsedList; - if (mru.Entries.Count > 0) MenuListView.SelectedIndex = 3; - }*/ - //mainVm.NotifyPropertyChanged("MainMenuItems"); + DataContext = new MainVm(Frame, MenuFrame); } private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e) { - var mainMenuItem = e.AddedItems[0] as MainMenuItemVm; - mainMenuItem?.Destination.Navigate(mainMenuItem.PageType, mainMenuItem.Parameter); + var mainVm = DataContext as MainVm; + mainVm.SelectedItem?.Destination.Navigate(mainVm.SelectedItem.PageType, mainVm.SelectedItem.Parameter); } } } diff --git a/ModernKeePass/ModernKeePass.csproj b/ModernKeePass/ModernKeePass.csproj index 408d85b..58fe225 100644 --- a/ModernKeePass/ModernKeePass.csproj +++ b/ModernKeePass/ModernKeePass.csproj @@ -200,6 +200,11 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + PreserveNewest + diff --git a/ModernKeePass/Pages/EntryDetailPage.xaml b/ModernKeePass/Pages/EntryDetailPage.xaml index 7bed9cd..6170bca 100644 --- a/ModernKeePass/Pages/EntryDetailPage.xaml +++ b/ModernKeePass/Pages/EntryDetailPage.xaml @@ -37,21 +37,19 @@ - + - - - - - - + + + + diff --git a/ModernKeePass/Pages/GroupDetailPage.xaml b/ModernKeePass/Pages/GroupDetailPage.xaml index 42e6365..5c05dd0 100644 --- a/ModernKeePass/Pages/GroupDetailPage.xaml +++ b/ModernKeePass/Pages/GroupDetailPage.xaml @@ -42,7 +42,7 @@ - + - + diff --git a/ModernKeePass/Pages/GroupDetailPage.xaml.cs b/ModernKeePass/Pages/GroupDetailPage.xaml.cs index eb58bb0..9235ee0 100644 --- a/ModernKeePass/Pages/GroupDetailPage.xaml.cs +++ b/ModernKeePass/Pages/GroupDetailPage.xaml.cs @@ -104,5 +104,13 @@ namespace ModernKeePass.Pages group?.RemoveGroup(); if (Frame.CanGoBack) Frame.GoBack(); } + + private void SemanticZoom_ViewChangeStarted(object sender, SemanticZoomViewChangedEventArgs e) + { + if (e.IsSourceZoomedInView == false) + { + e.DestinationItem.Item = e.SourceItem.Item; + } + } } } diff --git a/ModernKeePass/Pages/RecentDatabasesPage.xaml b/ModernKeePass/Pages/RecentDatabasesPage.xaml index 4029a03..62c4b76 100644 --- a/ModernKeePass/Pages/RecentDatabasesPage.xaml +++ b/ModernKeePass/Pages/RecentDatabasesPage.xaml @@ -5,22 +5,19 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewModels="using:ModernKeePass.ViewModels" xmlns:local="using:ModernKeePass.Controls" - xmlns:Converters="using:ModernKeePass.Converters" + xmlns:converters="using:ModernKeePass.Converters" x:Class="ModernKeePass.Pages.RecentDatabasesPage" mc:Ignorable="d"> - - + + diff --git a/ModernKeePass/Pages/RecentDatabasesPage.xaml.cs b/ModernKeePass/Pages/RecentDatabasesPage.xaml.cs index e293fa5..03433a0 100644 --- a/ModernKeePass/Pages/RecentDatabasesPage.xaml.cs +++ b/ModernKeePass/Pages/RecentDatabasesPage.xaml.cs @@ -1,7 +1,7 @@ using System; -using System.Collections.ObjectModel; -using System.Linq; +using System.Threading.Tasks; using Windows.Storage.AccessCache; +using Windows.UI.Core; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; @@ -28,12 +28,6 @@ namespace ModernKeePass.Pages { base.OnNavigatedTo(e); _mainFrame = e.Parameter as Frame; - var mru = StorageApplicationPermissions.MostRecentlyUsedList; - var recentVm = DataContext as RecentVm; - if (recentVm == null) return; - recentVm.RecentItems = new ObservableCollection( - from entry in mru.Entries - select new RecentItemVm {Name = entry.Metadata, Token = entry.Token}); } private async void RecentListView_SelectionChanged(object sender, SelectionChangedEventArgs e) diff --git a/ModernKeePass/Styles/TextBoxWithButtonStyle.xaml b/ModernKeePass/Styles/TextBoxWithButtonStyle.xaml new file mode 100644 index 0000000..35c9875 --- /dev/null +++ b/ModernKeePass/Styles/TextBoxWithButtonStyle.xaml @@ -0,0 +1,7 @@ + + + + diff --git a/ModernKeePass/ViewModels/Items/MainMenuItemVm.cs b/ModernKeePass/ViewModels/Items/MainMenuItemVm.cs index 9d59e3c..14070ef 100644 --- a/ModernKeePass/ViewModels/Items/MainMenuItemVm.cs +++ b/ModernKeePass/ViewModels/Items/MainMenuItemVm.cs @@ -1,12 +1,14 @@ using System; using Windows.UI.Xaml.Controls; +using ModernKeePass.Common; using ModernKeePass.Interfaces; namespace ModernKeePass.ViewModels { - public class MainMenuItemVm: IIsEnabled + public class MainMenuItemVm: NotifyPropertyChangedBase, IIsEnabled { private string _title; + private bool _isSelected; public string Title { @@ -21,6 +23,12 @@ namespace ModernKeePass.ViewModels public Symbol SymbolIcon { get; set; } public bool IsEnabled => PageType != null; + public bool IsSelected + { + get { return _isSelected; } + set { SetProperty(ref _isSelected, value); } + } + public override string ToString() { return Title; diff --git a/ModernKeePass/ViewModels/Items/RecentItemVm.cs b/ModernKeePass/ViewModels/Items/RecentItemVm.cs index b9ef4d1..1c047dc 100644 --- a/ModernKeePass/ViewModels/Items/RecentItemVm.cs +++ b/ModernKeePass/ViewModels/Items/RecentItemVm.cs @@ -1,6 +1,4 @@ -using System.ComponentModel; -using Windows.UI.Xaml; -using ModernKeePass.Common; +using ModernKeePass.Common; namespace ModernKeePass.ViewModels { diff --git a/ModernKeePass/ViewModels/MainVm.cs b/ModernKeePass/ViewModels/MainVm.cs index bf5e9b9..646547a 100644 --- a/ModernKeePass/ViewModels/MainVm.cs +++ b/ModernKeePass/ViewModels/MainVm.cs @@ -1,16 +1,73 @@ -using System.Linq; +using System.Collections.ObjectModel; +using System.Linq; +using Windows.Storage.AccessCache; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; using ModernKeePass.Common; +using ModernKeePass.Pages; namespace ModernKeePass.ViewModels { public class MainVm : NotifyPropertyChangedBase { private IOrderedEnumerable> _mainMenuItems; + private MainMenuItemVm _selectedItem; public IOrderedEnumerable> MainMenuItems { get { return _mainMenuItems; } set { SetProperty(ref _mainMenuItems, value); } } + + public MainMenuItemVm SelectedItem + { + get { return _selectedItem; } + set + { + if (_selectedItem == value) return; + if (_selectedItem != null) + { + _selectedItem.IsSelected = false; + } + + SetProperty(ref _selectedItem, value); + + if (_selectedItem != null) + { + _selectedItem.IsSelected = true; + } + } + } + + public MainVm() {} + + public MainVm(Frame referenceFrame, Frame destinationFrame) + { + var app = (App)Application.Current; + var mru = StorageApplicationPermissions.MostRecentlyUsedList; + + var mainMenuItems = new ObservableCollection + { + new MainMenuItemVm {Title = "Open", PageType = typeof(OpenDatabasePage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Page2}, + new MainMenuItemVm {Title = "New" /*, PageType = typeof(NewDatabasePage)*/, Destination = destinationFrame, SymbolIcon = Symbol.Add}, + new MainMenuItemVm {Title = "Save" , PageType = typeof(SaveDatabasePage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Save}, + new MainMenuItemVm {Title = "Recent" , PageType = typeof(RecentDatabasesPage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Copy, + IsSelected = (app.Database == null || !app.Database.IsOpen) && mru.Entries.Count > 0} + }; + // Auto-select the Recent Items menu item if the conditions are met + SelectedItem = mainMenuItems.FirstOrDefault(m => m.IsSelected); + if (app.Database != null && app.Database.IsOpen) + mainMenuItems.Add(new MainMenuItemVm + { + Title = app.Database.Name, + PageType = typeof(GroupDetailPage), + Destination = referenceFrame, + Parameter = app.Database.RootGroup, + Group = 1, + SymbolIcon = Symbol.ProtectedDocument + }); + + MainMenuItems = from item in mainMenuItems group item by item.Group into grp orderby grp.Key select grp; + } } } diff --git a/ModernKeePass/ViewModels/RecentVm.cs b/ModernKeePass/ViewModels/RecentVm.cs index bdf337c..93b7752 100644 --- a/ModernKeePass/ViewModels/RecentVm.cs +++ b/ModernKeePass/ViewModels/RecentVm.cs @@ -1,4 +1,6 @@ using System.Collections.ObjectModel; +using System.Linq; +using Windows.Storage.AccessCache; using ModernKeePass.Common; namespace ModernKeePass.ViewModels @@ -8,6 +10,16 @@ namespace ModernKeePass.ViewModels private RecentItemVm _selectedItem; private ObservableCollection _recentItems; + public RecentVm() + { + var mru = StorageApplicationPermissions.MostRecentlyUsedList; + RecentItems = new ObservableCollection( + from entry in mru.Entries + select new RecentItemVm { Name = entry.Metadata, Token = entry.Token }); + if (RecentItems.Count > 0) + SelectedItem = RecentItems[0]; + } + public ObservableCollection RecentItems { get { return _recentItems; }