blob: c5534eb0604b6e57875a89517d90d0f1aac429e6 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
#include <QWidget>
#include <QtCore>
#include <algorithm>
#include "keymap/KeySeqParser.hpp"
bool operator==(const KeyChord a, const KeyChord b) {
return a.mod == b.mod && a.key == b.key;
}
KeySeqParser::KeySeqParser() {}
QList<KeyChord> KeySeqParser::parse(QString keySequence) {
QList<KeyChord> keyChords;
KeyChord lastKey;
// TODO: Refactor
// TODO: Support <C-S-t>
keySequence = keySequence.toLower();
while (!keySequence.isEmpty()) {
int skipCount = 1;
if (keySequence.startsWith("<c-")) {
int nextClosing = keySequence.indexOf('>');
auto keyName = keySequence.sliced(3, nextClosing - 3);
lastKey.mod = lastKey.mod | Qt::KeyboardModifier::ControlModifier;
lastKey.key = parseKey(keyName);
skipCount = nextClosing + 1;
} else if (keySequence.startsWith("<s-")) {
int nextClosing = keySequence.indexOf('>');
auto keyName = keySequence.sliced(3, nextClosing - 3);
lastKey.mod = lastKey.mod | Qt::KeyboardModifier::ShiftModifier;
lastKey.key = parseKey(keyName);
skipCount = nextClosing + 1;
} else if (keySequence.startsWith("<")) {
int nextClosing = keySequence.indexOf('>');
auto keyName = keySequence.sliced(1, nextClosing - 1);
lastKey.mod = Qt::KeyboardModifier::NoModifier;
lastKey.key = parseKey(keyName);
skipCount = nextClosing + 1;
} else {
auto keyName = keySequence.first(1);
lastKey.mod = Qt::KeyboardModifier::NoModifier;
lastKey.key = parseKey(keyName);
}
keySequence.slice(std::max(1, skipCount));
keyChords.push_back(lastKey);
lastKey = KeyChord();
}
return keyChords;
}
Qt::Key KeySeqParser::parseKey(QString keyName) {
if (keyName.length() == 0)
return Qt::Key_T; // TODO: tmp
if (keyName.length() == 1) {
char c = keyName.toStdString().at(0);
return Qt::Key(Qt::Key_A + (c - 'a'));
}
if (keyName == "space")
return Qt::Key_Space;
if (keyName == "cr")
return Qt::Key_Return;
if (keyName == "esc")
return Qt::Key_Escape;
if (keyName == "bs")
return Qt::Key_Backspace;
if (keyName == "tab")
return Qt::Key_Tab;
return Qt::Key_T;
}
|