From d32f312d60c48059e3b07479aea175123a8e7a2e Mon Sep 17 00:00:00 2001 From: Geoffroy Bonneville Date: Tue, 31 Oct 2017 12:14:26 +0100 Subject: [PATCH] Auto create new recycle bin if needed Entries now also make use of the recycle bin New path indication below groups and entries title Password generator now has custom characters back (working thanks to lib 2.37) --- ModernKeePass/Common/DatabaseHelper.cs | 5 + ModernKeePass/Interfaces/IPwEntity.cs | 1 + .../Mappings/PwIconToSegoeMapping.cs | 395 ++++++++++++++++++ ModernKeePass/Pages/EntryDetailPage.xaml | 46 +- ModernKeePass/Pages/GroupDetailPage.xaml | 44 +- ModernKeePass/Pages/GroupDetailPage.xaml.cs | 4 +- ModernKeePass/ViewModels/EntryVm.cs | 33 +- ModernKeePass/ViewModels/GroupVm.cs | 34 +- 8 files changed, 504 insertions(+), 58 deletions(-) diff --git a/ModernKeePass/Common/DatabaseHelper.cs b/ModernKeePass/Common/DatabaseHelper.cs index a759daa..b49f525 100644 --- a/ModernKeePass/Common/DatabaseHelper.cs +++ b/ModernKeePass/Common/DatabaseHelper.cs @@ -116,5 +116,10 @@ namespace ModernKeePass.Common _pwDatabase?.Close(); Status = DatabaseStatus.Closed; } + + public void AddDeletedItem(PwUuid id) + { + _pwDatabase.DeletedObjects.Add(new PwDeletedObject(id, DateTime.UtcNow)); + } } } diff --git a/ModernKeePass/Interfaces/IPwEntity.cs b/ModernKeePass/Interfaces/IPwEntity.cs index d595d47..b02d413 100644 --- a/ModernKeePass/Interfaces/IPwEntity.cs +++ b/ModernKeePass/Interfaces/IPwEntity.cs @@ -9,6 +9,7 @@ namespace ModernKeePass.Interfaces Symbol IconSymbol { get; } string Id { get; } string Name { get; set; } + string Path { get; } bool IsEditMode { get; } /// diff --git a/ModernKeePass/Mappings/PwIconToSegoeMapping.cs b/ModernKeePass/Mappings/PwIconToSegoeMapping.cs index f1285fc..b847d4c 100644 --- a/ModernKeePass/Mappings/PwIconToSegoeMapping.cs +++ b/ModernKeePass/Mappings/PwIconToSegoeMapping.cs @@ -78,5 +78,400 @@ namespace ModernKeePass.Mappings default: return Symbol.Stop; } } + + public static PwIcon GetIconFromSymbol(Symbol symbol) + { + switch (symbol) + { + /*case Symbol.Previous: + break; + case Symbol.Next: + break; + case Symbol.Play: + break; + case Symbol.Pause: + break; + case Symbol.Edit: + break; + case Symbol.Save: + break; + case Symbol.Clear: + break;*/ + case Symbol.Delete: + return PwIcon.TrashBin; + /*case Symbol.Remove: + break; + case Symbol.Add: + break; + case Symbol.Cancel: + break; + case Symbol.Accept: + break; + case Symbol.More: + break; + case Symbol.Redo: + break; + case Symbol.Undo: + break; + case Symbol.Home: + break; + case Symbol.Up: + break; + case Symbol.Forward: + break; + case Symbol.Back: + break; + case Symbol.Favorite: + break; + case Symbol.Camera: + break; + case Symbol.Setting: + break; + case Symbol.Video: + break; + case Symbol.Sync: + break; + case Symbol.Download: + break; + case Symbol.Mail: + break; + case Symbol.Find: + break; + case Symbol.Help: + break; + case Symbol.Upload: + break; + case Symbol.Emoji: + break; + case Symbol.TwoPage: + break; + case Symbol.LeaveChat: + break; + case Symbol.MailForward: + break; + case Symbol.Clock: + break; + case Symbol.Send: + break; + case Symbol.Crop: + break; + case Symbol.RotateCamera: + break; + case Symbol.People: + break; + case Symbol.OpenPane: + break; + case Symbol.ClosePane: + break; + case Symbol.World: + break; + case Symbol.Flag: + break; + case Symbol.PreviewLink: + break; + case Symbol.Globe: + break; + case Symbol.Trim: + break; + case Symbol.AttachCamera: + break; + case Symbol.ZoomIn: + break; + case Symbol.Bookmarks: + break; + case Symbol.Document: + break; + case Symbol.ProtectedDocument: + break; + case Symbol.Page: + break; + case Symbol.Bullets: + break; + case Symbol.Comment: + break; + case Symbol.MailFilled: + break; + case Symbol.ContactInfo: + break; + case Symbol.HangUp: + break; + case Symbol.ViewAll: + break; + case Symbol.MapPin: + break; + case Symbol.Phone: + break; + case Symbol.VideoChat: + break; + case Symbol.Switch: + break; + case Symbol.Contact: + break; + case Symbol.Rename: + break; + case Symbol.Pin: + break; + case Symbol.MusicInfo: + break; + case Symbol.Go: + break; + case Symbol.Keyboard: + break; + case Symbol.DockLeft: + break; + case Symbol.DockRight: + break; + case Symbol.DockBottom: + break; + case Symbol.Remote: + break; + case Symbol.Refresh: + break; + case Symbol.Rotate: + break; + case Symbol.Shuffle: + break; + case Symbol.List: + break; + case Symbol.Shop: + break; + case Symbol.SelectAll: + break; + case Symbol.Orientation: + break; + case Symbol.Import: + break; + case Symbol.ImportAll: + break; + case Symbol.BrowsePhotos: + break; + case Symbol.WebCam: + break; + case Symbol.Pictures: + break; + case Symbol.SaveLocal: + break; + case Symbol.Caption: + break; + case Symbol.Stop: + break; + case Symbol.ShowResults: + break; + case Symbol.Volume: + break; + case Symbol.Repair: + break; + case Symbol.Message: + break; + case Symbol.Page2: + break; + case Symbol.CalendarDay: + break; + case Symbol.CalendarWeek: + break; + case Symbol.Calendar: + break; + case Symbol.Character: + break; + case Symbol.MailReplyAll: + break; + case Symbol.Read: + break; + case Symbol.Link: + break; + case Symbol.Account: + break; + case Symbol.ShowBcc: + break; + case Symbol.HideBcc: + break; + case Symbol.Cut: + break; + case Symbol.Attach: + break; + case Symbol.Paste: + break; + case Symbol.Filter: + break; + case Symbol.Copy: + break; + case Symbol.Emoji2: + break; + case Symbol.Important: + break; + case Symbol.MailReply: + break; + case Symbol.SlideShow: + break; + case Symbol.Sort: + break; + case Symbol.Manage: + break; + case Symbol.AllApps: + break; + case Symbol.DisconnectDrive: + break; + case Symbol.MapDrive: + break; + case Symbol.NewWindow: + break; + case Symbol.OpenWith: + break; + case Symbol.ContactPresence: + break; + case Symbol.Priority: + break; + case Symbol.GoToToday: + break; + case Symbol.Font: + break; + case Symbol.FontColor: + break; + case Symbol.Contact2: + break; + case Symbol.Folder: + break; + case Symbol.Audio: + break; + case Symbol.Placeholder: + break; + case Symbol.View: + break; + case Symbol.SetLockScreen: + break; + case Symbol.SetTile: + break; + case Symbol.ClosedCaption: + break; + case Symbol.StopSlideShow: + break; + case Symbol.Permissions: + break; + case Symbol.Highlight: + break; + case Symbol.DisableUpdates: + break; + case Symbol.UnFavorite: + break; + case Symbol.UnPin: + break; + case Symbol.OpenLocal: + break; + case Symbol.Mute: + break; + case Symbol.Italic: + break; + case Symbol.Underline: + break; + case Symbol.Bold: + break; + case Symbol.MoveToFolder: + break; + case Symbol.LikeDislike: + break; + case Symbol.Dislike: + break; + case Symbol.Like: + break; + case Symbol.AlignRight: + break; + case Symbol.AlignCenter: + break; + case Symbol.AlignLeft: + break; + case Symbol.Zoom: + break; + case Symbol.ZoomOut: + break; + case Symbol.OpenFile: + break; + case Symbol.OtherUser: + break; + case Symbol.Admin: + break; + case Symbol.Street: + break; + case Symbol.Map: + break; + case Symbol.ClearSelection: + break; + case Symbol.FontDecrease: + break; + case Symbol.FontIncrease: + break; + case Symbol.FontSize: + break; + case Symbol.CellPhone: + break; + case Symbol.ReShare: + break; + case Symbol.Tag: + break; + case Symbol.RepeatOne: + break; + case Symbol.RepeatAll: + break; + case Symbol.OutlineStar: + break; + case Symbol.SolidStar: + break; + case Symbol.Calculator: + break; + case Symbol.Directions: + break; + case Symbol.Target: + break; + case Symbol.Library: + break; + case Symbol.PhoneBook: + break; + case Symbol.Memo: + break; + case Symbol.Microphone: + break; + case Symbol.PostUpdate: + break; + case Symbol.BackToWindow: + break; + case Symbol.FullScreen: + break; + case Symbol.NewFolder: + break; + case Symbol.CalendarReply: + break; + case Symbol.UnSyncFolder: + break; + case Symbol.ReportHacked: + break; + case Symbol.SyncFolder: + break; + case Symbol.BlockContact: + break; + case Symbol.SwitchApps: + break; + case Symbol.AddFriend: + break; + case Symbol.TouchPointer: + break; + case Symbol.GoToStart: + break; + case Symbol.ZeroBars: + break; + case Symbol.OneBar: + break; + case Symbol.TwoBars: + break; + case Symbol.ThreeBars: + break; + case Symbol.FourBars: + break; + case Symbol.Scan: + break; + case Symbol.Preview: + break;*/ + default: + return PwIcon.Folder; + } + } } } diff --git a/ModernKeePass/Pages/EntryDetailPage.xaml b/ModernKeePass/Pages/EntryDetailPage.xaml index 5a93cbc..4b95ffa 100644 --- a/ModernKeePass/Pages/EntryDetailPage.xaml +++ b/ModernKeePass/Pages/EntryDetailPage.xaml @@ -348,6 +348,8 @@ + + - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/ModernKeePass/Pages/GroupDetailPage.xaml b/ModernKeePass/Pages/GroupDetailPage.xaml index c1f3882..a898d9a 100644 --- a/ModernKeePass/Pages/GroupDetailPage.xaml +++ b/ModernKeePass/Pages/GroupDetailPage.xaml @@ -71,7 +71,7 @@ - + @@ -259,7 +259,7 @@ - - - - - - - + + + + + + + + + + diff --git a/ModernKeePass/Pages/GroupDetailPage.xaml.cs b/ModernKeePass/Pages/GroupDetailPage.xaml.cs index 3db3970..695c297 100644 --- a/ModernKeePass/Pages/GroupDetailPage.xaml.cs +++ b/ModernKeePass/Pages/GroupDetailPage.xaml.cs @@ -84,7 +84,7 @@ namespace ModernKeePass.Pages case -1: return; case 0: - group = Model.CreateNewGroup(); + group = Model.AddNewGroup(); break; default: group = LeftListView.SelectedItem as GroupVm; @@ -101,7 +101,7 @@ namespace ModernKeePass.Pages case -1: return; case 0: - entry = Model.CreateNewEntry(); + entry = Model.AddNewEntry(); break; default: entry = GridView.SelectedItem as EntryVm; diff --git a/ModernKeePass/ViewModels/EntryVm.cs b/ModernKeePass/ViewModels/EntryVm.cs index 1716830..fb8a644 100644 --- a/ModernKeePass/ViewModels/EntryVm.cs +++ b/ModernKeePass/ViewModels/EntryVm.cs @@ -1,12 +1,13 @@ -using System.ComponentModel; +using System; +using System.ComponentModel; +using System.Text; +using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using ModernKeePass.Interfaces; using ModernKeePass.Mappings; using ModernKeePassLib; using ModernKeePassLib.Cryptography.PasswordGenerator; using ModernKeePassLib.Security; -using System; -using Windows.UI.Xaml; using ModernKeePassLib.Cryptography; namespace ModernKeePass.ViewModels @@ -32,6 +33,7 @@ namespace ModernKeePass.ViewModels public bool SpecialPatternSelected { get; set; } public bool BracketsPatternSelected { get; set; } public string CustomChars { get; set; } = string.Empty; + public PwUuid IdUuid => _pwEntry?.Uuid; public string Name { @@ -122,9 +124,20 @@ namespace ModernKeePass.ViewModels } } + public string Path + { + get + { + var path = new StringBuilder(ParentGroup.Path); + path.Append($" > {ParentGroup.Name}"); + return path.ToString(); + } + } + public event PropertyChangedEventHandler PropertyChanged; private readonly PwEntry _pwEntry; + private readonly App _app = (App)Application.Current; private bool _isEditMode; private bool _isRevealPassword; @@ -139,8 +152,7 @@ namespace ModernKeePass.ViewModels _pwEntry = entry; ParentGroup = parent; } - - + public void GeneratePassword() { var pwProfile = new PwProfile() @@ -182,24 +194,27 @@ namespace ModernKeePass.ViewModels public void MarkForDelete() { - var app = (App)Application.Current; - app.PendingDeleteEntities.Add(Id, this); + _app.PendingDeleteEntities.Add(Id, this); ParentGroup.Entries.Remove(this); + if (_app.Database.RecycleBinEnabled && !ParentGroup.IsSelected) _app.Database.RecycleBin.Entries.Add(this); } + public void CommitDelete() { _pwEntry.ParentGroup.Entries.Remove(_pwEntry); + if (_app.Database.RecycleBinEnabled && !ParentGroup.IsSelected) _app.Database.RecycleBin.AddPwEntry(_pwEntry); + else _app.Database.AddDeletedItem(IdUuid); } public void UndoDelete() { ParentGroup.Entries.Add(this); + if (_app.Database.RecycleBinEnabled && !ParentGroup.IsSelected) _app.Database.RecycleBin.Entries.Remove(this); } public void Save() { - var app = (App)Application.Current; - app.Database.Save(); + _app.Database.Save(); } } } diff --git a/ModernKeePass/ViewModels/GroupVm.cs b/ModernKeePass/ViewModels/GroupVm.cs index 5b15e13..585683b 100644 --- a/ModernKeePass/ViewModels/GroupVm.cs +++ b/ModernKeePass/ViewModels/GroupVm.cs @@ -1,5 +1,6 @@ using System.Collections.ObjectModel; using System.Linq; +using System.Text; using Windows.UI.Text; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; @@ -31,8 +32,13 @@ namespace ModernKeePass.ViewModels get { return _app.Database.RecycleBinEnabled && _app.Database.RecycleBin.Id == Id; } set { - // TODO: if _pwGroup is null, create a new group if (value && _pwGroup != null) _app.Database.RecycleBin = this; + else if (value && _pwGroup == null) + { + var recycleBin = _app.Database.RootGroup.AddNewGroup("Recycle bin"); + recycleBin.IsSelected = true; + recycleBin.IconSymbol = Symbol.Delete; + } } } @@ -56,6 +62,7 @@ namespace ModernKeePass.ViewModels var result = PwIconToSegoeMapping.GetSymbolFromIcon(_pwGroup.IconId); return result == Symbol.More ? Symbol.Folder : result; } + set { _pwGroup.IconId = PwIconToSegoeMapping.GetIconFromSymbol(value); } } public bool IsEditMode @@ -64,6 +71,17 @@ namespace ModernKeePass.ViewModels set { SetProperty(ref _isEditMode, value); } } + public string Path + { + get + { + if (ParentGroup == null) return string.Empty; + var path = new StringBuilder(ParentGroup.Path); + path.Append($" > {ParentGroup.Name}"); + return path.ToString(); + } + } + private readonly PwGroup _pwGroup; private readonly App _app = (App)Application.Current; private bool _isEditMode; @@ -82,16 +100,16 @@ namespace ModernKeePass.ViewModels Groups.Insert(0, new GroupVm ()); } - public GroupVm CreateNewGroup() + public GroupVm AddNewGroup(string name = "") { - var pwGroup = new PwGroup(true, true, string.Empty, PwIcon.Folder); + var pwGroup = new PwGroup(true, true, name, PwIcon.Folder); _pwGroup.AddGroup(pwGroup, true); - var newGroup = new GroupVm(pwGroup, this) {IsEditMode = true}; + var newGroup = new GroupVm(pwGroup, this) {Name = name, IsEditMode = string.IsNullOrEmpty(name)}; Groups.Add(newGroup); return newGroup; } - public EntryVm CreateNewEntry() + public EntryVm AddNewEntry() { var pwEntry = new PwEntry(true, true); _pwGroup.AddEntry(pwEntry, true); @@ -99,6 +117,11 @@ namespace ModernKeePass.ViewModels Entries.Add(newEntry); return newEntry; } + + public void AddPwEntry(PwEntry entry) + { + _pwGroup.AddEntry(entry, true); + } public void MarkForDelete() { @@ -111,6 +134,7 @@ namespace ModernKeePass.ViewModels { _pwGroup.ParentGroup.Groups.Remove(_pwGroup); if (_app.Database.RecycleBinEnabled && !IsSelected) _app.Database.RecycleBin._pwGroup.AddGroup(_pwGroup, true); + else _app.Database.AddDeletedItem(IdUuid); } public void UndoDelete()