diff --git a/src/librssguard/database/databasequeries.cpp b/src/librssguard/database/databasequeries.cpp index 9901de966..ab42fafc9 100644 --- a/src/librssguard/database/databasequeries.cpp +++ b/src/librssguard/database/databasequeries.cpp @@ -654,6 +654,47 @@ ArticleCounts DatabaseQueries::getMessageCountsForLabel(const QSqlDatabase& db, } } +QMap DatabaseQueries::getMessageCountsForAllLabels(const QSqlDatabase& db, + int account_id, + bool* ok) { + QMap counts; + QSqlQuery q(db); + + q.setForwardOnly(true); + q.prepare(QSL("SELECT l.custom_id, ('%.' || l.id || '.%') pid, SUM(m.is_read), COUNT(*) FROM Labels l " + "INNER JOIN Messages m " + " ON m.labels LIKE pid " + "WHERE " + " m.is_deleted = 0 AND " + " m.is_pdeleted = 0 AND " + " m.account_id = :account_id " + "GROUP BY pid;")); + q.bindValue(QSL(":account_id"), account_id); + + if (q.exec()) { + while (q.next()) { + QString lbl_custom_id = q.value(0).toString(); + ArticleCounts ac; + + ac.m_total = q.value(3).toInt(); + ac.m_unread = ac.m_total - q.value(2).toInt(); + + counts.insert(lbl_custom_id, ac); + } + + if (ok != nullptr) { + *ok = true; + } + } + else { + if (ok != nullptr) { + *ok = false; + } + } + + return counts; +} + ArticleCounts DatabaseQueries::getImportantMessageCounts(const QSqlDatabase& db, int account_id, bool* ok) { QSqlQuery q(db); diff --git a/src/librssguard/database/databasequeries.h b/src/librssguard/database/databasequeries.h index 1df401c21..0c1f281e1 100644 --- a/src/librssguard/database/databasequeries.h +++ b/src/librssguard/database/databasequeries.h @@ -90,6 +90,10 @@ class DatabaseQueries { Label* label, int account_id, bool* ok = nullptr); + static QMap getMessageCountsForAllLabels(const QSqlDatabase& db, + int account_id, + bool* ok = nullptr); + static ArticleCounts getImportantMessageCounts(const QSqlDatabase& db, int account_id, bool* ok = nullptr); static int getUnreadMessageCounts(const QSqlDatabase& db, int account_id, bool* ok = nullptr); static ArticleCounts getMessageCountsForBin(const QSqlDatabase& db, int account_id, bool* ok = nullptr); diff --git a/src/librssguard/gui/reusable/labelsmenu.cpp b/src/librssguard/gui/reusable/labelsmenu.cpp index 93ff2f8d5..fc486137d 100644 --- a/src/librssguard/gui/reusable/labelsmenu.cpp +++ b/src/librssguard/gui/reusable/labelsmenu.cpp @@ -31,6 +31,7 @@ LabelsMenu::LabelsMenu(const QList& messages, const QList& labe .toStdList()) { auto count = boolinq::from(messages).count([&db, label](const Message& msg) { + // TODO: slow return DatabaseQueries::isLabelAssignedToMessage(db, label, msg); }); @@ -142,7 +143,7 @@ void LabelAction::updateActionForState() { break; case Qt::CheckState::PartiallyChecked: - highlight = QColor(100, 50, 0); + highlight = Qt::GlobalColor::darkYellow; break; case Qt::CheckState::Unchecked: diff --git a/src/librssguard/services/abstract/labelsnode.cpp b/src/librssguard/services/abstract/labelsnode.cpp index 36c2c24d9..a343e0e84 100644 --- a/src/librssguard/services/abstract/labelsnode.cpp +++ b/src/librssguard/services/abstract/labelsnode.cpp @@ -60,6 +60,31 @@ int LabelsNode::countOfAllMessages() const { ->countOfAllMessages(); } +void LabelsNode::updateCounts(bool including_total_count) { + QSqlDatabase database = qApp->database()->driver()->threadSafeConnection(metaObject()->className()); + int account_id = getParentServiceRoot()->accountId(); + auto acc = DatabaseQueries::getMessageCountsForAllLabels(database, account_id); + + for (Label* lbl : labels()) { + if (!acc.contains(lbl->customId())) { + if (including_total_count) { + lbl->setCountOfAllMessages(0); + } + + lbl->setCountOfUnreadMessages(0); + } + else { + auto ac = acc.value(lbl->customId()); + + if (including_total_count) { + lbl->setCountOfAllMessages(ac.m_total); + } + + lbl->setCountOfUnreadMessages(ac.m_unread); + } + } +} + QList LabelsNode::labels() const { auto list = boolinq::from(childItems()) .select([](RootItem* it) { diff --git a/src/librssguard/services/abstract/labelsnode.h b/src/librssguard/services/abstract/labelsnode.h index 73de757c5..5d3c5416e 100644 --- a/src/librssguard/services/abstract/labelsnode.h +++ b/src/librssguard/services/abstract/labelsnode.h @@ -20,6 +20,7 @@ class LabelsNode : public RootItem { virtual QList contextMenuFeedsList(); virtual int countOfUnreadMessages() const; virtual int countOfAllMessages() const; + virtual void updateCounts(bool including_total_count); public slots: void createLabel(); diff --git a/src/librssguard/services/abstract/serviceroot.cpp b/src/librssguard/services/abstract/serviceroot.cpp index 18a74ca69..e1c0aece1 100644 --- a/src/librssguard/services/abstract/serviceroot.cpp +++ b/src/librssguard/services/abstract/serviceroot.cpp @@ -139,7 +139,7 @@ void ServiceRoot::updateCounts(bool including_total_count) { if (child->kind() == RootItem::Kind::Feed) { feeds.append(child->toFeed()); } - else if (child->kind() != RootItem::Kind::Labels && child->kind() != RootItem::Kind::Category && + else if (child->kind() != RootItem::Kind::Label && child->kind() != RootItem::Kind::Category && child->kind() != RootItem::Kind::ServiceRoot) { child->updateCounts(including_total_count); }