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

0001 /*
0002    SPDX-FileCopyrightText: 2021-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "searchtreebasewidget.h"
0008 #include "misc/searchwithdelaylineedit.h"
0009 #include "model/custombasemodel.h"
0010 #include <KLineEditEventHandler>
0011 
0012 #include <KLocalizedString>
0013 #include <QHeaderView>
0014 #include <QLabel>
0015 #include <QTreeView>
0016 #include <QVBoxLayout>
0017 
0018 SearchTreeBaseWidget::SearchTreeBaseWidget(RocketChatAccount *account, QWidget *parent)
0019     : QWidget(parent)
0020     , mLabelResultSearch(new QLabel(this))
0021     , mSearchLineEdit(new SearchWithDelayLineEdit(this))
0022     , mTreeView(new QTreeView(this))
0023     , mRocketChatAccount(account)
0024 {
0025     auto mainLayout = new QVBoxLayout(this);
0026     mainLayout->setObjectName(QStringLiteral("mainLayout"));
0027     mainLayout->setContentsMargins({});
0028 
0029     mSearchLayout = new QVBoxLayout;
0030     mainLayout->addLayout(mSearchLayout);
0031     mSearchLineEdit->setObjectName(QStringLiteral("mSearchLineEdit"));
0032     mSearchLayout->addWidget(mSearchLineEdit);
0033     mSearchLineEdit->setDelayMs(500ms);
0034     KLineEditEventHandler::catchReturnKey(mSearchLineEdit);
0035 
0036     mLabelResultSearch->setObjectName(QStringLiteral("mLabelResultSearch"));
0037     mSearchLayout->addWidget(mLabelResultSearch);
0038     mLabelResultSearch->setTextFormat(Qt::RichText);
0039     mLabelResultSearch->setContextMenuPolicy(Qt::NoContextMenu);
0040     QFont labFont = mLabelResultSearch->font();
0041     labFont.setBold(true);
0042     mLabelResultSearch->setFont(labFont);
0043     connect(mLabelResultSearch, &QLabel::linkActivated, this, &SearchTreeBaseWidget::loadMoreElements);
0044 
0045     auto treeViewLayout = new QVBoxLayout;
0046     treeViewLayout->setContentsMargins({});
0047     mainLayout->addLayout(treeViewLayout);
0048 
0049     mTreeView->setObjectName(QStringLiteral("mTreeView"));
0050     mTreeView->setProperty("_breeze_borders_sides", QVariant::fromValue(QFlags{Qt::TopEdge}));
0051 
0052     mTreeView->setRootIsDecorated(false);
0053     mTreeView->setSortingEnabled(true);
0054     mTreeView->sortByColumn(0, Qt::AscendingOrder);
0055     mTreeView->header()->setSectionsClickable(true);
0056     mTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
0057 
0058     treeViewLayout->addWidget(mTreeView);
0059     connect(mSearchLineEdit, &SearchWithDelayLineEdit::searchCleared, this, &SearchTreeBaseWidget::slotSearchCleared);
0060     connect(mSearchLineEdit, &SearchWithDelayLineEdit::searchRequested, this, &SearchTreeBaseWidget::slotSearchRequested);
0061     connect(this, &SearchTreeBaseWidget::loadMoreElements, this, [this]() {
0062         slotLoadMoreElements();
0063     });
0064     connect(mTreeView, &QTreeView::customContextMenuRequested, this, &SearchTreeBaseWidget::slotCustomContextMenuRequested);
0065     connect(mTreeView, &QTreeView::doubleClicked, this, &SearchTreeBaseWidget::doubleClicked);
0066 }
0067 
0068 SearchTreeBaseWidget::~SearchTreeBaseWidget() = default;
0069 
0070 QString SearchTreeBaseWidget::clickableStr() const
0071 {
0072     return QStringLiteral(" <a href=\"loadmoreelement\">%1</a>").arg(i18n("(Click here for Loading more...)"));
0073 }
0074 
0075 void SearchTreeBaseWidget::slotLoadMoreElements()
0076 {
0077     if (!mModel->loadMoreInProgress()) {
0078         const int offset = mModel->rowCount();
0079         if (offset < mModel->total()) {
0080             mModel->setLoadMoreInProgress(true);
0081             slotLoadElements(offset, qMin(50, mModel->total() - offset), mSearchLineEdit->text().trimmed());
0082         }
0083     }
0084 }
0085 
0086 void SearchTreeBaseWidget::hideColumns()
0087 {
0088     if (mModel) {
0089         const auto hideColumns = mModel->hideColumns();
0090         for (const auto col : hideColumns) {
0091             mTreeView->setColumnHidden(col, true);
0092         }
0093     }
0094 }
0095 
0096 void SearchTreeBaseWidget::connectModel()
0097 {
0098     connect(mModel, &CustomBaseModel::hasFullListChanged, this, &SearchTreeBaseWidget::updateLabel);
0099     connect(mModel, &CustomBaseModel::totalChanged, this, &SearchTreeBaseWidget::updateLabel);
0100     connect(mModel, &CustomBaseModel::loadingInProgressChanged, this, &SearchTreeBaseWidget::updateLabel);
0101 }
0102 
0103 void SearchTreeBaseWidget::finishSearching()
0104 {
0105     mModel->setLoadMoreInProgress(false);
0106     resizeColumToContents();
0107 }
0108 
0109 void SearchTreeBaseWidget::resizeColumToContents()
0110 {
0111     for (int i = 0, total = mTreeView->header()->count(); i < total; ++i) {
0112         if (!mModel->excludeResizeToContentColumns().contains(i)) {
0113             mTreeView->resizeColumnToContents(i);
0114         }
0115     }
0116 }
0117 
0118 void SearchTreeBaseWidget::slotLoadMoreElementDone(const QJsonObject &obj)
0119 {
0120     mModel->addMoreElements(obj);
0121     finishSearching();
0122 }
0123 
0124 void SearchTreeBaseWidget::slotSearchDone(const QJsonObject &obj)
0125 {
0126     mModel->parseElements(obj);
0127     finishSearching();
0128 }
0129 
0130 void SearchTreeBaseWidget::slotSearchCleared()
0131 {
0132     slotLoadElements();
0133 }
0134 
0135 void SearchTreeBaseWidget::slotSearchRequested(const QString &str)
0136 {
0137     slotLoadElements(-1, -1, str);
0138 }
0139 
0140 void SearchTreeBaseWidget::initialize()
0141 {
0142     mModel->initialize();
0143     slotLoadElements();
0144 }
0145 
0146 #include "moc_searchtreebasewidget.cpp"