aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-03-18 21:57:03 +0530
committerAkshay Nair <phenax5@gmail.com>2025-03-18 23:36:03 +0530
commit1bd89088f1bb6103a34584ae39157abf2f732742 (patch)
tree2f8fd292bbfb710979bdc44507156524a97148b7 /src
parent4c762b2516bc664293c2aec072074f1e34dda8c3 (diff)
downloadnull-browser-1bd89088f1bb6103a34584ae39157abf2f732742.tar.gz
null-browser-1bd89088f1bb6103a34584ae39157abf2f732742.zip
Add action for keymaps + test
Diffstat (limited to 'src')
-rw-r--r--src/InputMediator.cpp8
-rw-r--r--src/keymap/KeymapEvaluator.cpp53
-rw-r--r--src/widgets/MainWindow.cpp24
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;
}