diff options
| author | Akshay Nair <phenax5@gmail.com> | 2025-03-16 20:53:33 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2025-03-16 21:03:24 +0530 |
| commit | dd6590a0fda614fa2fb0ca9e4ad11b086393372e (patch) | |
| tree | 709c9abb4ff2b24d301e40438adc03f66bffdb83 /src | |
| parent | a004334349c724dc5d3b5695dc575c9f1a3744ec (diff) | |
| download | null-browser-dd6590a0fda614fa2fb0ca9e4ad11b086393372e.tar.gz null-browser-dd6590a0fda614fa2fb0ca9e4ad11b086393372e.zip | |
Add simple key sequence parser
Diffstat (limited to '')
| -rw-r--r-- | src/keymap/KeySeqParser.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/keymap/KeySeqParser.cpp b/src/keymap/KeySeqParser.cpp new file mode 100644 index 0000000..c5534eb --- /dev/null +++ b/src/keymap/KeySeqParser.cpp @@ -0,0 +1,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; +} |
