File indexing completed on 2024-05-19 05:04:06

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 "showlistmessagebasewidget.h"
0008 #include "model/listmessagesfilterproxymodel.h"
0009 #include "room/messagelistview.h"
0010 #include <KLineEditEventHandler>
0011 
0012 #include <KLocalizedString>
0013 #include <QLabel>
0014 #include <QLineEdit>
0015 #include <QVBoxLayout>
0016 
0017 #include "config-ruqola.h"
0018 
0019 #if HAVE_TEXT_TO_SPEECH
0020 #include <TextEditTextToSpeech/TextToSpeechContainerWidget>
0021 #endif
0022 
0023 ShowListMessageBaseWidget::ShowListMessageBaseWidget(RocketChatAccount *account, QWidget *parent)
0024     : QWidget(parent)
0025     , mSearchMessageLineEdit(new QLineEdit(this))
0026     , mMessageListInfo(new QLabel(this))
0027     , mMessageListView(new MessageListView(account, MessageListView::Mode::Viewing, this))
0028 #if HAVE_TEXT_TO_SPEECH
0029     , mTextToSpeechWidget(new TextEditTextToSpeech::TextToSpeechContainerWidget(this))
0030 #endif
0031 {
0032     auto mainLayout = new QVBoxLayout(this);
0033     mainLayout->setObjectName(QStringLiteral("mainLayout"));
0034     mainLayout->setContentsMargins({});
0035 
0036     mSearchMessageLineEdit->setObjectName(QStringLiteral("mSearchMessageLineEdit"));
0037     mSearchMessageLineEdit->setClearButtonEnabled(true);
0038     KLineEditEventHandler::catchReturnKey(mSearchMessageLineEdit);
0039     mSearchMessageLineEdit->setPlaceholderText(i18n("Search messages..."));
0040     connect(mSearchMessageLineEdit, &QLineEdit::textChanged, this, &ShowListMessageBaseWidget::slotSearchMessageTextChanged);
0041     mainLayout->addWidget(mSearchMessageLineEdit);
0042 
0043     mMessageListInfo->setObjectName(QStringLiteral("mMessageListInfo"));
0044     mMessageListInfo->setTextFormat(Qt::RichText);
0045     mMessageListInfo->setContextMenuPolicy(Qt::NoContextMenu);
0046     mMessageListView->setProperty("_breeze_borders_sides", QVariant{});
0047     QFont labFont = mMessageListInfo->font();
0048     labFont.setBold(true);
0049     mMessageListInfo->setFont(labFont);
0050     connect(mMessageListInfo, &QLabel::linkActivated, this, &ShowListMessageBaseWidget::loadMoreElements);
0051     mainLayout->addWidget(mMessageListInfo);
0052 
0053     mMessageListView->setObjectName(QStringLiteral("mMessageListView"));
0054 
0055 #if HAVE_TEXT_TO_SPEECH
0056     mTextToSpeechWidget->setObjectName(QStringLiteral("mTextToSpeechWidget"));
0057     mainLayout->addWidget(mTextToSpeechWidget);
0058     connect(mMessageListView, &MessageListView::textToSpeech, mTextToSpeechWidget, &TextEditTextToSpeech::TextToSpeechContainerWidget::say);
0059 #endif
0060 
0061     mainLayout->addWidget(mMessageListView);
0062     connect(mMessageListView, &MessageListView::modelChanged, this, &ShowListMessageBaseWidget::updateLabel);
0063 }
0064 
0065 ShowListMessageBaseWidget::~ShowListMessageBaseWidget()
0066 {
0067     // Clear search text
0068     if (mModel && mModel->listMessageModel()) {
0069         mModel->listMessageModel()->setSearchText({});
0070         mModel->clear();
0071     }
0072 }
0073 
0074 void ShowListMessageBaseWidget::setModel(ListMessagesFilterProxyModel *model)
0075 {
0076     mModel = model;
0077     mMessageListView->setModel(model);
0078     mModel->setFilterString({});
0079     connect(mModel, &ListMessagesFilterProxyModel::hasFullListChanged, this, &ShowListMessageBaseWidget::updateLabel);
0080     connect(mModel, &ListMessagesFilterProxyModel::loadingInProgressChanged, this, &ShowListMessageBaseWidget::updateLabel);
0081     updateLabel();
0082 }
0083 
0084 MessageListView *ShowListMessageBaseWidget::messageListView() const
0085 {
0086     return mMessageListView;
0087 }
0088 
0089 void ShowListMessageBaseWidget::setRoom(Room *room)
0090 {
0091     mMessageListView->setRoom(room);
0092 }
0093 
0094 void ShowListMessageBaseWidget::updateLabel()
0095 {
0096     if (mModel->loadMoreListMessagesInProgress()) {
0097         mMessageListInfo->setText(i18n("Loading..."));
0098     } else {
0099         mMessageListInfo->setText(mModel->numberOfMessages() == 0 ? i18n("No Message found") : displayShowMessageInRoom());
0100     }
0101 }
0102 
0103 QString ShowListMessageBaseWidget::displayShowMessageInRoom() const
0104 {
0105     QString displayMessageStr = i18np("%1 Message in room (Total: %2)", "%1 Messages in room (Total: %2)", mModel->numberOfMessages(), mModel->total());
0106     if (!mModel->hasFullList()) {
0107         displayMessageStr += QStringLiteral(" <a href=\"loadmoreelement\">%1</a>").arg(i18n("(Click here for Loading more...)"));
0108     }
0109     return displayMessageStr;
0110 }
0111 
0112 void ShowListMessageBaseWidget::slotSearchMessageTextChanged(const QString &str)
0113 {
0114     mModel->setFilterString(str);
0115     mModel->listMessageModel()->setSearchText(str);
0116     mMessageListView->setSearchText(str);
0117 }
0118 
0119 #include "moc_showlistmessagebasewidget.cpp"