Browse Source

ShortcutsPopup wip

Krzysztof Krysiński 1 year ago
parent
commit
0a38b59b97

+ 23 - 0
src/PixiEditor.AvaloniaUI/Helpers/Converters/KeyToStringConverter.cs

@@ -0,0 +1,23 @@
+using System.Globalization;
+using Avalonia.Input;
+using PixiEditor.Extensions.Common.Localization;
+
+namespace PixiEditor.AvaloniaUI.Helpers.Converters;
+
+internal class KeyToStringConverter
+    : SingleInstanceConverter<KeyToStringConverter>
+{
+    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
+        value switch
+        {
+            Key key => (object)InputKeyHelpers.GetKeyboardKey(key),
+            KeyModifiers modifier => modifier switch
+            {
+                KeyModifiers.Control => new LocalizedString("CTRL_KEY"),
+                KeyModifiers.Shift => new LocalizedString("SHIFT_KEY"),
+                KeyModifiers.Alt => new LocalizedString("ALT_KEY"),
+                _ => modifier.ToString()
+            },
+            _ => string.Empty
+        };
+}

+ 33 - 0
src/PixiEditor.AvaloniaUI/Helpers/Converters/ModifierFlagToModifiersConverter.cs

@@ -0,0 +1,33 @@
+using System.Collections.Generic;
+using System.Globalization;
+using Avalonia.Input;
+
+namespace PixiEditor.AvaloniaUI.Helpers.Converters;
+
+internal class ModifierFlagToModifiersConverter : SingleInstanceConverter<ModifierFlagToModifiersConverter>
+{
+    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+    {
+        return GetModifiers((KeyModifiers)value);
+    }
+
+    private IEnumerable<KeyModifiers> GetModifiers(KeyModifiers keys)
+    {
+        if (keys.HasFlag(KeyModifiers.Meta))
+        {
+            yield return KeyModifiers.Meta;
+        }
+        else if (keys.HasFlag(KeyModifiers.Control))
+        {
+            yield return KeyModifiers.Control;
+        }
+        else if (keys.HasFlag(KeyModifiers.Shift))
+        {
+            yield return KeyModifiers.Shift;
+        }
+        else if (keys.HasFlag(KeyModifiers.Alt))
+        {
+            yield return KeyModifiers.Alt;
+        }
+    }
+}

+ 4 - 5
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/WindowViewModel.cs

