mirror of
https://github.com/KeyKeeperApp/KeyKeeper.git
synced 2026-04-22 23:46:29 +03:00
escape to close CreateVaultDialog + fix indentation in XAML
This commit is contained in:
@@ -3,91 +3,92 @@
|
||||
x:Class="KeyKeeper.Views.CreateVaultFileWindow"
|
||||
Title="Create New Vault"
|
||||
Background="#fff"
|
||||
Focusable="True"
|
||||
Icon="/Assets/icon.ico"
|
||||
Width="600" Height="450"
|
||||
WindowStartupLocation="CenterOwner"
|
||||
CanResize="False"
|
||||
x:Name="ThisWindow">
|
||||
|
||||
<Grid ColumnDefinitions="1.5*, 2*">
|
||||
<!-- Левая синяя панель -->
|
||||
<Border Background="#2328C4" Grid.Column="0">
|
||||
<StackPanel VerticalAlignment="Center" Margin="20">
|
||||
<TextBlock Text="Choose where to save your password database and set a master password"
|
||||
<Grid ColumnDefinitions="1.5*, 2*">
|
||||
<!-- Левая синяя панель -->
|
||||
<Border Background="#2328C4" Grid.Column="0">
|
||||
<StackPanel VerticalAlignment="Center" Margin="20">
|
||||
<TextBlock Text="Choose where to save your password database and set a master password"
|
||||
TextWrapping="Wrap"
|
||||
Foreground="#E0E0FF"
|
||||
FontSize="20"
|
||||
TextAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Правая белая панель с формой -->
|
||||
<ScrollViewer Grid.Column="1" VerticalScrollBarVisibility="Auto">
|
||||
<StackPanel Margin="30" VerticalAlignment="Center" Spacing="20">
|
||||
<TextBlock Text="Create new vault"
|
||||
<!-- Правая белая панель с формой -->
|
||||
<ScrollViewer Grid.Column="1" VerticalScrollBarVisibility="Auto">
|
||||
<StackPanel Margin="30" VerticalAlignment="Center" Spacing="20">
|
||||
<TextBlock Text="Create new vault"
|
||||
FontSize="22"
|
||||
FontWeight="Bold"
|
||||
Foreground="#2328C4"/>
|
||||
|
||||
<!-- Выбор файла -->
|
||||
<StackPanel Spacing="10">
|
||||
<TextBlock Text="File location" FontWeight="SemiBold" Foreground="Black" />
|
||||
<Grid ColumnDefinitions="*, Auto" ColumnSpacing="10">
|
||||
<TextBox x:Name="FilePathTextBox"
|
||||
<!-- Выбор файла -->
|
||||
<StackPanel Spacing="10">
|
||||
<TextBlock Text="File location" FontWeight="SemiBold" Foreground="Black" />
|
||||
<Grid ColumnDefinitions="*, Auto" ColumnSpacing="10">
|
||||
<TextBox x:Name="FilePathTextBox"
|
||||
Grid.Column="0"
|
||||
Watermark="Select file path..."
|
||||
Padding="10,8"/>
|
||||
<Button x:Name="BrowseButton"
|
||||
<Button x:Name="BrowseButton"
|
||||
Grid.Column="1"
|
||||
Content="Browse..."
|
||||
Classes="secondaryButton"
|
||||
Padding="15,8"
|
||||
Click="BrowseButton_Click"/>
|
||||
</Grid>
|
||||
<TextBlock x:Name="PathWarning"
|
||||
</Grid>
|
||||
<TextBlock x:Name="PathWarning"
|
||||
FontSize="12"
|
||||
Foreground="Orange"
|
||||
Text=" "/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Ввод мастер-пароля -->
|
||||
<StackPanel Spacing="10">
|
||||
<TextBlock Text="Master password" FontWeight="SemiBold" Foreground="Black" />
|
||||
<TextBox x:Name="PasswordBox"
|
||||
<!-- Ввод мастер-пароля -->
|
||||
<StackPanel Spacing="10">
|
||||
<TextBlock Text="Master password" FontWeight="SemiBold" Foreground="Black" />
|
||||
<TextBox x:Name="PasswordBox"
|
||||
PasswordChar="*"
|
||||
Watermark="Enter password"
|
||||
Padding="10,8"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Spacing="10">
|
||||
<TextBlock Text="Confirm password" FontWeight="SemiBold" Foreground="Black" />
|
||||
<TextBox x:Name="ConfirmPasswordBox"
|
||||
<StackPanel Spacing="10">
|
||||
<TextBlock Text="Confirm password" FontWeight="SemiBold" Foreground="Black" />
|
||||
<TextBox x:Name="ConfirmPasswordBox"
|
||||
PasswordChar="*"
|
||||
Watermark="Confirm password"
|
||||
Padding="10,8"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Сообщение об ошибке пароля -->
|
||||
<TextBlock x:Name="PasswordErrorText"
|
||||
<!-- Сообщение об ошибке пароля -->
|
||||
<TextBlock x:Name="PasswordErrorText"
|
||||
FontSize="12"
|
||||
Foreground="Red"
|
||||
Text=""
|
||||
IsVisible="False"/>
|
||||
|
||||
<!-- Кнопки действий -->
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Spacing="10" Margin="0,20,0,0">
|
||||
<Button Content="Cancel"
|
||||
<!-- Кнопки действий -->
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Spacing="10" Margin="0,20,0,0">
|
||||
<Button Content="Cancel"
|
||||
Classes="secondaryButton"
|
||||
Width="80"
|
||||
Click="CancelButton_Click"/>
|
||||
<Button x:Name="CreateButton"
|
||||
<Button x:Name="CreateButton"
|
||||
Content="Create"
|
||||
Classes="accentButton"
|
||||
Width="80"
|
||||
IsEnabled="False"
|
||||
Click="CreateButton_Click"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</Grid>
|
||||
</Window>
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Interactivity;
|
||||
using Avalonia.Platform.Storage;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace KeyKeeper.Views
|
||||
{
|
||||
@@ -22,6 +21,8 @@ namespace KeyKeeper.Views
|
||||
FilePathTextBox.TextChanged += OnTextChanged;
|
||||
PasswordBox.TextChanged += OnPasswordTextChanged;
|
||||
ConfirmPasswordBox.TextChanged += OnPasswordTextChanged;
|
||||
|
||||
KeyDown += CreateVaultDialog_KeyDown;
|
||||
}
|
||||
|
||||
private async void OnTextChanged(object? sender, TextChangedEventArgs e)
|
||||
@@ -60,6 +61,18 @@ namespace KeyKeeper.Views
|
||||
CreateButton.IsEnabled = pathValid && passwordsEntered;
|
||||
}
|
||||
|
||||
private void CreateVaultDialog_KeyDown(object? sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.Key == Key.Escape)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
else if (e.Key == Key.Enter && CreateButton.IsEnabled)
|
||||
{
|
||||
Submit();
|
||||
}
|
||||
}
|
||||
|
||||
private async void BrowseButton_Click(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
var file = await StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions
|
||||
@@ -83,6 +96,11 @@ namespace KeyKeeper.Views
|
||||
}
|
||||
|
||||
private void CreateButton_Click(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
Submit();
|
||||
}
|
||||
|
||||
private void Submit()
|
||||
{
|
||||
string path = FilePathTextBox.Text ?? "";
|
||||
if (string.IsNullOrWhiteSpace(path))
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
xmlns:i="using:Avalonia.Interactivity"
|
||||
xmlns:kkp="using:KeyKeeper.Views"
|
||||
x:Class="KeyKeeper.Views.RepositoryWindow"
|
||||
Closing="RepositoryWindow_Closing"
|
||||
Closing="RepositoryWindow_Closing"
|
||||
Title="KeyKeeper - Password store"
|
||||
CanResize="False"
|
||||
Width="800"
|
||||
@@ -12,17 +12,19 @@
|
||||
Background="White"
|
||||
x:DataType="vm:RepositoryWindowViewModel">
|
||||
|
||||
<Window.DataTemplates>
|
||||
<DataTemplate DataType="{x:Type vm:UnlockedRepositoryViewModel}">
|
||||
<Grid>
|
||||
<!-- Синий левый край -->
|
||||
<Border Width="200"
|
||||
Background="#2328C4"
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Stretch"/>
|
||||
<StackPanel Margin="20" HorizontalAlignment="Left">
|
||||
<!-- Надпись KeyKeeper -->
|
||||
<TextBlock Text="KeyKeeper"
|
||||
<Window.DataTemplates>
|
||||
<DataTemplate DataType="{x:Type vm:UnlockedRepositoryViewModel}">
|
||||
<Grid>
|
||||
<!-- Синий левый край -->
|
||||
<Border Width="200"
|
||||
Background="#2328C4"
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Stretch"/>
|
||||
|
||||
<StackPanel Margin="20" HorizontalAlignment="Left">
|
||||
|
||||
<!-- Надпись KeyKeeper -->
|
||||
<TextBlock Text="KeyKeeper"
|
||||
FontSize="32"
|
||||
FontWeight="Bold"
|
||||
HorizontalAlignment="Left"
|
||||
@@ -36,13 +38,16 @@
|
||||
Margin="0,0,0,12"
|
||||
IsVisible="{Binding $parent[Window].DataContext.LockTimerDisplay,
|
||||
Converter={x:Static StringConverters.IsNotNullOrEmpty}}">
|
||||
|
||||
<StackPanel Orientation="Horizontal" Spacing="6" VerticalAlignment="Center">
|
||||
|
||||
<!-- Иконка замка (Material Design lock outline) -->
|
||||
<Path Fill="White"
|
||||
VerticalAlignment="Center"
|
||||
Width="13" Height="13"
|
||||
Stretch="Uniform"
|
||||
Data="M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z"/>
|
||||
|
||||
<TextBlock Text="{Binding $parent[Window].DataContext.LockTimerDisplay}"
|
||||
Foreground="White"
|
||||
FontSize="13"
|
||||
@@ -51,122 +56,126 @@
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Рамочка -->
|
||||
<!-- <Border BorderBrush="Gray"
|
||||
BorderThickness="1"
|
||||
CornerRadius="5"
|
||||
Padding="20"
|
||||
Background="#F5F5F5"
|
||||
HorizontalAlignment="Left">
|
||||
<!-- Рамочка -->
|
||||
<!-- <Border BorderBrush="Gray"
|
||||
BorderThickness="1"
|
||||
CornerRadius="5"
|
||||
Padding="20"
|
||||
Background="#F5F5F5"
|
||||
HorizontalAlignment="Left">
|
||||
|
||||
<StackPanel HorizontalAlignment="Left">
|
||||
<Button Content="All Passwords"
|
||||
Width="120"
|
||||
Height="30"
|
||||
HorizontalAlignment="Left"/>
|
||||
</StackPanel>
|
||||
<StackPanel HorizontalAlignment="Left">
|
||||
<Button Content="All Passwords"
|
||||
Width="120"
|
||||
Height="30"
|
||||
HorizontalAlignment="Left"/>
|
||||
</StackPanel>
|
||||
|
||||
</Border> -->
|
||||
<!-- Save Passwords -->
|
||||
<Button Content="Save Passwords"
|
||||
Classes="accentSidebarButton"
|
||||
Click="SaveButton_Click"
|
||||
Height="30"
|
||||
HorizontalAlignment="Left"
|
||||
Margin="0,20,0,0"/>
|
||||
|
||||
<!-- New Entry -->
|
||||
<Button Content="New Entry"
|
||||
</Border> -->
|
||||
<!-- Save Passwords -->
|
||||
<Button Content="Save Passwords"
|
||||
Classes="accentSidebarButton"
|
||||
Click="AddEntryButton_Click"
|
||||
Click="SaveButton_Click"
|
||||
Height="30"
|
||||
HorizontalAlignment="Left"
|
||||
Margin="0,20,0,0"/>
|
||||
|
||||
<!-- Edit Selected Entry -->
|
||||
<Button Content="Edit Selected Entry"
|
||||
Classes="accentSidebarButton"
|
||||
Click="EditEntryButton_Click"
|
||||
Height="30"
|
||||
HorizontalAlignment="Left"
|
||||
Margin="0,20,0,0"/>
|
||||
</StackPanel>
|
||||
<!-- New Entry -->
|
||||
<Button Content="New Entry"
|
||||
Classes="accentSidebarButton"
|
||||
Click="AddEntryButton_Click"
|
||||
Height="30"
|
||||
HorizontalAlignment="Left"
|
||||
Margin="0,20,0,0"/>
|
||||
|
||||
<!-- ListBox с паролями -->
|
||||
<ListBox x:Name="PasswordsListBox"
|
||||
Width="580"
|
||||
Margin="210 10 10 10"
|
||||
ItemsSource="{Binding Passwords}"
|
||||
Background="Transparent"
|
||||
SelectionMode="Single">
|
||||
<ListBox.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<WrapPanel Orientation="Horizontal" />
|
||||
</ItemsPanelTemplate>
|
||||
</ListBox.ItemsPanel>
|
||||
<!-- Edit Selected Entry -->
|
||||
<Button Content="Edit Selected Entry"
|
||||
Classes="accentSidebarButton"
|
||||
Click="EditEntryButton_Click"
|
||||
Height="30"
|
||||
HorizontalAlignment="Left"
|
||||
Margin="0,20,0,0"/>
|
||||
</StackPanel>
|
||||
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Border Background="Transparent" DoubleTapped="Entry_DoubleTapped">
|
||||
<StackPanel Width="100"
|
||||
<!-- ListBox с паролями -->
|
||||
<ListBox x:Name="PasswordsListBox"
|
||||
Width="580"
|
||||
Margin="210 10 10 10"
|
||||
ItemsSource="{Binding Passwords}"
|
||||
Background="Transparent"
|
||||
SelectionMode="Single">
|
||||
|
||||
<ListBox.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<WrapPanel Orientation="Horizontal"/>
|
||||
</ItemsPanelTemplate>
|
||||
</ListBox.ItemsPanel>
|
||||
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Border Background="Transparent" DoubleTapped="Entry_DoubleTapped">
|
||||
|
||||
<StackPanel Width="100"
|
||||
Margin="10"
|
||||
HorizontalAlignment="Center">
|
||||
<Svg Path="{Binding IconPath}" Width="48" Height="48"/>
|
||||
<TextBlock Text="{Binding Name}"
|
||||
|
||||
<Svg Path="{Binding IconPath}" Width="48" Height="48"/>
|
||||
<TextBlock Text="{Binding Name}"
|
||||
HorizontalAlignment="Center"
|
||||
Foreground="Black" />
|
||||
<TextBlock Text="{Binding Username.Value}"
|
||||
<TextBlock Text="{Binding Username.Value}"
|
||||
Foreground="#666"
|
||||
HorizontalAlignment="Center" />
|
||||
</StackPanel>
|
||||
<Border.ContextMenu>
|
||||
<ContextMenu>
|
||||
<MenuItem Name="entryCtxMenuCopyUsername" Header="Copy username" Click="EntryContextMenuItem_Click"/>
|
||||
<MenuItem Name="entryCtxMenuCopyPassword" Header="Copy password" Click="EntryContextMenuItem_Click"/>
|
||||
<!-- Новый пункт меню "Edit" -->
|
||||
<MenuItem Name="entryCtxMenuEdit" Header="Edit" Click="EntryContextMenuItem_Click"/>
|
||||
<MenuItem Name="entryCtxMenuDelete" Header="Delete" Click="EntryContextMenuItem_Click"/>
|
||||
</ContextMenu>
|
||||
</Border.ContextMenu>
|
||||
</Border>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
</StackPanel>
|
||||
<Border.ContextMenu>
|
||||
<ContextMenu>
|
||||
<MenuItem Name="entryCtxMenuCopyUsername" Header="Copy username" Click="EntryContextMenuItem_Click"/>
|
||||
<MenuItem Name="entryCtxMenuCopyPassword" Header="Copy password" Click="EntryContextMenuItem_Click"/>
|
||||
<MenuItem Name="entryCtxMenuEdit" Header="Edit" Click="EntryContextMenuItem_Click"/>
|
||||
<MenuItem Name="entryCtxMenuDelete" Header="Delete" Click="EntryContextMenuItem_Click"/>
|
||||
</ContextMenu>
|
||||
</Border.ContextMenu>
|
||||
</Border>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
|
||||
<kkp:ToastNotificationHost x:Name="NotificationHost"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Margin="20"
|
||||
Duration="0:0:2" />
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
<kkp:ToastNotificationHost x:Name="NotificationHost"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Margin="20"
|
||||
Duration="0:0:2" />
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
|
||||
<DataTemplate DataType="{x:Type vm:LockedRepositoryViewModel}">
|
||||
<StackPanel Margin="20"
|
||||
<DataTemplate DataType="{x:Type vm:LockedRepositoryViewModel}">
|
||||
<StackPanel Margin="20"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Spacing="10">
|
||||
<TextBlock Text="Enter credentials to unlock"
|
||||
|
||||
<TextBlock Text="Enter credentials to unlock"
|
||||
Foreground="#2328C4"
|
||||
FontSize="32" />
|
||||
|
||||
<TextBox x:Name="UnlockPasswordEdit"
|
||||
<TextBox x:Name="UnlockPasswordEdit"
|
||||
Text="{Binding UnlockPassword, Mode=TwoWay}"
|
||||
PasswordChar="*"
|
||||
Width="450"
|
||||
Loaded="UnlockPasswordEdit_Loaded">
|
||||
<TextBox.KeyBindings>
|
||||
<KeyBinding Gesture="Return" Command="{Binding TryUnlock}"/>
|
||||
</TextBox.KeyBindings>
|
||||
</TextBox>
|
||||
|
||||
<Button x:Name="UnlockButton"
|
||||
<TextBox.KeyBindings>
|
||||
<KeyBinding Gesture="Return" Command="{Binding TryUnlock}"/>
|
||||
</TextBox.KeyBindings>
|
||||
</TextBox>
|
||||
|
||||
<Button x:Name="UnlockButton"
|
||||
Command="{Binding TryUnlock}"
|
||||
HorizontalAlignment="Center"
|
||||
Content="Unlock!" />
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</Window.DataTemplates>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</Window.DataTemplates>
|
||||
|
||||
<ContentControl Content="{Binding CurrentPage}"/>
|
||||
<ContentControl Content="{Binding CurrentPage}"/>
|
||||
</Window>
|
||||
|
||||
Reference in New Issue
Block a user