diff --git a/ModernKeePass/Common/DatabaseHelper.cs b/ModernKeePass/Common/DatabaseHelper.cs
index fe3153d..adc8966 100644
--- a/ModernKeePass/Common/DatabaseHelper.cs
+++ b/ModernKeePass/Common/DatabaseHelper.cs
@@ -60,7 +60,11 @@ namespace ModernKeePass.Common
public void Save()
{
_pwDatabase.Save(new NullStatusLogger());
- //_pwDatabase.Close();
+ }
+
+ public void Close()
+ {
+ _pwDatabase.Close();
}
}
}
diff --git a/ModernKeePass/Controls/ListViewWithDisable.cs b/ModernKeePass/Controls/ListViewWithDisable.cs
new file mode 100644
index 0000000..74b2a66
--- /dev/null
+++ b/ModernKeePass/Controls/ListViewWithDisable.cs
@@ -0,0 +1,20 @@
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using ModernKeePass.Interfaces;
+
+namespace ModernKeePass.Controls
+{
+ public class ListViewWithDisable: ListView
+ {
+ protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
+ {
+ base.PrepareContainerForItemOverride(element, item);
+
+ var container = element as ListViewItem;
+ var binaryItem = item as IIsEnabled;
+ if (container == null || binaryItem == null) return;
+ container.IsEnabled = binaryItem.IsEnabled;
+ container.IsHitTestVisible = binaryItem.IsEnabled;
+ }
+ }
+}
diff --git a/ModernKeePass/Interfaces/IIsEnabled.cs b/ModernKeePass/Interfaces/IIsEnabled.cs
new file mode 100644
index 0000000..cfed3ab
--- /dev/null
+++ b/ModernKeePass/Interfaces/IIsEnabled.cs
@@ -0,0 +1,7 @@
+namespace ModernKeePass.Interfaces
+{
+ public interface IIsEnabled
+ {
+ bool IsEnabled { get; }
+ }
+}
diff --git a/ModernKeePass/MainPage.xaml b/ModernKeePass/MainPage.xaml
index b0a737e..4b54697 100644
--- a/ModernKeePass/MainPage.xaml
+++ b/ModernKeePass/MainPage.xaml
@@ -1,62 +1,46 @@
-
+
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
- Save
- New
- File
- Recent files - Coming soon
- Url files - Coming soon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/ModernKeePass/MainPage.xaml.cs b/ModernKeePass/MainPage.xaml.cs
index 64b69d3..524a4e4 100644
--- a/ModernKeePass/MainPage.xaml.cs
+++ b/ModernKeePass/MainPage.xaml.cs
@@ -1,7 +1,6 @@
-using System;
-using Windows.UI.Xaml;
+using System.Collections.ObjectModel;
using Windows.UI.Xaml.Controls;
-using Windows.UI.Xaml.Navigation;
+using ModernKeePass.Models;
using ModernKeePass.Pages;
using ModernKeePass.ViewModels;
@@ -17,70 +16,26 @@ namespace ModernKeePass
public MainPage()
{
InitializeComponent();
- }
-
- private async void Button_Click(object sender, RoutedEventArgs e)
- {
- var picker = new Windows.Storage.Pickers.FileOpenPicker();
- picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.List;
- picker.SuggestedStartLocation =
- Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary;
- picker.FileTypeFilter.Add(".kdbx");
-
- var file = await picker.PickSingleFileAsync();
- if (file != null)
+ var mainMenuItems = new ObservableCollection
{
- // Application now has read/write access to the picked file
- //DataContext = new DatabaseVm(file);
- ((App)Application.Current).Database = new Common.DatabaseHelper(file);
- var homeVm = DataContext as HomeVm;
- homeVm.Visibility = Visibility.Visible;
- homeVm.NotifyPropertyChanged("Visibility");
- }
+ new MainMenuItem {Title = "File", PageType = typeof(OpenDatabasePage)},
+ new MainMenuItem {Title = "New" /*, PageType = typeof(NewDatabasePage)*/},
+ new MainMenuItem {Title = "Save" , PageType = typeof(SaveDatabasePage)},
+ new MainMenuItem {Title = "Recent files - Coming soon" /*, PageType = typeof(RecentDatabasesPage)*/},
+ new MainMenuItem {Title = "Url files - Coming soon" /*, PageType = typeof(OpenUrlPage)*/}
+ };
+ DataContext = new MainVm {MainMenuItems = mainMenuItems};
+ MenuListView.SelectedIndex = -1;
}
- private void openBbutton_Click(object sender, RoutedEventArgs e)
- {
- /*var database = DataContext as DatabaseVm;
- database.Open();
- if (database.IsOpen)
- Frame.Navigate(typeof(GroupDetailPage), database.RootGroup);*/
- var homeVm = DataContext as HomeVm;
- var app = ((App)Application.Current);
- homeVm.ErrorMessage = app.Database.Open(homeVm.Password);
-
- if (!string.IsNullOrEmpty(homeVm.ErrorMessage)) homeVm.NotifyPropertyChanged("ErrorMessage");
- else Frame.Navigate(typeof(GroupDetailPage), app.Database.RootGroup);
- }
-
- private void saveBbutton_Click(object sender, RoutedEventArgs e)
- {
- var database = DataContext as HomeVm;
- ((App)Application.Current).Database.Save();
- }
-
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
- if (e.AddedItems.Contains(SelectItem) || e.AddedItems.Contains(NewItem))
- {
- SelectGrid.Visibility = Visibility.Visible;
- SaveButton.Visibility = Visibility.Collapsed;
- }
- else if (e.AddedItems.Contains(SaveItem))
- {
- SaveButton.Visibility = Visibility.Visible;
- SelectGrid.Visibility = Visibility.Collapsed;
- }
- }
-
- protected override void OnNavigatedTo(NavigationEventArgs e)
- {
- base.OnNavigatedTo(e);
- var app = (App)Application.Current;
- if (app.Database == null) return;
- var homeVm = DataContext as HomeVm;
- homeVm.IsOpen = app.Database.IsOpen;
- homeVm.NotifyPropertyChanged("IsOpen");
+ if (Frame == null) return;
+ var listView = sender as ListView;
+ if (listView == null) return;
+ if (listView.SelectedIndex == -1) return;
+ var selectedItem = listView.SelectedItem as MainMenuItem;
+ if (selectedItem != null) MenuFrame.Navigate(selectedItem.PageType, Frame);
}
}
}
diff --git a/ModernKeePass/Models/MainMenuItem.cs b/ModernKeePass/Models/MainMenuItem.cs
new file mode 100644
index 0000000..9a38340
--- /dev/null
+++ b/ModernKeePass/Models/MainMenuItem.cs
@@ -0,0 +1,17 @@
+using System;
+using ModernKeePass.Interfaces;
+
+namespace ModernKeePass.Models
+{
+ public class MainMenuItem: IIsEnabled
+ {
+ public string Title { get; set; }
+ public Type PageType { get; set; }
+ public bool IsEnabled => PageType != null;
+
+ public override string ToString()
+ {
+ return Title;
+ }
+ }
+}
diff --git a/ModernKeePass/ModernKeePass.csproj b/ModernKeePass/ModernKeePass.csproj
index 176101e..ef63a57 100644
--- a/ModernKeePass/ModernKeePass.csproj
+++ b/ModernKeePass/ModernKeePass.csproj
@@ -115,19 +115,29 @@
+
+
MainPage.xaml
+
EntryDetailPage.xaml
GroupDetailPage.xaml
+
+ OpenDatabasePage.xaml
+
+
+ SaveDatabasePage.xaml
+
-
+
+
@@ -157,13 +167,21 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
..\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/ModernKeePass.csproj.DotSettings b/ModernKeePass/ModernKeePass.csproj.DotSettings
new file mode 100644
index 0000000..c54c126
--- /dev/null
+++ b/ModernKeePass/ModernKeePass.csproj.DotSettings
@@ -0,0 +1,2 @@
+
+ CSharp70
\ No newline at end of file
diff --git a/ModernKeePass/Pages/GroupDetailPage.xaml b/ModernKeePass/Pages/GroupDetailPage.xaml
index 07fd5e1..953b3db 100644
--- a/ModernKeePass/Pages/GroupDetailPage.xaml
+++ b/ModernKeePass/Pages/GroupDetailPage.xaml
@@ -37,6 +37,7 @@
x:Name="groupsGridView"
AutomationProperties.AutomationId="ItemGridView"
AutomationProperties.Name="Groups"
+ Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
TabIndex="1"
Grid.RowSpan="2"
Padding="120,126,120,50"
diff --git a/ModernKeePass/Pages/GroupDetailPage.xaml.cs b/ModernKeePass/Pages/GroupDetailPage.xaml.cs
index 9570fbf..87a95bf 100644
--- a/ModernKeePass/Pages/GroupDetailPage.xaml.cs
+++ b/ModernKeePass/Pages/GroupDetailPage.xaml.cs
@@ -59,13 +59,11 @@ namespace ModernKeePass.Pages
protected override void OnNavigatedTo(NavigationEventArgs e)
{
navigationHelper.OnNavigatedTo(e);
-
- if (e.Parameter is GroupVm)
- {
- DataContext = e.Parameter as GroupVm;
- groupsGridView.SelectedIndex = -1;
- entriesListView.SelectedIndex = -1;
- }
+
+ if (!(e.Parameter is GroupVm)) return;
+ DataContext = (GroupVm) e.Parameter;
+ groupsGridView.SelectedIndex = -1;
+ entriesListView.SelectedIndex = -1;
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
@@ -78,14 +76,14 @@ namespace ModernKeePass.Pages
private void groupsGridView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var gridView = sender as GridView;
- Frame.Navigate(typeof(GroupDetailPage), gridView.SelectedItem as GroupVm);
+ Frame.Navigate(typeof(GroupDetailPage), gridView?.SelectedItem as GroupVm);
}
private void entriesListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var listView = sender as ListView;
- Frame.Navigate(typeof(EntryDetailPage), listView.SelectedItem as EntryVm);
+ Frame.Navigate(typeof(EntryDetailPage), listView?.SelectedItem as EntryVm);
}
}
}
diff --git a/ModernKeePass/Pages/OpenDatabasePage.xaml b/ModernKeePass/Pages/OpenDatabasePage.xaml
new file mode 100644
index 0000000..0c66e35
--- /dev/null
+++ b/ModernKeePass/Pages/OpenDatabasePage.xaml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ModernKeePass/Pages/OpenDatabasePage.xaml.cs b/ModernKeePass/Pages/OpenDatabasePage.xaml.cs
new file mode 100644
index 0000000..9dbfe4c
--- /dev/null
+++ b/ModernKeePass/Pages/OpenDatabasePage.xaml.cs
@@ -0,0 +1,61 @@
+using System;
+using Windows.Storage.Pickers;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Navigation;
+using ModernKeePass.Common;
+using ModernKeePass.ViewModels;
+
+// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
+
+namespace ModernKeePass.Pages
+{
+ ///
+ /// An empty page that can be used on its own or navigated to within a Frame.
+ ///
+ public sealed partial class OpenDatabasePage : Page
+ {
+ private Frame _mainFrame;
+
+ public OpenDatabasePage()
+ {
+ InitializeComponent();
+ DataContext = new DatabaseVm();
+ }
+
+ protected override void OnNavigatedTo(NavigationEventArgs e)
+ {
+ base.OnNavigatedTo(e);
+ _mainFrame = e.Parameter as Frame;
+ }
+
+ private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
+ {
+ var picker =
+ new FileOpenPicker
+ {
+ ViewMode = PickerViewMode.List,
+ SuggestedStartLocation = PickerLocationId.DocumentsLibrary
+ };
+ picker.FileTypeFilter.Add(".kdbx");
+
+ var file = await picker.PickSingleFileAsync();
+ if (file == null) return;
+ // Application now has read/write access to the picked file
+ ((App)Application.Current).Database = new DatabaseHelper(file);
+ var databaseVm = DataContext as DatabaseVm;
+ if (databaseVm == null) return;
+ databaseVm.SelectedVisibility = Visibility.Visible;
+ databaseVm.Name = file.Name;
+ databaseVm.NotifyPropertyChanged("SelectedVisibility");
+ databaseVm.NotifyPropertyChanged("Name");
+ }
+
+ private void OpenButton_OnClick(object sender, RoutedEventArgs e)
+ {
+ var app = (App)Application.Current;
+ StatusTextBlock.Text = app.Database.Open(PasswordBox.Password);
+ if (string.IsNullOrEmpty(StatusTextBlock.Text)) _mainFrame.Navigate(typeof(GroupDetailPage), app.Database.RootGroup);
+ }
+ }
+}
diff --git a/ModernKeePass/Pages/SaveDatabasePage.xaml b/ModernKeePass/Pages/SaveDatabasePage.xaml
new file mode 100644
index 0000000..f98e709
--- /dev/null
+++ b/ModernKeePass/Pages/SaveDatabasePage.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ModernKeePass/Pages/SaveDatabasePage.xaml.cs b/ModernKeePass/Pages/SaveDatabasePage.xaml.cs
new file mode 100644
index 0000000..267d074
--- /dev/null
+++ b/ModernKeePass/Pages/SaveDatabasePage.xaml.cs
@@ -0,0 +1,39 @@
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Navigation;
+using ModernKeePass.ViewModels;
+
+// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
+
+namespace ModernKeePass.Pages
+{
+ ///
+ /// An empty page that can be used on its own or navigated to within a Frame.
+ ///
+ public sealed partial class SaveDatabasePage : Page
+ {
+ public SaveDatabasePage()
+ {
+ this.InitializeComponent();
+ DataContext = new DatabaseVm();
+ }
+
+ protected override void OnNavigatedTo(NavigationEventArgs e)
+ {
+ base.OnNavigatedTo(e);
+ var app = (App)Application.Current;
+ if (app.Database == null) return;
+ var databaseVm = DataContext as DatabaseVm;
+ if (databaseVm == null) return;
+ databaseVm.IsOpen = app.Database.IsOpen;
+ databaseVm.NotifyPropertyChanged("IsOpen");
+ }
+
+ private void SaveButton_OnClick(object sender, RoutedEventArgs e)
+ {
+ var app = (App) Application.Current;
+ app.Database.Save();
+ app.Database.Close();
+ }
+ }
+}
diff --git a/ModernKeePass/Properties/AssemblyInfo.cs b/ModernKeePass/Properties/AssemblyInfo.cs
index 72c65d3..d29775c 100644
--- a/ModernKeePass/Properties/AssemblyInfo.cs
+++ b/ModernKeePass/Properties/AssemblyInfo.cs
@@ -6,9 +6,9 @@ using System.Runtime.InteropServices;
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("ModernKeePass")]
-[assembly: AssemblyDescription("")]
+[assembly: AssemblyDescription("A port of KeePass 2.x to Modern UI as a Windows Store application")]
[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
+[assembly: AssemblyCompany("wismna")]
[assembly: AssemblyProduct("ModernKeePass")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
diff --git a/ModernKeePass/ViewModels/DatabaseVm.cs b/ModernKeePass/ViewModels/DatabaseVm.cs
new file mode 100644
index 0000000..ce031b0
--- /dev/null
+++ b/ModernKeePass/ViewModels/DatabaseVm.cs
@@ -0,0 +1,25 @@
+using System;
+using System.ComponentModel;
+using Windows.UI.Xaml;
+
+namespace ModernKeePass.ViewModels
+{
+ public class DatabaseVm : INotifyPropertyChanged
+ {
+ private string _name;
+ public Visibility SelectedVisibility { get; set; } = Visibility.Collapsed;
+
+ public bool IsOpen { get; set; }
+ public string Name {
+ get { return string.IsNullOrEmpty(_name) ? string.Empty : $"Database {_name} selected"; }
+ set { _name = value; }
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ public void NotifyPropertyChanged(string propertyName)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+}
diff --git a/ModernKeePass/ViewModels/GroupVm.cs b/ModernKeePass/ViewModels/GroupVm.cs
index 653cfbb..f0a8e46 100644
--- a/ModernKeePass/ViewModels/GroupVm.cs
+++ b/ModernKeePass/ViewModels/GroupVm.cs
@@ -59,8 +59,7 @@ namespace ModernKeePass.ViewModels
Entries.Add(new EntryVm(pwEntry));
NotifyPropertyChanged("Entries");
}
-
-
+
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
diff --git a/ModernKeePass/ViewModels/HomeVm.cs b/ModernKeePass/ViewModels/HomeVm.cs
deleted file mode 100644
index a2f71f9..0000000
--- a/ModernKeePass/ViewModels/HomeVm.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System.ComponentModel;
-using Windows.UI.Xaml;
-
-namespace ModernKeePass.ViewModels
-{
- public class HomeVm : INotifyPropertyChanged
- {
- public string Password { get; set; }
- public Visibility Visibility { get; set; }
- public string ErrorMessage { get; set; }
- public bool IsOpen { get; set; }
-
- public HomeVm()
- {
- Visibility = Visibility.Collapsed;
- }
-
- public event PropertyChangedEventHandler PropertyChanged;
- public void NotifyPropertyChanged(string propertyName)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
- }
-}
diff --git a/ModernKeePass/ViewModels/MainVm.cs b/ModernKeePass/ViewModels/MainVm.cs
new file mode 100644
index 0000000..aa20c8f
--- /dev/null
+++ b/ModernKeePass/ViewModels/MainVm.cs
@@ -0,0 +1,10 @@
+using System.Collections.ObjectModel;
+using ModernKeePass.Models;
+
+namespace ModernKeePass.ViewModels
+{
+ public class MainVm
+ {
+ public ObservableCollection MainMenuItems { get; set; }
+ }
+}