From 9332d1a2ed622b094367ec530908e77fd103a113 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Cie=C5=9Blak?= Date: Thu, 17 Oct 2024 12:40:02 +0200 Subject: [PATCH] StatusQ: ModelCount simplified and property added Closes: #15740 --- ui/StatusQ/include/StatusQ/modelcount.h | 5 ++- ui/StatusQ/src/modelcount.cpp | 43 ++++++++++--------- ui/StatusQ/tests/tst_ModelCount.cpp | 32 ++++++++++---- ui/imports/shared/views/AssetsViewAdaptor.qml | 2 +- 4 files changed, 52 insertions(+), 30 deletions(-) diff --git a/ui/StatusQ/include/StatusQ/modelcount.h b/ui/StatusQ/include/StatusQ/modelcount.h index 8f0e719e27..fc5c563ea2 100644 --- a/ui/StatusQ/include/StatusQ/modelcount.h +++ b/ui/StatusQ/include/StatusQ/modelcount.h @@ -8,6 +8,7 @@ class QAbstractItemModel; class ModelCount : public QObject { Q_OBJECT Q_PROPERTY(int count READ count NOTIFY countChanged) + Q_PROPERTY(bool empty READ empty NOTIFY emptyChanged) public: explicit ModelCount(QObject* parent = nullptr); @@ -15,12 +16,14 @@ public: static ModelCount* qmlAttachedProperties(QObject* object); int count() const; + bool empty() const; signals: void countChanged(); + void emptyChanged(); private: - int m_intermediateCount = 0; + int m_count = 0; }; QML_DECLARE_TYPEINFO(ModelCount, QML_HAS_ATTACHED_PROPERTIES) diff --git a/ui/StatusQ/src/modelcount.cpp b/ui/StatusQ/src/modelcount.cpp index fcb16dd083..6559b183bc 100644 --- a/ui/StatusQ/src/modelcount.cpp +++ b/ui/StatusQ/src/modelcount.cpp @@ -9,25 +9,26 @@ ModelCount::ModelCount(QObject* parent) : QObject(parent) if (model == nullptr) return; - connect(model, &QAbstractItemModel::rowsInserted, - this, &ModelCount::countChanged); - connect(model, &QAbstractItemModel::rowsRemoved, - this, &ModelCount::countChanged); + m_count = model->rowCount(); - auto storeIntermediateCount = [this, model] { - this->m_intermediateCount = model->rowCount(); + auto update = [this, model] { + auto wasEmpty = m_count == 0; + auto count = model->rowCount(); + + if (m_count == count) + return; + + m_count = count; + emit this->countChanged(); + + if (wasEmpty != (count == 0)) + this->emptyChanged(); }; - auto emitIfChanged = [this, model] { - if (this->m_intermediateCount != model->rowCount()) - emit this->countChanged(); - }; - - connect(model, &QAbstractItemModel::modelAboutToBeReset, this, storeIntermediateCount); - connect(model, &QAbstractItemModel::layoutAboutToBeChanged, storeIntermediateCount); - - connect(model, &QAbstractItemModel::modelReset, this, emitIfChanged); - connect(model, &QAbstractItemModel::layoutChanged, this, emitIfChanged); + connect(model, &QAbstractItemModel::rowsInserted, this, update); + connect(model, &QAbstractItemModel::rowsRemoved, this, update); + connect(model, &QAbstractItemModel::modelReset, this, update); + connect(model, &QAbstractItemModel::layoutChanged, this, update); } ModelCount* ModelCount::qmlAttachedProperties(QObject* object) @@ -37,8 +38,10 @@ ModelCount* ModelCount::qmlAttachedProperties(QObject* object) int ModelCount::count() const { - if (auto model = qobject_cast(parent())) - return model->rowCount(); - - return 0; + return m_count; +} + +bool ModelCount::empty() const +{ + return m_count == 0; } diff --git a/ui/StatusQ/tests/tst_ModelCount.cpp b/ui/StatusQ/tests/tst_ModelCount.cpp index b3e09b8740..bb6d2d74f0 100644 --- a/ui/StatusQ/tests/tst_ModelCount.cpp +++ b/ui/StatusQ/tests/tst_ModelCount.cpp @@ -19,43 +19,59 @@ private slots: ModelCount modelCount(&model); QCOMPARE(modelCount.count(), 4); + QCOMPARE(modelCount.empty(), false); - QSignalSpy spy(&modelCount, &ModelCount::countChanged); + QSignalSpy countSpy(&modelCount, &ModelCount::countChanged); + QSignalSpy emptySpy(&modelCount, &ModelCount::emptyChanged); model.insert(1, { "e" }); - QCOMPARE(spy.count(), 1); + QCOMPARE(countSpy.count(), 1); + QCOMPARE(emptySpy.count(), 0); QCOMPARE(modelCount.count(), 5); + QCOMPARE(modelCount.empty(), false); model.remove(0); - QCOMPARE(spy.count(), 2); + QCOMPARE(countSpy.count(), 2); + QCOMPARE(emptySpy.count(), 0); QCOMPARE(modelCount.count(), 4); + QCOMPARE(modelCount.empty(), false); model.update(0, 0, "aa"); - QCOMPARE(spy.count(), 2); + QCOMPARE(countSpy.count(), 2); + QCOMPARE(emptySpy.count(), 0); QCOMPARE(modelCount.count(), 4); + QCOMPARE(modelCount.empty(), false); model.invert(); - QCOMPARE(spy.count(), 2); + QCOMPARE(countSpy.count(), 2); + QCOMPARE(emptySpy.count(), 0); QCOMPARE(modelCount.count(), 4); + QCOMPARE(modelCount.empty(), false); model.removeEverySecond(); - QCOMPARE(spy.count(), 3); + QCOMPARE(countSpy.count(), 3); + QCOMPARE(emptySpy.count(), 0); QCOMPARE(modelCount.count(), 2); + QCOMPARE(modelCount.empty(), false); model.reset(); - QCOMPARE(spy.count(), 3); + QCOMPARE(countSpy.count(), 3); + QCOMPARE(emptySpy.count(), 0); QCOMPARE(modelCount.count(), 2); + QCOMPARE(modelCount.empty(), false); model.resetAndClear(); - QCOMPARE(spy.count(), 4); + QCOMPARE(countSpy.count(), 4); + QCOMPARE(emptySpy.count(), 1); QCOMPARE(modelCount.count(), 0); + QCOMPARE(modelCount.empty(), true); } }; diff --git a/ui/imports/shared/views/AssetsViewAdaptor.qml b/ui/imports/shared/views/AssetsViewAdaptor.qml index 794c7890c1..275a681405 100644 --- a/ui/imports/shared/views/AssetsViewAdaptor.qml +++ b/ui/imports/shared/views/AssetsViewAdaptor.qml @@ -116,7 +116,7 @@ QObject { if (!model.visible) return false - if (filteredBalances.ModelCount.count === 0) + if (filteredBalances.ModelCount.empty) return false if (hasCommunityId)