14const QMap<Qt::Key, QPair<OhosKeyboardModifier, Qt::KeyboardModifier>> qtKeyToModifiersMap = {
15 {Qt::Key_Shift, {OhosKeyboardModifier::SHIFT, Qt::ShiftModifier}},
16 {Qt::Key_Alt, {OhosKeyboardModifier::ALT, Qt::AltModifier}},
17 {Qt::Key_Control, {OhosKeyboardModifier::CTRL, Qt::ControlModifier}},
18 {Qt::Key_Meta, {OhosKeyboardModifier::LOGO, Qt::MetaModifier}},
21bool isNoModificatorPressed(Qt::KeyboardModifiers keyboardModifiers)
23 return keyboardModifiers.testFlag(Qt::NoModifier);
26bool isOnlyKeypadModificatorOn(Qt::KeyboardModifiers keyboardModifiers)
28 return keyboardModifiers == Qt::KeyboardModifiers(Qt::KeypadModifier);
31char tryConvertKeyEventToKeyCharOrNull(
const Qt::Key &key, Qt::KeyboardModifiers qtModifiers)
33 bool onlyShiftModPressed = isOnlyShiftModificatorPressed(qtModifiers);
34 bool onlyKeypadModificatorOn = isOnlyKeypadModificatorOn(qtModifiers);
35 bool noModPressed = isNoModificatorPressed(qtModifiers);
36 bool useNoModifiedKeyText = noModPressed || onlyKeypadModificatorOn;
39 case Qt::Key_Space:
return ' ';
40 case Qt::Key_Backspace:
return '\x08';
41 case Qt::Key_Tab:
return '\x09';
42 case Qt::Key_Enter:
return '\x0D';
43 case Qt::Key_Return:
return '\x0D';
44 case Qt::Key_Delete:
return '\x7F';
45 case Qt::Key_Escape:
return '\x1B';
50 if (onlyShiftModPressed || useNoModifiedKeyText) {
52 case Qt::Key_A:
return 'a';
53 case Qt::Key_B:
return 'b';
54 case Qt::Key_C:
return 'c';
55 case Qt::Key_D:
return 'd';
56 case Qt::Key_E:
return 'e';
57 case Qt::Key_F:
return 'f';
58 case Qt::Key_G:
return 'g';
59 case Qt::Key_H:
return 'h';
60 case Qt::Key_I:
return 'i';
61 case Qt::Key_J:
return 'j';
62 case Qt::Key_K:
return 'k';
63 case Qt::Key_L:
return 'l';
64 case Qt::Key_M:
return 'm';
65 case Qt::Key_N:
return 'n';
66 case Qt::Key_O:
return 'o';
67 case Qt::Key_P:
return 'p';
68 case Qt::Key_Q:
return 'q';
69 case Qt::Key_R:
return 'r';
70 case Qt::Key_S:
return 's';
71 case Qt::Key_T:
return 't';
72 case Qt::Key_U:
return 'u';
73 case Qt::Key_V:
return 'v';
74 case Qt::Key_W:
return 'w';
75 case Qt::Key_X:
return 'x';
76 case Qt::Key_Y:
return 'y';
77 case Qt::Key_Z:
return 'z';
78 case Qt::Key_0:
return '0';
79 case Qt::Key_1:
return '1';
80 case Qt::Key_2:
return '2';
81 case Qt::Key_3:
return '3';
82 case Qt::Key_4:
return '4';
83 case Qt::Key_5:
return '5';
84 case Qt::Key_6:
return '6';
85 case Qt::Key_7:
return '7';
86 case Qt::Key_8:
return '8';
87 case Qt::Key_9:
return '9';
88 case Qt::Key_QuoteLeft:
return '`';
89 case Qt::Key_Minus:
return '-';
90 case Qt::Key_Equal:
return '=';
91 case Qt::Key_BracketLeft:
return '[';
92 case Qt::Key_BracketRight:
return ']';
93 case Qt::Key_Backslash:
return '\\';
94 case Qt::Key_Semicolon:
return ';';
95 case Qt::Key_Apostrophe:
return '\'';
96 case Qt::Key_Comma:
return ',';
97 case Qt::Key_Period:
return '.';
98 case Qt::Key_Slash:
return '/';
99 case Qt::Key_ParenRight:
return ')';
100 case Qt::Key_Exclam:
return '!';
101 case Qt::Key_At:
return '@';
102 case Qt::Key_NumberSign:
return '#';
103 case Qt::Key_Dollar:
return '$';
104 case Qt::Key_Percent:
return '%';
105 case Qt::Key_AsciiCircum:
return '^';
106 case Qt::Key_Ampersand:
return '&';
107 case Qt::Key_Asterisk:
return '*';
108 case Qt::Key_ParenLeft:
return '(';
109 case Qt::Key_AsciiTilde:
return '~';
110 case Qt::Key_Underscore:
return '_';
111 case Qt::Key_Plus:
return '+';
112 case Qt::Key_BraceLeft:
return '{';
113 case Qt::Key_BraceRight:
return '}';
114 case Qt::Key_Bar:
return '|';
115 case Qt::Key_Colon:
return ':';
116 case Qt::Key_QuoteDbl:
return '"';
117 case Qt::Key_Less:
return '<';
118 case Qt::Key_Greater:
return '>';
119 case Qt::Key_Question:
return '?';
131 QFlags<OhosKeyboardModifier> ohosKeysModifiers,
bool keyFromNumPad)
133 auto keyboardModifiers = convertOhosToQtKeyboardModifiers(ohosKeysModifiers);
134 keyboardModifiers.setFlag(Qt::KeypadModifier, keyFromNumPad);
136 return keyboardModifiers;
141 return keyboardModifiers.testFlag(Qt::ShiftModifier) &&
142 !keyboardModifiers.testFlag(Qt::AltModifier) &&
143 !keyboardModifiers.testFlag(Qt::ControlModifier);
147 const Qt::Key &key, Qt::KeyboardModifiers qtModifiers, QFlags<OhosKeyboardModifier> ohosKeysModifiers)
149 auto keyChar = QChar::fromLatin1(tryConvertKeyEventToKeyCharOrNull(key, qtModifiers));
151 auto effectiveKeyChar =
152 keyChar.isLetter() && keyCapsLockFlagOn != isOnlyShiftModificatorPressed(qtModifiers)
155 return !effectiveKeyChar.isNull() ? QString(effectiveKeyChar) : QString();
159 Qt::KeyboardModifiers lastKeyboardModifiers, QFlags<OhosKeyboardModifier> ohosKeysModifiers, Qt::Key qtKey)
161 auto modifiers = lastKeyboardModifiers;
162 if (qtKeyToModifiersMap.contains(qtKey)) {
163 const auto actualKeyModifiers = qtKeyToModifiersMap.value(qtKey);
164 const auto ohosModifier = actualKeyModifiers.first;
165 const auto qtModifier = actualKeyModifiers.second;
166 modifiers.setFlag(qtModifier, !ohosKeysModifiers.testFlag(ohosModifier));