X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/d059b705a9b50572537cb938b3f593de0d305f9a..817f3952e2bed820ea3b50dfdfe91ccb99dcb748:/src/statusbarspaceinfo.cpp diff --git a/src/statusbarspaceinfo.cpp b/src/statusbarspaceinfo.cpp index 9bc091b7a..79a1169e5 100644 --- a/src/statusbarspaceinfo.cpp +++ b/src/statusbarspaceinfo.cpp @@ -29,10 +29,13 @@ #include StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget* parent) : - QProgressBar(parent), - m_text() + KCapacityBar(KCapacityBar::DrawTextInline, parent), + m_gettingSize(false), + m_foundMountPoint(false), + m_kBSize(0) { setMaximumWidth(200); + setMinimumWidth(200); // something to fix on kcapacitybar (ereslibre) // Update the space information each 10 seconds. Polling is useful // here, as files can be deleted/added outside the scope of Dolphin. @@ -49,12 +52,6 @@ void StatusBarSpaceInfo::setUrl(const KUrl& url) { m_url = url; refresh(); - QTimer::singleShot(300, this, SLOT(update())); -} - -QString StatusBarSpaceInfo::text() const -{ - return m_text; } void StatusBarSpaceInfo::slotFoundMountPoint(const QString& mountPoint, @@ -62,32 +59,50 @@ void StatusBarSpaceInfo::slotFoundMountPoint(const QString& mountPoint, quint64 kBUsed, quint64 kBAvailable) { - Q_UNUSED(kBUsed); Q_UNUSED(mountPoint); - m_text = i18nc("@info:status", "%1 free", KIO::convertSizeFromKiB(kBAvailable)); + m_gettingSize = false; + m_foundMountPoint = true; + const bool valuesChanged = (kBUsed != static_cast(value())) || (kBSize != m_kBSize); + if (valuesChanged) { + setText(i18nc("@info:status Free disk space", "%1 free", KIO::convertSize(kBAvailable * 1024))); + setUpdatesEnabled(false); + m_kBSize = kBSize; + setValue(kBSize > 0 ? (kBUsed * 100) / kBSize : 0); + setUpdatesEnabled(true); + update(); + } +} - setMinimum(0); - setMaximum(kBAvailable); - setValue(kBUsed); +void StatusBarSpaceInfo::slotDiskFreeSpaceDone() +{ + if (m_foundMountPoint) { + return; + } + + m_gettingSize = false; + setText(i18nc("@info:status", "Unknown size")); + setValue(0); + update(); } void StatusBarSpaceInfo::refresh() { // KDiskFreeSpace is for local paths only if (!m_url.isLocalFile()) { + setText(i18nc("@info:status", "Unknown size")); + setValue(0); + update(); return; } - m_text = i18nc("@info:status", "Getting size..."); - setMinimum(0); - setMaximum(0); - KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByPath(m_url.path()); if (!mp) { return; } + m_gettingSize = true; + m_foundMountPoint = false; KDiskFreeSpace* job = new KDiskFreeSpace(this); connect(job, SIGNAL(foundMountPoint(const QString&, quint64, @@ -97,8 +112,24 @@ void StatusBarSpaceInfo::refresh() quint64, quint64, quint64))); + connect(job, SIGNAL(done()), this, SLOT(slotDiskFreeSpaceDone())); job->readDF(mp->mountPoint()); + + // refresh() is invoked for each directory change. Usually getting + // the size information can be done very fast, so to prevent any + // flickering the "Getting size..." indication is only shown if + // at least 300 ms have been passed. + QTimer::singleShot(300, this, SLOT(showGettingSizeInfo())); +} + +void StatusBarSpaceInfo::showGettingSizeInfo() +{ + if (m_gettingSize) { + m_kBSize = 0; + setText(i18nc("@info:status", "Getting size...")); + update(); + } } #include "statusbarspaceinfo.moc"