File indexing completed on 2024-04-14 15:32:44
0001 // SPDX-License-Identifier: GPL-2.0-or-later 0002 // SPDX-FileCopyrightText: 2009 Dario Andres Rodriguez <andresbajotierra@gmail.com> 0003 // SPDX-FileCopyrightText: 2019-2021 Harald Sitter <sitter@kde.org> 0004 0005 #include "duplicatemodel.h" 0006 0007 #include <QMetaEnum> 0008 0009 #include "bugzillaintegration/bugzillalib.h" 0010 #include "bugzillaintegration/reportinterface.h" 0011 0012 void DuplicateModel::setManager(BugzillaManager *manager) 0013 { 0014 if (m_manager) { 0015 m_manager->disconnect(this); 0016 } 0017 m_manager = manager; 0018 0019 connect(m_manager, &BugzillaManager::searchFinished, this, &DuplicateModel::searchFinished); 0020 connect(m_manager, &BugzillaManager::searchError, this, [] { 0021 qDebug() << "search error"; 0022 }); 0023 0024 Q_EMIT managerChanged(); 0025 } 0026 0027 void DuplicateModel::searchBugs(const QStringList &products, const QString &severity, const QString &comment) 0028 { 0029 m_searching = true; 0030 Q_EMIT searchingChanged(); 0031 m_manager->searchBugs(products, severity, comment, m_offset); 0032 } 0033 0034 int DuplicateModel::rowCount(const QModelIndex &parent) const 0035 { 0036 Q_UNUSED(parent) 0037 return m_list.size(); 0038 } 0039 0040 QVariant DuplicateModel::data(const QModelIndex &index, int intRole) const 0041 { 0042 if (!index.isValid()) { 0043 return {}; 0044 } 0045 0046 auto bug = m_list.at(index.row()); 0047 switch (static_cast<Role>(intRole)) { 0048 case Role::Title: 0049 return bug->summary(); 0050 case Role::Number: 0051 return bug->id(); 0052 case Role::Object: 0053 return QVariant::fromValue(bug.data()); 0054 } 0055 0056 return {}; 0057 } 0058 0059 QHash<int, QByteArray> DuplicateModel::roleNames() const 0060 { 0061 static QHash<int, QByteArray> roles; 0062 if (!roles.isEmpty()) { 0063 return roles; 0064 } 0065 0066 const QMetaEnum roleEnum = QMetaEnum::fromType<Role>(); 0067 for (int i = 0; i < roleEnum.keyCount(); ++i) { 0068 const int value = roleEnum.value(i); 0069 Q_ASSERT(value != -1); 0070 roles[static_cast<int>(value)] = QByteArray("ROLE_") + roleEnum.valueToKey(value); 0071 } 0072 return roles; 0073 } 0074 0075 void DuplicateModel::searchFinished(const QList<Bugzilla::Bug::Ptr> &list) 0076 { 0077 int results = list.count(); 0078 0079 qDebug() << "search finished" << results; 0080 m_offset += results; 0081 if (results > 0) { 0082 m_atEnd = false; 0083 Q_EMIT atEndChanged(); 0084 beginResetModel(); 0085 for (int i = 0; i < results; ++i) { 0086 const Bugzilla::Bug::Ptr &bug = list.at(i); 0087 m_list.append(bug); 0088 } 0089 endResetModel(); 0090 0091 if (!m_foundDuplicate) { 0092 m_searching = true; 0093 Q_EMIT searchingChanged(); 0094 auto *job = new DuplicateFinderJob(list, m_manager, this); 0095 connect(job, &KJob::result, this, &DuplicateModel::analyzedDuplicates); 0096 job->start(); 0097 } 0098 } else { 0099 m_atEnd = true; 0100 Q_EMIT atEndChanged(); 0101 m_searching = false; 0102 Q_EMIT searchingChanged(); 0103 } 0104 } 0105 0106 void DuplicateModel::analyzedDuplicates(KJob *j) 0107 { 0108 qDebug() << "ANALYZE"; 0109 0110 auto *job = static_cast<DuplicateFinderJob *>(j); 0111 m_result = job->result(); 0112 m_foundDuplicate = m_result.parentDuplicate; 0113 qDebug() << m_result.parentDuplicate << m_foundDuplicate; 0114 m_reportInterface->setDuplicateId(m_result.parentDuplicate); 0115 0116 m_searching = false; 0117 Q_EMIT searchingChanged(); 0118 }