mirror of
https://github.com/microsoft/PowerToys.git
synced 2024-12-11 09:49:22 +08:00
Added functionality for left/right key navigation (#5067)
* Added functionality for left/right key navigation * Update Behviour of left/right navigation * Code cleanup * Null check for results VM * Added tests for results view model * Update test namings
This commit is contained in:
parent
25d43354b3
commit
f773604dec
@ -239,6 +239,25 @@ namespace PowerLauncher
|
|||||||
UpdateTextBoxToSelectedItem();
|
UpdateTextBoxToSelectedItem();
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
else if (e.Key == Key.Right)
|
||||||
|
{
|
||||||
|
if(SearchBox.QueryTextBox.CaretIndex == SearchBox.QueryTextBox.Text.Length)
|
||||||
|
{
|
||||||
|
_viewModel.SelectNextContextMenuItemCommand.Execute(null);
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (e.Key == Key.Left)
|
||||||
|
{
|
||||||
|
if (SearchBox.QueryTextBox.CaretIndex == SearchBox.QueryTextBox.Text.Length)
|
||||||
|
{
|
||||||
|
if(_viewModel.Results != null && _viewModel.Results.IsContextMenuItemSelected())
|
||||||
|
{
|
||||||
|
_viewModel.SelectPreviousContextMenuItemCommand.Execute(null);
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (e.Key == Key.PageDown)
|
else if (e.Key == Key.PageDown)
|
||||||
{
|
{
|
||||||
_viewModel.SelectNextPageCommand.Execute(null);
|
_viewModel.SelectNextPageCommand.Execute(null);
|
||||||
|
@ -151,6 +151,16 @@ namespace PowerLauncher.ViewModel
|
|||||||
SelectedResults.SelectPrevTabItem();
|
SelectedResults.SelectPrevTabItem();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
SelectNextContextMenuItemCommand = new RelayCommand(_ =>
|
||||||
|
{
|
||||||
|
SelectedResults.SelectNextContextMenuItem();
|
||||||
|
});
|
||||||
|
|
||||||
|
SelectPreviousContextMenuItemCommand = new RelayCommand(_ =>
|
||||||
|
{
|
||||||
|
SelectedResults.SelectPreviousContextMenuItem();
|
||||||
|
});
|
||||||
|
|
||||||
SelectNextPageCommand = new RelayCommand(_ =>
|
SelectNextPageCommand = new RelayCommand(_ =>
|
||||||
{
|
{
|
||||||
SelectedResults.SelectNextPage();
|
SelectedResults.SelectNextPage();
|
||||||
@ -342,6 +352,8 @@ namespace PowerLauncher.ViewModel
|
|||||||
public ICommand EscCommand { get; set; }
|
public ICommand EscCommand { get; set; }
|
||||||
public ICommand SelectNextItemCommand { get; set; }
|
public ICommand SelectNextItemCommand { get; set; }
|
||||||
public ICommand SelectPrevItemCommand { get; set; }
|
public ICommand SelectPrevItemCommand { get; set; }
|
||||||
|
public ICommand SelectNextContextMenuItemCommand { get; set; }
|
||||||
|
public ICommand SelectPreviousContextMenuItemCommand { get; set; }
|
||||||
|
|
||||||
public ICommand SelectNextTabItemCommand { get; set; }
|
public ICommand SelectNextTabItemCommand { get; set; }
|
||||||
public ICommand SelectPrevTabItemCommand { get; set; }
|
public ICommand SelectPrevTabItemCommand { get; set; }
|
||||||
|
@ -34,7 +34,7 @@ namespace PowerLauncher.ViewModel
|
|||||||
|
|
||||||
public int ContextMenuSelectedIndex { get; set; }
|
public int ContextMenuSelectedIndex { get; set; }
|
||||||
|
|
||||||
const int NoSelectionIndex = -1;
|
public const int NoSelectionIndex = -1;
|
||||||
|
|
||||||
public ResultViewModel(Result result)
|
public ResultViewModel(Result result)
|
||||||
{
|
{
|
||||||
|
@ -182,6 +182,37 @@ namespace PowerLauncher.ViewModel
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SelectNextContextMenuItem()
|
||||||
|
{
|
||||||
|
if(SelectedItem != null)
|
||||||
|
{
|
||||||
|
if(!SelectedItem.SelectNextContextButton())
|
||||||
|
{
|
||||||
|
SelectedItem.SelectLastContextButton();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SelectPreviousContextMenuItem()
|
||||||
|
{
|
||||||
|
if (SelectedItem != null)
|
||||||
|
{
|
||||||
|
SelectedItem.SelectPrevContextButton();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsContextMenuItemSelected()
|
||||||
|
{
|
||||||
|
if (SelectedItem != null && SelectedItem.ContextMenuSelectedIndex != ResultViewModel.NoSelectionIndex)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// To avoid deadlock, this method should not called from main thread
|
/// To avoid deadlock, this method should not called from main thread
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -17,7 +17,7 @@ namespace Wox.Core.Plugin
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class PluginManager
|
public static class PluginManager
|
||||||
{
|
{
|
||||||
private static IEnumerable<PluginPair> _contextMenuPlugins;
|
private static IEnumerable<PluginPair> _contextMenuPlugins = new List<PluginPair>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Directories that will hold Wox plugin directory
|
/// Directories that will hold Wox plugin directory
|
||||||
|
172
src/modules/launcher/Wox.Test/ResultsViewModelTest.cs
Normal file
172
src/modules/launcher/Wox.Test/ResultsViewModelTest.cs
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using PowerLauncher.ViewModel;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using Wox.Core.Plugin;
|
||||||
|
using Wox.Plugin;
|
||||||
|
|
||||||
|
namespace Wox.Test
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
class ResultsViewModelTest
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void ContextMenuSelectedIndex_ShouldEqualNoSelectionIndex_WhenInitialized()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
ResultsViewModel rvm = new ResultsViewModel();
|
||||||
|
Result result = new Result();
|
||||||
|
ResultViewModel selectedItem = new ResultViewModel(result);
|
||||||
|
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel()
|
||||||
|
{
|
||||||
|
Title = "Dummy Context Menu"
|
||||||
|
});
|
||||||
|
rvm.SelectedItem = selectedItem;
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(selectedItem.ContextMenuSelectedIndex, ResultViewModel.NoSelectionIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void SelectNextContextMenuItem_IncrementsContextMenuSelectedIndex_WhenCalled()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
ResultsViewModel rvm = new ResultsViewModel();
|
||||||
|
Result result = new Result();
|
||||||
|
ResultViewModel selectedItem = new ResultViewModel(result);
|
||||||
|
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel()
|
||||||
|
{
|
||||||
|
Title = "Dummy Context Menu"
|
||||||
|
});
|
||||||
|
rvm.SelectedItem = selectedItem;
|
||||||
|
|
||||||
|
|
||||||
|
// Act
|
||||||
|
rvm.SelectNextContextMenuItem();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(selectedItem.ContextMenuSelectedIndex, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void SelectNextContextMenuItem_DoesnNotIncrementContextMenuSelectedIndex_WhenCalledOnLastItem()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
ResultsViewModel rvm = new ResultsViewModel();
|
||||||
|
Result result = new Result();
|
||||||
|
ResultViewModel selectedItem = new ResultViewModel(result);
|
||||||
|
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel()
|
||||||
|
{
|
||||||
|
Title = "Dummy Context Menu"
|
||||||
|
});
|
||||||
|
rvm.SelectedItem = selectedItem;
|
||||||
|
|
||||||
|
|
||||||
|
// Act
|
||||||
|
rvm.SelectNextContextMenuItem();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(selectedItem.ContextMenuSelectedIndex, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void SelectPreviousContextMenuItem_DecrementsContextMenuSelectedIndex_WhenCalled()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
ResultsViewModel rvm = new ResultsViewModel();
|
||||||
|
Result result = new Result();
|
||||||
|
ResultViewModel selectedItem = new ResultViewModel(result);
|
||||||
|
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel()
|
||||||
|
{
|
||||||
|
Title = "Dummy Context Menu 1"
|
||||||
|
});
|
||||||
|
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel()
|
||||||
|
{
|
||||||
|
Title = "Dummy Context Menu 2"
|
||||||
|
});
|
||||||
|
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel()
|
||||||
|
{
|
||||||
|
Title = "Dummy Context Menu 3"
|
||||||
|
});
|
||||||
|
rvm.SelectedItem = selectedItem;
|
||||||
|
|
||||||
|
|
||||||
|
// Act
|
||||||
|
rvm.SelectNextContextMenuItem();
|
||||||
|
rvm.SelectNextContextMenuItem();
|
||||||
|
rvm.SelectNextContextMenuItem();
|
||||||
|
rvm.SelectPreviousContextMenuItem();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(selectedItem.ContextMenuSelectedIndex, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void SelectPreviousContextMenuItem_ResetsContextMenuSelectedIndex_WhenCalledOnFirstItem()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
ResultsViewModel rvm = new ResultsViewModel();
|
||||||
|
Result result = new Result();
|
||||||
|
ResultViewModel selectedItem = new ResultViewModel(result);
|
||||||
|
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel()
|
||||||
|
{
|
||||||
|
Title = "Dummy Context Menu"
|
||||||
|
});
|
||||||
|
rvm.SelectedItem = selectedItem;
|
||||||
|
|
||||||
|
|
||||||
|
// Act
|
||||||
|
rvm.SelectNextContextMenuItem();
|
||||||
|
rvm.SelectPreviousContextMenuItem();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(selectedItem.ContextMenuSelectedIndex, ResultViewModel.NoSelectionIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void IsContextMenuItemSelected_ReturnsTrue_WhenContextMenuItemIsSelected()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
ResultsViewModel rvm = new ResultsViewModel();
|
||||||
|
Result result = new Result();
|
||||||
|
ResultViewModel selectedItem = new ResultViewModel(result);
|
||||||
|
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel()
|
||||||
|
{
|
||||||
|
Title = "Dummy Context Menu"
|
||||||
|
});
|
||||||
|
rvm.SelectedItem = selectedItem;
|
||||||
|
|
||||||
|
|
||||||
|
// Act
|
||||||
|
rvm.SelectNextContextMenuItem();
|
||||||
|
bool isContextMenuItemSelected = rvm.IsContextMenuItemSelected();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(isContextMenuItemSelected);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void IsContextMenuItemSelected_ReturnsFalse_WhenContextMenuItemIsNotSelected()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
ResultsViewModel rvm = new ResultsViewModel();
|
||||||
|
Result result = new Result();
|
||||||
|
ResultViewModel selectedItem = new ResultViewModel(result);
|
||||||
|
selectedItem.ContextMenuItems.Add(new ContextMenuItemViewModel()
|
||||||
|
{
|
||||||
|
Title = "Dummy Context Menu"
|
||||||
|
});
|
||||||
|
rvm.SelectedItem = selectedItem;
|
||||||
|
|
||||||
|
|
||||||
|
// Act
|
||||||
|
rvm.SelectNextContextMenuItem();
|
||||||
|
rvm.SelectPreviousContextMenuItem();
|
||||||
|
bool isContextMenuItemSelected = rvm.IsContextMenuItemSelected();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.IsFalse(isContextMenuItemSelected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user