2020-03-27 23:38:58 +08:00
# pragma once
# include <keyboardmanager/common/KeyboardManagerState.h>
2020-04-19 07:12:26 +08:00
# include "KeyDropDownControl.h"
2020-03-27 23:38:58 +08:00
class SingleKeyRemapControl
{
private :
2020-04-19 07:12:26 +08:00
// Drop down to display the selected remap key
KeyDropDownControl singleKeyRemapDropDown ;
2020-03-27 23:38:58 +08:00
// Button to type the remap key
Button typeKey ;
// StackPanel to parent the above controls
StackPanel singleKeyRemapControlLayout ;
public :
// Handle to the current Edit Keyboard Window
static HWND EditKeyboardWindowHandle ;
// Pointer to the keyboard manager state
static KeyboardManagerState * keyboardManagerState ;
2020-04-10 00:20:19 +08:00
// Stores the current list of remappings
static std : : vector < std : : vector < DWORD > > singleKeyRemapBuffer ;
2020-03-27 23:38:58 +08:00
2020-04-19 07:12:26 +08:00
SingleKeyRemapControl ( const size_t rowIndex , const size_t colIndex ) :
singleKeyRemapDropDown ( rowIndex , colIndex , singleKeyRemapBuffer )
2020-03-27 23:38:58 +08:00
{
typeKey . Content ( winrt : : box_value ( winrt : : to_hstring ( " Type Key " ) ) ) ;
typeKey . Background ( Windows : : UI : : Xaml : : Media : : SolidColorBrush { Windows : : UI : : Colors : : LightGray ( ) } ) ;
typeKey . Foreground ( Windows : : UI : : Xaml : : Media : : SolidColorBrush { Windows : : UI : : Colors : : Black ( ) } ) ;
2020-04-10 00:20:19 +08:00
typeKey . Click ( [ & , rowIndex , colIndex ] ( IInspectable const & sender , RoutedEventArgs const & ) {
2020-03-27 23:38:58 +08:00
keyboardManagerState - > SetUIState ( KeyboardManagerUIState : : DetectSingleKeyRemapWindowActivated , EditKeyboardWindowHandle ) ;
// Using the XamlRoot of the typeKey to get the root of the XAML host
2020-04-10 00:20:19 +08:00
createDetectKeyWindow ( sender , sender . as < Button > ( ) . XamlRoot ( ) , singleKeyRemapBuffer , * keyboardManagerState , rowIndex , colIndex ) ;
2020-03-27 23:38:58 +08:00
} ) ;
singleKeyRemapControlLayout . Background ( Windows : : UI : : Xaml : : Media : : SolidColorBrush { Windows : : UI : : Colors : : LightGray ( ) } ) ;
singleKeyRemapControlLayout . Margin ( { 0 , 0 , 0 , 10 } ) ;
singleKeyRemapControlLayout . Spacing ( 10 ) ;
singleKeyRemapControlLayout . Children ( ) . Append ( typeKey ) ;
2020-04-19 07:12:26 +08:00
singleKeyRemapControlLayout . Children ( ) . Append ( singleKeyRemapDropDown . GetComboBox ( ) ) ;
singleKeyRemapControlLayout . UpdateLayout ( ) ;
2020-03-27 23:38:58 +08:00
}
// Function to add a new row to the remap keys table. If the originalKey and newKey args are provided, then the displayed remap keys are set to those values.
2020-04-19 07:12:26 +08:00
static void AddNewControlKeyRemapRow ( StackPanel & parent , std : : vector < std : : vector < std : : unique_ptr < SingleKeyRemapControl > > > & keyboardRemapControlObjects , const DWORD originalKey = NULL , const DWORD newKey = NULL ) ;
2020-03-27 23:38:58 +08:00
// Function to return the stack panel element of the SingleKeyRemapControl. This is the externally visible UI element which can be used to add it to other layouts
StackPanel getSingleKeyRemapControl ( ) ;
// Function to create the detect remap keys UI window
2020-04-19 07:12:26 +08:00
void createDetectKeyWindow ( IInspectable const & sender , XamlRoot xamlRoot , std : : vector < std : : vector < DWORD > > & singleKeyRemapBuffer , KeyboardManagerState & keyboardManagerState , const size_t rowIndex , const size_t colIndex ) ;
2020-03-27 23:38:58 +08:00
} ;