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

0001 /*
0002    SPDX-FileCopyrightText: 2021-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 #include "channelsearchnamelineedit.h"
0007 #include "common/completionlistview.h"
0008 #include "common/userandchannelcompletiondelegate.h"
0009 #include "connection.h"
0010 #include "misc/lineeditcatchreturnkey.h"
0011 #include "model/channelcompleterfilterproxymodel.h"
0012 #include "model/inputcompletermodel.h"
0013 #include "rocketchataccount.h"
0014 #include "rooms/roomsautocompletechannelandprivatejob.h"
0015 #include "ruqolawidgets_debug.h"
0016 #include <QJsonObject>
0017 
0018 ChannelSearchNameLineEdit::ChannelSearchNameLineEdit(RocketChatAccount *account, QWidget *parent)
0019     : CompletionLineEdit(parent)
0020     , mChannelCompleterFilterProxyModel(new ChannelCompleterFilterProxyModel(this))
0021     , mChannelCompleterModel(new InputCompleterModel(account, this))
0022     , mRocketChatAccount(account)
0023 {
0024     new LineEditCatchReturnKey(this, this);
0025     mChannelCompleterFilterProxyModel->setSourceModel(mChannelCompleterModel);
0026     connect(this, &QLineEdit::textChanged, this, &ChannelSearchNameLineEdit::slotTextChanged);
0027     setCompletionModel(mChannelCompleterFilterProxyModel);
0028     connect(this, &ChannelSearchNameLineEdit::complete, this, &ChannelSearchNameLineEdit::slotComplete);
0029 
0030     auto userAndChannelCompletionDelegate = new UserAndChannelCompletionDelegate(mCompletionListView);
0031     userAndChannelCompletionDelegate->setRocketChatAccount(account);
0032     mCompletionListView->setItemDelegate(userAndChannelCompletionDelegate);
0033 
0034     mCompletionListView->setTextWidget(this);
0035 }
0036 
0037 ChannelSearchNameLineEdit::~ChannelSearchNameLineEdit() = default;
0038 
0039 void ChannelSearchNameLineEdit::slotTextChanged(const QString &text)
0040 {
0041     if (!text.trimmed().isEmpty()) {
0042         auto job = new RocketChatRestApi::RoomsAutocompleteChannelAndPrivateJob(this);
0043         RocketChatRestApi::RoomsAutocompleteChannelAndPrivateJob::RoomsAutocompleteChannelAndPrivateInfo info;
0044         info.name = text;
0045         job->setRoomsCompleterInfo(info);
0046         mRocketChatAccount->restApi()->initializeRestApiJob(job);
0047         connect(job,
0048                 &RocketChatRestApi::RoomsAutocompleteChannelAndPrivateJob::roomsAutoCompleteChannelAndPrivateDone,
0049                 this,
0050                 &ChannelSearchNameLineEdit::slotSearchDone);
0051         if (!job->start()) {
0052             qCDebug(RUQOLAWIDGETS_LOG) << "Impossible to start RoomsAutocompleteChannelAndPrivateJob";
0053         }
0054     } else {
0055         mChannelCompleterModel->clear();
0056         mCompletionListView->hide();
0057     }
0058 }
0059 
0060 void ChannelSearchNameLineEdit::slotSearchDone(const QJsonObject &obj)
0061 {
0062     mChannelCompleterModel->parseSearchChannels(obj);
0063 }
0064 
0065 void ChannelSearchNameLineEdit::slotComplete(const QModelIndex &index)
0066 {
0067     const QString completerName = index.data(InputCompleterModel::CompleterName).toString();
0068     const QString roomId = index.data(InputCompleterModel::Identifier).toString();
0069     ChannelCompletionInfo info;
0070     info.channelName = completerName;
0071     info.channelId = roomId;
0072     mCompletionListView->hide();
0073     disconnect(this, &QLineEdit::textChanged, this, &ChannelSearchNameLineEdit::slotTextChanged);
0074     Q_EMIT newRoomName(info);
0075     clear();
0076     connect(this, &QLineEdit::textChanged, this, &ChannelSearchNameLineEdit::slotTextChanged);
0077 }
0078 
0079 #include "moc_channelsearchnamelineedit.cpp"