From ff39958dd98644e73b7b77bdd986944134f78d09 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=BCdiger=20Sonderfeld?= Date: Tue, 9 Mar 2010 16:12:16 +0100 Subject: [PATCH] added basic support for Emacs style key bindings --- src/qtui/inputwidget.cpp | 7 +++ src/qtui/inputwidget.h | 1 + .../settingspages/inputwidgetsettingspage.ui | 16 +++++ src/uisupport/multilineedit.cpp | 60 +++++++++++++++++++ src/uisupport/multilineedit.h | 3 + 5 files changed, 87 insertions(+) diff --git a/src/qtui/inputwidget.cpp b/src/qtui/inputwidget.cpp index 814f4f42..f490a670 100644 --- a/src/qtui/inputwidget.cpp +++ b/src/qtui/inputwidget.cpp @@ -106,6 +106,9 @@ InputWidget::InputWidget(QWidget *parent) setEnableSpellCheck(s.value("EnableSpellCheck", false)); #endif + s.notify("EnableEmacsMode", this, SLOT(setEnableEmacsMode(QVariant))); + setEnableEmacsMode(s.value("EnableEmacsMode", false)); + s.notify("ShowNickSelector", this, SLOT(setShowNickSelector(QVariant))); setShowNickSelector(s.value("ShowNickSelector", true)); @@ -161,6 +164,10 @@ void InputWidget::setEnableSpellCheck(const QVariant &v) { ui.inputEdit->setSpellCheckEnabled(v.toBool()); } +void InputWidget::setEnableEmacsMode(const QVariant &v) { + ui.inputEdit->setEmacsMode(v.toBool()); +} + void InputWidget::setShowNickSelector(const QVariant &v) { ui.ownNick->setVisible(v.toBool()); } diff --git a/src/qtui/inputwidget.h b/src/qtui/inputwidget.h index 033378d6..b5770355 100644 --- a/src/qtui/inputwidget.h +++ b/src/qtui/inputwidget.h @@ -55,6 +55,7 @@ private slots: void setCustomFont(const QVariant &font); void setUseCustomFont(const QVariant &); void setEnableSpellCheck(const QVariant &); + void setEnableEmacsMode(const QVariant &); void setShowNickSelector(const QVariant &); void setShowStyleButtons(const QVariant &); void setEnablePerChatHistory(const QVariant &); diff --git a/src/qtui/settingspages/inputwidgetsettingspage.ui b/src/qtui/settingspages/inputwidgetsettingspage.ui index c4197d4d..078745fe 100644 --- a/src/qtui/settingspages/inputwidgetsettingspage.ui +++ b/src/qtui/settingspages/inputwidgetsettingspage.ui @@ -105,6 +105,22 @@ + + + + Enables (limited) Emacs key bindings in the input field. + + + Emacs key bindings + + + EnableEmacsMode + + + false + + + diff --git a/src/uisupport/multilineedit.cpp b/src/uisupport/multilineedit.cpp index a0e0e8cc..871f47a7 100644 --- a/src/uisupport/multilineedit.cpp +++ b/src/uisupport/multilineedit.cpp @@ -168,6 +168,10 @@ QSize MultiLineEdit::minimumSizeHint() const { return sizeHint(); } +void MultiLineEdit::setEmacsMode(bool enable) { + _emacsMode = enable; +} + void MultiLineEdit::setSpellCheckEnabled(bool enable) { #ifdef HAVE_KDE setCheckSpellingEnabled(enable); @@ -318,6 +322,62 @@ void MultiLineEdit::keyPressEvent(QKeyEvent *event) { ; } + if(_emacsMode) { + if(event->modifiers() & Qt::ControlModifier) { + switch(event->key()) { + // move + case Qt::Key_A: + moveCursor(QTextCursor::StartOfLine); + return; + case Qt::Key_E: + moveCursor(QTextCursor::EndOfLine); + return; + case Qt::Key_F: + moveCursor(QTextCursor::Right); + return; + case Qt::Key_B: + moveCursor(QTextCursor::Left); + return; + case Qt::Key_Right: + moveCursor(QTextCursor::WordRight); + return; + case Qt::Key_Left: + moveCursor(QTextCursor::WordLeft); + return; + + // modify + case Qt::Key_Y: + paste(); + return; + case Qt::Key_K: + moveCursor(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); + cut(); + return; + } + } + else if(event->modifiers() & Qt::MetaModifier) { + switch(event->key()) { + case Qt::Key_Right: + moveCursor(QTextCursor::WordRight); + return; + case Qt::Key_Left: + moveCursor(QTextCursor::WordLeft); + return; + case Qt::Key_F: + moveCursor(QTextCursor::WordRight); + return; + case Qt::Key_B: + moveCursor(QTextCursor::WordLeft); + return; + case Qt::Key_Less: + moveCursor(QTextCursor::Start); + return; + case Qt::Key_Greater: + moveCursor(QTextCursor::End); + return; + } + } + } #ifdef HAVE_KDE KTextEdit::keyPressEvent(event); diff --git a/src/uisupport/multilineedit.h b/src/uisupport/multilineedit.h index b3a9d593..a1a0ffdf 100644 --- a/src/uisupport/multilineedit.h +++ b/src/uisupport/multilineedit.h @@ -70,11 +70,13 @@ public: inline QStringList history() const { return _history; } inline QHash tempHistory() const { return _tempHistory; } inline qint32 idx() const { return _idx; } + inline bool emacsMode() const { return _emacsMode; } public slots: void setMode(Mode mode); void setMinHeight(int numLines); void setMaxHeight(int numLines); + void setEmacsMode(bool enable = true); void setScrollBarsEnabled(bool enable = true); void setSpellCheckEnabled(bool enable = true); void setPasteProtectionEnabled(bool enable = true, QWidget *msgBoxParent = 0); @@ -119,6 +121,7 @@ private: int _maxHeight; bool _scrollBarsEnabled; bool _pasteProtectionEnabled; + bool _emacsMode; QSize _sizeHint; qreal _lastDocumentHeight; -- 2.20.1