From 1bd89088f1bb6103a34584ae39157abf2f732742 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Tue, 18 Mar 2025 21:57:03 +0530 Subject: Add action for keymaps + test --- include/keymap/KeymapEvaluator.hpp | 62 +++++++++++--------------------------- 1 file changed, 17 insertions(+), 45 deletions(-) (limited to 'include/keymap/KeymapEvaluator.hpp') diff --git a/include/keymap/KeymapEvaluator.hpp b/include/keymap/KeymapEvaluator.hpp index 54409b1..db93900 100644 --- a/include/keymap/KeymapEvaluator.hpp +++ b/include/keymap/KeymapEvaluator.hpp @@ -1,70 +1,42 @@ #pragma once -#include "keymap/KeySeqParser.hpp" #include #include #include #include +#include + +#include "keymap/KeySeqParser.hpp" +#include "utils.hpp" + +typedef std::function KeyAction; struct KeyMap { KeySequence keySequence; - QString action; // TODO: string for testing + KeyAction action; }; +enum KeyMode { Normal, Insert }; + class KeymapEvaluator : public QObject { Q_OBJECT public: KeymapEvaluator(); - void addKeymap(QString mode, QString key, QString action) { - if (!modalKeys.contains(mode)) - modalKeys.insert(mode, {}); - - auto keySeq = keySeqParser.parse(key); - // TODO: Add actions - modalKeys[mode].append((KeyMap){.keySequence = keySeq, .action = action}); - } - - void evaluate(Qt::KeyboardModifiers modifiers, Qt::Key key) { - if (key == Qt::Key_Control || key == Qt::Key_Shift || key == Qt::Key_Meta || - key == Qt::Key_Alt) - return; + void addKeymap(KeyMode mode, QString key, KeyAction action); + bool evaluate(Qt::KeyboardModifiers modifiers, Qt::Key key); - auto keymaps = currentModeKeys(); - auto foundPendingMatches = false; - - activeKeySequence.append((KeyChord){.mod = modifiers, .key = key}); - - for (auto &keymap : *keymaps) { - auto matchType = - KeySeqParser::keySequenceMatch(keymap.keySequence, activeKeySequence); - - if (matchType == KeyMatchType::Match) { - qDebug() << "Matched!" << keymap.action; - activeKeySequence.clear(); - return; - } else if (matchType == KeyMatchType::Pending) { - foundPendingMatches = true; - } - } - - if (!foundPendingMatches) - activeKeySequence.clear(); - } + DEFINE_SETTER(setCurrentMode, currentMode) + DEFINE_GETTER(getCurrentMode, currentMode) private: - const QList *currentModeKeys() { - if (!modalKeys.contains(currentMode)) - return new QList(); - - return &modalKeys[currentMode]; - } + const QList *currentModeKeys(); + bool isInsertableMode(); private: - QMap> modalKeys; + QMap> modalKeys; KeySeqParser keySeqParser; - QString currentMode = "default"; - + KeyMode currentMode = KeyMode::Normal; KeySequence activeKeySequence; }; -- cgit v1.3.1