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; }