Skip to content

Commit 4c8e506

Browse files
committed
Improvements to Keyboard Accelerator Reliability
1 parent 3bb3c37 commit 4c8e506

9 files changed

+202
-69
lines changed

Files/App.xaml.cs

Lines changed: 168 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
using Windows.UI.Xaml.Media.Imaging;
2929
using Windows.Management.Deployment;
3030
using Windows.Storage.Streams;
31+
using Windows.System;
32+
using Microsoft.UI.Xaml.Controls;
3133

3234
namespace Files
3335
{
@@ -65,6 +67,7 @@ public static ProHome OccupiedInstance
6567
public static ObservableCollection<SidebarItem> sideBarItems = new ObservableCollection<SidebarItem>();
6668
public static ObservableCollection<WSLDistroItem> linuxDistroItems = new ObservableCollection<WSLDistroItem>();
6769
public static FormFactorMode FormFactor { get; set; } = FormFactorMode.Regular;
70+
ApplicationDataContainer localSettings;
6871

6972
public App()
7073
{
@@ -79,12 +82,142 @@ public App()
7982
Clipboard.ContentChanged += Clipboard_ContentChanged;
8083
Clipboard_ContentChanged(null, null);
8184
AppCenter.Start("682666d1-51d3-4e4a-93d0-d028d43baaa0", typeof(Analytics), typeof(Crashes));
85+
localSettings = ApplicationData.Current.LocalSettings;
8286
SetPropertiesFromLocalSettings();
8387
PopulatePinnedSidebarItems();
8488
DetectWSLDistros();
8589
QuickLookIntegration();
8690
}
8791

92+
public void CloseOpenPopups()
93+
{
94+
var popups = VisualTreeHelper.GetOpenPopups(Window.Current);
95+
foreach (var popup in popups)
96+
{
97+
if(popup.Child is ContentDialog)
98+
{
99+
(popup.Child as ContentDialog).Hide();
100+
}
101+
}
102+
}
103+
104+
public Popup GetOpenPopupByDialog(ContentDialog dialog)
105+
{
106+
var popups = VisualTreeHelper.GetOpenPopups(Window.Current);
107+
foreach (var popup in popups)
108+
{
109+
if (popup.Child is ContentDialog)
110+
{
111+
if((popup.Child as ContentDialog) == dialog)
112+
{
113+
return popup;
114+
}
115+
}
116+
}
117+
return null;
118+
}
119+
120+
private async void CoreWindow_KeyDown(CoreWindow sender, KeyEventArgs args)
121+
{
122+
var ctrl = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control);
123+
var shift = Window.Current.CoreWindow.GetKeyState(VirtualKey.Shift);
124+
var alt = Window.Current.CoreWindow.GetKeyState(VirtualKey.Menu);
125+
if (App.OccupiedInstance != null)
126+
{
127+
if (ctrl.HasFlag(CoreVirtualKeyStates.Down))
128+
{
129+
if (shift.HasFlag(CoreVirtualKeyStates.Down))
130+
{
131+
if ((App.OccupiedInstance.ItemDisplayFrame.Content as BaseLayout) != null)
132+
{
133+
switch (args.VirtualKey)
134+
{
135+
case VirtualKey.N:
136+
Window.Current.CoreWindow.KeyDown -= CoreWindow_KeyDown;
137+
await App.addItemDialog.ShowAsync();
138+
Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;
139+
break;
140+
}
141+
}
142+
}
143+
else
144+
{
145+
if ((App.OccupiedInstance.ItemDisplayFrame.Content as BaseLayout) != null)
146+
{
147+
switch (args.VirtualKey)
148+
{
149+
case VirtualKey.C:
150+
App.OccupiedInstance.instanceInteraction.CopyItem_ClickAsync(null, null);
151+
break;
152+
case VirtualKey.X:
153+
App.OccupiedInstance.instanceInteraction.CutItem_Click(null, null);
154+
break;
155+
case VirtualKey.V:
156+
App.OccupiedInstance.instanceInteraction.PasteItem_ClickAsync(null, null);
157+
break;
158+
case VirtualKey.A:
159+
App.OccupiedInstance.instanceInteraction.SelectAllItems();
160+
break;
161+
}
162+
}
163+
164+
switch (args.VirtualKey)
165+
{
166+
case VirtualKey.N:
167+
var filesUWPUri = new Uri("files-uwp:");
168+
await Launcher.LaunchUriAsync(filesUWPUri);
169+
break;
170+
case VirtualKey.W:
171+
if (((Window.Current.Content as Frame).Content as InstanceTabsView).TabStrip.TabItems.Count == 1)
172+
{
173+
Application.Current.Exit();
174+
}
175+
else if (((Window.Current.Content as Frame).Content as InstanceTabsView).TabStrip.TabItems.Count > 1)
176+
{
177+
((Window.Current.Content as Frame).Content as InstanceTabsView).TabStrip.TabItems.RemoveAt(((Window.Current.Content as Frame).Content as InstanceTabsView).TabStrip.SelectedIndex);
178+
}
179+
break;
180+
}
181+
}
182+
}
183+
else if (ctrl.HasFlag(CoreVirtualKeyStates.None) && alt.HasFlag(CoreVirtualKeyStates.None))
184+
{
185+
if ((App.OccupiedInstance.ItemDisplayFrame.Content as BaseLayout) != null)
186+
{
187+
switch (args.VirtualKey)
188+
{
189+
case VirtualKey.Delete:
190+
App.OccupiedInstance.instanceInteraction.DeleteItem_Click(null, null);
191+
break;
192+
case VirtualKey.Enter:
193+
if ((App.OccupiedInstance.ItemDisplayFrame.Content as BaseLayout).IsQuickLookEnabled)
194+
{
195+
App.OccupiedInstance.instanceInteraction.ToggleQuickLook();
196+
}
197+
else
198+
{
199+
App.OccupiedInstance.instanceInteraction.List_ItemClick(null, null);
200+
}
201+
break;
202+
}
203+
204+
if (App.OccupiedInstance.ItemDisplayFrame.SourcePageType == typeof(PhotoAlbum))
205+
{
206+
switch (args.VirtualKey)
207+
{
208+
case VirtualKey.F2:
209+
if((App.OccupiedInstance.ItemDisplayFrame.Content as BaseLayout).SelectedItems.Count > 0)
210+
{
211+
App.OccupiedInstance.instanceInteraction.RenameItem_Click(null, null);
212+
}
213+
break;
214+
}
215+
}
216+
}
217+
}
218+
}
219+
}
220+
88221
private async void DetectWSLDistros()
89222
{
90223
try
@@ -136,14 +269,12 @@ private async void DetectWSLDistros()
136269

137270
private async void QuickLookIntegration()
138271
{
139-
ApplicationData.Current.LocalSettings.Values["Arguments"] = "CheckQuickLookAvailability";
272+
localSettings.Values["Arguments"] = "CheckQuickLookAvailability";
140273
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
141274
}
142275

143276
private void SetPropertiesFromLocalSettings()
144277
{
145-
ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
146-
147278
if (localSettings.Values["theme"] == null)
148279
{
149280
localSettings.Values["theme"] = "Default";
@@ -180,10 +311,10 @@ private void SetPropertiesFromLocalSettings()
180311
}
181312

182313
this.RequestedTheme = SettingsPages.Personalization.TV.ThemeValue;
183-
DetectCustomLocations(localSettings);
314+
DetectCustomLocations();
184315
}
185316

186-
private async void DetectCustomLocations(ApplicationDataContainer localSettings)
317+
private async void DetectCustomLocations()
187318
{
188319
// Detect custom locations set from Windows
189320
localSettings.Values["Arguments"] = "DetectUserPaths";
@@ -660,7 +791,37 @@ protected override void OnLaunched(LaunchActivatedEventArgs e)
660791
watcher.Start();
661792
// Ensure the current window is active
662793
Window.Current.Activate();
794+
Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;
795+
Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += Dispatcher_AcceleratorKeyActivated;
796+
797+
}
798+
}
663799

