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

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/lineeditcatchreturnkey.h"
0009 #include "misc/searchwithdelaylineedit.h"
0010 #include "model/custombasemodel.h"
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 #if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
0028     mainLayout->setContentsMargins({});
0029 #endif
0030 
0031     mSearchLayout = new QVBoxLayout;
0032 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
0033     mSearchLayout->setContentsMargins({});
0034 #endif
0035     mainLayout->addLayout(mSearchLayout);
0036     mSearchLineEdit->setObjectName(QStringLiteral("mSearchLineEdit"));
0037     mSearchLayout->addWidget(mSearchLineEdit);
0038     mSearchLineEdit->setDelayMs(500ms);
0039     new LineEditCatchReturnKey(mSearchLineEdit, this);
0040 
0041     mLabelResultSearch->setObjectName(QStringLiteral("mLabelResultSearch"));
0042     mSearchLayout->addWidget(mLabelResultSearch);
0043     mLabelResultSearch->setTextFormat(Qt::RichText);
0044     mLabelResultSearch->setContextMenuPolicy(Qt::NoContextMenu);
0045     QFont labFont = mLabelResultSearch->font();
0046     labFont.setBold(true);
0047     mLabelResultSearch->setFont(labFont);
0048     connect(mLabelResultSearch, &QLabel::linkActivated, this, &SearchTreeBaseWidget::loadMoreElements);
0049 
0050     auto treeViewLayout = new QVBoxLayout;
0051     treeViewLayout->setContentsMargins({});
0052     mainLayout->addLayout(treeViewLayout);
0053 
0054     mTreeView->setObjectName(QStringLiteral("mTreeView"));
0055 #if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
0056     mTreeView->setProperty("_breeze_borders_sides", QVariant::fromValue(QFlags{Qt::TopEdge}));
0057 #endif
0058 
0059     mTreeView->setRootIsDecorated(false);
0060     mTreeView->setSortingEnabled(true);
0061     mTreeView->sortByColumn(0, Qt::AscendingOrder);
0062     mTreeView->header()->setSectionsClickable(true);
0063     mTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
0064 
0065     treeViewLayout->addWidget(mTreeView);
0066     connect(mSearchLineEdit, &SearchWithDelayLineEdit::searchCleared, this, &SearchTreeBaseWidget::slotSearchCleared);
0067     connect(mSearchLineEdit, &SearchWithDelayLineEdit::searchRequested, this, &SearchTreeBaseWidget::slotSearchRequested);
0068     connect(this, &SearchTreeBaseWidget::loadMoreElements, this, [this]() {
0069         slotLoadMoreElements();
0070     });
0071     connect(mTreeView, &QTreeView::customContextMenuRequested, this, &SearchTreeBaseWidget::slotCustomContextMenuRequested);
0072     connect(mTreeView, &QTreeView::doubleClicked, this, &SearchTreeBaseWidget::doubleClicked);
0073 }
0074 
0075 SearchTreeBaseWidget::~SearchTreeBaseWidget() = default;
0076 
0077 QString SearchTreeBaseWidget::clickableStr() const
0078 {
0079     return QStringLiteral(" <a href=\"loadmoreelement\">%1</a>").arg(i18n("(Click here for Loading more...)"));
0080 }
0081 
0082 void SearchTreeBaseWidget::slotLoadMoreElements()
0083 {
0084     if (!mModel->loadMoreInProgress()) {
0085         const int offset = mModel->rowCount();
0086         if (offset < mModel->total()) {
0087             mModel->setLoadMoreInProgress(true);
0088             slotLoadElements(offset, qMin(50, mModel->total() - offset), mSearchLineEdit->text().trimmed());
0089         }
0090     }
0091 }
0092 
0093 void SearchTreeBaseWidget::hideColumns()
0094 {
0095     if (mModel) {
0096         const auto hideColumns = mModel->hideColumns();
0097         for (const auto col : hideColumns) {
0098             mTreeView->setColumnHidden(col, true);
0099         }
0100     }
0101 }
0102 
0103 void SearchTreeBaseWidget::connectModel()
0104 {
0105     connect(mModel, &CustomBaseModel::hasFullListChanged, this, &SearchTreeBaseWidget::updateLabel);
0106     connect(mModel, &CustomBaseModel::totalChanged, this, &SearchTreeBaseWidget::updateLabel);
0107     connect(mModel, &CustomBaseModel::loadingInProgressChanged, this, &SearchTreeBaseWidget::updateLabel);
0108 }
0109 
0110 void SearchTreeBaseWidget::finishSearching()
0111 {
0112     mModel->setLoadMoreInProgress(false);
0113     resizeColumToContents();
0114 }
0115 
0116 void SearchTreeBaseWidget::resizeColumToContents()
0117 {
0118     for (int i = 0, total = mTreeView->header()->count(); i < total; ++i) {
0119         if (!mModel->excludeResizeToContentColumns().contains(i)) {
0120             mTreeView->resizeColumnToContents(i);
0121         }
0122     }
0123 }
0124 
0125 void SearchTreeBaseWidget::slotLoadMoreElementDone(const QJsonObject &obj)
0126 {
0127     mModel->addMoreElements(obj);
0128     finishSearching();
0129 }
0130 
0131 void SearchTreeBaseWidget::slotSearchDone(const QJsonObject &obj)
0132 {
0133     mModel->parseElements(obj);
0134     finishSearching();
0135 }
0136 
0137 void SearchTreeBaseWidget::slotSearchCleared()
0138 {
0139     slotLoadElements();
0140 }
0141 
0142 void SearchTreeBaseWidget::slotSearchRequested(const QString &str)
0143 {
0144     slotLoadElements(-1, -1, str);
0145 }
0146 
0147 void SearchTreeBaseWidget::initialize()
0148 {
0149     mModel->initialize();
0150     slotLoadElements();
0151 }
0152 
0153 #include "moc_searchtreebasewidget.cpp"