File indexing completed on 2024-05-12 16:27:15

0001 /*
0002    SPDX-FileCopyrightText: 2020-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "searchmessagewidget.h"
0008 #include "misc/lineeditcatchreturnkey.h"
0009 #include "model/commonmessagefilterproxymodel.h"
0010 #include "rocketchataccount.h"
0011 #include "room/messagelistview.h"
0012 #include "searchmessagewithdelaylineedit.h"
0013 #include <KLocalizedString>
0014 #include <QLabel>
0015 #include <QLineEdit>
0016 #include <QVBoxLayout>
0017 
0018 #include "config-ruqola.h"
0019 
0020 #if HAVE_TEXT_TO_SPEECH
0021 #include <TextEditTextToSpeech/TextToSpeechContainerWidget>
0022 #endif
0023 
0024 SearchMessageWidget::SearchMessageWidget(RocketChatAccount *account, QWidget *parent)
0025     : QWidget(parent)
0026     , mSearchLabel(new QLabel(this))
0027     , mSearchLineEdit(new SearchMessageWithDelayLineEdit(account, this))
0028     , mResultListWidget(new MessageListView(account, MessageListView::Mode::Viewing, this))
0029     , mCurrentRocketChatAccount(account)
0030 #if HAVE_TEXT_TO_SPEECH
0031     , mTextToSpeechWidget(new TextEditTextToSpeech::TextToSpeechContainerWidget(this))
0032 #endif
0033 {
0034     auto mainLayout = new QVBoxLayout(this);
0035     mainLayout->setObjectName(QStringLiteral("mainLayout"));
0036     mainLayout->setContentsMargins({});
0037 
0038     mSearchLineEdit->setObjectName(QStringLiteral("mSearchLineEdit"));
0039     mSearchLineEdit->setPlaceholderText(i18n("Search messages"));
0040     new LineEditCatchReturnKey(mSearchLineEdit, this);
0041     mainLayout->addWidget(mSearchLineEdit);
0042     connect(mSearchLineEdit, &SearchWithDelayLineEdit::searchRequested, this, &SearchMessageWidget::slotSearchMessages);
0043     connect(mSearchLineEdit, &SearchWithDelayLineEdit::searchCleared, this, &SearchMessageWidget::slotClearedMessages);
0044 
0045     mSearchLabel->setObjectName(QStringLiteral("mSearchLabel"));
0046     QFont labFont = mSearchLabel->font();
0047     labFont.setBold(true);
0048     mSearchLabel->setFont(labFont);
0049     mainLayout->addWidget(mSearchLabel);
0050 
0051 #if HAVE_TEXT_TO_SPEECH
0052     mTextToSpeechWidget->setObjectName(QStringLiteral("mTextToSpeechWidget"));
0053     mainLayout->addWidget(mTextToSpeechWidget);
0054     connect(mResultListWidget, &MessageListView::textToSpeech, mTextToSpeechWidget, &TextEditTextToSpeech::TextToSpeechContainerWidget::say);
0055 #endif
0056 
0057     mResultListWidget->setObjectName(QStringLiteral("mResultListWidget"));
0058     mainLayout->addWidget(mResultListWidget);
0059     connect(mSearchLineEdit, &QLineEdit::returnPressed, this, &SearchMessageWidget::slotSearchLineMessagesEnterPressed);
0060     connect(mResultListWidget, &MessageListView::goToMessageRequested, this, &SearchMessageWidget::goToMessageRequested);
0061 }
0062 
0063 SearchMessageWidget::~SearchMessageWidget()
0064 {
0065     if (mCurrentRocketChatAccount) {
0066         mCurrentRocketChatAccount->clearSearchModel();
0067     }
0068 }
0069 
0070 void SearchMessageWidget::slotClearedMessages()
0071 {
0072     mModel->clearModel();
0073     updateLabel();
0074 }
0075 
0076 void SearchMessageWidget::slotSearchMessages(const QString &str)
0077 {
0078     mModel->setSearchText(str);
0079     mSearchLineEdit->addCompletionItem(str);
0080     mCurrentRocketChatAccount->messageSearch(str, mRoomId, true);
0081 }
0082 
0083 void SearchMessageWidget::slotSearchLineMessagesEnterPressed()
0084 {
0085     slotSearchMessages(mSearchLineEdit->text());
0086 }
0087 
0088 QString SearchMessageWidget::roomId() const
0089 {
0090     return mRoomId;
0091 }
0092 
0093 void SearchMessageWidget::setRoomId(const QString &roomId)
0094 {
0095     mRoomId = roomId;
0096 }
0097 
0098 void SearchMessageWidget::updateLabel()
0099 {
0100     if (mModel->loadCommonMessagesInProgress()) {
0101         mSearchLabel->setText(i18n("Loading..."));
0102     } else if (mSearchLineEdit->text().isEmpty() && mModel->rowCount() == 0) {
0103         mSearchLabel->clear();
0104     } else {
0105         mSearchLabel->setText(mModel->rowCount() == 0 ? i18n("No Message found") : displayShowSearch());
0106     }
0107 }
0108 
0109 QString SearchMessageWidget::displayShowSearch() const
0110 {
0111     const QString displayMessageStr = i18np("%1 Message in room", "%1 Messages in room", mModel->rowCount());
0112     return displayMessageStr;
0113 }
0114 
0115 RocketChatAccount *SearchMessageWidget::currentRocketChatAccount() const
0116 {
0117     return mCurrentRocketChatAccount;
0118 }
0119 
0120 void SearchMessageWidget::setModel(CommonMessageFilterProxyModel *model)
0121 {
0122     mResultListWidget->setModel(model);
0123     mModel = model;
0124     connect(mModel, &CommonMessageFilterProxyModel::stringNotFoundChanged, this, &SearchMessageWidget::updateLabel);
0125     connect(mModel, &CommonMessageFilterProxyModel::loadingInProgressChanged, this, &SearchMessageWidget::updateLabel);
0126     updateLabel();
0127 }
0128 
0129 void SearchMessageWidget::setRoom(Room *room)
0130 {
0131     mResultListWidget->setRoom(room);
0132 }
0133 
0134 #include "moc_searchmessagewidget.cpp"