File indexing completed on 2024-12-01 04:36:54

0001 /*
0002    SPDX-FileCopyrightText: 2022-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "notificationhistorywidget.h"
0008 #include "misc/serverscombobox.h"
0009 #include "model/notificationhistorymodel.h"
0010 #include "model/notificationhistorymodelfilterproxymodel.h"
0011 #include "notificationhistorylistview.h"
0012 #include "notificationhistorymanager.h"
0013 #include "ruqolawidgets_debug.h"
0014 #include <KLineEditEventHandler>
0015 #include <KLocalizedString>
0016 #include <QLineEdit>
0017 #include <QListView>
0018 #include <QVBoxLayout>
0019 
0020 #include "config-ruqola.h"
0021 
0022 #if HAVE_TEXT_TO_SPEECH
0023 #include <TextEditTextToSpeech/TextToSpeechContainerWidget>
0024 #endif
0025 
0026 NotificationHistoryWidget::NotificationHistoryWidget(QWidget *parent)
0027     : QWidget{parent}
0028     , mListNotificationsListView(new NotificationHistoryListView(this))
0029     , mSearchLineEdit(new QLineEdit(this))
0030     , mNotificationFilterProxyModel(new NotificationHistoryModelFilterProxyModel(this))
0031 #if HAVE_TEXT_TO_SPEECH
0032     , mTextToSpeechWidget(new TextEditTextToSpeech::TextToSpeechContainerWidget(this))
0033 #endif
0034     , mServersComboBox(new ServersComboBox(this))
0035 {
0036     auto mainLayout = new QVBoxLayout(this);
0037     mainLayout->setObjectName(QStringLiteral("mainLayout"));
0038     mainLayout->setContentsMargins({});
0039 
0040     auto searchLayout = new QHBoxLayout;
0041     searchLayout->setObjectName(QStringLiteral("searchLayout"));
0042     searchLayout->setContentsMargins({});
0043 
0044     mSearchLineEdit->setObjectName(QStringLiteral("mSearchLineEdit"));
0045     mSearchLineEdit->setPlaceholderText(i18n("Search..."));
0046     searchLayout->addWidget(mSearchLineEdit);
0047     mSearchLineEdit->setClearButtonEnabled(true);
0048     KLineEditEventHandler::catchReturnKey(mSearchLineEdit);
0049     mServersComboBox->setObjectName(QStringLiteral("mServersComboBox"));
0050     searchLayout->addWidget(mServersComboBox);
0051 
0052     mainLayout->addLayout(searchLayout);
0053 
0054 #if HAVE_TEXT_TO_SPEECH
0055     mTextToSpeechWidget->setObjectName(QStringLiteral("mTextToSpeechWidget"));
0056     mainLayout->addWidget(mTextToSpeechWidget);
0057     connect(mListNotificationsListView,
0058             &NotificationHistoryListView::textToSpeech,
0059             mTextToSpeechWidget,
0060             &TextEditTextToSpeech::TextToSpeechContainerWidget::say);
0061 #endif
0062 
0063     mListNotificationsListView->setObjectName(QStringLiteral("mListNotifications"));
0064     mainLayout->addWidget(mListNotificationsListView);
0065 
0066     auto model = NotificationHistoryManager::self()->notificationHistoryModel();
0067 
0068     mNotificationFilterProxyModel->setObjectName(QStringLiteral("mNotificationFilterProxyModel"));
0069     mNotificationFilterProxyModel->setSourceModel(model);
0070     mListNotificationsListView->setModel(mNotificationFilterProxyModel);
0071 
0072     connect(mListNotificationsListView, &QListView::doubleClicked, this, &NotificationHistoryWidget::slotShowMessage);
0073     connect(mListNotificationsListView, &NotificationHistoryListView::showMessage, this, &NotificationHistoryWidget::slotShowMessage);
0074 
0075     connect(model, &QAbstractItemModel::rowsAboutToBeInserted, mListNotificationsListView, &MessageListViewBase::checkIfAtBottom);
0076     connect(model, &QAbstractItemModel::rowsAboutToBeRemoved, mListNotificationsListView, &MessageListViewBase::checkIfAtBottom);
0077     connect(model, &QAbstractItemModel::modelAboutToBeReset, mListNotificationsListView, &MessageListViewBase::checkIfAtBottom);
0078 
0079     connect(mSearchLineEdit, &QLineEdit::textChanged, this, &NotificationHistoryWidget::slotTextChanged);
0080 
0081     connect(mServersComboBox, &ServersComboBox::accountSelected, this, &NotificationHistoryWidget::slotFilterAccount);
0082 }
0083 
0084 NotificationHistoryWidget::~NotificationHistoryWidget() = default;
0085 
0086 void NotificationHistoryWidget::slotFilterAccount(const QString &accountName)
0087 {
0088     mNotificationFilterProxyModel->setAccountNameFilter(accountName);
0089 }
0090 
0091 void NotificationHistoryWidget::slotTextChanged(const QString &str)
0092 {
0093     mNotificationFilterProxyModel->setFilterString(str);
0094     mListNotificationsListView->setSearchText(str);
0095 }
0096 
0097 void NotificationHistoryWidget::slotShowMessage(const QModelIndex &index)
0098 {
0099     if (index.isValid()) {
0100         const QString roomId = index.data(NotificationHistoryModel::RoomId).toString();
0101         const QString messageId = index.data(NotificationHistoryModel::MessageId).toString();
0102         const QString accountName = index.data(NotificationHistoryModel::AccountName).toString();
0103         if (!accountName.isEmpty() && !roomId.isEmpty() && !messageId.isEmpty()) {
0104             Q_EMIT showNotifyMessage(accountName, messageId, roomId);
0105         } else {
0106             qCWarning(RUQOLAWIDGETS_LOG) << " Problem with index. AccountName " << accountName << " roomId : " << roomId << "messageId " << messageId;
0107         }
0108     }
0109 }
0110 
0111 void NotificationHistoryWidget::addServerList(const QStringList &serverNames)
0112 {
0113     mServersComboBox->addServerList(serverNames);
0114 }
0115 
0116 #include "moc_notificationhistorywidget.cpp"