mirror of
https://github.com/wismna/ModernKeePass.git
synced 2025-10-03 15:40:18 -04:00
RecycleBin now uses resources
RecycleBin bugs correction
This commit is contained in:
@@ -191,7 +191,9 @@ namespace ModernKeePass
|
|||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
|
#if DEBUG
|
||||||
ToastNotificationHelper.ShowErrorToast(exception);
|
ToastNotificationHelper.ShowErrorToast(exception);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
deferral.Complete();
|
deferral.Complete();
|
||||||
}
|
}
|
||||||
|
@@ -15,7 +15,7 @@ namespace ModernKeePass.Interfaces
|
|||||||
GroupVm RootGroup { get; set; }
|
GroupVm RootGroup { get; set; }
|
||||||
GroupVm RecycleBin { get; set; }
|
GroupVm RecycleBin { get; set; }
|
||||||
StorageFile DatabaseFile { get; set; }
|
StorageFile DatabaseFile { get; set; }
|
||||||
CompositeKey CompositeKey { get; }
|
CompositeKey CompositeKey { get; set; }
|
||||||
PwUuid DataCipher { get; set; }
|
PwUuid DataCipher { get; set; }
|
||||||
PwCompressionAlgorithm CompressionAlgorithm { get; set; }
|
PwCompressionAlgorithm CompressionAlgorithm { get; set; }
|
||||||
KdfParameters KeyDerivation { get; set; }
|
KdfParameters KeyDerivation { get; set; }
|
||||||
@@ -26,10 +26,9 @@ namespace ModernKeePass.Interfaces
|
|||||||
|
|
||||||
Task Open(CompositeKey key, bool createNew = false);
|
Task Open(CompositeKey key, bool createNew = false);
|
||||||
Task ReOpen();
|
Task ReOpen();
|
||||||
void UpdateCompositeKey(CompositeKey key);
|
|
||||||
void Save();
|
void Save();
|
||||||
void Save(StorageFile file);
|
void Save(StorageFile file);
|
||||||
void CreateRecycleBin();
|
void CreateRecycleBin(string title);
|
||||||
void AddDeletedItem(PwUuid id);
|
void AddDeletedItem(PwUuid id);
|
||||||
Task Close(bool releaseFile = true);
|
Task Close(bool releaseFile = true);
|
||||||
}
|
}
|
||||||
|
@@ -34,6 +34,6 @@ namespace ModernKeePass.Interfaces
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Delete from ViewModel
|
/// Delete from ViewModel
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void MarkForDelete();
|
void MarkForDelete(string recycleBinTitle);
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -32,7 +32,7 @@ namespace ModernKeePass.Services
|
|||||||
set
|
set
|
||||||
{
|
{
|
||||||
_recycleBin = value;
|
_recycleBin = value;
|
||||||
_pwDatabase.RecycleBinUuid = _recycleBin.IdUuid;
|
_pwDatabase.RecycleBinUuid = _recycleBin?.IdUuid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,7 +57,11 @@ namespace ModernKeePass.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public CompositeKey CompositeKey => _compositeKey;
|
public CompositeKey CompositeKey
|
||||||
|
{
|
||||||
|
get { return _compositeKey; }
|
||||||
|
set { _compositeKey = value; }
|
||||||
|
}
|
||||||
|
|
||||||
public PwUuid DataCipher
|
public PwUuid DataCipher
|
||||||
{
|
{
|
||||||
@@ -137,8 +141,7 @@ namespace ModernKeePass.Services
|
|||||||
CreationCollisionOption.FailIfExists);
|
CreationCollisionOption.FailIfExists);
|
||||||
Save(backupFile);
|
Save(backupFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Status = (int)DatabaseStatus.Opened;
|
|
||||||
RootGroup = new GroupVm(_pwDatabase.RootGroup, null, RecycleBinEnabled ? _pwDatabase.RecycleBinUuid : null);
|
RootGroup = new GroupVm(_pwDatabase.RootGroup, null, RecycleBinEnabled ? _pwDatabase.RecycleBinUuid : null);
|
||||||
}
|
}
|
||||||
catch (InvalidCompositeKeyException ex)
|
catch (InvalidCompositeKeyException ex)
|
||||||
@@ -215,18 +218,13 @@ namespace ModernKeePass.Services
|
|||||||
_pwDatabase.DeletedObjects.Add(new PwDeletedObject(id, DateTime.UtcNow));
|
_pwDatabase.DeletedObjects.Add(new PwDeletedObject(id, DateTime.UtcNow));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CreateRecycleBin()
|
public void CreateRecycleBin(string title)
|
||||||
{
|
{
|
||||||
RecycleBin = RootGroup.AddNewGroup("Recycle bin");
|
RecycleBin = RootGroup.AddNewGroup(title);
|
||||||
RecycleBin.IsSelected = true;
|
RecycleBin.IsSelected = true;
|
||||||
RecycleBin.IconSymbol = Symbol.Delete;
|
RecycleBin.IconSymbol = Symbol.Delete;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateCompositeKey(CompositeKey key)
|
|
||||||
{
|
|
||||||
_pwDatabase.MasterKey = key;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CreateSampleData()
|
private void CreateSampleData()
|
||||||
{
|
{
|
||||||
_pwDatabase.RootGroup.AddGroup(new PwGroup(true, true, "Banking", PwIcon.Count), true);
|
_pwDatabase.RootGroup.AddGroup(new PwGroup(true, true, "Banking", PwIcon.Count), true);
|
||||||
|
@@ -204,9 +204,6 @@
|
|||||||
<data name="EntryDeletingConfirmation" xml:space="preserve">
|
<data name="EntryDeletingConfirmation" xml:space="preserve">
|
||||||
<value>Are you sure you want to delete this entry?</value>
|
<value>Are you sure you want to delete this entry?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EntryNew" xml:space="preserve">
|
|
||||||
<value>< New entry ></value>
|
|
||||||
</data>
|
|
||||||
<data name="EntryRecycled" xml:space="preserve">
|
<data name="EntryRecycled" xml:space="preserve">
|
||||||
<value>Entry moved to the Recycle bin</value>
|
<value>Entry moved to the Recycle bin</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -222,9 +219,6 @@
|
|||||||
<data name="GroupDeletingConfirmation" xml:space="preserve">
|
<data name="GroupDeletingConfirmation" xml:space="preserve">
|
||||||
<value>Are you sure you want to delete the whole group and all its entries?</value>
|
<value>Are you sure you want to delete the whole group and all its entries?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GroupNew" xml:space="preserve">
|
|
||||||
<value>< New group ></value>
|
|
||||||
</data>
|
|
||||||
<data name="GroupRecycled" xml:space="preserve">
|
<data name="GroupRecycled" xml:space="preserve">
|
||||||
<value>Group moved to the Recycle bin</value>
|
<value>Group moved to the Recycle bin</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -276,4 +270,7 @@
|
|||||||
<data name="SettingsMenuItemSave" xml:space="preserve">
|
<data name="SettingsMenuItemSave" xml:space="preserve">
|
||||||
<value>Saving</value>
|
<value>Saving</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="RecycleBinTitle" xml:space="preserve">
|
||||||
|
<value>Recycle Bin</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
@@ -214,10 +214,10 @@
|
|||||||
<value>Filter...</value>
|
<value>Filter...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GroupNewItemTextBox.Text" xml:space="preserve">
|
<data name="GroupNewItemTextBox.Text" xml:space="preserve">
|
||||||
<value>< New group ></value>
|
<value>New group</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GroupNewItemTooltip.Content" xml:space="preserve">
|
<data name="GroupNewItemTooltip.Content" xml:space="preserve">
|
||||||
<value>< New group ></value>
|
<value>New group</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GroupSearch.PlaceholderText" xml:space="preserve">
|
<data name="GroupSearch.PlaceholderText" xml:space="preserve">
|
||||||
<value>Search...</value>
|
<value>Search...</value>
|
||||||
|
@@ -204,10 +204,6 @@
|
|||||||
<data name="EntryDeletingConfirmation" xml:space="preserve">
|
<data name="EntryDeletingConfirmation" xml:space="preserve">
|
||||||
<value>Êtes-vous sûr de vouloir supprimer cette entrée ?</value>
|
<value>Êtes-vous sûr de vouloir supprimer cette entrée ?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EntryNew" xml:space="preserve">
|
|
||||||
<value>< Nouvelle entrée ></value>
|
|
||||||
<comment>Unused</comment>
|
|
||||||
</data>
|
|
||||||
<data name="EntryRecycled" xml:space="preserve">
|
<data name="EntryRecycled" xml:space="preserve">
|
||||||
<value>Entrée placée dans la Corbeille</value>
|
<value>Entrée placée dans la Corbeille</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -223,9 +219,6 @@
|
|||||||
<data name="GroupDeletingConfirmation" xml:space="preserve">
|
<data name="GroupDeletingConfirmation" xml:space="preserve">
|
||||||
<value>Êtes-vous sûr de vouloir supprimer ce group et toutes ses entrées ?</value>
|
<value>Êtes-vous sûr de vouloir supprimer ce group et toutes ses entrées ?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GroupNew" xml:space="preserve">
|
|
||||||
<value>< Nouveau groupe ></value>
|
|
||||||
</data>
|
|
||||||
<data name="GroupRecycled" xml:space="preserve">
|
<data name="GroupRecycled" xml:space="preserve">
|
||||||
<value>Groupe placé dans la Corbeille</value>
|
<value>Groupe placé dans la Corbeille</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -277,4 +270,7 @@
|
|||||||
<data name="SettingsMenuItemSave" xml:space="preserve">
|
<data name="SettingsMenuItemSave" xml:space="preserve">
|
||||||
<value>Sauvegardes</value>
|
<value>Sauvegardes</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="RecycleBinTitle" xml:space="preserve">
|
||||||
|
<value>Corbeille</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
@@ -214,10 +214,10 @@
|
|||||||
<value>Filtrer...</value>
|
<value>Filtrer...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GroupNewItemTextBox.Text" xml:space="preserve">
|
<data name="GroupNewItemTextBox.Text" xml:space="preserve">
|
||||||
<value>< Nouveau groupe ></value>
|
<value>Nouveau groupe</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GroupNewItemTooltip.Content" xml:space="preserve">
|
<data name="GroupNewItemTooltip.Content" xml:space="preserve">
|
||||||
<value>< Nouveau groupe ></value>
|
<value>Nouveau groupe</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GroupSearch.PlaceholderText" xml:space="preserve">
|
<data name="GroupSearch.PlaceholderText" xml:space="preserve">
|
||||||
<value>Rechercher...</value>
|
<value>Rechercher...</value>
|
||||||
|
@@ -2,7 +2,6 @@
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Windows.Storage;
|
using Windows.Storage;
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
using ModernKeePass.Services;
|
using ModernKeePass.Services;
|
||||||
@@ -154,7 +153,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
public void UpdateKey()
|
public void UpdateKey()
|
||||||
{
|
{
|
||||||
Database.UpdateCompositeKey(CreateCompositeKey());
|
Database.CompositeKey = CreateCompositeKey();
|
||||||
UpdateStatus(_resource.GetResourceValue("CompositeKeyUpdated"), StatusTypes.Success);
|
UpdateStatus(_resource.GetResourceValue("CompositeKeyUpdated"), StatusTypes.Success);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -219,10 +219,10 @@ namespace ModernKeePass.ViewModels
|
|||||||
_pwEntry?.Strings.Set(key, new ProtectedString(true, newValue));
|
_pwEntry?.Strings.Set(key, new ProtectedString(true, newValue));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MarkForDelete()
|
public void MarkForDelete(string recycleBinTitle)
|
||||||
{
|
{
|
||||||
if (_database.RecycleBinEnabled && _database.RecycleBin?.IdUuid == null)
|
if (_database.RecycleBinEnabled && _database.RecycleBin?.IdUuid == null)
|
||||||
_database.CreateRecycleBin();
|
_database.CreateRecycleBin(recycleBinTitle);
|
||||||
Move(_database.RecycleBinEnabled && !ParentGroup.IsSelected ? _database.RecycleBin : null);
|
Move(_database.RecycleBinEnabled && !ParentGroup.IsSelected ? _database.RecycleBin : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -153,10 +153,10 @@ namespace ModernKeePass.ViewModels
|
|||||||
return newEntry;
|
return newEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MarkForDelete()
|
public void MarkForDelete(string recycleBinTitle)
|
||||||
{
|
{
|
||||||
if (_database.RecycleBinEnabled && _database.RecycleBin?.IdUuid == null)
|
if (_database.RecycleBinEnabled && _database.RecycleBin?.IdUuid == null)
|
||||||
_database.CreateRecycleBin();
|
_database.CreateRecycleBin(recycleBinTitle);
|
||||||
Move(_database.RecycleBinEnabled && !IsSelected ? _database.RecycleBin : null);
|
Move(_database.RecycleBinEnabled && !IsSelected ? _database.RecycleBin : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,7 +165,6 @@ namespace ModernKeePass.ViewModels
|
|||||||
Move(PreviousGroup);
|
Move(PreviousGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[DatabaseChanged]
|
[DatabaseChanged]
|
||||||
public void Move(GroupVm destination)
|
public void Move(GroupVm destination)
|
||||||
{
|
{
|
||||||
@@ -194,7 +193,6 @@ namespace ModernKeePass.ViewModels
|
|||||||
_database.Save();
|
_database.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[DatabaseChanged]
|
[DatabaseChanged]
|
||||||
public void SortEntries()
|
public void SortEntries()
|
||||||
{
|
{
|
||||||
@@ -210,7 +208,6 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[DatabaseChanged]
|
[DatabaseChanged]
|
||||||
public void SortGroups()
|
public void SortGroups()
|
||||||
{
|
{
|
||||||
|
@@ -27,6 +27,15 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsNewRecycleBin
|
||||||
|
{
|
||||||
|
get { return _database.RecycleBin == null; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value) _database.RecycleBin = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ObservableCollection<GroupVm> Groups { get; set; }
|
public ObservableCollection<GroupVm> Groups { get; set; }
|
||||||
|
|
||||||
public IEnumerable<string> Ciphers
|
public IEnumerable<string> Ciphers
|
||||||
@@ -73,7 +82,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
get { return Groups.FirstOrDefault(g => g.IsSelected); }
|
get { return Groups.FirstOrDefault(g => g.IsSelected); }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (_selectedItem == value) return;
|
if (_selectedItem == value || IsNewRecycleBin) return;
|
||||||
if (_selectedItem != null)
|
if (_selectedItem != null)
|
||||||
{
|
{
|
||||||
_selectedItem.IsSelected = false;
|
_selectedItem.IsSelected = false;
|
||||||
|
@@ -81,7 +81,7 @@ namespace ModernKeePass.Views
|
|||||||
resource.GetResourceValue("EntityDeleteCancelButton"), a =>
|
resource.GetResourceValue("EntityDeleteCancelButton"), a =>
|
||||||
{
|
{
|
||||||
ToastNotificationHelper.ShowMovedToast(Model, resource.GetResourceValue("EntityDeleting"), text);
|
ToastNotificationHelper.ShowMovedToast(Model, resource.GetResourceValue("EntityDeleting"), text);
|
||||||
Model.MarkForDelete();
|
Model.MarkForDelete(resource.GetResourceValue("RecycleBinTitle"));
|
||||||
if (Frame.CanGoBack) Frame.GoBack();
|
if (Frame.CanGoBack) Frame.GoBack();
|
||||||
}, null);
|
}, null);
|
||||||
}
|
}
|
||||||
|
@@ -117,7 +117,7 @@ namespace ModernKeePass.Views
|
|||||||
resource.GetResourceValue("EntityDeleteCancelButton"), a =>
|
resource.GetResourceValue("EntityDeleteCancelButton"), a =>
|
||||||
{
|
{
|
||||||
ToastNotificationHelper.ShowMovedToast(Model, resource.GetResourceValue("EntityDeleting"), text);
|
ToastNotificationHelper.ShowMovedToast(Model, resource.GetResourceValue("EntityDeleting"), text);
|
||||||
Model.MarkForDelete();
|
Model.MarkForDelete(resource.GetResourceValue("RecycleBinTitle"));
|
||||||
if (Frame.CanGoBack) Frame.GoBack();
|
if (Frame.CanGoBack) Frame.GoBack();
|
||||||
}, null);
|
}, null);
|
||||||
}
|
}
|
||||||
|
@@ -22,7 +22,7 @@
|
|||||||
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
|
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
|
||||||
<ToggleSwitch x:Uid="SettingsDatabaseRecycleBin" IsOn="{Binding HasRecycleBin, Mode=TwoWay}" />
|
<ToggleSwitch x:Uid="SettingsDatabaseRecycleBin" IsOn="{Binding HasRecycleBin, Mode=TwoWay}" />
|
||||||
<StackPanel Visibility="{Binding HasRecycleBin, Converter={StaticResource BooleanToVisibilityConverter}}">
|
<StackPanel Visibility="{Binding HasRecycleBin, Converter={StaticResource BooleanToVisibilityConverter}}">
|
||||||
<RadioButton x:Uid="SettingsDatabaseRecycleBinCreate" GroupName="Recycle" IsChecked="True" />
|
<RadioButton x:Uid="SettingsDatabaseRecycleBinCreate" GroupName="Recycle" IsChecked="{Binding IsNewRecycleBin, Mode=TwoWay}" />
|
||||||
<RadioButton x:Name="RadioButton" x:Uid="SettingsDatabaseRecycleBinExisting" GroupName="Recycle" IsChecked="{Binding SelectedItem, Converter={StaticResource NullToBooleanConverter}}" />
|
<RadioButton x:Name="RadioButton" x:Uid="SettingsDatabaseRecycleBinExisting" GroupName="Recycle" IsChecked="{Binding SelectedItem, Converter={StaticResource NullToBooleanConverter}}" />
|
||||||
<ComboBox ItemsSource="{Binding Source={StaticResource RecycleBinGroups}}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" IsEnabled="{Binding IsChecked, ElementName=RadioButton}" />
|
<ComboBox ItemsSource="{Binding Source={StaticResource RecycleBinGroups}}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" IsEnabled="{Binding IsChecked, ElementName=RadioButton}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
@@ -19,7 +19,11 @@ namespace ModernKeePassApp.Test.Mock
|
|||||||
|
|
||||||
public StorageFile DatabaseFile { get; set; }
|
public StorageFile DatabaseFile { get; set; }
|
||||||
|
|
||||||
public CompositeKey CompositeKey => _compositeKey;
|
public CompositeKey CompositeKey
|
||||||
|
{
|
||||||
|
get { return _compositeKey; }
|
||||||
|
set { _compositeKey = value; }
|
||||||
|
}
|
||||||
|
|
||||||
public PwUuid DataCipher { get; set; }
|
public PwUuid DataCipher { get; set; }
|
||||||
|
|
||||||
@@ -55,7 +59,7 @@ namespace ModernKeePassApp.Test.Mock
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CreateRecycleBin()
|
public void CreateRecycleBin(string title)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
@@ -84,10 +88,5 @@ namespace ModernKeePassApp.Test.Mock
|
|||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateCompositeKey(CompositeKey key)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using ModernKeePass.Interfaces;
|
||||||
using ModernKeePass.Interfaces;
|
|
||||||
|
|
||||||
namespace ModernKeePassApp.Test.Mock
|
namespace ModernKeePassApp.Test.Mock
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user