Use QDeadlineTimer instead of QDateTime.

Use early returns instead of deeply nested if/else.
This commit is contained in:
Chris Holland 2020-10-17 14:37:54 -04:00 committed by Elvis Angelaccio
parent 60c3fa8d39
commit 70656d08f9
2 changed files with 33 additions and 36 deletions

View file

@ -6,7 +6,6 @@
#include "placesitemlistwidget.h"
#include <QDateTime>
#include <QStyleOption>
#include <QPainter>
@ -16,6 +15,7 @@
#define CAPACITYBAR_HEIGHT 2
#define CAPACITYBAR_MARGIN 2
#define CAPACITYBAR_CACHE_TTL 60000
PlacesItemListWidget::PlacesItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent) :
@ -43,47 +43,44 @@ void PlacesItemListWidget::updateCapacityBar()
{
const bool isDevice = !data().value("udi").toString().isEmpty();
const QUrl url = data().value("url").toUrl();
if (isDevice && url.isLocalFile()) {
if (!m_freeSpaceInfo.job
&& (
!m_freeSpaceInfo.lastUpdated.isValid()
|| m_freeSpaceInfo.lastUpdated.secsTo(QDateTime::currentDateTimeUtc()) > 60
)
) {
m_freeSpaceInfo.job = KIO::fileSystemFreeSpace(url);
connect(
m_freeSpaceInfo.job,
&KIO::FileSystemFreeSpaceJob::result,
this,
[this](KIO::Job *job, KIO::filesize_t size, KIO::filesize_t available) {
// even if we receive an error we want to refresh lastUpdated to avoid repeatedly querying in this case
m_freeSpaceInfo.lastUpdated = QDateTime::currentDateTimeUtc();
if (job->error()) {
return;
}
m_freeSpaceInfo.size = size;
m_freeSpaceInfo.used = size - available;
m_freeSpaceInfo.usedRatio = (qreal)m_freeSpaceInfo.used / (qreal)m_freeSpaceInfo.size;
m_drawCapacityBar = size > 0;
update();
}
);
} else {
// Job running or cache is still valid.
}
} else {
if (!(isDevice && url.isLocalFile())) {
resetCapacityBar();
return;
}
if (m_freeSpaceInfo.job || !m_freeSpaceInfo.lastUpdated.hasExpired()) {
// Job running or cache is still valid.
return;
}
m_freeSpaceInfo.job = KIO::fileSystemFreeSpace(url);
connect(
m_freeSpaceInfo.job,
&KIO::FileSystemFreeSpaceJob::result,
this,
[this](KIO::Job *job, KIO::filesize_t size, KIO::filesize_t available) {
// even if we receive an error we want to refresh lastUpdated to avoid repeatedly querying in this case
m_freeSpaceInfo.lastUpdated.setRemainingTime(CAPACITYBAR_CACHE_TTL);
if (job->error()) {
return;
}
m_freeSpaceInfo.size = size;
m_freeSpaceInfo.used = size - available;
m_freeSpaceInfo.usedRatio = (qreal)m_freeSpaceInfo.used / (qreal)m_freeSpaceInfo.size;
m_drawCapacityBar = size > 0;
update();
}
);
}
void PlacesItemListWidget::resetCapacityBar()
{
m_drawCapacityBar = false;
delete m_freeSpaceInfo.job;
m_freeSpaceInfo.lastUpdated = QDateTime();
m_freeSpaceInfo.lastUpdated.setRemainingTime(0);
m_freeSpaceInfo.size = 0;
m_freeSpaceInfo.used = 0;
m_freeSpaceInfo.usedRatio = 0;

View file

@ -9,7 +9,7 @@
#include "kitemviews/kstandarditemlistwidget.h"
#include <QDateTime>
#include <QDeadlineTimer>
#include <QPainter>
#include <QPointer>
#include <QStyleOptionGraphicsItem>
@ -22,7 +22,7 @@
// https://invent.kde.org/frameworks/kio/-/commit/933887dc334f3498505af7a86d25db7faae91019
struct PlaceFreeSpaceInfo
{
QDateTime lastUpdated;
QDeadlineTimer lastUpdated;
KIO::filesize_t used = 0;
KIO::filesize_t size = 0;
qreal usedRatio = 0;