diff --git a/ModernKeePass/ModernKeePass.App.csproj b/ModernKeePass/ModernKeePass.App.csproj
index e76076f..ed9c35d 100644
--- a/ModernKeePass/ModernKeePass.App.csproj
+++ b/ModernKeePass/ModernKeePass.App.csproj
@@ -123,6 +123,7 @@
+
DonatePage.xaml
@@ -229,6 +230,9 @@
+
+ HamburgerMenuUserControl.xaml
+
@@ -352,6 +356,10 @@
MSBuild:Compile
PreserveNewest
+
+ Designer
+ MSBuild:Compile
+
diff --git a/ModernKeePass/Strings/en-US/Resources.resw b/ModernKeePass/Strings/en-US/Resources.resw
index fa743dc..1a15826 100644
--- a/ModernKeePass/Strings/en-US/Resources.resw
+++ b/ModernKeePass/Strings/en-US/Resources.resw
@@ -213,21 +213,9 @@
Filter...
-
- New group
-
-
- New group
-
Search...
-
- Groups
-
-
- Groups
-
New group name...
@@ -390,4 +378,13 @@
Have an existing password database? Open it here.
+
+ New group
+
+
+ Groups
+
+
+ History
+
\ No newline at end of file
diff --git a/ModernKeePass/Strings/fr-FR/Resources.resw b/ModernKeePass/Strings/fr-FR/Resources.resw
index 9f6e508..b33fda5 100644
--- a/ModernKeePass/Strings/fr-FR/Resources.resw
+++ b/ModernKeePass/Strings/fr-FR/Resources.resw
@@ -213,21 +213,9 @@
Filtrer...
-
- Nouveau groupe
-
-
- Nouveau groupe
-
Rechercher...
-
- Groupes
-
-
- Groupes
-
Nom du nouveau groupe...
@@ -390,4 +378,13 @@
Pour ouvrir une base de données existante, c'est ici.
+
+ Nouveau groupe
+
+
+ Groupes
+
+
+ Historique
+
\ No newline at end of file
diff --git a/ModernKeePass/ViewModels/EntryVm.cs b/ModernKeePass/ViewModels/EntryVm.cs
index a5ca84f..7931110 100644
--- a/ModernKeePass/ViewModels/EntryVm.cs
+++ b/ModernKeePass/ViewModels/EntryVm.cs
@@ -31,6 +31,8 @@ namespace ModernKeePass.ViewModels
public string CustomChars { get; set; } = string.Empty;
public PwUuid IdUuid => _pwEntry?.Uuid;
public string Id => _pwEntry?.Uuid.ToHexString();
+ public bool IsRecycleOnDelete => _database.RecycleBinEnabled && !ParentGroup.IsSelected;
+ public IEnumerable BreadCrumb => new List(ParentGroup.BreadCrumb) {ParentGroup};
public double PasswordLength
{
@@ -117,9 +119,7 @@ namespace ModernKeePass.ViewModels
NotifyPropertyChanged("IsVisible");
}
}
-
- public bool IsRecycleOnDelete => _database.RecycleBinEnabled && !ParentGroup.IsSelected;
-
+
public bool IsRevealPassword
{
get { return _isRevealPassword; }
@@ -139,7 +139,16 @@ namespace ModernKeePass.ViewModels
}
}
- public IEnumerable BreadCrumb => new List(ParentGroup.BreadCrumb) {ParentGroup};
+ public IEnumerable History
+ {
+ get
+ {
+ foreach (var historyEntry in _pwEntry.History)
+ {
+ yield return new EntryVm(historyEntry, ParentGroup);
+ }
+ }
+ }
public event PropertyChangedEventHandler PropertyChanged;
diff --git a/ModernKeePass/ViewModels/HistoryVm.cs b/ModernKeePass/ViewModels/HistoryVm.cs
new file mode 100644
index 0000000..070a70d
--- /dev/null
+++ b/ModernKeePass/ViewModels/HistoryVm.cs
@@ -0,0 +1,19 @@
+using System.Collections.Generic;
+using ModernKeePass.Interfaces;
+
+namespace ModernKeePass.ViewModels
+{
+ public class HistoryVm: IHasSelectableObject
+ {
+ public IEnumerable History { get; }
+
+ public HistoryVm() { }
+
+ public HistoryVm(IEnumerable history)
+ {
+ History = history;
+ }
+
+ public ISelectableModel SelectedItem { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/ModernKeePass/Views/EntryDetailPage.xaml b/ModernKeePass/Views/EntryDetailPage.xaml
index 73fde7e..238a400 100644
--- a/ModernKeePass/Views/EntryDetailPage.xaml
+++ b/ModernKeePass/Views/EntryDetailPage.xaml
@@ -373,9 +373,9 @@
-
+
@@ -429,63 +429,68 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
diff --git a/ModernKeePass/Views/GroupDetailPage.xaml b/ModernKeePass/Views/GroupDetailPage.xaml
index 923231d..85ed539 100644
--- a/ModernKeePass/Views/GroupDetailPage.xaml
+++ b/ModernKeePass/Views/GroupDetailPage.xaml
@@ -116,90 +116,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/ModernKeePass/Views/GroupDetailPage.xaml.cs b/ModernKeePass/Views/GroupDetailPage.xaml.cs
index 5b40af4..3fa5fdf 100644
--- a/ModernKeePass/Views/GroupDetailPage.xaml.cs
+++ b/ModernKeePass/Views/GroupDetailPage.xaml.cs
@@ -79,13 +79,14 @@ namespace ModernKeePass.Views
private void groups_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
+ var listView = sender as ListView;
GroupVm group;
- switch (LeftListView.SelectedIndex)
+ switch (listView?.SelectedIndex)
{
case -1:
return;
default:
- group = LeftListView.SelectedItem as GroupVm;
+ group = listView?.SelectedItem as GroupVm;
break;
}
Frame.Navigate(typeof(GroupDetailPage), group);
diff --git a/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml b/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml
new file mode 100644
index 0000000..c2525c3
--- /dev/null
+++ b/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml.cs b/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml.cs
new file mode 100644
index 0000000..a6cdeee
--- /dev/null
+++ b/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml.cs
@@ -0,0 +1,82 @@
+using System.Collections.Generic;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using ModernKeePass.Interfaces;
+
+// The User Control item template is documented at http://go.microsoft.com/fwlink/?LinkId=234236
+
+namespace ModernKeePass.Views.UserControls
+{
+ // TODO: Add a property (string path) that allows chosing which field to display
+ public sealed partial class HamburgerMenuUserControl
+ {
+ public HamburgerMenuUserControl()
+ {
+ InitializeComponent();
+ }
+
+ public string HeaderLabel
+ {
+ get { return (string)GetValue(HeaderLabelProperty); }
+ set { SetValue(HeaderLabelProperty, value); }
+ }
+ public static readonly DependencyProperty HeaderLabelProperty =
+ DependencyProperty.Register(
+ "HeaderLabel",
+ typeof(string),
+ typeof(HamburgerMenuUserControl),
+ new PropertyMetadata("Header", (o, args) => { }));
+
+ public string ButtonLabel
+ {
+ get { return (string)GetValue(ButtonLabelProperty); }
+ set { SetValue(ButtonLabelProperty, value); }
+ }
+ // TODO: set a boolean that will show/hide the button when a value is set/not set
+ public static readonly DependencyProperty ButtonLabelProperty =
+ DependencyProperty.Register(
+ "ButtonLabel",
+ typeof(string),
+ typeof(HamburgerMenuUserControl),
+ new PropertyMetadata("Button", (o, args) => { }));
+
+ public object ResizeTarget
+ {
+ get { return GetValue(ResizeTargetProperty); }
+ set { SetValue(ResizeTargetProperty, value); }
+ }
+ public static readonly DependencyProperty ResizeTargetProperty =
+ DependencyProperty.Register(
+ "ResizeTarget",
+ typeof(object),
+ typeof(HamburgerMenuUserControl),
+ new PropertyMetadata(null, (o, args) => { }));
+
+ public IEnumerable ItemsSource
+ {
+ get { return (IEnumerable)GetValue(ItemsSourceProperty); }
+ set { SetValue(ItemsSourceProperty, value); }
+ }
+
+ public static readonly DependencyProperty ItemsSourceProperty =
+ DependencyProperty.Register(
+ "ItemsSource",
+ typeof(IEnumerable),
+ typeof(HamburgerMenuUserControl),
+ new PropertyMetadata(new List(), (o, args) => { }));
+
+ public event SelectionChangedEventHandler SelectionChanged;
+ public delegate void SelectionChangedEventHandler(object sender, SelectionChangedEventArgs e);
+ private void Selector_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ SelectionChanged?.Invoke(sender, e);
+ }
+
+ public event ButtonClickedEventHandler ButtonClicked;
+ public delegate void ButtonClickedEventHandler(object sender, RoutedEventArgs e);
+ private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
+ {
+ ButtonClicked?.Invoke(sender, e);
+ }
+ }
+}