800+
private void Dispatcher_AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs args)
801+
{
802+
if (args.KeyStatus.IsMenuKeyDown)
803+
{
804+
switch (args.VirtualKey)
805+
{
806+
case VirtualKey.Left:
807+
NavigationActions.Back_Click(null, null);
808+
break;
809+
case VirtualKey.Right:
810+
NavigationActions.Forward_Click(null, null);
811+
break;
812+
case VirtualKey.F:
813+
App.OccupiedInstance.RibbonArea.RibbonTabView.SelectedIndex = 0;
814+
break;
815+
case VirtualKey.H:
816+
App.OccupiedInstance.RibbonArea.RibbonTabView.SelectedIndex = 1;
817+
break;
818+
case VirtualKey.S:
819+
App.OccupiedInstance.RibbonArea.RibbonTabView.SelectedIndex = 2;
820+
break;
821+
case VirtualKey.V:
822+
App.OccupiedInstance.RibbonArea.RibbonTabView.SelectedIndex = 3;
823+
break;
824+
}
664825
}
665826
}
666827

@@ -695,6 +856,8 @@ protected override void OnActivated(IActivatedEventArgs args)
695856
watcher.EnumerationCompleted += Watcher_EnumerationCompleted;
696857
watcher.Start();
697858
Window.Current.Activate();
859+
Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;
860+
Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += Dispatcher_AcceleratorKeyActivated;
698861
return;
699862
}
700863

