diff --git a/src/widget/form/genericchatform.cpp b/src/widget/form/genericchatform.cpp index b23494b80..bed679b30 100644 --- a/src/widget/form/genericchatform.cpp +++ b/src/widget/form/genericchatform.cpp @@ -227,7 +227,7 @@ GenericChatForm::GenericChatForm(QWidget* parent) connect(searchForm, &SearchForm::searchInBegin, this, &GenericChatForm::searchInBegin); connect(searchForm, &SearchForm::searchUp, this, &GenericChatForm::onSearchUp); connect(searchForm, &SearchForm::searchDown, this, &GenericChatForm::onSearchDown); - connect(searchForm, &SearchForm::visibleChanged, this, &GenericChatForm::onSearchTrigered); + connect(searchForm, &SearchForm::visibleChanged, this, &GenericChatForm::onSearchTriggered); connect(chatWidget, &ChatLog::workerTimeoutFinished, this, &GenericChatForm::onContinueSearch); @@ -311,14 +311,18 @@ void GenericChatForm::showEvent(QShowEvent*) bool GenericChatForm::event(QEvent* e) { // If the user accidentally starts typing outside of the msgEdit, focus it automatically - if (searchForm->isHidden()) { + if (e->type() == QEvent::KeyRelease && !msgEdit->hasFocus()) { QKeyEvent* ke = static_cast(e); if ((ke->modifiers() == Qt::NoModifier || ke->modifiers() == Qt::ShiftModifier) - && !ke->text().isEmpty()) - msgEdit->setFocus(); + && !ke->text().isEmpty()) { + if (searchForm->isHidden()) { + msgEdit->setFocus(); + } else { + searchForm->setFocusEditor(); + } + } } - } return QWidget::event(e); } @@ -578,9 +582,7 @@ bool GenericChatForm::searchInText(const QString& phrase, bool searchUp) for (int i = startLine; searchUp ? i >= 0 : i < numLines; searchUp ? --i : ++i) { ChatLine::Ptr l = lines[i]; - if (l->getColumnCount() < 2) { - continue; - } + if (l->getColumnCount() < 2) { continue; } ChatLineContent* content = l->getContent(1); Text* text = static_cast(content); @@ -784,10 +786,11 @@ void GenericChatForm::searchFormShow() { if (searchForm->isHidden()) { searchForm->show(); + searchForm->setFocusEditor(); } } -void GenericChatForm::onSearchTrigered() +void GenericChatForm::onSearchTriggered() { if (searchForm->isHidden()) { searchForm->removeSearchPhrase(); diff --git a/src/widget/form/genericchatform.h b/src/widget/form/genericchatform.h index e15008e61..0789d00c2 100644 --- a/src/widget/form/genericchatform.h +++ b/src/widget/form/genericchatform.h @@ -104,7 +104,7 @@ protected slots: void quoteSelectedText(); void copyLink(); void searchFormShow(); - void onSearchTrigered(); + void onSearchTriggered(); void searchInBegin(const QString& phrase); virtual void onSearchUp(const QString& phrase) = 0; diff --git a/src/widget/searchform.cpp b/src/widget/searchform.cpp index 095ff1ef4..e8a405118 100644 --- a/src/widget/searchform.cpp +++ b/src/widget/searchform.cpp @@ -20,13 +20,13 @@ #include "searchform.h" #include "src/widget/style.h" #include -#include #include +#include SearchForm::SearchForm(QWidget* parent) : QWidget(parent) { QHBoxLayout *layout = new QHBoxLayout(); - searchLine = new QLineEdit(); + searchLine = new LineEdit(); upButton = createButton("searchUpButton", "green"); downButton = createButton("searchDownButton", "green"); @@ -40,7 +40,11 @@ SearchForm::SearchForm(QWidget* parent) : QWidget(parent) setLayout(layout); - connect(searchLine, &QLineEdit::textChanged, this, &SearchForm::changedSearchPhrase); + connect(searchLine, &LineEdit::textChanged, this, &SearchForm::changedSearchPhrase); + connect(searchLine, &LineEdit::clickEnter, this, &SearchForm::clickedUp); + connect(searchLine, &LineEdit::clickShiftEnter, this, &SearchForm::clickedDown); + connect(searchLine, &LineEdit::clickEsc, this, &SearchForm::clickedHide); + connect(upButton, &QPushButton::clicked, this, &SearchForm::clickedUp); connect(downButton, &QPushButton::clicked, this, &SearchForm::clickedDown); connect(hideButton, &QPushButton::clicked, this, &SearchForm::clickedHide); @@ -56,6 +60,17 @@ QString SearchForm::getSearchPhrase() const return searchPhrase; } +void SearchForm::setFocusEditor() +{ + searchLine->setFocus(); +} + +void SearchForm::showEvent(QShowEvent* event) +{ + QWidget::showEvent(event); + emit visibleChanged(); +} + QPushButton *SearchForm::createButton(const QString& name, const QString& state) { QPushButton* btn = new QPushButton(); @@ -67,12 +82,6 @@ QPushButton *SearchForm::createButton(const QString& name, const QString& state) return btn; } -void SearchForm::showEvent(QShowEvent* event) -{ - QWidget::showEvent(event); - emit visibleChanged(); -} - void SearchForm::changedSearchPhrase(const QString& text) { searchPhrase = text; @@ -94,3 +103,26 @@ void SearchForm::clickedHide() hide(); emit visibleChanged(); } + +LineEdit::LineEdit(QWidget* parent) : QLineEdit(parent) +{ +} + +void LineEdit::keyPressEvent(QKeyEvent* event) +{ + int key = event->key(); + + if ((key == Qt::Key_Enter || key == Qt::Key_Return)) { + if ((event->modifiers() & Qt::ShiftModifier)) { + emit clickShiftEnter(); + } else { + emit clickEnter(); + } + } else if (key == Qt::Key_Escape) { + emit clickEsc(); + } + + QLineEdit::keyPressEvent(event); +} + + diff --git a/src/widget/searchform.h b/src/widget/searchform.h index 70f8ae076..d7a522c85 100644 --- a/src/widget/searchform.h +++ b/src/widget/searchform.h @@ -21,9 +21,10 @@ #define SEARCHFORM_H #include +#include class QPushButton; -class QLineEdit; +class LineEdit; class SearchForm final : public QWidget { @@ -32,6 +33,10 @@ public: explicit SearchForm(QWidget* parent = nullptr); void removeSearchPhrase(); QString getSearchPhrase() const; + void setFocusEditor(); + +protected: + virtual void showEvent(QShowEvent* event) final override; private: QPushButton* createButton(const QString& name, const QString& state); @@ -39,13 +44,10 @@ private: QPushButton* upButton; QPushButton* downButton; QPushButton* hideButton; - QLineEdit* searchLine; + LineEdit* searchLine; QString searchPhrase; -protected: - virtual void showEvent(QShowEvent* event); - private slots: void changedSearchPhrase(const QString& text); void clickedUp(); @@ -59,4 +61,20 @@ signals: void visibleChanged(); }; +class LineEdit : public QLineEdit +{ + Q_OBJECT + +public: + LineEdit(QWidget* parent = nullptr); + +protected: + virtual void keyPressEvent(QKeyEvent* event) final override; + +signals: + void clickEnter(); + void clickShiftEnter(); + void clickEsc(); +}; + #endif // SEARCHFORM_H