-
Notifications
You must be signed in to change notification settings - Fork 6.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Keyboard Manager] Add JSON support for App Specific shortcuts (#4840)
* Enable app specific shortcut remapping * Fixed lowercase function call * Add test file * Moved GetForegroundProcess to II and added tests * Fixed runtime error while testing due to heap allocation across dll boundary * Renamed function * Changed shortcutBuffer type * Linked App specific UI to backend * Added shortcut validation logic on TextBox LostFocus handler * Moved Validate function and changed default text * Changed to case insensitive warning check * Changed to case insensitive warning check at OnClickAccept * Fixed alignment and spacing issues * Added app-specific JSON support in backend * Updated landing page * Make listview horizontally scrollable * Added tests * Consider all case variants of All Apps in textbox to be global shortcuts
- Loading branch information
1 parent
653ae77
commit bb20494
Showing
13 changed files
with
403 additions
and
33 deletions.
There are no files selected for viewing
32 changes: 32 additions & 0 deletions
32
src/core/Microsoft.PowerToys.Settings.UI.Lib/AppSpecificKeysDataModel.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
// Copyright (c) Microsoft Corporation | ||
// The Microsoft Corporation licenses this file to you under the MIT license. | ||
// See the LICENSE file in the project root for more information. | ||
|
||
using System.Collections.Generic; | ||
using System.Linq; | ||
using System.Text.Json.Serialization; | ||
using Microsoft.PowerToys.Settings.UI.Lib.Utilities; | ||
|
||
namespace Microsoft.PowerToys.Settings.UI.Lib | ||
{ | ||
public class AppSpecificKeysDataModel : KeysDataModel | ||
{ | ||
[JsonPropertyName("targetApp")] | ||
public string TargetApp { get; set; } | ||
|
||
public new List<string> GetOriginalKeys() | ||
{ | ||
return base.GetOriginalKeys(); | ||
} | ||
|
||
public new List<string> GetNewRemapKeys() | ||
{ | ||
return base.GetNewRemapKeys(); | ||
} | ||
|
||
public bool Compare(AppSpecificKeysDataModel arg) | ||
{ | ||
return OriginalKeys.Equals(arg.OriginalKeys) && NewRemapKeys.Equals(arg.NewRemapKeys) && TargetApp.Equals(arg.TargetApp); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,4 +17,4 @@ public RemapKeysDataModel() | |
InProcessRemapKeys = new List<KeysDataModel>(); | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
132 changes: 132 additions & 0 deletions
132
src/core/Microsoft.PowerToys.Settings.UnitTest/ViewModelTests/KeyboardManager.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
using Microsoft.PowerToys.Settings.UI.Lib; | ||
using Microsoft.PowerToys.Settings.UI.ViewModels; | ||
using Microsoft.PowerToys.Settings.UI.Views; | ||
using Microsoft.VisualStudio.TestTools.UnitTesting; | ||
using System.Collections.Generic; | ||
using System.IO; | ||
using System.Linq; | ||
using System.Text.Json; | ||
using Windows.System; | ||
|
||
namespace ViewModelTests | ||
{ | ||
[TestClass] | ||
public class KeyboardManager | ||
{ | ||
public const string Module = "Keyboard Manager"; | ||
|
||
[TestInitialize] | ||
public void Setup() | ||
{ } | ||
|
||
[TestCleanup] | ||
public void CleanUp() | ||
{ } | ||
|
||
[TestMethod] | ||
public void CombineShortcutLists_ShouldReturnEmptyList_WhenBothArgumentsAreEmptyLists() | ||
{ | ||
// arrange | ||
var firstList = new List<KeysDataModel>(); | ||
var secondList = new List<AppSpecificKeysDataModel>(); | ||
|
||
// act | ||
var result = KeyboardManagerViewModel.CombineShortcutLists(firstList, secondList); | ||
|
||
// Assert | ||
var expectedResult = new List<AppSpecificKeysDataModel>(); | ||
|
||
Assert.AreEqual(expectedResult.Count(), result.Count()); | ||
} | ||
|
||
[TestMethod] | ||
public void CombineShortcutLists_ShouldReturnListWithOneAllAppsEntry_WhenFirstArgumentHasOneEntryAndSecondArgumentIsEmpty() | ||
{ | ||
// arrange | ||
var firstList = new List<KeysDataModel>(); | ||
var entry = new KeysDataModel(); | ||
entry.OriginalKeys = VirtualKey.Control + ";" + VirtualKey.A; | ||
entry.NewRemapKeys = VirtualKey.Control + ";" + VirtualKey.V; | ||
firstList.Add(entry); | ||
var secondList = new List<AppSpecificKeysDataModel>(); | ||
|
||
// act | ||
var result = KeyboardManagerViewModel.CombineShortcutLists(firstList, secondList); | ||
|
||
// Assert | ||
var expectedResult = new List<AppSpecificKeysDataModel>(); | ||
var expectedEntry = new AppSpecificKeysDataModel(); | ||
expectedEntry.OriginalKeys = entry.OriginalKeys; | ||
expectedEntry.NewRemapKeys = entry.NewRemapKeys; | ||
expectedEntry.TargetApp = "All Apps"; | ||
expectedResult.Add(expectedEntry); | ||
var x = expectedResult[0].Equals(result[0]); | ||
Assert.AreEqual(expectedResult.Count(), result.Count()); | ||
Assert.IsTrue(expectedResult[0].Compare(result[0])); | ||
} | ||
|
||
[TestMethod] | ||
public void CombineShortcutLists_ShouldReturnListWithOneAppSpecificEntry_WhenFirstArgumentIsEmptyAndSecondArgumentHasOneEntry() | ||
{ | ||
// arrange | ||
var firstList = new List<KeysDataModel>(); | ||
var secondList = new List<AppSpecificKeysDataModel>(); | ||
var entry = new AppSpecificKeysDataModel(); | ||
entry.OriginalKeys = VirtualKey.Control + ";" + VirtualKey.A; | ||
entry.NewRemapKeys = VirtualKey.Control + ";" + VirtualKey.V; | ||
entry.TargetApp = "msedge"; | ||
secondList.Add(entry); | ||
|
||
// act | ||
var result = KeyboardManagerViewModel.CombineShortcutLists(firstList, secondList); | ||
|
||
// Assert | ||
var expectedResult = new List<AppSpecificKeysDataModel>(); | ||
var expectedEntry = new AppSpecificKeysDataModel(); | ||
expectedEntry.OriginalKeys = entry.OriginalKeys; | ||
expectedEntry.NewRemapKeys = entry.NewRemapKeys; | ||
expectedEntry.TargetApp = entry.TargetApp; | ||
expectedResult.Add(expectedEntry); | ||
|
||
Assert.AreEqual(expectedResult.Count(), result.Count()); | ||
Assert.IsTrue(expectedResult[0].Compare(result[0])); | ||
} | ||
|
||
[TestMethod] | ||
public void CombineShortcutLists_ShouldReturnListWithOneAllAppsEntryAndOneAppSpecificEntry_WhenFirstArgumentHasOneEntryAndSecondArgumentHasOneEntry() | ||
{ | ||
// arrange | ||
var firstList = new List<KeysDataModel>(); | ||
var firstListEntry = new KeysDataModel(); | ||
firstListEntry.OriginalKeys = VirtualKey.Control + ";" + VirtualKey.A; | ||
firstListEntry.NewRemapKeys = VirtualKey.Control + ";" + VirtualKey.V; | ||
firstList.Add(firstListEntry); | ||
var secondList = new List<AppSpecificKeysDataModel>(); | ||
var secondListEntry = new AppSpecificKeysDataModel(); | ||
secondListEntry.OriginalKeys = VirtualKey.Control + ";" + VirtualKey.B; | ||
secondListEntry.NewRemapKeys = VirtualKey.Control + ";" + VirtualKey.W; | ||
secondListEntry.TargetApp = "msedge"; | ||
secondList.Add(secondListEntry); | ||
|
||
// act | ||
var result = KeyboardManagerViewModel.CombineShortcutLists(firstList, secondList); | ||
|
||
// Assert | ||
var expectedResult = new List<AppSpecificKeysDataModel>(); | ||
var expectedFirstEntry = new AppSpecificKeysDataModel(); | ||
expectedFirstEntry.OriginalKeys = firstListEntry.OriginalKeys; | ||
expectedFirstEntry.NewRemapKeys = firstListEntry.NewRemapKeys; | ||
expectedFirstEntry.TargetApp = "All Apps"; | ||
expectedResult.Add(expectedFirstEntry); | ||
var expectedSecondEntry = new AppSpecificKeysDataModel(); | ||
expectedSecondEntry.OriginalKeys = secondListEntry.OriginalKeys; | ||
expectedSecondEntry.NewRemapKeys = secondListEntry.NewRemapKeys; | ||
expectedSecondEntry.TargetApp = secondListEntry.TargetApp; | ||
expectedResult.Add(expectedSecondEntry); | ||
|
||
Assert.AreEqual(expectedResult.Count(), result.Count()); | ||
Assert.IsTrue(expectedResult[0].Compare(result[0])); | ||
Assert.IsTrue(expectedResult[1].Compare(result[1])); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.