@@ -18,8 +18,8 @@ namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 internal class WindowViewModel : SubViewModel<ViewModelMain>
 {
     private CommandController commandController;
-    /*private ShortcutPopup? shortcutPopup; TODO: Add shortcut popup
-    private ShortcutPopup ShortcutPopup => shortcutPopup ??= new(commandController);*/
+    private ShortcutsPopup? shortcutPopup;
+    private ShortcutsPopup ShortcutsPopup => shortcutPopup ??= new(commandController);
     public RelayCommand<string> ShowAvalonDockWindowCommand { get; set; }
     public ObservableCollection<ViewportWindowViewModel> Viewports { get; } = new();
     public event EventHandler<ViewportWindowViewModel>? ActiveViewportChanged;
@@ -163,9 +163,8 @@ internal class WindowViewModel : SubViewModel<ViewModelMain>
     [Command.Basic("PixiEditor.Window.OpenShortcutWindow", "OPEN_SHORTCUT_WINDOW", "OPEN_SHORTCUT_WINDOW", Key = Key.F1)]
     public void ShowShortcutWindow()
     {
-        //TODO: Add shortcut window
-        /*ShortcutPopup.Show();
-        ShortcutPopup.Activate();*/
+        ShortcutsPopup.Show();
+        ShortcutsPopup.Activate();
     }
 
     [Command.Basic("PixiEditor.Window.OpenPalettesBrowserWindow", "OPEN_PALETTE_BROWSER", "OPEN_PALETTE_BROWSER",

+ 80 - 0
src/PixiEditor.AvaloniaUI/Views/Dialogs/ShortcutsPopup.axaml

@@ -0,0 +1,80 @@
+<dialogs:PixiEditorPopup xmlns="https://github.com/avaloniaui"
+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+        xmlns:ui="clr-namespace:PixiEditor.Extensions.UI;assembly=PixiEditor.Extensions"
+        xmlns:dialogs="clr-namespace:PixiEditor.AvaloniaUI.Views.Dialogs"
+        xmlns:commands="clr-namespace:PixiEditor.AvaloniaUI.Models.Commands"
+        xmlns:commands1="clr-namespace:PixiEditor.AvaloniaUI.Models.Commands.XAML"
+        xmlns:converters="clr-namespace:PixiEditor.AvaloniaUI.Helpers.Converters"
+        xmlns:commands2="clr-namespace:PixiEditor.AvaloniaUI.Models.Commands.Commands"
+        mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
+        x:Class="PixiEditor.AvaloniaUI.Views.Dialogs.ShortcutsPopup"
+        x:ClassModifier="internal"
+        Title="ShortcutsPopup">
+    <Grid>
+        <TextBlock Grid.Row="0" FontSize="15" VerticalAlignment="Center" HorizontalAlignment="Center" ui:Translator.Key="SHORTCUTS_TITLE"/>
+
+        <DockPanel Grid.Row="3">
+            <TextBlock FontSize="14" Margin="10" Foreground="LightGray" HorizontalAlignment="Left" DockPanel.Dock="Bottom">
+                <!--TODO: Add this-->
+                <!--<Hyperlink Style="{StaticResource SettingsLink}"
+                            Command="{cmds:Command PixiEditor.Window.OpenSettingsWindow, UseProvided=True}">
+                    <Hyperlink.CommandParameter>
+                        <s:Int32>2</s:Int32>
+                    </Hyperlink.CommandParameter>
+                    <Run ui:Translator.Key="EDIT"/>
+                    <Run Text="" FontFamily="{StaticResource Feather}"/>
+                </Hyperlink>-->
+            </TextBlock>
+            <ScrollViewer Grid.Row="3" VerticalScrollBarVisibility="Auto">
+                <WrapPanel HorizontalAlignment="Center" Margin="2">
+                    <ItemsControl ItemsSource="{Binding Controller.CommandGroups}" Background="Transparent">
+                        <ItemsControl.ItemTemplate>
+                            <DataTemplate DataType="{x:Type commands:CommandGroup}">
+                                <StackPanel IsVisible="{Binding HasAssignedShortcuts}">
+                                    <TextBlock Text="{Binding DisplayName}" Foreground="White" FontSize="15" FontWeight="Medium" Margin="10,8,0,5"/>
+                                    <ItemsControl ItemsSource="{Binding VisibleCommands}">
+                                        <ItemsControl.ItemTemplate>
+                                            <DataTemplate DataType="{x:Type commands2:Command}">
+                                                <StackPanel Orientation="Horizontal" Margin="20,0,0,0" IsVisible="{Binding Shortcut.Key, ConverterParameter=None, Converter={converters:EqualityBoolToIsVisibleConverter Invert=True}}"
+                                                            ToolTip.Tip="{Binding Description}">
+                                                    <ItemsControl ItemsSource="{Binding Shortcut.Modifiers, Converter={converters:ModifierFlagToModifiersConverter}}">
+                                                        <ItemsControl.ItemTemplate>
+                                                            <DataTemplate DataType="{x:Type KeyModifiers}">
+                                                                <Border Classes="KeyBorder">
+                                                                    <!--TODO: BindsDirectlyToSource=True was here-->
+                                                                    <TextBlock ui:Translator.LocalizedString="{Binding Converter={converters:KeyToStringConverter}}"
+                                                                               Classes="KeyBorderText"/>
+                                                                </Border>
+                                                            </DataTemplate>
+                                                        </ItemsControl.ItemTemplate>
+                                                        <ItemsControl.ItemsPanel>
+                                                            <ItemsPanelTemplate>
+                                                                <StackPanel Orientation="Horizontal"/>
+                                                            </ItemsPanelTemplate>
+                                                        </ItemsControl.ItemsPanel>
+                                                    </ItemsControl>
+                                                    <Border Classes="KeyBorderLast">
+                                                        <TextBlock Text="{Binding Shortcut.Key, Converter={converters:KeyToStringConverter}}" Classes="KeyBorderText"/>
+                                                    </Border>
+
+                                                    <TextBlock Text="{Binding DisplayName}" Foreground="#FFEEEEEE" VerticalAlignment="Center" FontSize="14" Margin="8,0,0,0"/>
+                                                </StackPanel>
+                                            </DataTemplate>
+                                        </ItemsControl.ItemTemplate>
+                                    </ItemsControl>
+                                </StackPanel>
+                            </DataTemplate>
+                        </ItemsControl.ItemTemplate>
+                        <ItemsControl.ItemsPanel>
+                            <ItemsPanelTemplate>
+                                <WrapPanel ItemWidth="300"/>
+                            </ItemsPanelTemplate>
+                        </ItemsControl.ItemsPanel>
+                    </ItemsControl>
+                </WrapPanel>
+            </ScrollViewer>
+        </DockPanel>
+    </Grid>
+</dialogs:PixiEditorPopup>

+ 52 - 0
src/PixiEditor.AvaloniaUI/Views/Dialogs/ShortcutsPopup.axaml.cs

@@ -0,0 +1,52 @@
+using System.ComponentModel;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Input;
+using PixiEditor.AvaloniaUI.Models.Commands;
+using PixiEditor.AvaloniaUI.Models.Commands.Commands;
+using PixiEditor.AvaloniaUI.Models.Input;
+using PixiEditor.AvaloniaUI.ViewModels;
+
+namespace PixiEditor.AvaloniaUI.Views.Dialogs;
+
+internal partial class ShortcutsPopup : PixiEditorPopup
+{
+    public static readonly StyledProperty<CommandController> ControllerProperty = AvaloniaProperty.Register<ShortcutsPopup, CommandController>(
+        nameof(Controller));
+
+    public static readonly StyledProperty<bool> IsTopmostProperty = AvaloniaProperty.Register<ShortcutsPopup, bool>(
+        "IsTopmost");
+
+    public bool IsTopmost
+    {
+        get => GetValue(IsTopmostProperty);
+        set => SetValue(IsTopmostProperty, value);
+    }
+
+    public CommandController Controller
+    {
+        get => GetValue(ControllerProperty);
+        set => SetValue(ControllerProperty, value);
+    }
+
+    Command settingsCommand;
+
+    public ShortcutsPopup(CommandController controller)
+    {
+        DataContext = this;
+        InitializeComponent();
+        Controller = controller;
+        settingsCommand = Controller.Commands["PixiEditor.Window.OpenSettingsWindow"];
+    }
+
+    private void ShortcutPopup_OnKeyDown(object sender, KeyEventArgs e)
+    {
+        if (settingsCommand.Shortcut != new KeyCombination(e.Key, e.KeyModifiers))
+        {
+            return;
+        }
+
+        settingsCommand.Methods.Execute("Keybinds");
+    }
+}
+