diff options
Diffstat (limited to 'src/keymap')
| -rw-r--r-- | src/keymap/KeySeqParser.hpp | 44 | ||||
| -rw-r--r-- | src/keymap/KeymapEvaluator.hpp | 42 |
2 files changed, 86 insertions, 0 deletions
diff --git a/src/keymap/KeySeqParser.hpp b/src/keymap/KeySeqParser.hpp new file mode 100644 index 0000000..fac2546 --- /dev/null +++ b/src/keymap/KeySeqParser.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include <QtCore/qnamespace.h> +#include <QtCore> +#include <cmath> + +struct KeyChord { + Qt::KeyboardModifiers mod; + Qt::Key key; +}; +bool operator==(const KeyChord a, const KeyChord b); + +typedef QList<KeyChord> KeySequence; + +enum KeyMatchType { + NoMatch, + Match, + Pending, +}; + +class KeySeqParser { +public: + static const KeyMatchType keySequenceMatch(const KeySequence target, + const KeySequence current) { + for (int i = 0; i < target.length(); i++) { + if (current.length() <= i) + return KeyMatchType::Pending; + + if (target[i].key != current[i].key || + !target[i].mod.testFlags(current[i].mod)) + return KeyMatchType::NoMatch; + } + + return KeyMatchType::Match; + } + +public: + KeySeqParser(); + + KeySequence parse(QString keySequence); + +private: + Qt::Key parseKey(QString keyName); +}; diff --git a/src/keymap/KeymapEvaluator.hpp b/src/keymap/KeymapEvaluator.hpp new file mode 100644 index 0000000..db93900 --- /dev/null +++ b/src/keymap/KeymapEvaluator.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include <QWidget> +#include <QtCore/qmap.h> +#include <QtCore/qnamespace.h> +#include <QtCore> +#include <functional> + +#include "keymap/KeySeqParser.hpp" +#include "utils.hpp" + +typedef std::function<void()> KeyAction; + +struct KeyMap { + KeySequence keySequence; + KeyAction action; +}; + +enum KeyMode { Normal, Insert }; + +class KeymapEvaluator : public QObject { + Q_OBJECT + +public: + KeymapEvaluator(); + + void addKeymap(KeyMode mode, QString key, KeyAction action); + bool evaluate(Qt::KeyboardModifiers modifiers, Qt::Key key); + + DEFINE_SETTER(setCurrentMode, currentMode) + DEFINE_GETTER(getCurrentMode, currentMode) + +private: + const QList<KeyMap> *currentModeKeys(); + bool isInsertableMode(); + +private: + QMap<KeyMode, QList<KeyMap>> modalKeys; + KeySeqParser keySeqParser; + KeyMode currentMode = KeyMode::Normal; + KeySequence activeKeySequence; +}; |