Files/BaseLayout.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace Files
2525
/// </summary>
2626
public class BaseLayout : Page
2727
{
28-
protected bool IsQuickLookEnabled { get; set; } = false;
28+
public bool IsQuickLookEnabled { get; set; } = false;
2929

3030
public ItemViewModel AssociatedViewModel = null;
3131
public Interaction AssociatedInteractions = null;

Files/Controls/RibbonArea.xaml

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -904,7 +904,7 @@
904904
<Grid Background="{ThemeResource RibbonBackgroundColor}" Margin="0,0,0,0" x:Name="Ribbon" Grid.Row="0">
905905
<StackPanel x:Name="RibbonPanel" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Orientation="Vertical">
906906
<Grid Height="Auto">
907-
<Custom:TabView x:Name="RibbonTabView" ItemsPanel="{StaticResource TabViewItemsPanel1}" TabWidthBehavior="Actual" Background="Transparent" Template="{StaticResource TabViewTemplate1}">
907+
<Custom:TabView x:Name="RibbonTabView" x:FieldModifier="public" ItemsPanel="{StaticResource TabViewItemsPanel1}" TabWidthBehavior="Actual" Background="Transparent" Template="{StaticResource TabViewTemplate1}">
908908
<Custom:TabView.ItemContainerTransitions>
909909
<TransitionCollection>
910910
</TransitionCollection>
@@ -969,11 +969,7 @@
969969
<AppBarSeparator IsCompact="True" Height="40"/>
970970
<AppBarButton MinWidth="40" LabelPosition="{x:Bind RibbonViewModel.ItemLabelPosition, Mode=OneWay}" Style="{StaticResource AppBarButtonRevealStyle}" CornerRadius="2" Click="{x:Bind parentPage.instanceInteraction.DeleteItem_Click}" x:Name="DeleteButton" IsEnabled="{x:Bind parentPage.HomeItems.isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Label="Delete" Icon="Delete"/>
971971
<AppBarButton MinWidth="40" LabelPosition="{x:Bind RibbonViewModel.ItemLabelPosition, Mode=OneWay}" Style="{StaticResource AppBarButtonRevealStyle}" CornerRadius="2" Click="{x:Bind parentPage.instanceInteraction.RenameItem_Click}" x:Name="RenameButton" IsEnabled="{x:Bind parentPage.HomeItems.isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Label="Rename" Icon="Rename"/>
972-
<AppBarButton MinWidth="40" LabelPosition="{x:Bind RibbonViewModel.ItemLabelPosition, Mode=OneWay}" Style="{StaticResource AppBarButtonRevealStyle}" CornerRadius="2" Click="AddItem_Click" x:Name="addItemButton" IsEnabled="{x:Bind parentPage.AlwaysPresentCommands.isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Label="Add Item" Icon="Add">
973-
<AppBarButton.KeyboardAccelerators>
974-
<KeyboardAccelerator Modifiers="Control, Shift" Key="N"/>
975-
</AppBarButton.KeyboardAccelerators>
976-
</AppBarButton>
972+
<AppBarButton MinWidth="40" LabelPosition="{x:Bind RibbonViewModel.ItemLabelPosition, Mode=OneWay}" Style="{StaticResource AppBarButtonRevealStyle}" CornerRadius="2" Click="AddItem_Click" x:Name="addItemButton" IsEnabled="{x:Bind parentPage.AlwaysPresentCommands.isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Label="Add Item" Icon="Add"/>
977973
<AppBarSeparator IsCompact="True" Height="40"/>
978974
<AppBarButton MinWidth="40" LabelPosition="{x:Bind RibbonViewModel.ItemLabelPosition, Mode=OneWay}" Style="{StaticResource AppBarButtonRevealStyle}" CornerRadius="2" Click="ShowPropertiesButton_Click" x:Name="ShowPropertiesButton" IsEnabled="{x:Bind parentPage.HomeItems.isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Label="Properties">
979975
<AppBarButton.Icon>
@@ -1021,11 +1017,7 @@
10211017
<FontIcon Glyph="&#xF0E2;" FontFamily="Segoe MDL2 Assets"/>
10221018
</AppBarButton.Icon>
10231019
</AppBarButton>
1024-
<AppBarButton MinWidth="40" LabelPosition="{x:Bind RibbonViewModel.ItemLabelPosition, Mode=OneWay}" Style="{StaticResource AppBarButtonRevealStyle}" CornerRadius="2" Click="{x:Bind parentPage.instanceInteraction.SelectAllItems}" x:Name="SelectAllButton" IsEnabled="{x:Bind parentPage.LayoutItems.isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Icon="SelectAll" Label="Select All">
1025-
<AppBarButton.KeyboardAccelerators>
1026-
<KeyboardAccelerator Modifiers="Control" Key="A"/>
1027-
</AppBarButton.KeyboardAccelerators>
1028-
</AppBarButton>
1020+
<AppBarButton MinWidth="40" LabelPosition="{x:Bind RibbonViewModel.ItemLabelPosition, Mode=OneWay}" Style="{StaticResource AppBarButtonRevealStyle}" CornerRadius="2" Click="{x:Bind parentPage.instanceInteraction.SelectAllItems}" x:Name="SelectAllButton" IsEnabled="{x:Bind parentPage.LayoutItems.isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Icon="SelectAll" Label="Select All"/>
10291021
<AppBarButton MinWidth="40" LabelPosition="{x:Bind RibbonViewModel.ItemLabelPosition, Mode=OneWay}" Style="{StaticResource AppBarButtonRevealStyle}" CornerRadius="2" Click="{x:Bind parentPage.instanceInteraction.ClearAllItems}" x:Name="ClearAllButton" IsEnabled="{x:Bind parentPage.LayoutItems.isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Icon="ClearSelection" Label="Clear All"/>
10301022
<AppBarSeparator IsCompact="True" Height="40"/>
10311023
<AppBarButton MinWidth="40" LabelPosition="{x:Bind RibbonViewModel.ItemLabelPosition, Mode=OneWay}" Style="{StaticResource AppBarButtonRevealStyle}" CornerRadius="2" IsEnabled="{x:Bind parentPage.LayoutItems.isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Icon="Sort" Label="Sort by">

Files/GenericFileBrowser.xaml

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,6 @@
3333
<MenuFlyoutItem.Icon>
3434
<FontIcon Glyph="&#xE77F;"/>
3535
</MenuFlyoutItem.Icon>
36-
<MenuFlyoutItem.KeyboardAccelerators>
37-
<KeyboardAccelerator Modifiers="Control" Key="V"/>
38-
</MenuFlyoutItem.KeyboardAccelerators>
3936
</MenuFlyoutItem>
4037
<MenuFlyoutSeparator/>
4138
<MenuFlyoutItem x:Name="OpenTerminal" Click="{x:Bind AssociatedInteractions.OpenDirectoryInTerminal}" IsEnabled="True" Text="Open in Terminal...">
@@ -98,43 +95,28 @@
9895
<MenuFlyoutItem.Icon>
9996
<FontIcon Glyph="&#xE72D;"/>
10097
</MenuFlyoutItem.Icon>
101-
<MenuFlyoutItem.KeyboardAccelerators>
102-
<KeyboardAccelerator Modifiers="Control" Key="S"/>
103-
</MenuFlyoutItem.KeyboardAccelerators>
10498
</MenuFlyoutItem>
10599
<MenuFlyoutSeparator/>
106100
<MenuFlyoutItem Click="{x:Bind AssociatedInteractions.CutItem_Click}" Text="Cut" x:Name="CutItem" >
107101
<MenuFlyoutItem.Icon>
108102
<FontIcon Glyph="&#xE8C6;"/>
109103
</MenuFlyoutItem.Icon>
110-
<MenuFlyoutItem.KeyboardAccelerators>
111-
<KeyboardAccelerator Modifiers="Control" Key="X"/>
112-
</MenuFlyoutItem.KeyboardAccelerators>
113104
</MenuFlyoutItem>
114105
<MenuFlyoutItem Click="{x:Bind AssociatedInteractions.CopyItem_ClickAsync}" Text="Copy" x:Name="CopyItem" >
115106
<MenuFlyoutItem.Icon>
116107
<FontIcon Glyph="&#xE8C8;"/>
117108
</MenuFlyoutItem.Icon>
118-
<MenuFlyoutItem.KeyboardAccelerators>
119-
<KeyboardAccelerator Modifiers="Control" Key="C"/>
120-
</MenuFlyoutItem.KeyboardAccelerators>
121109
</MenuFlyoutItem>
122110
<MenuFlyoutSeparator/>
123111
<MenuFlyoutItem Click="{x:Bind AssociatedInteractions.DeleteItem_Click}" Text="Delete" x:Name="DeleteItem" >
124112
<MenuFlyoutItem.Icon>
125113
<FontIcon Glyph="&#xE74D;"/>
126114
</MenuFlyoutItem.Icon>
127-
<MenuFlyoutItem.KeyboardAccelerators>
128-
<KeyboardAccelerator Key="Delete"/>
129-
</MenuFlyoutItem.KeyboardAccelerators>
130115
</MenuFlyoutItem>
131116
<MenuFlyoutItem Click="{x:Bind AssociatedInteractions.RenameItem_Click}" Text="Rename" x:Name="RenameItem" >
132117
<MenuFlyoutItem.Icon>
133118
<FontIcon Glyph="&#xE8AC;"/>
134119
</MenuFlyoutItem.Icon>
135-
<MenuFlyoutItem.KeyboardAccelerators>
136-
<KeyboardAccelerator Key="F2"/>
137-
</MenuFlyoutItem.KeyboardAccelerators>
138120
</MenuFlyoutItem>
139121
<MenuFlyoutSeparator/>
140122
<MenuFlyoutItem Click="{x:Bind AssociatedInteractions.PinItem_Click}" Text="Pin to sidebar" x:Load="False" Tag="PinItem_FlyoutItem" x:Name="SidebarPinItem">
@@ -151,9 +133,6 @@
151133
<MenuFlyoutItem.Icon>
152134
<BitmapIcon UriSource="ms-appx:///Assets/QuickLook/quicklook_icon_black.png"/>
153135
</MenuFlyoutItem.Icon>
154-
<MenuFlyoutItem.KeyboardAccelerators>
155-
<KeyboardAccelerator Key="Space"/>
156-
</MenuFlyoutItem.KeyboardAccelerators>
157136
</MenuFlyoutItem>
158137
</MenuFlyout>
159138
</local:BaseLayout.Resources>

0 commit comments

Comments
 (0)