mirror of
https://github.com/wismna/ModernKeePass.git
synced 2025-10-03 15:40:18 -04:00
Groups can now also be manually reordered
Design improvements
This commit is contained in:
@@ -97,6 +97,7 @@
|
|||||||
<Compile Include="Entry\Queries\GetEntry\GetEntryQuery.cs" />
|
<Compile Include="Entry\Queries\GetEntry\GetEntryQuery.cs" />
|
||||||
<Compile Include="Group\Commands\DeleteEntry\DeleteEntryCommand.cs" />
|
<Compile Include="Group\Commands\DeleteEntry\DeleteEntryCommand.cs" />
|
||||||
<Compile Include="Group\Commands\DeleteGroup\DeleteGroupCommand.cs" />
|
<Compile Include="Group\Commands\DeleteGroup\DeleteGroupCommand.cs" />
|
||||||
|
<Compile Include="Group\Commands\MoveGroup\MoveGroupCommand.cs" />
|
||||||
<Compile Include="Group\Commands\UpdateGroup\UpdateGroupCommand.cs" />
|
<Compile Include="Group\Commands\UpdateGroup\UpdateGroupCommand.cs" />
|
||||||
<Compile Include="Group\Queries\GetAllGroups\GetAllGroupsQuery.cs" />
|
<Compile Include="Group\Queries\GetAllGroups\GetAllGroupsQuery.cs" />
|
||||||
<Compile Include="Group\Queries\GetGroup\GetGroupQuery.cs" />
|
<Compile Include="Group\Queries\GetGroup\GetGroupQuery.cs" />
|
||||||
|
@@ -41,6 +41,7 @@ namespace ModernKeePass.Application.Common.Interfaces
|
|||||||
|
|
||||||
GroupEntity GetGroup(string id);
|
GroupEntity GetGroup(string id);
|
||||||
Task AddGroup(string parentGroupId, string groupId);
|
Task AddGroup(string parentGroupId, string groupId);
|
||||||
|
Task MoveGroup(string parentGroupId, string groupId, int index);
|
||||||
void UpdateGroup(GroupEntity group);
|
void UpdateGroup(GroupEntity group);
|
||||||
Task RemoveGroup(string parentGroupId, string groupId);
|
Task RemoveGroup(string parentGroupId, string groupId);
|
||||||
void DeleteEntity(string entityId);
|
void DeleteEntity(string entityId);
|
||||||
|
@@ -0,0 +1,33 @@
|
|||||||
|
using System.Threading.Tasks;
|
||||||
|
using MediatR;
|
||||||
|
using ModernKeePass.Application.Common.Interfaces;
|
||||||
|
using ModernKeePass.Application.Group.Models;
|
||||||
|
using ModernKeePass.Domain.Exceptions;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Application.Group.Commands.MoveGroup
|
||||||
|
{
|
||||||
|
public class MoveGroupCommand : IRequest
|
||||||
|
{
|
||||||
|
public GroupVm ParentGroup { get; set; }
|
||||||
|
public GroupVm Group { get; set; }
|
||||||
|
public int Index { get; set; }
|
||||||
|
|
||||||
|
public class MoveGroupCommandHandler : IAsyncRequestHandler<MoveGroupCommand>
|
||||||
|
{
|
||||||
|
private readonly IDatabaseProxy _database;
|
||||||
|
|
||||||
|
public MoveGroupCommandHandler(IDatabaseProxy database)
|
||||||
|
{
|
||||||
|
_database = database;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task Handle(MoveGroupCommand message)
|
||||||
|
{
|
||||||
|
if (!_database.IsOpen) throw new DatabaseClosedException();
|
||||||
|
|
||||||
|
await _database.MoveGroup(message.ParentGroup.Id, message.Group.Id, message.Index);
|
||||||
|
message.ParentGroup.SubGroups.Insert(message.Index, message.Group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -189,6 +189,20 @@ namespace ModernKeePass.Infrastructure.KeePass
|
|||||||
parentPwGroup.AddGroup(pwGroup, true);
|
parentPwGroup.AddGroup(pwGroup, true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task MoveGroup(string parentGroupId, string groupId, int index)
|
||||||
|
{
|
||||||
|
await Task.Run(() =>
|
||||||
|
{
|
||||||
|
var parentPwGroup = _pwDatabase.RootGroup.FindGroup(BuildIdFromString(parentGroupId), true);
|
||||||
|
var pwGroup = _pwDatabase.RootGroup.FindGroup(BuildIdFromString(groupId), true);
|
||||||
|
var currentIndex = (uint)parentPwGroup.Groups.IndexOf(pwGroup);
|
||||||
|
|
||||||
|
parentPwGroup.Groups.RemoveAt(currentIndex);
|
||||||
|
parentPwGroup.Groups.Insert((uint)index, pwGroup);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public async Task RemoveEntry(string parentGroupId, string entryId)
|
public async Task RemoveEntry(string parentGroupId, string entryId)
|
||||||
{
|
{
|
||||||
await Task.Run(() =>
|
await Task.Run(() =>
|
||||||
|
@@ -376,7 +376,7 @@
|
|||||||
<value>New group</value>
|
<value>New group</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GroupsLeftListView.HeaderLabel" xml:space="preserve">
|
<data name="GroupsLeftListView.HeaderLabel" xml:space="preserve">
|
||||||
<value>Groups</value>
|
<value>Navigation</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="HistoryLeftListView.HeaderLabel" xml:space="preserve">
|
<data name="HistoryLeftListView.HeaderLabel" xml:space="preserve">
|
||||||
<value>History</value>
|
<value>History</value>
|
||||||
@@ -540,4 +540,10 @@
|
|||||||
<data name="EntryDeleteAdditionalField.Content" xml:space="preserve">
|
<data name="EntryDeleteAdditionalField.Content" xml:space="preserve">
|
||||||
<value>Delete</value>
|
<value>Delete</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="ReorderGroupsLabel.Text" xml:space="preserve">
|
||||||
|
<value>Drag and drop groups to reorder them</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryAdditionalFieldNameReserved.Text" xml:space="preserve">
|
||||||
|
<value>Invalid field name</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
@@ -379,7 +379,7 @@
|
|||||||
<value>Nouveau groupe</value>
|
<value>Nouveau groupe</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GroupsLeftListView.HeaderLabel" xml:space="preserve">
|
<data name="GroupsLeftListView.HeaderLabel" xml:space="preserve">
|
||||||
<value>Groupes</value>
|
<value>Navigation</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="HistoryLeftListView.HeaderLabel" xml:space="preserve">
|
<data name="HistoryLeftListView.HeaderLabel" xml:space="preserve">
|
||||||
<value>Historique</value>
|
<value>Historique</value>
|
||||||
@@ -537,4 +537,10 @@
|
|||||||
<data name="EntryDeleteAdditionalField.Content" xml:space="preserve">
|
<data name="EntryDeleteAdditionalField.Content" xml:space="preserve">
|
||||||
<value>Supprimer</value>
|
<value>Supprimer</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="ReorderGroupsLabel.Text" xml:space="preserve">
|
||||||
|
<value>Drag and drop groups to reorder them</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryAdditionalFieldNameReserved.Text" xml:space="preserve">
|
||||||
|
<value>Nom de champ invalide</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
@@ -285,7 +285,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
private GroupVm _parent;
|
private GroupVm _parent;
|
||||||
private EntryVm _selectedItem;
|
private EntryVm _selectedItem;
|
||||||
private int _selectedIndex;
|
private int _selectedIndex;
|
||||||
private int _additionalFieldSelectedIndex;
|
private int _additionalFieldSelectedIndex = -1;
|
||||||
private bool _isEditMode;
|
private bool _isEditMode;
|
||||||
private bool _isRevealPassword;
|
private bool _isRevealPassword;
|
||||||
private double _passwordLength = 25;
|
private double _passwordLength = 25;
|
||||||
@@ -307,11 +307,11 @@ namespace ModernKeePass.ViewModels
|
|||||||
DeleteCommand = new RelayCommand(async () => await AskForDelete());
|
DeleteCommand = new RelayCommand(async () => await AskForDelete());
|
||||||
GoBackCommand = new RelayCommand(() => _navigation.GoBack());
|
GoBackCommand = new RelayCommand(() => _navigation.GoBack());
|
||||||
GoToParentCommand = new RelayCommand(() => GoToGroup(_parent.Id));
|
GoToParentCommand = new RelayCommand(() => GoToGroup(_parent.Id));
|
||||||
AddAdditionalField = new RelayCommand(AddField);
|
AddAdditionalField = new RelayCommand(AddField, () => IsCurrentEntry);
|
||||||
DeleteAdditionalField = new RelayCommand<FieldVm>(async field => await DeleteField(field), field => field != null);
|
DeleteAdditionalField = new RelayCommand<FieldVm>(async field => await DeleteField(field), field => field != null && IsCurrentEntry);
|
||||||
OpenAttachmentCommand = new RelayCommand<Attachment>(async attachment => await OpenAttachment(attachment));
|
OpenAttachmentCommand = new RelayCommand<Attachment>(async attachment => await OpenAttachment(attachment));
|
||||||
AddAttachmentCommand = new RelayCommand(async () => await AddAttachment(), () => IsCurrentEntry);
|
AddAttachmentCommand = new RelayCommand(async () => await AddAttachment(), () => IsCurrentEntry);
|
||||||
DeleteAttachmentCommand = new RelayCommand<Attachment>(async attachment => await DeleteAttachment(attachment));
|
DeleteAttachmentCommand = new RelayCommand<Attachment>(async attachment => await DeleteAttachment(attachment), _ => IsCurrentEntry);
|
||||||
|
|
||||||
MessengerInstance.Register<DatabaseSavedMessage>(this, _ => SaveCommand.RaiseCanExecuteChanged());
|
MessengerInstance.Register<DatabaseSavedMessage>(this, _ => SaveCommand.RaiseCanExecuteChanged());
|
||||||
MessengerInstance.Register<EntryFieldValueChangedMessage>(this, async message => await SetFieldValue(message.FieldName, message.FieldValue));
|
MessengerInstance.Register<EntryFieldValueChangedMessage>(this, async message => await SetFieldValue(message.FieldName, message.FieldValue));
|
||||||
|
@@ -20,6 +20,7 @@ using ModernKeePass.Application.Group.Commands.CreateEntry;
|
|||||||
using ModernKeePass.Application.Group.Commands.CreateGroup;
|
using ModernKeePass.Application.Group.Commands.CreateGroup;
|
||||||
using ModernKeePass.Application.Group.Commands.DeleteGroup;
|
using ModernKeePass.Application.Group.Commands.DeleteGroup;
|
||||||
using ModernKeePass.Application.Group.Commands.MoveEntry;
|
using ModernKeePass.Application.Group.Commands.MoveEntry;
|
||||||
|
using ModernKeePass.Application.Group.Commands.MoveGroup;
|
||||||
using ModernKeePass.Application.Group.Commands.RemoveGroup;
|
using ModernKeePass.Application.Group.Commands.RemoveGroup;
|
||||||
using ModernKeePass.Application.Group.Commands.SortEntries;
|
using ModernKeePass.Application.Group.Commands.SortEntries;
|
||||||
using ModernKeePass.Application.Group.Commands.SortGroups;
|
using ModernKeePass.Application.Group.Commands.SortGroups;
|
||||||
@@ -106,6 +107,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
private GroupVm _parent;
|
private GroupVm _parent;
|
||||||
private bool _isEditMode;
|
private bool _isEditMode;
|
||||||
private EntryVm _reorderedEntry;
|
private EntryVm _reorderedEntry;
|
||||||
|
private GroupVm _reorderedGroup;
|
||||||
|
|
||||||
public GroupDetailVm(IMediator mediator, IResourceProxy resource, INavigationService navigation, IDialogService dialog, INotificationService notification)
|
public GroupDetailVm(IMediator mediator, IResourceProxy resource, INavigationService navigation, IDialogService dialog, INotificationService notification)
|
||||||
{
|
{
|
||||||
@@ -139,6 +141,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
Entries = new ObservableCollection<EntryVm>(_group.Entries);
|
Entries = new ObservableCollection<EntryVm>(_group.Entries);
|
||||||
Entries.CollectionChanged += Entries_CollectionChanged;
|
Entries.CollectionChanged += Entries_CollectionChanged;
|
||||||
Groups = new ObservableCollection<GroupVm>(_group.SubGroups);
|
Groups = new ObservableCollection<GroupVm>(_group.SubGroups);
|
||||||
|
Groups.CollectionChanged += Groups_CollectionChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GoToEntry(string entryId, bool isNew = false)
|
public void GoToEntry(string entryId, bool isNew = false)
|
||||||
@@ -213,6 +216,29 @@ namespace ModernKeePass.ViewModels
|
|||||||
SaveCommand.RaiseCanExecuteChanged();
|
SaveCommand.RaiseCanExecuteChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async void Groups_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
switch (e.Action)
|
||||||
|
{
|
||||||
|
case NotifyCollectionChangedAction.Remove:
|
||||||
|
var oldIndex = e.OldStartingIndex;
|
||||||
|
_reorderedGroup = _group.SubGroups[oldIndex];
|
||||||
|
break;
|
||||||
|
case NotifyCollectionChangedAction.Add:
|
||||||
|
if (_reorderedGroup == null)
|
||||||
|
{
|
||||||
|
var group = (GroupVm)e.NewItems[0];
|
||||||
|
await _mediator.Send(new AddGroupCommand() { GroupId = group.Id, ParentGroupId = Id });
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await _mediator.Send(new MoveGroupCommand { Group = _reorderedGroup, ParentGroup = _group, Index = e.NewStartingIndex });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
SaveCommand.RaiseCanExecuteChanged();
|
||||||
|
}
|
||||||
|
|
||||||
private async Task SortEntriesAsync()
|
private async Task SortEntriesAsync()
|
||||||
{
|
{
|
||||||
await _mediator.Send(new SortEntriesCommand {Group = _group});
|
await _mediator.Send(new SortEntriesCommand {Group = _group});
|
||||||
|
@@ -445,7 +445,6 @@
|
|||||||
<TimePicker Margin="0,10,0,0" Time="{Binding ExpiryTime, Mode=TwoWay}" />
|
<TimePicker Margin="0,10,0,0" Time="{Binding ExpiryTime, Mode=TwoWay}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<VisualStateManager.VisualStateGroups>
|
<VisualStateManager.VisualStateGroups>
|
||||||
<VisualStateGroup>
|
<VisualStateGroup>
|
||||||
@@ -496,10 +495,10 @@
|
|||||||
ItemContainerStyle="{StaticResource ListViewLeftIndicatorItemExpanded}">
|
ItemContainerStyle="{StaticResource ListViewLeftIndicatorItemExpanded}">
|
||||||
<local:SelectableTemplateListView.SelectedItemTemplate>
|
<local:SelectableTemplateListView.SelectedItemTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<StackPanel Orientation="Vertical">
|
<StackPanel Orientation="Vertical" Margin="5">
|
||||||
<TextBox Text="{Binding Name, Mode=TwoWay}" Width="350"
|
<TextBox Text="{Binding Name, Mode=TwoWay}" Width="350"
|
||||||
IsEnabled="{Binding Path=DataContext.IsCurrentEntry, ElementName=Page}" />
|
IsEnabled="{Binding Path=DataContext.IsCurrentEntry, ElementName=Page}" />
|
||||||
<TextBox HorizontalAlignment="Left" AcceptsReturn="True" Height="100" TextWrapping="Wrap" Width="350"
|
<TextBox HorizontalAlignment="Left" AcceptsReturn="True" Height="100" TextWrapping="Wrap" Width="350" Margin="0,5,0,0"
|
||||||
Text="{Binding Value, Mode=TwoWay}"
|
Text="{Binding Value, Mode=TwoWay}"
|
||||||
IsEnabled="{Binding Path=DataContext.IsCurrentEntry, ElementName=Page}" />
|
IsEnabled="{Binding Path=DataContext.IsCurrentEntry, ElementName=Page}" />
|
||||||
<Button x:Uid="EntryDeleteAdditionalField" HorizontalAlignment="Right" Command="{Binding Path=DataContext.DeleteAdditionalField, ElementName=Page}" CommandParameter="{Binding}" />
|
<Button x:Uid="EntryDeleteAdditionalField" HorizontalAlignment="Right" Command="{Binding Path=DataContext.DeleteAdditionalField, ElementName=Page}" CommandParameter="{Binding}" />
|
||||||
@@ -508,7 +507,7 @@
|
|||||||
</local:SelectableTemplateListView.SelectedItemTemplate>
|
</local:SelectableTemplateListView.SelectedItemTemplate>
|
||||||
<local:SelectableTemplateListView.ItemTemplate>
|
<local:SelectableTemplateListView.ItemTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<StackPanel Orientation="Vertical">
|
<StackPanel Orientation="Vertical" Margin="5">
|
||||||
<TextBlock Text="{Binding Name}" Style="{StaticResource EntryTextBlockStyle}" FontWeight="SemiBold" />
|
<TextBlock Text="{Binding Name}" Style="{StaticResource EntryTextBlockStyle}" FontWeight="SemiBold" />
|
||||||
<TextBlock HorizontalAlignment="Left" MaxLines="3" FontSize="12" Margin="2,0,2,5" Text="{Binding Value}" Style="{StaticResource EntryTextBlockStyle}"/>
|
<TextBlock HorizontalAlignment="Left" MaxLines="3" FontSize="12" Margin="2,0,2,5" Text="{Binding Value}" Style="{StaticResource EntryTextBlockStyle}"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
@@ -556,6 +555,8 @@
|
|||||||
<Grid Grid.Row="0" Background="{ThemeResource AppBarBackgroundThemeBrush}">
|
<Grid Grid.Row="0" Background="{ThemeResource AppBarBackgroundThemeBrush}">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="{StaticResource MenuWidthGridLength}"/>
|
<ColumnDefinition Width="{StaticResource MenuWidthGridLength}"/>
|
||||||
|
<ColumnDefinition Width="{StaticResource MenuWidthGridLength}"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
<ColumnDefinition Width="Auto"/>
|
<ColumnDefinition Width="Auto"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
@@ -569,44 +570,41 @@
|
|||||||
Style="{StaticResource NoBorderButtonStyle}">
|
Style="{StaticResource NoBorderButtonStyle}">
|
||||||
<SymbolIcon Symbol="Back" />
|
<SymbolIcon Symbol="Back" />
|
||||||
</Button>
|
</Button>
|
||||||
<StackPanel Grid.Column="1" Orientation="Horizontal">
|
<Button Grid.Column="1"
|
||||||
<Button
|
Height="{StaticResource MenuHeight}"
|
||||||
Height="{StaticResource MenuHeight}"
|
Width="{StaticResource MenuWidth}"
|
||||||
Width="{StaticResource MenuWidth}"
|
Command="{Binding GoToParentCommand}"
|
||||||
Command="{Binding GoToParentCommand}"
|
Style="{StaticResource NoBorderButtonStyle}">
|
||||||
Style="{StaticResource NoBorderButtonStyle}">
|
<SymbolIcon Symbol="Up" />
|
||||||
<SymbolIcon Symbol="Up" />
|
<ToolTipService.ToolTip>
|
||||||
<ToolTipService.ToolTip>
|
<ToolTip Content="{Binding ParentGroupName}" />
|
||||||
<ToolTip Content="{Binding ParentGroupName}" />
|
</ToolTipService.ToolTip>
|
||||||
</ToolTipService.ToolTip>
|
</Button>
|
||||||
</Button>
|
<Viewbox Grid.Column="2" MaxHeight="200">
|
||||||
<Viewbox MaxHeight="200">
|
<SymbolIcon Symbol="{Binding Icon}" Width="100" Height="70" />
|
||||||
<SymbolIcon Symbol="{Binding Icon}" Width="100" Height="70" />
|
</Viewbox>
|
||||||
</Viewbox>
|
<TextBox Grid.Column="3"
|
||||||
<TextBox
|
x:Uid="EntryTitle"
|
||||||
x:Uid="EntryTitle"
|
x:Name="TitleTextBox"
|
||||||
x:Name="TitleTextBox"
|
Text="{Binding Title, Mode=TwoWay}"
|
||||||
Text="{Binding Title, Mode=TwoWay}"
|
Background="Transparent"
|
||||||
Background="Transparent"
|
IsHitTestVisible="{Binding IsEditMode}"
|
||||||
IsHitTestVisible="{Binding IsEditMode}"
|
FontSize="20"
|
||||||
FontSize="20"
|
FontWeight="Light"
|
||||||
FontWeight="Light"
|
TextWrapping="NoWrap"
|
||||||
TextWrapping="NoWrap"
|
VerticalAlignment="Center">
|
||||||
MinWidth="360"
|
<interactivity:Interaction.Behaviors>
|
||||||
VerticalAlignment="Center">
|
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="True">
|
||||||
<interactivity:Interaction.Behaviors>
|
<actions:SetupFocusAction TargetObject="{Binding ElementName=TitleTextBox}" />
|
||||||
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="True">
|
<core:ChangePropertyAction TargetObject="{Binding ElementName=TitleTextBox}" PropertyName="BorderThickness" Value="2" />
|
||||||
<actions:SetupFocusAction TargetObject="{Binding ElementName=TitleTextBox}" />
|
</core:DataTriggerBehavior>
|
||||||
<core:ChangePropertyAction TargetObject="{Binding ElementName=TitleTextBox}" PropertyName="BorderThickness" Value="2" />
|
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="False">
|
||||||
</core:DataTriggerBehavior>
|
<core:ChangePropertyAction TargetObject="{Binding ElementName=TitleTextBox}" PropertyName="BorderThickness" Value="0" />
|
||||||
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="False">
|
</core:DataTriggerBehavior>
|
||||||
<core:ChangePropertyAction TargetObject="{Binding ElementName=TitleTextBox}" PropertyName="BorderThickness" Value="0" />
|
</interactivity:Interaction.Behaviors>
|
||||||
</core:DataTriggerBehavior>
|
</TextBox>
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</TextBox>
|
|
||||||
</StackPanel>
|
|
||||||
<userControls:TopMenuUserControl
|
<userControls:TopMenuUserControl
|
||||||
x:Name="TopMenu" Grid.Column="2"
|
x:Name="TopMenu" Grid.Column="4"
|
||||||
IsEditButtonChecked="{Binding IsEditMode, Mode=TwoWay}"
|
IsEditButtonChecked="{Binding IsEditMode, Mode=TwoWay}"
|
||||||
MoveButtonVisibility="{Binding IsCurrentEntry, Converter={StaticResource BooleanToVisibilityConverter}}"
|
MoveButtonVisibility="{Binding IsCurrentEntry, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||||
RestoreButtonVisibility="{Binding IsCurrentEntry, Converter={StaticResource InverseBooleanToVisibilityConverter}}"
|
RestoreButtonVisibility="{Binding IsCurrentEntry, Converter={StaticResource InverseBooleanToVisibilityConverter}}"
|
||||||
|
@@ -48,6 +48,7 @@
|
|||||||
x:Name="HamburgerMenu"
|
x:Name="HamburgerMenu"
|
||||||
x:Uid="GroupsLeftListView"
|
x:Uid="GroupsLeftListView"
|
||||||
ItemsSource="{Binding Groups}"
|
ItemsSource="{Binding Groups}"
|
||||||
|
CanDragItems="{Binding IsEditMode}"
|
||||||
SelectionChanged="groups_SelectionChanged"
|
SelectionChanged="groups_SelectionChanged"
|
||||||
ActionButtonCommand="{Binding CreateGroupCommand}"
|
ActionButtonCommand="{Binding CreateGroupCommand}"
|
||||||
IsButtonVisible="Visible" />
|
IsButtonVisible="Visible" />
|
||||||
@@ -62,7 +63,6 @@
|
|||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<TextBlock Grid.Column="0" Grid.Row="0" x:Uid="ReorderEntriesLabel" Margin="10,10,0,0" Visibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}" Style="{StaticResource BodyTextBlockStyle}" />
|
<TextBlock Grid.Column="0" Grid.Row="0" x:Uid="ReorderEntriesLabel" Margin="10,10,0,0" Visibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}" Style="{StaticResource BodyTextBlockStyle}" />
|
||||||
<!--<TextBlock Grid.Column="1" Grid.Row="0" x:Uid="EntrySymbol" Margin="40,20,0,0" Visibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}" Style="{StaticResource BodyTextBlockStyle}" />-->
|
|
||||||
<HyperlinkButton Grid.Column="2" Grid.Row="0" VerticalAlignment="Top" Command="{Binding CreateEntryCommand}" HorizontalAlignment="Right">
|
<HyperlinkButton Grid.Column="2" Grid.Row="0" VerticalAlignment="Top" Command="{Binding CreateEntryCommand}" HorizontalAlignment="Right">
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
<SymbolIcon Symbol="Add">
|
<SymbolIcon Symbol="Add">
|
||||||
@@ -88,12 +88,11 @@
|
|||||||
IsSynchronizedWithCurrentItem="False"
|
IsSynchronizedWithCurrentItem="False"
|
||||||
BorderBrush="{StaticResource ListViewItemSelectedBackgroundThemeBrush}"
|
BorderBrush="{StaticResource ListViewItemSelectedBackgroundThemeBrush}"
|
||||||
AllowDrop="True"
|
AllowDrop="True"
|
||||||
CanReorderItems="True"
|
CanReorderItems="{Binding IsEditMode}"
|
||||||
CanDragItems="True"
|
CanDragItems="{Binding IsEditMode}">
|
||||||
DragItemsStarting="GridView_DragItemsStarting">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
<interactivity:Interaction.Behaviors>
|
||||||
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="False">
|
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="False">
|
||||||
<actions:SetupFocusAction TargetObject="{Binding ElementName=GridView}" />
|
<actions:SetupFocusAction TargetObject="{Binding}" />
|
||||||
</core:DataTriggerBehavior>
|
</core:DataTriggerBehavior>
|
||||||
</interactivity:Interaction.Behaviors>
|
</interactivity:Interaction.Behaviors>
|
||||||
<GridView.ItemTemplate>
|
<GridView.ItemTemplate>
|
||||||
@@ -183,6 +182,8 @@
|
|||||||
<Grid Grid.Row="0" Background="{ThemeResource AppBarBackgroundThemeBrush}">
|
<Grid Grid.Row="0" Background="{ThemeResource AppBarBackgroundThemeBrush}">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="{StaticResource MenuWidthGridLength}"/>
|
<ColumnDefinition Width="{StaticResource MenuWidthGridLength}"/>
|
||||||
|
<ColumnDefinition Width="{StaticResource MenuWidthGridLength}"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
<ColumnDefinition Width="Auto"/>
|
<ColumnDefinition Width="Auto"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
@@ -196,24 +197,23 @@
|
|||||||
Style="{StaticResource NoBorderButtonStyle}">
|
Style="{StaticResource NoBorderButtonStyle}">
|
||||||
<SymbolIcon Symbol="Back" />
|
<SymbolIcon Symbol="Back" />
|
||||||
</Button>
|
</Button>
|
||||||
<StackPanel Grid.Column="1" Orientation="Horizontal">
|
<Button Grid.Column="1"
|
||||||
<Button
|
Height="{StaticResource MenuHeight}"
|
||||||
Height="{StaticResource MenuHeight}"
|
Width="{StaticResource MenuWidth}"
|
||||||
Width="{StaticResource MenuWidth}"
|
Command="{Binding GoToParentCommand}"
|
||||||
Command="{Binding GoToParentCommand}"
|
Style="{StaticResource NoBorderButtonStyle}">
|
||||||
Style="{StaticResource NoBorderButtonStyle}">
|
<SymbolIcon Symbol="Up" />
|
||||||
<SymbolIcon Symbol="Up" />
|
<ToolTipService.ToolTip>
|
||||||
<ToolTipService.ToolTip>
|
<ToolTip Content="{Binding ParentGroupName}" />
|
||||||
<ToolTip Content="{Binding ParentGroupName}" />
|
</ToolTipService.ToolTip>
|
||||||
</ToolTipService.ToolTip>
|
</Button>
|
||||||
</Button>
|
<Viewbox Grid.Column="2" MaxHeight="200" Visibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}">
|
||||||
<Viewbox MaxHeight="200" Visibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}">
|
<userControls:SymbolPickerUserControl Width="100" Height="70" SelectedSymbol="{Binding Icon, Mode=TwoWay}" />
|
||||||
<userControls:SymbolPickerUserControl Width="100" Height="70" SelectedSymbol="{Binding Icon, Mode=TwoWay}" />
|
</Viewbox>
|
||||||
</Viewbox>
|
<Viewbox Grid.Column="2" MaxHeight="200" Visibility="{Binding IsEditMode, Converter={StaticResource InverseBooleanToVisibilityConverter}}">
|
||||||
<Viewbox MaxHeight="200" Visibility="{Binding IsEditMode, Converter={StaticResource InverseBooleanToVisibilityConverter}}">
|
<SymbolIcon Symbol="{Binding Icon}" Width="100" Height="70" />
|
||||||
<SymbolIcon Symbol="{Binding Icon}" Width="100" Height="70" />
|
</Viewbox>
|
||||||
</Viewbox>
|
<TextBox Grid.Column="3"
|
||||||
<TextBox
|
|
||||||
x:Uid="GroupTitle"
|
x:Uid="GroupTitle"
|
||||||
x:Name="TitleTextBox"
|
x:Name="TitleTextBox"
|
||||||
Text="{Binding Title, Mode=TwoWay}"
|
Text="{Binding Title, Mode=TwoWay}"
|
||||||
@@ -222,20 +222,18 @@
|
|||||||
FontSize="20"
|
FontSize="20"
|
||||||
FontWeight="Light"
|
FontWeight="Light"
|
||||||
TextWrapping="NoWrap"
|
TextWrapping="NoWrap"
|
||||||
MinWidth="360"
|
|
||||||
VerticalAlignment="Center">
|
VerticalAlignment="Center">
|
||||||
<interactivity:Interaction.Behaviors>
|
<interactivity:Interaction.Behaviors>
|
||||||
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="True">
|
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="True">
|
||||||
<actions:SetupFocusAction TargetObject="{Binding ElementName=TitleTextBox}" />
|
<actions:SetupFocusAction TargetObject="{Binding ElementName=TitleTextBox}" />
|
||||||
<core:ChangePropertyAction TargetObject="{Binding ElementName=TitleTextBox}" PropertyName="BorderThickness" Value="2" />
|
<core:ChangePropertyAction TargetObject="{Binding ElementName=TitleTextBox}" PropertyName="BorderThickness" Value="2" />
|
||||||
</core:DataTriggerBehavior>
|
</core:DataTriggerBehavior>
|
||||||
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="False">
|
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="False">
|
||||||
<core:ChangePropertyAction TargetObject="{Binding ElementName=TitleTextBox}" PropertyName="BorderThickness" Value="0" />
|
<core:ChangePropertyAction TargetObject="{Binding ElementName=TitleTextBox}" PropertyName="BorderThickness" Value="0" />
|
||||||
</core:DataTriggerBehavior>
|
</core:DataTriggerBehavior>
|
||||||
</interactivity:Interaction.Behaviors>
|
</interactivity:Interaction.Behaviors>
|
||||||
</TextBox>
|
</TextBox>
|
||||||
</StackPanel>
|
<userControls:TopMenuUserControl x:Name="TopMenu" Grid.Column="4"
|
||||||
<userControls:TopMenuUserControl x:Name="TopMenu" Grid.Column="2"
|
|
||||||
SortButtonVisibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}"
|
SortButtonVisibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||||
IsEditButtonChecked="{Binding IsEditMode, Mode=TwoWay}"
|
IsEditButtonChecked="{Binding IsEditMode, Mode=TwoWay}"
|
||||||
SaveCommand="{Binding SaveCommand}"
|
SaveCommand="{Binding SaveCommand}"
|
||||||
@@ -252,22 +250,6 @@
|
|||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
<VisualStateManager.VisualStateGroups>
|
<VisualStateManager.VisualStateGroups>
|
||||||
<VisualStateGroup x:Name="DragDropGroup">
|
|
||||||
<VisualState x:Name="Dragging">
|
|
||||||
<Storyboard>
|
|
||||||
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="GridView" Storyboard.TargetProperty="BorderThickness">
|
|
||||||
<DiscreteObjectKeyFrame KeyTime="0" Value="2"/>
|
|
||||||
</ObjectAnimationUsingKeyFrames>
|
|
||||||
</Storyboard>
|
|
||||||
</VisualState>
|
|
||||||
<VisualState x:Name="Dropped">
|
|
||||||
<Storyboard>
|
|
||||||
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="GridView" Storyboard.TargetProperty="BorderThickness">
|
|
||||||
<DiscreteObjectKeyFrame KeyTime="0" Value="0"/>
|
|
||||||
</ObjectAnimationUsingKeyFrames>
|
|
||||||
</Storyboard>
|
|
||||||
</VisualState>
|
|
||||||
</VisualStateGroup>
|
|
||||||
<VisualStateGroup x:Name="PageLayout">
|
<VisualStateGroup x:Name="PageLayout">
|
||||||
<VisualState x:Name="Small">
|
<VisualState x:Name="Small">
|
||||||
<Storyboard>
|
<Storyboard>
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
using Windows.ApplicationModel.DataTransfer;
|
using Windows.UI.Xaml;
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using Windows.UI.Xaml.Controls;
|
using Windows.UI.Xaml.Controls;
|
||||||
using Windows.UI.Xaml.Navigation;
|
using Windows.UI.Xaml.Navigation;
|
||||||
using ModernKeePass.Application.Entry.Models;
|
using ModernKeePass.Application.Entry.Models;
|
||||||
@@ -75,12 +74,6 @@ namespace ModernKeePass.Views
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GridView_DragItemsStarting(object sender, DragItemsStartingEventArgs e)
|
|
||||||
{
|
|
||||||
e.Cancel = !Model.IsEditMode;
|
|
||||||
e.Data.RequestedOperation = DataPackageOperation.Move;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GroupDetailPage_OnSizeChanged(object sender, SizeChangedEventArgs e)
|
private void GroupDetailPage_OnSizeChanged(object sender, SizeChangedEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.NewSize.Width <= 640)
|
if (e.NewSize.Width <= 640)
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
<UserControl.Resources>
|
<UserControl.Resources>
|
||||||
<converters:IconToSymbolConverter x:Key="IconToSymbolConverter"/>
|
<converters:IconToSymbolConverter x:Key="IconToSymbolConverter"/>
|
||||||
|
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
|
||||||
</UserControl.Resources>
|
</UserControl.Resources>
|
||||||
<Grid HorizontalAlignment="Left">
|
<Grid HorizontalAlignment="Left">
|
||||||
<VisualStateManager.VisualStateGroups>
|
<VisualStateManager.VisualStateGroups>
|
||||||
@@ -79,6 +80,9 @@
|
|||||||
<ListView
|
<ListView
|
||||||
x:Name="ListView"
|
x:Name="ListView"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
|
AllowDrop="True"
|
||||||
|
CanReorderItems="{Binding CanDragItems, ElementName=UserControl}"
|
||||||
|
CanDragItems="{Binding CanDragItems, ElementName=UserControl}"
|
||||||
ItemsSource="{Binding ItemsSource, ElementName=UserControl}"
|
ItemsSource="{Binding ItemsSource, ElementName=UserControl}"
|
||||||
SelectionChanged="Selector_OnSelectionChanged"
|
SelectionChanged="Selector_OnSelectionChanged"
|
||||||
SelectedItem="{Binding SelectedItem, ElementName=UserControl, Mode=TwoWay}"
|
SelectedItem="{Binding SelectedItem, ElementName=UserControl, Mode=TwoWay}"
|
||||||
@@ -148,6 +152,7 @@
|
|||||||
</interactivity:Interaction.Behaviors>
|
</interactivity:Interaction.Behaviors>
|
||||||
</controls:TextBoxWithButton>
|
</controls:TextBoxWithButton>
|
||||||
<Border BorderBrush="DarkGray" BorderThickness="0,0,0,1" />
|
<Border BorderBrush="DarkGray" BorderThickness="0,0,0,1" />
|
||||||
|
<TextBlock x:Uid="ReorderGroupsLabel" Margin="10,0,0,10" Visibility="{Binding CanDragItems, ElementName=UserControl, Converter={StaticResource BooleanToVisibilityConverter}}" TextWrapping="NoWrap" Style="{StaticResource BodyTextBlockStyle}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</ListView.HeaderTemplate>
|
</ListView.HeaderTemplate>
|
||||||
|
@@ -111,6 +111,18 @@ namespace ModernKeePass.Views.UserControls
|
|||||||
typeof(HamburgerMenuUserControl),
|
typeof(HamburgerMenuUserControl),
|
||||||
new PropertyMetadata(false, (o, args) => { }));
|
new PropertyMetadata(false, (o, args) => { }));
|
||||||
|
|
||||||
|
public bool CanDragItems
|
||||||
|
{
|
||||||
|
get { return (bool)GetValue(CanDragItemsProperty); }
|
||||||
|
set { SetValue(CanDragItemsProperty, value); }
|
||||||
|
}
|
||||||
|
public static readonly DependencyProperty CanDragItemsProperty =
|
||||||
|
DependencyProperty.Register(
|
||||||
|
nameof(CanDragItems),
|
||||||
|
typeof(bool),
|
||||||
|
typeof(HamburgerMenuUserControl),
|
||||||
|
new PropertyMetadata(false, (o, args) => { }));
|
||||||
|
|
||||||
public ICommand ActionButtonCommand
|
public ICommand ActionButtonCommand
|
||||||
{
|
{
|
||||||
get { return (ICommand)GetValue(ActionButtonCommandProperty); }
|
get { return (ICommand)GetValue(ActionButtonCommandProperty); }
|
||||||
|
@@ -150,7 +150,6 @@
|
|||||||
<Button.Flyout>
|
<Button.Flyout>
|
||||||
<MenuFlyout Opening="OverflowFlyout_OnOpening">
|
<MenuFlyout Opening="OverflowFlyout_OnOpening">
|
||||||
<MenuFlyoutItem x:Uid="TopMenuSaveFlyout" x:Name="SaveFlyout" />
|
<MenuFlyoutItem x:Uid="TopMenuSaveFlyout" x:Name="SaveFlyout" />
|
||||||
<MenuFlyoutItem x:Uid="TopMenuMoveFlyout" x:Name="MoveFlyout" Visibility="{Binding MoveButtonVisibility, ElementName=UserControl}" />
|
|
||||||
<MenuFlyoutItem x:Uid="TopMenuRestoreFlyout" x:Name="RestoreFlyout" Visibility="{Binding RestoreButtonVisibility, ElementName=UserControl}" />
|
<MenuFlyoutItem x:Uid="TopMenuRestoreFlyout" x:Name="RestoreFlyout" Visibility="{Binding RestoreButtonVisibility, ElementName=UserControl}" />
|
||||||
<ToggleMenuFlyoutItem x:Uid="TopMenuEditFlyout" x:Name="EditFlyout" IsChecked="{Binding IsEditButtonChecked, ElementName=UserControl, Mode=TwoWay}" Click="EditButton_Click" />
|
<ToggleMenuFlyoutItem x:Uid="TopMenuEditFlyout" x:Name="EditFlyout" IsChecked="{Binding IsEditButtonChecked, ElementName=UserControl, Mode=TwoWay}" Click="EditButton_Click" />
|
||||||
<MenuFlyoutItem x:Uid="TopMenuDeleteFlyout" x:Name="DeleteFlyout" />
|
<MenuFlyoutItem x:Uid="TopMenuDeleteFlyout" x:Name="DeleteFlyout" />
|
||||||
|
@@ -170,7 +170,6 @@ namespace ModernKeePass.Views.UserControls
|
|||||||
{
|
{
|
||||||
EditFlyout.IsChecked = IsEditButtonChecked;
|
EditFlyout.IsChecked = IsEditButtonChecked;
|
||||||
|
|
||||||
MoveFlyout.Visibility = MoveButtonVisibility;
|
|
||||||
RestoreFlyout.Visibility = RestoreButtonVisibility;
|
RestoreFlyout.Visibility = RestoreButtonVisibility;
|
||||||
SortEntriesFlyout.Visibility = SortButtonVisibility;
|
SortEntriesFlyout.Visibility = SortButtonVisibility;
|
||||||
SortGroupsFlyout.Visibility = SortButtonVisibility;
|
SortGroupsFlyout.Visibility = SortButtonVisibility;
|
||||||
@@ -196,7 +195,7 @@ namespace ModernKeePass.Views.UserControls
|
|||||||
|
|
||||||
private void GroupSearchBox_OnSuggestionsRequested(SearchBox sender, SearchBoxSuggestionsRequestedEventArgs args)
|
private void GroupSearchBox_OnSuggestionsRequested(SearchBox sender, SearchBoxSuggestionsRequestedEventArgs args)
|
||||||
{
|
{
|
||||||
var imageUri = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appdata://Assets/ModernKeePass-SmallLogo.scale-80.png"));
|
var imageUri = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appdata:/Assets/ModernKeePass-SmallLogo.scale-80.png"));
|
||||||
var groups = Model.Groups.Where(g => g.Title.IndexOf(args.QueryText, StringComparison.OrdinalIgnoreCase) >= 0).Take(5);
|
var groups = Model.Groups.Where(g => g.Title.IndexOf(args.QueryText, StringComparison.OrdinalIgnoreCase) >= 0).Take(5);
|
||||||
foreach (var group in groups)
|
foreach (var group in groups)
|
||||||
{
|
{
|
||||||
@@ -218,7 +217,7 @@ namespace ModernKeePass.Views.UserControls
|
|||||||
|
|
||||||
private async void EntrySearchBox_OnSuggestionsRequested(SearchBox sender, SearchBoxSuggestionsRequestedEventArgs args)
|
private async void EntrySearchBox_OnSuggestionsRequested(SearchBox sender, SearchBoxSuggestionsRequestedEventArgs args)
|
||||||
{
|
{
|
||||||
var imageUri = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appdata://Assets/ModernKeePass-SmallLogo.scale-80.png"));
|
var imageUri = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appdata:/Assets/ModernKeePass-SmallLogo.scale-80.png"));
|
||||||
var results = (await Model.Search(args.QueryText)).Take(5);
|
var results = (await Model.Search(args.QueryText)).Take(5);
|
||||||
foreach (var result in results)
|
foreach (var result in results)
|
||||||
{
|
{
|
||||||
|
@@ -372,10 +372,6 @@
|
|||||||
<HintPath>..\packages\HockeySDK.WINRT.4.1.6\lib\portable-win81\Microsoft.HockeyApp.Kit.dll</HintPath>
|
<HintPath>..\packages\HockeySDK.WINRT.4.1.6\lib\portable-win81\Microsoft.HockeyApp.Kit.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Microsoft.Toolkit.Uwp.Notifications, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\packages\Microsoft.Toolkit.Uwp.Notifications.2.0.0\lib\dotnet\Microsoft.Toolkit.Uwp.Notifications.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="ModernKeePassLib, Version=2.44.3.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="ModernKeePassLib, Version=2.44.3.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\ModernKeePassLib.2.44.3\lib\netstandard1.2\ModernKeePassLib.dll</HintPath>
|
<HintPath>..\packages\ModernKeePassLib.2.44.3\lib\netstandard1.2\ModernKeePassLib.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
|
@@ -1,2 +1,4 @@
|
|||||||
Support for additional fields
|
Support for additional fields
|
||||||
Support for attachments
|
Support for attachments
|
||||||
|
Ability to manually reorder groups
|
||||||
|
Design changes
|
@@ -1,2 +1,4 @@
|
|||||||
Ajout des champs additionnels
|
Ajout des champs additionnels
|
||||||
Ajout des pi<70>ces-jointes
|
Ajout des pi<70>ces-jointes
|
||||||
|
Possibilite de reorganiser les groupes manuellement
|
||||||
|
Quelques changements de design
|
@@ -14,7 +14,6 @@
|
|||||||
<package id="Microsoft.NETCore.Platforms" version="2.1.1" targetFramework="win81" />
|
<package id="Microsoft.NETCore.Platforms" version="2.1.1" targetFramework="win81" />
|
||||||
<package id="Microsoft.NETCore.Portable.Compatibility" version="1.0.1" targetFramework="win81" />
|
<package id="Microsoft.NETCore.Portable.Compatibility" version="1.0.1" targetFramework="win81" />
|
||||||
<package id="Microsoft.NETCore.UniversalWindowsPlatform" version="6.1.7" targetFramework="win81" />
|
<package id="Microsoft.NETCore.UniversalWindowsPlatform" version="6.1.7" targetFramework="win81" />
|
||||||
<package id="Microsoft.Toolkit.Uwp.Notifications" version="2.0.0" targetFramework="win81" />
|
|
||||||
<package id="ModernKeePassLib" version="2.44.3" targetFramework="win81" />
|
<package id="ModernKeePassLib" version="2.44.3" targetFramework="win81" />
|
||||||
<package id="MvvmLight" version="5.4.1.1" targetFramework="win81" />
|
<package id="MvvmLight" version="5.4.1.1" targetFramework="win81" />
|
||||||
<package id="MvvmLightLibs" version="5.4.1.1" targetFramework="win81" />
|
<package id="MvvmLightLibs" version="5.4.1.1" targetFramework="win81" />
|
||||||
|
Reference in New Issue
Block a user