diff options
Diffstat (limited to '')
| -rw-r--r-- | src/InputMediator.cpp | 8 | ||||
| -rw-r--r-- | src/keymap/KeymapEvaluator.cpp | 53 | ||||
| -rw-r--r-- | src/widgets/MainWindow.cpp | 24 |
3 files changed, 78 insertions, 7 deletions
diff --git a/src/InputMediator.cpp b/src/InputMediator.cpp index 350d8ac..f935ad2 100644 --- a/src/InputMediator.cpp +++ b/src/InputMediator.cpp @@ -7,8 +7,10 @@ #include "LuaRuntime.hpp" #include "widgets/WebViewStack.hpp" -InputMediator::InputMediator(WebViewStack *webViewStack, LuaRuntime *luaRuntime) - : QObject(), webViewStack(webViewStack), luaRuntime(luaRuntime) { +InputMediator::InputMediator(WebViewStack *webViewStack, LuaRuntime *luaRuntime, + KeymapEvaluator *keymapEvaluator) + : QObject(), webViewStack(webViewStack), luaRuntime(luaRuntime), + keymapEvaluator(keymapEvaluator) { connect(luaRuntime, &LuaRuntime::urlOpened, webViewStack, &WebViewStack::openUrl); } @@ -40,3 +42,5 @@ void InputMediator::evaluateCommand(QString command) { break; } } + +InputMediator::~InputMediator() { delete webViewStack; } diff --git a/src/keymap/KeymapEvaluator.cpp b/src/keymap/KeymapEvaluator.cpp index cca10e8..baae819 100644 --- a/src/keymap/KeymapEvaluator.cpp +++ b/src/keymap/KeymapEvaluator.cpp @@ -4,3 +4,56 @@ #include "keymap/KeymapEvaluator.hpp" KeymapEvaluator::KeymapEvaluator() : QObject() {} + +// TODO: Clear mapping after some time + +void KeymapEvaluator::addKeymap(KeyMode mode, QString key, KeyAction action) { + if (!modalKeys.contains(mode)) + modalKeys.insert(mode, {}); + + auto keySeq = keySeqParser.parse(key); + modalKeys[mode].append((KeyMap){.keySequence = keySeq, .action = action}); +} + +bool KeymapEvaluator::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 true; + + 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) { + keymap.action(); + activeKeySequence.clear(); + return true; + } else if (matchType == KeyMatchType::Pending) { + foundPendingMatches = true; + } + } + + if (!foundPendingMatches) + activeKeySequence.clear(); + + if (isInsertableMode()) + return foundPendingMatches; + + return true; +} + +bool KeymapEvaluator::isInsertableMode() { + return currentMode == KeyMode::Insert; +} + +const QList<KeyMap> *KeymapEvaluator::currentModeKeys() { + if (!modalKeys.contains(currentMode)) + return new QList<KeyMap>(); + + return &modalKeys[currentMode]; +} diff --git a/src/widgets/MainWindow.cpp b/src/widgets/MainWindow.cpp index 327a77c..32bde30 100644 --- a/src/widgets/MainWindow.cpp +++ b/src/widgets/MainWindow.cpp @@ -6,6 +6,7 @@ #include <QtWidgets/qapplication.h> #include "InputMediator.hpp" +#include "keymap/KeymapEvaluator.hpp" #include "widgets/MainWindow.hpp" #include "widgets/WebViewStack.hpp" @@ -34,11 +35,23 @@ MainWindow::MainWindow() { webViewStack->openUrl(QUrl("https://github.com/trending"), OpenType::OpenUrlInBgTab); - inputMediator = new InputMediator(webViewStack, LuaRuntime::instance()); + auto keymapEvaluator = new KeymapEvaluator; + + inputMediator = + new InputMediator(webViewStack, LuaRuntime::instance(), keymapEvaluator); // TODO: remove - keymapEvaluator.addKeymap("default", "<c-t>a", "Stuff"); - keymapEvaluator.addKeymap("default", "<c-t>b", "Other stuff"); + keymapEvaluator->addKeymap(KeyMode::Normal, "i", [keymapEvaluator]() { + keymapEvaluator->setCurrentMode(KeyMode::Insert); + }); + keymapEvaluator->addKeymap(KeyMode::Insert, "<esc>", [keymapEvaluator]() { + keymapEvaluator->setCurrentMode(KeyMode::Normal); + }); + + keymapEvaluator->addKeymap(KeyMode::Normal, "<c-t>a", + []() { qDebug() << "Stuff"; }); + keymapEvaluator->addKeymap(KeyMode::Normal, "<c-t>b", + []() { qDebug() << "Else"; }); } void MainWindow::keyPressEvent(QKeyEvent *event) { @@ -61,7 +74,8 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event) { return false; auto keyEvent = static_cast<QKeyEvent *>(event); - keymapEvaluator.evaluate(keyEvent->modifiers(), (Qt::Key)keyEvent->key()); + bool shouldSkip = inputMediator->evaluateKeymap(keyEvent->modifiers(), + (Qt::Key)keyEvent->key()); - return true; + return shouldSkip; } |
