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:
Divyansh Srivastava 2020-07-22 12:48:42 -07:00 committed by GitHub
parent 25d43354b3
commit f773604dec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 238 additions and 4 deletions

View File

@ -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);

View File

@ -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; }

View File

@ -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)
{ {

View File

@ -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>

View File

@ -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

View 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);
}
}
}