X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/daf788e858774b4d5e11ac199fecfa0e6896e1bb..e9b697bdf6b8de3a40ac2d4689a9b20a6d7cf550:/src/statusbarspaceinfo.cpp diff --git a/src/statusbarspaceinfo.cpp b/src/statusbarspaceinfo.cpp index 8ee98a3d0..c9173b8f9 100644 --- a/src/statusbarspaceinfo.cpp +++ b/src/statusbarspaceinfo.cpp @@ -20,7 +20,7 @@ #include "statusbarspaceinfo.h" -#include +#include #include #include #include @@ -29,21 +29,17 @@ #include StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget* parent) : - QProgressBar(parent), - m_gettingSize(false), - m_foundMountPoint(false), - m_text() + KCapacityBar(KCapacityBar::DrawTextInline, parent), + m_kBSize(0), + m_timer(0) { - setMinimum(0); - setMaximum(0); - setMaximumWidth(200); + setMinimumWidth(200); // something to fix on kcapacitybar (ereslibre) - // Update the space information each 10 seconds. Polling is useful + // Use a timer to update the space information. Polling is useful // here, as files can be deleted/added outside the scope of Dolphin. - QTimer* timer = new QTimer(this); - connect(timer, SIGNAL(timeout()), this, SLOT(refresh())); - timer->start(10000); + m_timer = new QTimer(this); + connect(m_timer, SIGNAL(timeout()), this, SLOT(refresh())); } StatusBarSpaceInfo::~StatusBarSpaceInfo() @@ -56,84 +52,61 @@ void StatusBarSpaceInfo::setUrl(const KUrl& url) refresh(); } -QString StatusBarSpaceInfo::text() const +void StatusBarSpaceInfo::showEvent(QShowEvent* event) { - return m_text; -} - -void StatusBarSpaceInfo::slotFoundMountPoint(const QString& mountPoint, - quint64 kBSize, - quint64 kBUsed, - quint64 kBAvailable) -{ - Q_UNUSED(kBSize); - Q_UNUSED(mountPoint); - - m_gettingSize = false; - m_foundMountPoint = true; - const bool valuesChanged = (kBUsed != static_cast(value())) || - (kBAvailable != static_cast(maximum())); - if (valuesChanged) { - m_text = i18nc("@info:status Free disk space", "%1 free", KIO::convertSize(kBAvailable*1024)); - setMaximum(kBSize); - setValue(kBUsed); + KCapacityBar::showEvent(event); + if (!event->spontaneous()) { + refresh(); + m_timer->start(10000); } } -void StatusBarSpaceInfo::slotKDFSDone() +void StatusBarSpaceInfo::hideEvent(QHideEvent* event) { - if( m_foundMountPoint ) - return; - m_gettingSize = false; - m_text = i18n("Free disk space could not be determined"); - setMinimum(0); - setMaximum(0); - setValue(0); + m_timer->stop(); + KCapacityBar::hideEvent(event); } void StatusBarSpaceInfo::refresh() { + if (!isVisible()) { + return; + } + // KDiskFreeSpace is for local paths only if (!m_url.isLocalFile()) { - m_text = i18nc("@info:status", "Unknown size"); + setText(i18nc("@info:status", "Unknown size")); + setValue(0); update(); return; } - KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByPath(m_url.path()); + KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByPath(m_url.toLocalFile()); if (!mp) { return; } - m_gettingSize = true; - m_foundMountPoint = false; - KDiskFreeSpace* job = new KDiskFreeSpace(this); - connect(job, SIGNAL(foundMountPoint(const QString&, - quint64, - quint64, - quint64)), - this, SLOT(slotFoundMountPoint(const QString&, - quint64, - quint64, - quint64))); - connect(job, SIGNAL(done()), this, SLOT(slotKDFSDone())); - - 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())); -} + KDiskFreeSpaceInfo job = KDiskFreeSpaceInfo::freeSpaceInfo(mp->mountPoint()); + if (!job.isValid()) { + setText(i18nc("@info:status", "Unknown size")); + setValue(0); + update(); + return; + } -void StatusBarSpaceInfo::showGettingSizeInfo() -{ - if (m_gettingSize) { - m_text = i18nc("@info:status", "Getting size..."); + KIO::filesize_t kBSize = job.size() / 1024; + KIO::filesize_t kBUsed = job.used() / 1024; + + const bool valuesChanged = (kBUsed != static_cast(value())) || (kBSize != m_kBSize); + if (valuesChanged) { + setText(i18nc("@info:status Free disk space", "%1 free", + KIO::convertSize(job.available()))); + + setUpdatesEnabled(false); + m_kBSize = kBSize; + setValue(kBSize > 0 ? (kBUsed * 100) / kBSize : 0); + setUpdatesEnabled(true); update(); - setMinimum(0); - setMaximum(0); } }