Minor refactoring and add gamepad button 1 as additional enter button

This commit is contained in:
Peter Kirmeier 2023-05-03 00:34:30 +02:00
parent ab0758788c
commit b93e1fb345
2 changed files with 42 additions and 28 deletions

View file

@ -7,12 +7,12 @@ namespace SystemTrayMenu.Handler
using System;
using System.Globalization;
using System.Linq;
using System.Windows.Controls;
using System.Windows.Input;
using SystemTrayMenu.DataClasses;
using SystemTrayMenu.Helpers;
using SystemTrayMenu.Utilities;
using static SystemTrayMenu.UserInterface.Menu;
using ListView = System.Windows.Controls.ListView;
using Menu = SystemTrayMenu.UserInterface.Menu;
internal class KeyboardInput : IDisposable
@ -38,8 +38,6 @@ namespace SystemTrayMenu.Handler
internal event Action<ListView, ListViewItemData>? EnterPressed;
internal event Action? Cleared;
internal bool InUse { get; set; }
public void Dispose()
@ -245,26 +243,25 @@ namespace SystemTrayMenu.Handler
private bool IsAnyMenuSelectedByKey(
ref ListView? dgv,
ref Menu? menuFromSelected,
ref string textselected)
ref Menu? subMenu,
ref string textSelected)
{
Menu? menu = menus[iMenuKey];
bool isStillSelected = false;
if (menu != null &&
iRowKey > -1)
if (menu != null && iRowKey > -1)
{
dgv = menu.GetDataGridView();
if (dgv != null)
{
if (dgv.Items.Count > iRowKey)
{
Menu.ListViewItemData itemData = (Menu.ListViewItemData)dgv.Items[iRowKey];
ListViewItemData itemData = (ListViewItemData)dgv.Items[iRowKey];
RowData rowData = itemData.data;
if (rowData.IsSelected)
{
isStillSelected = true;
menuFromSelected = rowData.SubMenu;
textselected = itemData.ColumnText;
subMenu = rowData.SubMenu;
textSelected = itemData.ColumnText;
}
}
}
@ -427,8 +424,7 @@ namespace SystemTrayMenu.Handler
(key == Key.F4 && modifiers == ModifierKeys.Alt))
{
RowDeselected?.Invoke(iRowBefore, dgvBefore);
iMenuKey = 0;
iRowKey = -1;
ResetSelectedByKey();
toClear = true;
ClosePressed?.Invoke();
@ -478,9 +474,10 @@ namespace SystemTrayMenu.Handler
{
if (iMenuKey > 0)
{
if (menus[iMenuKey - 1] != null)
int iMenuKeyPrev = iMenuKey - 1;
if (menus[iMenuKeyPrev] != null)
{
iMenuKey -= 1;
iMenuKey = iMenuKeyPrev;
iRowKey = -1;
menu = menus[iMenuKey];
dgv = menu?.GetDataGridView();
@ -499,25 +496,23 @@ namespace SystemTrayMenu.Handler
else
{
RowDeselected?.Invoke(iRowBefore, dgvBefore);
iMenuKey = 0;
iRowKey = -1;
ResetSelectedByKey();
toClear = true;
Cleared?.Invoke();
}
}
private void SelectNextMenu(int iRowBefore, ref ListView? dgv, ListView dgvBefore, Menu? menuFromSelected, bool isStillSelected, ref bool toClear)
{
int iMenuKeyNext = iMenuKey + 1;
if (isStillSelected)
{
int iMenuKeyNext = iMenuKey + 1;
if (menuFromSelected != null &&
menuFromSelected == menus[iMenuKeyNext])
{
dgv = menuFromSelected?.GetDataGridView();
if (dgv != null && dgv.Items.Count > 0)
{
iMenuKey += 1;
iMenuKey = iMenuKeyNext;
iRowKey = -1;
if (SelectMatched(dgv, iRowKey) ||
SelectMatched(dgv, 0))
@ -598,7 +593,7 @@ namespace SystemTrayMenu.Handler
dgv != null &&
dgv.Items.Count > i)
{
Menu.ListViewItemData itemData = (Menu.ListViewItemData)dgv.Items[i];
ListViewItemData itemData = (ListViewItemData)dgv.Items[i];
RowData rowData = itemData.data;
if (itemData.ColumnText.StartsWith(keyInput, true, CultureInfo.InvariantCulture))
{
@ -643,4 +638,4 @@ namespace SystemTrayMenu.Handler
}
}
}
}
}

View file

@ -15,6 +15,9 @@ namespace SystemTrayMenu.Helpers
public class JoystickHelper : IDisposable
{
private readonly Dispatcher dispatchter = Dispatcher.CurrentDispatcher;
#if COLLECTUSAGES
private readonly System.Collections.Generic.Dictionary<Usage, int> usagesCollection = new();
#endif
private readonly System.Timers.Timer pollGamepad = new();
private HidDevice? connectedDevice;
@ -102,6 +105,7 @@ namespace SystemTrayMenu.Helpers
try
{
bool wasPressedButton1 = false;
bool wasPressedButton2 = false;
bool wasPressedPadUp = false;
bool wasPressedPadDown = false;
@ -121,16 +125,31 @@ namespace SystemTrayMenu.Helpers
var dataValue = inputParser.GetValue(index);
foreach (uint usage in dataValue.Usages)
{
int logicalValue = dataValue.GetLogicalValue();
#if COLLECTUSAGES
if (!usagesCollection.ContainsKey((Usage)usage))
{
usagesCollection.Add((Usage)usage, 0);
}
else
{
usagesCollection[(Usage)usage]++;
}
#endif
// See page 14 and referenced subsections, e.g. Generic Desktop Controls
// https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf
switch ((Usage)usage)
{
case Usage.Button2: wasPressedButton2 = dataValue.GetLogicalValue() != 0; break;
case Usage.GenericDesktopDPadUp: wasPressedPadUp = dataValue.GetLogicalValue() != 0; break;
case Usage.GenericDesktopDPadDown: wasPressedPadDown = dataValue.GetLogicalValue() != 0; break;
case Usage.GenericDesktopDPadLeft: wasPressedPadLeft = dataValue.GetLogicalValue() != 0; break;
case Usage.GenericDesktopDPadRight: wasPressedPadRight = dataValue.GetLogicalValue() != 0; break;
case Usage.Button1: wasPressedButton1 = logicalValue != 0; break;
case Usage.Button2: wasPressedButton2 = logicalValue != 0; break;
case Usage.GenericDesktopDPadUp: wasPressedPadUp = logicalValue != 0; break;
case Usage.GenericDesktopDPadDown: wasPressedPadDown = logicalValue != 0; break;
case Usage.GenericDesktopDPadLeft: wasPressedPadLeft = logicalValue != 0; break;
case Usage.GenericDesktopDPadRight: wasPressedPadRight = logicalValue != 0; break;
case Usage.GenericDesktopHatSwitch:
{
switch (dataValue.GetLogicalValue())
switch (logicalValue)
{
case 0: wasPressedPadUp = true; break;
case 2: wasPressedPadRight = true; break;
@ -150,7 +169,7 @@ namespace SystemTrayMenu.Helpers
{
firstPoll = false;
}
else if (wasPressedButton2)
else if (wasPressedButton1 || wasPressedButton2)
{
dispatchter.Invoke(() => KeyPressed?.Invoke(Key.Enter, ModifierKeys.None));
}