]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/statusbarspaceinfo.cpp
there's no need having 2-liners inside their own method when this method is only...
[dolphin.git] / src / statusbarspaceinfo.cpp
index 4322658d29cc05d4decf0dd5b7e6c771614327a6..1d1ca0240dd4978298d8db239b05adf1fd22b7de 100644 (file)
 
 #include "statusbarspaceinfo.h"
 
-#include <QPainter>
-#include <QPaintEvent>
-#include <QTimer>
-
-#include <kglobalsettings.h>
-#include <kdiskfreesp.h>
+#include <kdiskfreespace.h>
+#include <kmountpoint.h>
 #include <klocale.h>
 #include <kio/job.h>
 
+#include <QTimer>
+#include <QKeyEvent>
+
 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<int>((m_kBAvailable *
-                        static_cast<float>(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<quint64>(value())) ||
+                               (kBAvailable != static_cast<quint64>(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"