Enter key event binding in chat

This commit is contained in:
Blue 2019-04-10 18:22:52 +03:00
parent 3cc53dfaf6
commit d3f537856f
2 changed files with 26 additions and 10 deletions

View File

@ -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(contact, SIGNAL(childChanged(Models::Item*, int, int)), this, SLOT(onContactChanged(Models::Item*, int, int)));
connect(&ker, SIGNAL(enterPressed()), this, SLOT(onEnterPressed())); connect(&ker, SIGNAL(enterPressed()), this, SLOT(onEnterPressed()));
m_ui->dialogBox->installEventFilter(&ker); m_ui->messageEditor->installEventFilter(&ker);
} }
Conversation::~Conversation() Conversation::~Conversation()
@ -93,20 +93,33 @@ void Conversation::addMessage(const QMap<QString, QString>& data)
m_ui->dialogBox->append(data.value("from") + ": " + data.value("body")); 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) 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<QKeyEvent*>(event); QKeyEvent* key = static_cast<QKeyEvent*>(event);
if ( (key->key()==Qt::Key_Enter) || (key->key()==Qt::Key_Return) ) { int k = key->key();
emit enterPressed(); if (k == Qt::Key_Enter || k == Qt::Key_Return) {
} else { Qt::KeyboardModifiers mod = key->modifiers();
return QObject::eventFilter(obj, event); 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() void Conversation::onEnterPressed()

View File

@ -32,7 +32,10 @@ class Conversation;
class KeyEnterReceiver : public QObject class KeyEnterReceiver : public QObject
{ {
Q_OBJECT Q_OBJECT
public:
KeyEnterReceiver(QObject* parent = 0);
protected: protected:
bool ownEvent;
bool eventFilter(QObject* obj, QEvent* event); bool eventFilter(QObject* obj, QEvent* event);
signals: signals: