X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/4fcc56a6200804cb4e15f3eab9cb0acd0268132c..d38bb6891a4048dd666cad27a38d7b7a2463dfb5:/src/statusbarspaceinfo.cpp diff --git a/src/statusbarspaceinfo.cpp b/src/statusbarspaceinfo.cpp index 4322658d2..1d1ca0240 100644 --- a/src/statusbarspaceinfo.cpp +++ b/src/statusbarspaceinfo.cpp @@ -20,22 +20,23 @@ #include "statusbarspaceinfo.h" -#include -#include -#include - -#include -#include +#include +#include #include #include +#include +#include + StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget* parent) : - QWidget(parent), - m_gettingSize(false), - m_kBSize(0), - m_kBAvailable(0) + QProgressBar(parent), + m_gettingSize(false), + m_text() { - setMinimumWidth(200); + setMinimum(0); + setMaximum(0); + + setMaximumWidth(200); // Update the space information each 10 seconds. Polling is useful // here, as files can be deleted/added outside the scope of Dolphin. @@ -45,142 +46,77 @@ StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget* parent) : } StatusBarSpaceInfo::~StatusBarSpaceInfo() -{} +{ +} void StatusBarSpaceInfo::setUrl(const KUrl& url) { m_url = url; refresh(); - QTimer::singleShot(300, this, SLOT(update())); } -void StatusBarSpaceInfo::paintEvent(QPaintEvent* /* event */) +QString StatusBarSpaceInfo::text() const { - QPainter painter(this); - const int barWidth = width(); - const int barTop = 1; - const int barHeight = height() - 5; - - QString text; - - const int widthDec = 3; // visual decrement for the available width - - const QColor c1 = palette().brush(QPalette::Background).color(); - const QColor c2 = KGlobalSettings::buttonTextColor(); - const QColor frameColor((c1.red() + c2.red()) / 2, - (c1.green() + c2.green()) / 2, - (c1.blue() + c2.blue()) / 2); - painter.setPen(frameColor); - - const QColor backgrColor = KGlobalSettings::baseColor(); - painter.setBrush(backgrColor); - - painter.drawRect(QRect(0, barTop + 1 , barWidth - widthDec, barHeight)); - - if ((m_kBSize > 0) && (m_kBAvailable > 0)) { - // draw 'used size' bar - painter.setPen(Qt::NoPen); - painter.setBrush(progressColor(backgrColor)); - int usedWidth = barWidth - static_cast((m_kBAvailable * - static_cast(barWidth)) / m_kBSize); - const int left = 1; - int right = usedWidth - widthDec; - if (right < left) { - right = left; - } - painter.drawRect(QRect(left, barTop + 2, right, barHeight - 1)); - - text = i18n("%1 free", KIO::convertSizeFromKiB(m_kBAvailable)); - } else { - if (m_gettingSize) { - text = i18n("Getting size..."); - } else { - text = QString(); - QTimer::singleShot(0, this, SLOT(hide())); - } - } - - // draw text - painter.setPen(KGlobalSettings::textColor()); - painter.drawText(QRect(1, 1, barWidth - 2, barHeight + 6), - Qt::AlignCenter | Qt::TextWordWrap, - text); + return m_text; } - -void StatusBarSpaceInfo::slotFoundMountPoint(const unsigned long& kBSize, - const unsigned long& /* kBUsed */, - const unsigned long& kBAvailable, - const QString& /* mountPoint */) +void StatusBarSpaceInfo::slotFoundMountPoint(const QString& mountPoint, + quint64 kBSize, + quint64 kBUsed, + quint64 kBAvailable) { - m_gettingSize = false; - m_kBSize = kBSize; - m_kBAvailable = kBAvailable; - - // Bypass a the issue (?) of KDiskFreeSp that for protocols like - // FTP, SMB the size of root partition is returned. - // TODO: check whether KDiskFreeSp is buggy or Dolphin uses it in a wrong way - const QString protocol(m_url.protocol()); - if (!protocol.isEmpty() && (protocol != "file")) { - m_kBSize = 0; - m_kBAvailable = 0; - } - - update(); -} + Q_UNUSED(kBSize); + Q_UNUSED(mountPoint); -void StatusBarSpaceInfo::showResult() -{ m_gettingSize = false; - update(); + const bool valuesChanged = (kBUsed != static_cast(value())) || + (kBAvailable != static_cast(maximum())); + if (valuesChanged) { + m_text = i18nc("@info:status", "%1 free", KIO::convertSizeFromKiB(kBAvailable)); + setMaximum(kBAvailable); + setValue(kBUsed); + } } void StatusBarSpaceInfo::refresh() { + // KDiskFreeSpace is for local paths only + if (!m_url.isLocalFile()) { + return; + } + + KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByPath(m_url.path()); + if (!mp) { + return; + } + m_gettingSize = true; - m_kBSize = 0; - m_kBAvailable = 0; - - const QString mountPoint(KIO::findPathMountPoint(m_url.path())); - - KDiskFreeSp* job = new KDiskFreeSp(this); - connect(job, SIGNAL(foundMountPoint(const unsigned long&, - const unsigned long&, - const unsigned long&, - const QString&)), - this, SLOT(slotFoundMountPoint(const unsigned long&, - const unsigned long&, - const unsigned long&, - const QString&))); - connect(job, SIGNAL(done()), - this, SLOT(showResult())); - - job->readDF(mountPoint); + KDiskFreeSpace* job = new KDiskFreeSpace(this); + connect(job, SIGNAL(foundMountPoint(const QString&, + quint64, + quint64, + quint64)), + this, SLOT(slotFoundMountPoint(const QString&, + quint64, + quint64, + quint64))); + + 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())); } -QColor StatusBarSpaceInfo::progressColor(const QColor& bgColor) const +void StatusBarSpaceInfo::showGettingSizeInfo() { - QColor color = KGlobalSettings::buttonBackground(); - - // assure that enough contrast is given between the background color - // and the progressbar color - int bgRed = bgColor.red(); - int bgGreen = bgColor.green(); - int bgBlue = bgColor.blue(); - - const int backgrBrightness = qGray(bgRed, bgGreen, bgBlue); - const int progressBrightness = qGray(color.red(), color.green(), color.blue()); - - const int limit = 32; - const int diff = backgrBrightness - progressBrightness; - bool adjustColor = ((diff >= 0) && (diff < limit)) || - ((diff < 0) && (diff > -limit)); - if (adjustColor) { - const int inc = (backgrBrightness < 2 * limit) ? (2 * limit) : -limit; - color = QColor(bgRed + inc, bgGreen + inc, bgBlue + inc); + if (m_gettingSize) { + m_text = i18nc("@info:status", "Getting size..."); + setMinimum(0); + setMaximum(0); } - - return color; } #include "statusbarspaceinfo.moc"