[PTRun] Fix always show after executing context menu result (#21291)

* fix always show

* add tests

* remove workaround
This commit is contained in:
Henrik Lau Eriksson
2022-10-25 23:27:18 +02:00
committed by GitHub
parent a3042b8435
commit 460f242967
10 changed files with 111 additions and 32 deletions

View File

@@ -42,9 +42,7 @@ namespace Microsoft.Plugin.WindowWalker.Components
return false; return false;
} }
// As a workaround to close PT Run after executing the context menu command, we switch to the window before closing it (Issue #16601). windowData.CloseThisWindow();
// We use the setting OpenAfterKillAndClose to detect if we have to switch.
windowData.CloseThisWindow(!WindowWalkerSettings.Instance.OpenAfterKillAndClose);
return !WindowWalkerSettings.Instance.OpenAfterKillAndClose; return !WindowWalkerSettings.Instance.OpenAfterKillAndClose;
}, },
@@ -102,12 +100,6 @@ namespace Microsoft.Plugin.WindowWalker.Components
} }
} }
// As a workaround to close PT Run before executing the command, we switch to the window before killing it's process
if (!WindowWalkerSettings.Instance.OpenAfterKillAndClose)
{
window.SwitchToWindow();
}
// Kill process // Kill process
window.Process.KillThisProcess(WindowWalkerSettings.Instance.KillProcessTree); window.Process.KillThisProcess(WindowWalkerSettings.Instance.KillProcessTree);
return !WindowWalkerSettings.Instance.OpenAfterKillAndClose; return !WindowWalkerSettings.Instance.OpenAfterKillAndClose;

View File

@@ -237,13 +237,8 @@ namespace Microsoft.Plugin.WindowWalker.Components
/// <summary> /// <summary>
/// Closes the window /// Closes the window
/// </summary> /// </summary>
internal void CloseThisWindow(bool switchBeforeClose) internal void CloseThisWindow()
{ {
if (switchBeforeClose)
{
SwitchToWindow();
}
_ = NativeMethods.SendMessage(Hwnd, Win32Constants.WM_SYSCOMMAND, Win32Constants.SC_CLOSE); _ = NativeMethods.SendMessage(Hwnd, Win32Constants.WM_SYSCOMMAND, Win32Constants.SC_CLOSE);
} }

View File

@@ -0,0 +1,11 @@
// 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.
namespace PowerLauncher.ViewModel
{
public interface IMainViewModel
{
void Hide();
}
}

View File

@@ -29,7 +29,7 @@ using Wox.Plugin.Logger;
namespace PowerLauncher.ViewModel namespace PowerLauncher.ViewModel
{ {
[System.Diagnostics.CodeAnalysis.SuppressMessage("Globalization", "CA1309:Use ordinal string comparison", Justification = "Using CurrentCultureIgnoreCase for user facing strings. Each usage is attributed with a comment.")] [System.Diagnostics.CodeAnalysis.SuppressMessage("Globalization", "CA1309:Use ordinal string comparison", Justification = "Using CurrentCultureIgnoreCase for user facing strings. Each usage is attributed with a comment.")]
public class MainViewModel : BaseModel, ISavable, IDisposable public class MainViewModel : BaseModel, IMainViewModel, ISavable, IDisposable
{ {
private string _currentQuery; private string _currentQuery;
private static string _emptyQuery = string.Empty; private static string _emptyQuery = string.Empty;
@@ -75,9 +75,9 @@ namespace PowerLauncher.ViewModel
_history = _historyItemsStorage.Load(); _history = _historyItemsStorage.Load();
_userSelectedRecord = _userSelectedRecordStorage.Load(); _userSelectedRecord = _userSelectedRecordStorage.Load();
ContextMenu = new ResultsViewModel(_settings); ContextMenu = new ResultsViewModel(_settings, this);
Results = new ResultsViewModel(_settings); Results = new ResultsViewModel(_settings, this);
History = new ResultsViewModel(_settings); History = new ResultsViewModel(_settings, this);
_selectedResults = Results; _selectedResults = Results;
InitializeKeyCommands(); InitializeKeyCommands();

View File

@@ -65,7 +65,7 @@ namespace PowerLauncher.ViewModel
public const int NoSelectionIndex = -1; public const int NoSelectionIndex = -1;
public ResultViewModel(Result result) public ResultViewModel(Result result, IMainViewModel mainViewModel)
{ {
if (result != null) if (result != null)
{ {
@@ -77,6 +77,7 @@ namespace PowerLauncher.ViewModel
ActivateContextButtonsHoverCommand = new RelayCommand(ActivateContextButtonsHoverAction); ActivateContextButtonsHoverCommand = new RelayCommand(ActivateContextButtonsHoverAction);
DeactivateContextButtonsHoverCommand = new RelayCommand(DeactivateContextButtonsHoverAction); DeactivateContextButtonsHoverCommand = new RelayCommand(DeactivateContextButtonsHoverAction);
MainViewModel = mainViewModel;
} }
private void ActivateContextButtonsHoverAction(object sender) private void ActivateContextButtonsHoverAction(object sender)
@@ -159,8 +160,7 @@ namespace PowerLauncher.ViewModel
if (hideWindow) if (hideWindow)
{ {
// TODO - Do we hide the window MainViewModel.Hide();
// MainWindowVisibility = Visibility.Collapsed;
} }
}))); })));
} }
@@ -258,6 +258,8 @@ namespace PowerLauncher.ViewModel
public Result Result { get; } public Result Result { get; }
public IMainViewModel MainViewModel { get; }
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
var r = obj as ResultViewModel; var r = obj as ResultViewModel;

