summaryrefslogtreecommitdiffstats
path: root/src/keymap.h
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-02 17:02:18 +0200
committerDanilo M. <danix@danix.xyz>2026-08-04 12:52:15 +0200
commit83669b23c371ee0bdea178fce9920585dd55704b (patch)
tree98d09b34dd5c0da4196620296757ce5e26095bcd /src/keymap.h
parentd217d976ccdc439803003a26252904ca8abdd520 (diff)
downloadqtmaildir-83669b23c371ee0bdea178fce9920585dd55704b.tar.gz
qtmaildir-83669b23c371ee0bdea178fce9920585dd55704b.zip
feat: add KeyMap with defaults and INI overrides
Maps key sequences to action name strings, with hardcoded vim-style defaults and QSettings-based [keys] overrides. Unknown actions and unparseable sequences are collected as warnings rather than treated as fatal, so a typo in the config cannot silently misbind or crash. Note: QKeySequence::fromString() on Qt 6.11 does not return an empty sequence for unparseable input (e.g. "NotAKey++") -- it returns a non-empty sequence whose toString() is empty. Detection uses that instead of isEmpty().
Diffstat (limited to 'src/keymap.h')
-rw-r--r--src/keymap.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/keymap.h b/src/keymap.h
new file mode 100644
index 0000000..3f0f85c
--- /dev/null
+++ b/src/keymap.h
@@ -0,0 +1,32 @@
+#pragma once
+
+#include <QHash>
+#include <QKeySequence>
+#include <QStringList>
+
+class QSettings;
+
+/// Maps key sequences to action names. Action names are plain strings so this
+/// class has no dependency on the widgets that implement the actions.
+class KeyMap
+{
+public:
+ /// Every action name the application understands. loadOverrides() rejects
+ /// anything not in this set, so a typo in the config cannot bind silently.
+ static QStringList knownActions();
+
+ void loadDefaults();
+
+ /// Reads the [keys] group. Invalid sequences and unknown action names are
+ /// collected into warnings() rather than throwing or aborting.
+ void loadOverrides(QSettings &settings);
+
+ /// Empty string when nothing is bound.
+ QString actionFor(const QKeySequence &sequence) const;
+
+ QStringList warnings() const { return m_warnings; }
+
+private:
+ QHash<QKeySequence, QString> m_bindings;
+ QStringList m_warnings;
+};