From d3f537856f6b4cef1b3fbd38fb20e408b7b85921 Mon Sep 17 00:00:00 2001 From: blue Date: Wed, 10 Apr 2019 18:22:52 +0300 Subject: [PATCH] Enter key event binding in chat --- ui/conversation.cpp | 33 +++++++++++++++++++++++---------- ui/conversation.h | 3 +++ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/ui/conversation.cpp b/ui/conversation.cpp index b45601d..4cbfdd7 100644 --- a/ui/conversation.cpp +++ b/ui/conversation.cpp @@ -36,7 +36,7 @@ Conversation::Conversation(Models::Contact* p_contact, QWidget* parent): connect(contact, SIGNAL(childChanged(Models::Item*, int, int)), this, SLOT(onContactChanged(Models::Item*, int, int))); connect(&ker, SIGNAL(enterPressed()), this, SLOT(onEnterPressed())); - m_ui->dialogBox->installEventFilter(&ker); + m_ui->messageEditor->installEventFilter(&ker); } Conversation::~Conversation() @@ -93,20 +93,33 @@ void Conversation::addMessage(const QMap& data) m_ui->dialogBox->append(data.value("from") + ": " + data.value("body")); } +KeyEnterReceiver::KeyEnterReceiver(QObject* parent): QObject(parent), ownEvent(false) {} + bool KeyEnterReceiver::eventFilter(QObject* obj, QEvent* event) { - if (event->type()==QEvent::KeyPress) { + QEvent::Type type = event->type(); + if (type == QEvent::KeyPress) { QKeyEvent* key = static_cast(event); - if ( (key->key()==Qt::Key_Enter) || (key->key()==Qt::Key_Return) ) { - emit enterPressed(); - } else { - return QObject::eventFilter(obj, event); + int k = key->key(); + if (k == Qt::Key_Enter || k == Qt::Key_Return) { + Qt::KeyboardModifiers mod = key->modifiers(); + if (mod & Qt::ControlModifier) { + mod = mod & ~Qt::ControlModifier; + QKeyEvent* nEvent = new QKeyEvent(event->type(), k, mod, key->text(), key->isAutoRepeat(), key->count()); + QCoreApplication::postEvent(obj, nEvent); + ownEvent = true; + return true; + } else { + if (ownEvent) { + ownEvent = false; + } else { + emit enterPressed(); + return true; + } + } } - return true; - } else { - return QObject::eventFilter(obj, event); } - return false; + return QObject::eventFilter(obj, event); } void Conversation::onEnterPressed() diff --git a/ui/conversation.h b/ui/conversation.h index 4e450d8..1bdec69 100644 --- a/ui/conversation.h +++ b/ui/conversation.h @@ -32,7 +32,10 @@ class Conversation; class KeyEnterReceiver : public QObject { Q_OBJECT +public: + KeyEnterReceiver(QObject* parent = 0); protected: + bool ownEvent; bool eventFilter(QObject* obj, QEvent* event); signals: