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

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 "misc/lineeditcatchreturnkey.h"
0009 #include "model/listmessagesfilterproxymodel.h"
0010 #include "room/messagelistview.h"
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     new LineEditCatchReturnKey(mSearchMessageLineEdit, this);
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 #if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
0047     mMessageListView->setProperty("_breeze_borders_sides", QVariant{});
0048 #endif
0049     QFont labFont = mMessageListInfo->font();
0050     labFont.setBold(true);
0051     mMessageListInfo->setFont(labFont);
0052     connect(mMessageListInfo, &QLabel::linkActivated, this, &ShowListMessageBaseWidget::loadMoreElements);
0053     mainLayout->addWidget(mMessageListInfo);
0054 
0055     mMessageListView->setObjectName(QStringLiteral("mMessageListView"));
0056 
0057 #if HAVE_TEXT_TO_SPEECH
0058     mTextToSpeechWidget->setObjectName(QStringLiteral("mTextToSpeechWidget"));
0059     mainLayout->addWidget(mTextToSpeechWidget);
0060     connect(mMessageListView, &MessageListView::textToSpeech, mTextToSpeechWidget, &TextEditTextToSpeech::TextToSpeechContainerWidget::say);
0061 #endif
0062 
0063     mainLayout->addWidget(mMessageListView);
0064     connect(mMessageListView, &MessageListView::modelChanged, this, &ShowListMessageBaseWidget::updateLabel);
0065 }
0066 
0067 ShowListMessageBaseWidget::~ShowListMessageBaseWidget()
0068 {
0069     // Clear search text
0070     if (mModel && mModel->listMessageModel()) {
0071         mModel->listMessageModel()->setSearchText({});
0072         mModel->clear();
0073     }
0074 }
0075 
0076 void ShowListMessageBaseWidget::setModel(ListMessagesFilterProxyModel *model)
0077 {
0078     mModel = model;
0079     mMessageListView->setModel(model);
0080     mModel->setFilterString({});
0081     connect(mModel, &ListMessagesFilterProxyModel::hasFullListChanged, this, &ShowListMessageBaseWidget::updateLabel);
0082     connect(mModel, &ListMessagesFilterProxyModel::loadingInProgressChanged, this, &ShowListMessageBaseWidget::updateLabel);
0083     updateLabel();
0084 }
0085 
0086 MessageListView *ShowListMessageBaseWidget::messageListView() const
0087 {
0088     return mMessageListView;
0089 }
0090 
0091 void ShowListMessageBaseWidget::setRoom(Room *room)
0092 {
0093     mMessageListView->setRoom(room);
0094 }
0095 
0096 void ShowListMessageBaseWidget::updateLabel()
0097 {
0098     if (mModel->loadMoreListMessagesInProgress()) {
0099         mMessageListInfo->setText(i18n("Loading..."));
0100     } else {
0101         mMessageListInfo->setText(mModel->numberOfMessages() == 0 ? i18n("No Message found") : displayShowMessageInRoom());
0102     }
0103 }
0104 
0105 QString ShowListMessageBaseWidget::displayShowMessageInRoom() const
0106 {
0107     QString displayMessageStr = i18np("%1 Message in room (Total: %2)", "%1 Messages in room (Total: %2)", mModel->numberOfMessages(), mModel->total());
0108     if (!mModel->hasFullList()) {
0109         displayMessageStr += QStringLiteral(" <a href=\"loadmoreelement\">%1</a>").arg(i18n("(Click here for Loading more...)"));
0110     }
0111     return displayMessageStr;
0112 }
0113 
0114 void ShowListMessageBaseWidget::slotSearchMessageTextChanged(const QString &str)
0115 {
0116     mModel->setFilterString(str);
0117     mModel->listMessageModel()->setSearchText(str);
0118     mMessageListView->setSearchText(str);
0119 }
0120 
0121 #include "moc_showlistmessagebasewidget.cpp"