diff --git a/discover/qml/DiscoverWindow.qml b/discover/qml/DiscoverWindow.qml --- a/discover/qml/DiscoverWindow.qml +++ b/discover/qml/DiscoverWindow.qml @@ -60,7 +60,7 @@ TopLevelPageData { id: updateAction iconName: enabled ? "update-low" : "update-none" - text: !enabled ? i18n("No Updates") : i18nc("Update section name", "Update (%1)", ResourcesModel.updatesCount) + text: !enabled ? (ResourcesModel.isFetching ? i18n("Checking for updates...") : i18n("No Updates") ) : i18nc("Update section name", "Update (%1)", ResourcesModel.updatesCount) enabled: ResourcesModel.updatesCount>0 component: topUpdateComp objectName: "update" diff --git a/libdiscover/backends/KNSBackend/KNSBackend.cpp b/libdiscover/backends/KNSBackend/KNSBackend.cpp --- a/libdiscover/backends/KNSBackend/KNSBackend.cpp +++ b/libdiscover/backends/KNSBackend/KNSBackend.cpp @@ -107,7 +107,8 @@ m_engine = new KNSCore::Engine(this); m_engine->init(m_name); - connect(m_engine, &KNSCore::Engine::signalError, this, [this](const QString &error) { qWarning() << "kns error" << objectName() << error; }); + // Setting setFetching to false when we get an error ensures we don't end up in an eternally-fetching state + connect(m_engine, &KNSCore::Engine::signalError, this, [this](const QString &error) { this->setFetching(false); qWarning() << "kns error" << objectName() << error; }); connect(m_engine, &KNSCore::Engine::signalEntriesLoaded, this, &KNSBackend::receivedEntries); connect(m_engine, &KNSCore::Engine::signalEntryChanged, this, &KNSBackend::statusChanged); connect(m_engine, &KNSCore::Engine::signalEntryDetailsLoaded, this, &KNSBackend::statusChanged); diff --git a/libdiscover/resources/ResourcesModel.cpp b/libdiscover/resources/ResourcesModel.cpp --- a/libdiscover/resources/ResourcesModel.cpp +++ b/libdiscover/resources/ResourcesModel.cpp @@ -22,6 +22,7 @@ #include "AbstractResource.h" #include "resources/AbstractResourcesBackend.h" +#include "resources/AbstractBackendUpdater.h" #include #include #include @@ -100,6 +101,7 @@ connect(backend, &AbstractResourcesBackend::updatesCountChanged, this, &ResourcesModel::updatesCountChanged); connect(backend, &AbstractResourcesBackend::resourceRemoved, this, &ResourcesModel::resourceRemoved); connect(backend, &AbstractResourcesBackend::passiveMessage, this, &ResourcesModel::passiveMessage); + connect(backend->backendUpdater(), &AbstractBackendUpdater::progressingChanged, this, &ResourcesModel::fetchingChanged); if(m_initializingBackends==0) emit allInitialized(); @@ -208,8 +210,13 @@ bool ResourcesModel::isFetching() const { foreach(AbstractResourcesBackend* b, m_backends) { - if(b->isFetching()) + // isFetching should sort of be enough. However, sometimes the backend itself + // will still be operating on things, which from a model point of view would + // still mean something going on. So, interpret that as fetching as well, for + // the purposes of this property. + if(b->isFetching() || (b->backendUpdater() && b->backendUpdater()->isProgressing())) { return true; + } } return false; }