diff --git a/ModernKeePass/MainPage.xaml.cs b/ModernKeePass/MainPage.xaml.cs index e59b7cb..d6d6b4e 100644 --- a/ModernKeePass/MainPage.xaml.cs +++ b/ModernKeePass/MainPage.xaml.cs @@ -29,21 +29,21 @@ namespace ModernKeePass new MainMenuItem {Title = "Open", PageType = typeof(OpenDatabasePage), Destination = MenuFrame, Parameter = Frame, SymbolIcon = Symbol.Page2}, new MainMenuItem {Title = "New" /*, PageType = typeof(NewDatabasePage)*/, Destination = MenuFrame, SymbolIcon = Symbol.Add}, new MainMenuItem {Title = "Save" , PageType = typeof(SaveDatabasePage), Destination = MenuFrame, Parameter = Frame, SymbolIcon = Symbol.Save}, - new MainMenuItem {Title = "Recent" /*, PageType = typeof(RecentDatabasesPage)*/, Destination = MenuFrame, SymbolIcon = Symbol.Copy} + new MainMenuItem {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 MainMenuItem { Title = app.Database.Name, PageType = typeof(GroupDetailPage), Destination = Frame, Parameter = app.Database.RootGroup, Group = 1, SymbolIcon = Symbol.ProtectedDocument}); - var result = from item in mainMenuItems group item by item.Group into grp orderby grp.Key select grp; - MenuItemsSource.Source = result; + + var mainVm = DataContext as MainVm; + mainVm.MainMenuItems = from item in mainMenuItems group item by item.Group into grp orderby grp.Key select grp; + mainVm.NotifyPropertyChanged("MainMenuItems"); } private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e) { - var listView = sender as ListView; - if (listView == null) return; - var selectedItem = listView.SelectedItem as MainMenuItem; - selectedItem?.Destination.Navigate(selectedItem.PageType, selectedItem.Parameter); + var mainMenuItem = e.AddedItems[0] as MainMenuItem; + mainMenuItem?.Destination.Navigate(mainMenuItem.PageType, mainMenuItem.Parameter); } } } diff --git a/ModernKeePass/Models/RecentItem.cs b/ModernKeePass/Models/RecentItem.cs new file mode 100644 index 0000000..72e3d72 --- /dev/null +++ b/ModernKeePass/Models/RecentItem.cs @@ -0,0 +1,8 @@ +namespace ModernKeePass.Models +{ + public class RecentItem + { + public string Token { get; set; } + public string Name { get; set; } + } +} diff --git a/ModernKeePass/ModernKeePass.csproj b/ModernKeePass/ModernKeePass.csproj index 8f8dbff..5335855 100644 --- a/ModernKeePass/ModernKeePass.csproj +++ b/ModernKeePass/ModernKeePass.csproj @@ -123,6 +123,7 @@ + EntryDetailPage.xaml @@ -132,6 +133,9 @@ OpenDatabasePage.xaml + + RecentDatabasesPage.xaml + SaveDatabasePage.xaml @@ -140,6 +144,7 @@ + @@ -173,6 +178,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -183,7 +192,7 @@ ..\packages\Portable.BouncyCastle.1.8.1.3\lib\netstandard1.0\BouncyCastle.Crypto.dll True - + ..\packages\ModernKeePassLib.2.28.3000\lib\netstandard1.2\ModernKeePassLib.dll True diff --git a/ModernKeePass/Pages/GroupDetailPage.xaml b/ModernKeePass/Pages/GroupDetailPage.xaml index da7c225..764dfb9 100644 --- a/ModernKeePass/Pages/GroupDetailPage.xaml +++ b/ModernKeePass/Pages/GroupDetailPage.xaml @@ -18,7 +18,6 @@ - - - + - + @@ -91,6 +89,12 @@ + + + diff --git a/ModernKeePass/Pages/OpenDatabasePage.xaml.cs b/ModernKeePass/Pages/OpenDatabasePage.xaml.cs index ab5812c..06a26b2 100644 --- a/ModernKeePass/Pages/OpenDatabasePage.xaml.cs +++ b/ModernKeePass/Pages/OpenDatabasePage.xaml.cs @@ -7,6 +7,8 @@ using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Navigation; using ModernKeePass.Common; using ModernKeePass.ViewModels; +using Windows.Storage.AccessCache; +using Windows.Storage; // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 @@ -22,7 +24,6 @@ namespace ModernKeePass.Pages public OpenDatabasePage() { InitializeComponent(); - DataContext = new DatabaseVm(); } protected override void OnNavigatedTo(NavigationEventArgs e) @@ -42,9 +43,28 @@ namespace ModernKeePass.Pages picker.FileTypeFilter.Add(".kdbx"); var file = await picker.PickSingleFileAsync(); - if (file == null) return; // Application now has read/write access to the picked file + if (file == null) return; + // Initialize KDBX database ((App)Application.Current).Database = new DatabaseHelper(file); + AddToRecentFiles(file); + ShowPassword(file); + } + + private void AddToRecentFiles(StorageFile file) + { + var mru = StorageApplicationPermissions.MostRecentlyUsedList; + var mruToken = mru.Add(file, file.DisplayName); + + /*var localSettings = ApplicationData.Current.LocalSettings; + if (!localSettings.Containers.ContainsKey("Recent")) + localSettings.CreateContainer("Recent", ApplicationDataCreateDisposition.Always); + + localSettings.Containers["Recent"].Values[file.DisplayName] = mruToken;*/ + } + + private void ShowPassword(StorageFile file) + { var databaseVm = DataContext as DatabaseVm; if (databaseVm == null) return; databaseVm.SelectedVisibility = Visibility.Visible; diff --git a/ModernKeePass/Pages/RecentDatabasesPage.xaml b/ModernKeePass/Pages/RecentDatabasesPage.xaml new file mode 100644 index 0000000..794738e --- /dev/null +++ b/ModernKeePass/Pages/RecentDatabasesPage.xaml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + diff --git a/ModernKeePass/Pages/RecentDatabasesPage.xaml.cs b/ModernKeePass/Pages/RecentDatabasesPage.xaml.cs new file mode 100644 index 0000000..3fd5aa4 --- /dev/null +++ b/ModernKeePass/Pages/RecentDatabasesPage.xaml.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.ObjectModel; +using System.Linq; +using ModernKeePass.Common; +using ModernKeePass.Models; +using ModernKeePass.ViewModels; +using Windows.Storage; +using Windows.Storage.AccessCache; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Navigation; + +// Pour en savoir plus sur le modèle d'élément Page vierge, consultez la page http://go.microsoft.com/fwlink/?LinkId=234238 + +namespace ModernKeePass.Pages +{ + /// + /// Une page vide peut être utilisée seule ou constituer une page de destination au sein d'un frame. + /// + public sealed partial class RecentDatabasesPage : Page + { + private Frame _mainFrame; + + public RecentDatabasesPage() + { + InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + _mainFrame = e.Parameter as Frame; + //RecentListView.SelectedIndex = -1; + var mru = StorageApplicationPermissions.MostRecentlyUsedList; + var recentVm = DataContext as RecentVm; + recentVm.RecentItems = new ObservableCollection( + from entry in mru.Entries + select new RecentItem() { Name = entry.Metadata, Token = entry.Token }); + recentVm.NotifyPropertyChanged("RecentItems"); + } + + private async void RecentListView_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + //if (RecentListView == null || e.RemovedItems.Count > 0) return; + var recentItem = e.AddedItems[0] as RecentItem; + var mru = StorageApplicationPermissions.MostRecentlyUsedList; + var file = await mru.GetFileAsync(recentItem.Token) as StorageFile; + + var app = (App)Application.Current; + app.Database = new DatabaseHelper(file); + app.Database.Open("test"); + _mainFrame.Navigate(typeof(GroupDetailPage), app.Database.RootGroup); + } + } +} diff --git a/ModernKeePass/Pages/SaveDatabasePage.xaml b/ModernKeePass/Pages/SaveDatabasePage.xaml index e7a18dc..7a8b14b 100644 --- a/ModernKeePass/Pages/SaveDatabasePage.xaml +++ b/ModernKeePass/Pages/SaveDatabasePage.xaml @@ -11,17 +11,8 @@ - - - - - - - - - - - - - + + + + diff --git a/ModernKeePass/Pages/SaveDatabasePage.xaml.cs b/ModernKeePass/Pages/SaveDatabasePage.xaml.cs index 3e7f986..110c935 100644 --- a/ModernKeePass/Pages/SaveDatabasePage.xaml.cs +++ b/ModernKeePass/Pages/SaveDatabasePage.xaml.cs @@ -16,7 +16,6 @@ namespace ModernKeePass.Pages public SaveDatabasePage() { InitializeComponent(); - DataContext = new DatabaseVm(); } protected override void OnNavigatedTo(NavigationEventArgs e) diff --git a/ModernKeePass/ViewModels/EntryVm.cs b/ModernKeePass/ViewModels/EntryVm.cs index c18fce5..a47391d 100644 --- a/ModernKeePass/ViewModels/EntryVm.cs +++ b/ModernKeePass/ViewModels/EntryVm.cs @@ -1,12 +1,15 @@ using System.ComponentModel; +using System.Drawing; using Windows.UI.Xaml.Controls; using ModernKeePass.Mappings; using ModernKeePassLib; using ModernKeePassLib.Security; +using Windows.UI.Xaml.Media; +using Windows.UI; namespace ModernKeePass.ViewModels { - public class EntryVm : INotifyPropertyChanged + public class EntryVm { public string Title { @@ -34,6 +37,10 @@ namespace ModernKeePass.ViewModels set { SetEntryValue(PwDefs.NotesField, value); } } + public SolidColorBrush BackgroundColor => CreateFromColor(_pwEntry.BackgroundColor, Colors.Transparent); + + public SolidColorBrush ForegroundColor => CreateFromColor(_pwEntry.ForegroundColor, Colors.White); + public Symbol IconSymbol { get @@ -42,9 +49,7 @@ namespace ModernKeePass.ViewModels return result == Symbol.More ? Symbol.Permissions : result; } } - - public event PropertyChangedEventHandler PropertyChanged; - + private readonly PwEntry _pwEntry; public EntryVm() { } @@ -62,5 +67,15 @@ namespace ModernKeePass.ViewModels { _pwEntry.Strings.Set(key, new ProtectedString(true, newValue)); } + + private SolidColorBrush CreateFromColor(System.Drawing.Color color, Windows.UI.Color defaultValue) + { + if (color == System.Drawing.Color.Empty) return new SolidColorBrush(defaultValue); + return new SolidColorBrush(Windows.UI.Color.FromArgb( + color.A, + color.R, + color.G, + color.B)); + } } } diff --git a/ModernKeePass/ViewModels/MainVm.cs b/ModernKeePass/ViewModels/MainVm.cs index aa20c8f..5a03612 100644 --- a/ModernKeePass/ViewModels/MainVm.cs +++ b/ModernKeePass/ViewModels/MainVm.cs @@ -1,10 +1,18 @@ using System.Collections.ObjectModel; using ModernKeePass.Models; +using System.ComponentModel; +using System.Linq; namespace ModernKeePass.ViewModels { - public class MainVm + public class MainVm : INotifyPropertyChanged { - public ObservableCollection MainMenuItems { get; set; } + public IOrderedEnumerable> MainMenuItems { get; set; } + + public event PropertyChangedEventHandler PropertyChanged; + public void NotifyPropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } } } diff --git a/ModernKeePass/ViewModels/RecentVm.cs b/ModernKeePass/ViewModels/RecentVm.cs new file mode 100644 index 0000000..10eae97 --- /dev/null +++ b/ModernKeePass/ViewModels/RecentVm.cs @@ -0,0 +1,18 @@ +using ModernKeePass.Models; +using System.Collections.ObjectModel; +using System.ComponentModel; + +namespace ModernKeePass.ViewModels +{ + public class RecentVm : INotifyPropertyChanged + { + public ObservableCollection RecentItems { get; set; } + + public event PropertyChangedEventHandler PropertyChanged; + + public void NotifyPropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } +}