diff --git a/src/InvvardDev.EZLayoutDisplay.Desktop/Model/Revision.cs b/src/InvvardDev.EZLayoutDisplay.Desktop/Model/Revision.cs index 9ebd2b67..07f0c9c9 100644 --- a/src/InvvardDev.EZLayoutDisplay.Desktop/Model/Revision.cs +++ b/src/InvvardDev.EZLayoutDisplay.Desktop/Model/Revision.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using Newtonsoft.Json; namespace InvvardDev.EZLayoutDisplay.Desktop.Model diff --git a/src/InvvardDev.EZLayoutDisplay.Desktop/View/DisplayLayoutWindow.xaml b/src/InvvardDev.EZLayoutDisplay.Desktop/View/DisplayLayoutWindow.xaml index c9a0346a..04ba091c 100644 --- a/src/InvvardDev.EZLayoutDisplay.Desktop/View/DisplayLayoutWindow.xaml +++ b/src/InvvardDev.EZLayoutDisplay.Desktop/View/DisplayLayoutWindow.xaml @@ -26,6 +26,10 @@ + + + @@ -50,24 +54,27 @@ - + Visibility="{Binding NoLayoutAvailable, Converter={StaticResource BoolToVisibleConverter}}"> + - + - - - + + + - - - - - + + + + + diff --git a/src/InvvardDev.EZLayoutDisplay.Desktop/View/SettingsWindow.xaml b/src/InvvardDev.EZLayoutDisplay.Desktop/View/SettingsWindow.xaml index 45bf0b25..74ad9785 100644 --- a/src/InvvardDev.EZLayoutDisplay.Desktop/View/SettingsWindow.xaml +++ b/src/InvvardDev.EZLayoutDisplay.Desktop/View/SettingsWindow.xaml @@ -3,7 +3,6 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:model="clr-namespace:InvvardDev.EZLayoutDisplay.Desktop.Model" mc:Ignorable="d" Background="{StaticResource WindowBackgroundBrush}" Title="{Binding WindowTitle}" Icon="{StaticResource WindowIcon}" Width="630" Height="340" MinWidth="630" MinHeight="300" diff --git a/src/InvvardDev.EZLayoutDisplay.Desktop/ViewModel/DisplayLayoutViewModel.cs b/src/InvvardDev.EZLayoutDisplay.Desktop/ViewModel/DisplayLayoutViewModel.cs index 849aa3d9..bc041a83 100644 --- a/src/InvvardDev.EZLayoutDisplay.Desktop/ViewModel/DisplayLayoutViewModel.cs +++ b/src/InvvardDev.EZLayoutDisplay.Desktop/ViewModel/DisplayLayoutViewModel.cs @@ -33,6 +33,7 @@ public class DisplayLayoutViewModel : ViewModelBase private ICommand _lostFocusCommand; private ICommand _hideWindowCommand; private ICommand _nextLayerCommand; + private ICommand _scrollLayerCommand; private List> _layoutTemplates; private ObservableCollection _currentLayoutTemplate; @@ -198,6 +199,13 @@ public bool IsWindowPinned _nextLayerCommand ?? (_nextLayerCommand = new RelayCommand(NextLayer, NextLayerCanExecute)); + /// + /// Next layer command. + /// + public ICommand ScrollLayerCommand => + _scrollLayerCommand + ?? (_scrollLayerCommand = new RelayCommand(ScrollLayer)); + #endregion public DisplayLayoutViewModel(IWindowService windowService, ILayoutService layoutService, ISettingsService settingsService) @@ -370,16 +378,50 @@ private void LostFocus() private void NextLayer() { Logger.TraceRelayCommand(); + + VaryLayer(1); + } + + private void ScrollLayer(MouseWheelEventArgs e) + { + Logger.TraceRelayCommand(); + + if (e.Delta < 0) + { + VaryLayer(1); + } + + if (e.Delta > 0) + { + VaryLayer(-1); + } + } + + private void VaryLayer(int variation) + { + Logger.TraceRelayCommand(); + var maxLayerIndex = _ezLayout.EZLayers.Count - 1; switch (CurrentLayerIndex) { - case var _ when maxLayerIndex == 0: - case var _ when CurrentLayerIndex >= maxLayerIndex: + case var _ when maxLayerIndex <= 0: + CurrentLayerIndex = 0; + + break; + case var _ when CurrentLayerIndex <= 0 && variation < 0: + CurrentLayerIndex = maxLayerIndex; + + break; + case var _ when CurrentLayerIndex > 0 && variation < 0: + CurrentLayerIndex--; + + break; + case var _ when CurrentLayerIndex >= maxLayerIndex && variation > 0: CurrentLayerIndex = 0; break; - case var _ when CurrentLayerIndex < maxLayerIndex: + case var _ when CurrentLayerIndex < maxLayerIndex && variation > 0: CurrentLayerIndex++; break; diff --git a/src/InvvardDev.EZLayoutDisplay.Tests/InvvardDev.EZLayoutDisplay.Tests.csproj b/src/InvvardDev.EZLayoutDisplay.Tests/InvvardDev.EZLayoutDisplay.Tests.csproj index 9d5fecab..3603056f 100644 --- a/src/InvvardDev.EZLayoutDisplay.Tests/InvvardDev.EZLayoutDisplay.Tests.csproj +++ b/src/InvvardDev.EZLayoutDisplay.Tests/InvvardDev.EZLayoutDisplay.Tests.csproj @@ -44,24 +44,12 @@ ..\packages\Castle.Core.4.3.1\lib\net45\Castle.Core.dll - - ..\packages\MSTest.TestFramework.1.4.0\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll - - - ..\packages\MSTest.TestFramework.1.4.0\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll - ..\packages\Moq.4.10.1\lib\net45\Moq.dll - - ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll - - - ..\packages\NonInvasiveKeyboardHookLibrary.1.4.0\lib\net452\NonInvasiveKeyboardHookLibrary.dll - + - ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll @@ -69,9 +57,7 @@ ..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll - - ..\packages\xunit.abstractions.2.0.3\lib\net35\xunit.abstractions.dll - + ..\packages\xunit.assert.2.4.1\lib\netstandard1.1\xunit.assert.dll @@ -81,6 +67,9 @@ ..\packages\xunit.extensibility.execution.2.4.1\lib\net452\xunit.execution.desktop.dll + + ..\packages\Xunit.StaFact.0.3.18\lib\net452\Xunit.StaFact.dll + diff --git a/src/InvvardDev.EZLayoutDisplay.Tests/ViewModel/DisplayLayoutViewModelTest.cs b/src/InvvardDev.EZLayoutDisplay.Tests/ViewModel/DisplayLayoutViewModelTest.cs index fc71f87e..d72cd7ac 100644 --- a/src/InvvardDev.EZLayoutDisplay.Tests/ViewModel/DisplayLayoutViewModelTest.cs +++ b/src/InvvardDev.EZLayoutDisplay.Tests/ViewModel/DisplayLayoutViewModelTest.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Windows.Input; using InvvardDev.EZLayoutDisplay.Desktop.Model; using InvvardDev.EZLayoutDisplay.Desktop.Service.Interface; using InvvardDev.EZLayoutDisplay.Desktop.View; @@ -10,6 +12,23 @@ namespace InvvardDev.EZLayoutDisplay.Tests.ViewModel { public class DisplayLayoutViewModelTest { + private static EZLayout CreateLayers(int layerNumber) + { + var keyboardLayout = new EZLayout(); + + for (int i = 0 ; i < layerNumber ; i++) + { + keyboardLayout.EZLayers.Add(new EZLayer { + Index = i, + EZKeys = new List { + new EZKey() + } + }); + } + + return keyboardLayout; + } + [ Fact ] public void DisplayLayoutViewModel_Constructor() { @@ -17,11 +36,7 @@ public void DisplayLayoutViewModel_Constructor() var mockWindowService = new Mock(); var mockLayoutService = new Mock(); var mockSettingsService = new Mock(); - mockSettingsService.SetupProperty(s => s.EZLayout, - new EZLayout - { - EZLayers = new List { new EZLayer { EZKeys = new List { new EZKey { Label = new KeyLabel("A"), Modifier = new KeyLabel("a") } } } } - }); + mockSettingsService.SetupProperty(s => s.EZLayout, CreateLayers(1)); //Act var displayLayoutViewModel = new DisplayLayoutViewModel(mockWindowService.Object, mockLayoutService.Object, mockSettingsService.Object); @@ -56,8 +71,8 @@ public void LostFocusCommand_Execute() } [ Theory ] - [InlineData(true)] - [InlineData(false)] + [ InlineData(true) ] + [ InlineData(false) ] public void LostFocusCommand_CanExecute(bool isPinned) { //Arrange @@ -82,7 +97,7 @@ public void LostFocusCommand_CanExecute(bool isPinned) } } - [Fact] + [ Fact ] public void HideWindowCommand_Execute() { //Arrange @@ -99,7 +114,7 @@ public void HideWindowCommand_Execute() mockWindowService.Verify(w => w.CloseWindow(), Times.Once); } - [Theory ] + [ Theory ] [ InlineData(0, 1, true) ] [ InlineData(1, 2, false) ] [ InlineData(76, 2, false) ] @@ -119,7 +134,10 @@ public void LoadCompleteLayout(int numberOfKey, int numberOfLayer, bool noLayout for (int i = 0 ; i < numberOfLayer ; i++) { - keyboardLayout.EZLayers.Add(new EZLayer { Index = i, EZKeys = new List(ezKeys) }); + keyboardLayout.EZLayers.Add(new EZLayer { + Index = i, + EZKeys = new List(ezKeys) + }); } var mockWindowService = new Mock(); @@ -143,13 +161,49 @@ [ InlineData(1, true) ] public void NextLayerCommand_CanExecute(int layerNumber, bool expectedCanExecute) { //Arrange - var keyboardLayout = new EZLayout(); + var keyboardLayout = CreateLayers(layerNumber); - for (int i = 0 ; i < layerNumber ; i++) + var layoutTemplate = new List(); + + for (int i = 0 ; i < 1 ; i++) { - keyboardLayout.EZLayers.Add(new EZLayer { Index = i, EZKeys = new List { new EZKey() } }); + layoutTemplate.Add(new KeyTemplate(i, i, 54, 81)); } + var mockLayoutService = new Mock(); + mockLayoutService.Setup(l => l.GetLayoutTemplate()).ReturnsAsync(layoutTemplate); + var mockWindowService = new Mock(); + var mockSettingsService = new Mock(); + mockSettingsService.SetupProperty(s => s.EZLayout, keyboardLayout); + + //Act + var displayLayoutViewModel = new DisplayLayoutViewModel(mockWindowService.Object, mockLayoutService.Object, mockSettingsService.Object); + + //Assert + Assert.Equal(expectedCanExecute, displayLayoutViewModel.NextLayerCommand.CanExecute(null)); + } + + [ WpfTheory ] + [ InlineData(0, 0, 120) ] + [ InlineData(0, 0, -120) ] + [ InlineData(1, 0, 120) ] + [ InlineData(1, 0, -120) ] + [ InlineData(2, 1, -120) ] + [ InlineData(2, 1, 120) ] + [ InlineData(2, 0, 120, -120) ] + [ InlineData(2, 0, 120, 120) ] + [ InlineData(2, 1, 120, 120, -120) ] + [ InlineData(3, 2, 120) ] + [ InlineData(3, 1, -120) ] + [ InlineData(3, 2, -120, -120) ] + [ InlineData(3, 1, 120, 120) ] + [ InlineData(3, 0, -120, -120, -120) ] + [ InlineData(3, 0, 120, 120, 120) ] + public void ScrollLayerCommand_Execute(int layerNumber, int expectedCurrentLayerIndex, params int[] scrollingValues) + { + //Arrange + var keyboardLayout = CreateLayers(layerNumber); + var layoutTemplate = new List(); for (int i = 0 ; i < 1 ; i++) @@ -166,8 +220,13 @@ public void NextLayerCommand_CanExecute(int layerNumber, bool expectedCanExecute //Act var displayLayoutViewModel = new DisplayLayoutViewModel(mockWindowService.Object, mockLayoutService.Object, mockSettingsService.Object); + foreach (var scrollingValue in scrollingValues) + { + displayLayoutViewModel.ScrollLayerCommand.Execute(new MouseWheelEventArgs(Mouse.PrimaryDevice, 0, scrollingValue)); + } + //Assert - Assert.Equal(expectedCanExecute, displayLayoutViewModel.NextLayerCommand.CanExecute(null)); + Assert.Equal(expectedCurrentLayerIndex, displayLayoutViewModel.CurrentLayerIndex); } [ Theory ] @@ -184,13 +243,7 @@ [ InlineData(3, 3, 0) ] public void NextLayerCommand_Execute(int layerNumber, int nextLayerHit, int expectedCurrentLayerIndex) { //Arrange - var keyboardLayout = new EZLayout(); - - for (int i = 0 ; i < layerNumber ; i++) - { - keyboardLayout.EZLayers.Add(new EZLayer { Index = i, EZKeys = new List { new EZKey() } }); - } - + var keyboardLayout = CreateLayers(layerNumber); var layoutTemplate = new List(); for (int i = 0 ; i < 1 ; i++) @@ -223,8 +276,7 @@ public void NoLayoutAvailable() var mockLayoutService = new Mock(); var mockWindowService = new Mock(); var mockSettingsService = new Mock(); - mockSettingsService.SetupProperty(s => s.EZLayout, - new EZLayout { EZLayers = new List() }); + mockSettingsService.SetupProperty(s => s.EZLayout, CreateLayers(0)); // Act var displayLayoutViewModel = new DisplayLayoutViewModel(mockWindowService.Object, mockLayoutService.Object, mockSettingsService.Object); diff --git a/src/InvvardDev.EZLayoutDisplay.Tests/ViewModel/SettingsViewModelTest.cs b/src/InvvardDev.EZLayoutDisplay.Tests/ViewModel/SettingsViewModelTest.cs index 33c0a8b4..24a42073 100644 --- a/src/InvvardDev.EZLayoutDisplay.Tests/ViewModel/SettingsViewModelTest.cs +++ b/src/InvvardDev.EZLayoutDisplay.Tests/ViewModel/SettingsViewModelTest.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; -using Castle.Components.DictionaryAdapter; using InvvardDev.EZLayoutDisplay.Desktop.Model; using InvvardDev.EZLayoutDisplay.Desktop.Service.Interface; using InvvardDev.EZLayoutDisplay.Desktop.View; @@ -300,7 +298,7 @@ public void OpenTagSearchCommandExecute_ArgumentNullException() var mockProcessService = new Mock(); // Act - var settingsViewModel = new SettingsViewModel(mockSettingsService.Object, mockWindowService.Object, mockLayoutService.Object, mockProcessService.Object); + var _ = new SettingsViewModel(mockSettingsService.Object, mockWindowService.Object, mockLayoutService.Object, mockProcessService.Object); // Assert mockLayoutService.Verify(); @@ -320,7 +318,7 @@ public void OpenTagSearchCommandExecute_ArgumentException() var mockProcessService = new Mock(); // Act - var settingsViewModel = new SettingsViewModel(mockSettingsService.Object, mockWindowService.Object, mockLayoutService.Object, mockProcessService.Object); + var _settingsViewModel = new SettingsViewModel(mockSettingsService.Object, mockWindowService.Object, mockLayoutService.Object, mockProcessService.Object); // Assert mockLayoutService.Verify(); diff --git a/src/InvvardDev.EZLayoutDisplay.Tests/app.config b/src/InvvardDev.EZLayoutDisplay.Tests/app.config index afb677ed..2e39f81b 100644 --- a/src/InvvardDev.EZLayoutDisplay.Tests/app.config +++ b/src/InvvardDev.EZLayoutDisplay.Tests/app.config @@ -6,6 +6,14 @@ + + + + + + + + \ No newline at end of file diff --git a/src/InvvardDev.EZLayoutDisplay.Tests/packages.config b/src/InvvardDev.EZLayoutDisplay.Tests/packages.config index 89e522db..ac062fb4 100644 --- a/src/InvvardDev.EZLayoutDisplay.Tests/packages.config +++ b/src/InvvardDev.EZLayoutDisplay.Tests/packages.config @@ -3,7 +3,6 @@ - @@ -16,4 +15,5 @@ + \ No newline at end of file