View File

@@ -21,6 +21,7 @@ namespace PowerLauncher.ViewModel
private readonly object _collectionLock = new object(); private readonly object _collectionLock = new object();
private readonly PowerToysRunSettings _settings; private readonly PowerToysRunSettings _settings;
private readonly IMainViewModel _mainViewModel;
public ResultsViewModel() public ResultsViewModel()
{ {
@@ -28,10 +29,11 @@ namespace PowerLauncher.ViewModel
BindingOperations.EnableCollectionSynchronization(Results, _collectionLock); BindingOperations.EnableCollectionSynchronization(Results, _collectionLock);
} }
public ResultsViewModel(PowerToysRunSettings settings) public ResultsViewModel(PowerToysRunSettings settings, IMainViewModel mainViewModel)
: this() : this()
{ {
_settings = settings ?? throw new ArgumentNullException(nameof(settings)); _settings = settings ?? throw new ArgumentNullException(nameof(settings));
_mainViewModel = mainViewModel;
_settings.PropertyChanged += (s, e) => _settings.PropertyChanged += (s, e) =>
{ {
if (e.PropertyName == nameof(_settings.MaxResultsToShow)) if (e.PropertyName == nameof(_settings.MaxResultsToShow))
@@ -246,7 +248,7 @@ namespace PowerLauncher.ViewModel
List<ResultViewModel> newResults = new List<ResultViewModel>(newRawResults.Count); List<ResultViewModel> newResults = new List<ResultViewModel>(newRawResults.Count);
foreach (Result r in newRawResults) foreach (Result r in newRawResults)
{ {
newResults.Add(new ResultViewModel(r)); newResults.Add(new ResultViewModel(r, _mainViewModel));
ct.ThrowIfCancellationRequested(); ct.ThrowIfCancellationRequested();
} }

View File

@@ -22,7 +22,8 @@ namespace Wox.Plugin
public ModifierKeys AcceleratorModifiers { get; set; } public ModifierKeys AcceleratorModifiers { get; set; }
/// <summary> /// <summary>
/// Gets or sets return true to hide wox after select result /// Gets or sets the context menu result action.
/// Return <c>true</c> to hide PowerToys Run after the context menu result has been selected.
/// </summary> /// </summary>
public Func<ActionContext, bool> Action { get; set; } public Func<ActionContext, bool> Action { get; set; }

View File

@@ -0,0 +1,71 @@
// 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 Microsoft.PowerToys.STATestExtension;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using PowerLauncher.Plugin;
using PowerLauncher.ViewModel;
using Wox.Plugin;
namespace Wox.Test
{
[STATestClass]
public class ResultViewModelTest
{
private ContextMenuResult contextMenuResult;
private Mock<IMainViewModel> mainViewModelMock;
private ResultViewModel resultViewModel;
[TestInitialize]
public void Setup()
{
var result = new Result();
contextMenuResult = new ContextMenuResult();
mainViewModelMock = new Mock<IMainViewModel>();
resultViewModel = new ResultViewModel(result, mainViewModelMock.Object);
var pluginMock = new Mock<IPlugin>();
pluginMock.As<IContextMenu>().Setup(x => x.LoadContextMenus(result)).Returns(new List<ContextMenuResult> { contextMenuResult });
var pair = new PluginPair(new PluginMetadata());
pair.Plugin = pluginMock.Object;
PluginManager.SetAllPlugins(new List<PluginPair>()
{
pair,
});
PluginManager.InitializePlugins(new Mock<IPublicAPI>().Object);
}
[TestMethod]
public void ExecuteContextMenuResultActionThatReturnsTrueShouldHideTheMainView()
{
// Arrange
contextMenuResult.Action = _ => true;
// Act
resultViewModel.LoadContextMenu();
resultViewModel.ContextMenuItems.Single().Command.Execute(null);
// Assert
mainViewModelMock.Verify(x => x.Hide(), Times.Once());
}
[TestMethod]
public void ExecuteContextMenuResultActionThatReturnsFalseShouldNotHideTheMainView()
{
// Arrange
contextMenuResult.Action = _ => false;
// Act
resultViewModel.LoadContextMenu();
resultViewModel.ContextMenuItems.Single().Command.Execute(null);
// Assert
mainViewModelMock.Verify(x => x.Hide(), Times.Never());
}
}
}

View File

@@ -18,7 +18,7 @@ namespace Wox.Test
// Arrange // Arrange
ResultsViewModel rvm = new ResultsViewModel(); ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result(); Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result); ResultViewModel selectedItem = new ResultViewModel(result, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null)); selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
rvm.SelectedItem = selectedItem; rvm.SelectedItem = selectedItem;
@@ -32,7 +32,7 @@ namespace Wox.Test
// Arrange // Arrange
ResultsViewModel rvm = new ResultsViewModel(); ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result(); Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result); ResultViewModel selectedItem = new ResultViewModel(result, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null)); selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
rvm.SelectedItem = selectedItem; rvm.SelectedItem = selectedItem;
@@ -49,7 +49,7 @@ namespace Wox.Test
// Arrange // Arrange
ResultsViewModel rvm = new ResultsViewModel(); ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result(); Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result); ResultViewModel selectedItem = new ResultViewModel(result, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null)); selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
rvm.SelectedItem = selectedItem; rvm.SelectedItem = selectedItem;
@@ -66,7 +66,7 @@ namespace Wox.Test
// Arrange // Arrange
ResultsViewModel rvm = new ResultsViewModel(); ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result(); Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result); ResultViewModel selectedItem = new ResultViewModel(result, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null)); selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null)); selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null)); selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
@@ -88,7 +88,7 @@ namespace Wox.Test
// Arrange // Arrange
ResultsViewModel rvm = new ResultsViewModel(); ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result(); Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result); ResultViewModel selectedItem = new ResultViewModel(result, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null)); selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
rvm.SelectedItem = selectedItem; rvm.SelectedItem = selectedItem;
@@ -106,7 +106,7 @@ namespace Wox.Test
// Arrange // Arrange
ResultsViewModel rvm = new ResultsViewModel(); ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result(); Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result); ResultViewModel selectedItem = new ResultViewModel(result, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null)); selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
rvm.SelectedItem = selectedItem; rvm.SelectedItem = selectedItem;
@@ -124,7 +124,7 @@ namespace Wox.Test
// Arrange // Arrange
ResultsViewModel rvm = new ResultsViewModel(); ResultsViewModel rvm = new ResultsViewModel();
Result result = new Result(); Result result = new Result();
ResultViewModel selectedItem = new ResultViewModel(result); ResultViewModel selectedItem = new ResultViewModel(result, null);
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null)); selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel(null, null, null, null, Key.None, ModifierKeys.None, null));
rvm.SelectedItem = selectedItem; rvm.SelectedItem = selectedItem;

View File

@@ -32,6 +32,11 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<Compile Include="..\..\previewpane\STATestClassAttribute.cs" Link="STATestClassAttribute.cs" />
<Compile Include="..\..\previewpane\STATestMethodAttribute.cs" Link="STATestMethodAttribute.cs" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Plugins\Microsoft.Plugin.Folder\Microsoft.Plugin.Folder.csproj" /> <ProjectReference Include="..\Plugins\Microsoft.Plugin.Folder\Microsoft.Plugin.Folder.csproj" />
<ProjectReference Include="..\Plugins\Microsoft.Plugin.Indexer\Microsoft.Plugin.Indexer.csproj" /> <ProjectReference Include="..\Plugins\Microsoft.Plugin.Indexer\Microsoft.Plugin.Indexer.csproj" />