mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-09 04:37:30 +02:00
[PTRun] Fix always show after executing context menu result (#21291)
* fix always show * add tests * remove workaround
This commit is contained in:
committed by
GitHub
parent
a3042b8435
commit
460f242967
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|
||||||
|
|||||||
71
src/modules/launcher/Wox.Test/ResultViewModelTest.cs
Normal file
71
src/modules/launcher/Wox.Test/ResultViewModelTest.cs
Normal 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
Reference in New Issue
Block a user