File indexing completed on 2025-01-12 13:04:08
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"