From dd6590a0fda614fa2fb0ca9e4ad11b086393372e Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sun, 16 Mar 2025 20:53:33 +0530 Subject: Add simple key sequence parser --- src/keymap/KeySeqParser.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/keymap/KeySeqParser.cpp (limited to 'src/keymap') 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 +#include +#include + +#include "keymap/KeySeqParser.hpp" + +bool operator==(const KeyChord a, const KeyChord b) { + return a.mod == b.mod && a.key == b.key; +} + +KeySeqParser::KeySeqParser() {} + +QList KeySeqParser::parse(QString keySequence) { + QList keyChords; + KeyChord lastKey; + + // TODO: Refactor + // TODO: Support + keySequence = keySequence.toLower(); + while (!keySequence.isEmpty()) { + int skipCount = 1; + if (keySequence.startsWith("'); + 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("'); + 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; +} -- cgit v1.3.1