]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/statusbarspaceinfo.cpp
simplified code for assuring that Open Office files won't get browsed + added comment...
[dolphin.git] / src / statusbarspaceinfo.cpp
index 84436813608728d4af814adc631e949c338aab02..1d1ca0240dd4978298d8db239b05adf1fd22b7de 100644 (file)
 
 #include "statusbarspaceinfo.h"
 
-#include <kcolorscheme.h>
 #include <kdiskfreespace.h>
 #include <kmountpoint.h>
 #include <klocale.h>
 #include <kio/job.h>
 
 #include <QTimer>
-#include <QPainter>
 #include <QKeyEvent>
 
 StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget* parent) :
-    QWidget(parent),
+    QProgressBar(parent),
     m_gettingSize(false),
-    m_kBSize(0),
-    m_kBAvailable(0)
+    m_text()
 {
-    setMinimumWidth(200);
+    setMinimum(0);
+    setMaximum(0);
 
-    QPalette palette;
-    palette.setColor(QPalette::Background, Qt::transparent);
-    setPalette(palette);
+    setMaximumWidth(200);
 
     // Update the space information each 10 seconds. Polling is useful
     // here, as files can be deleted/added outside the scope of Dolphin.
@@ -57,96 +53,44 @@ 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
-
-    QColor frameColor = palette().brush(QPalette::Background).color();
-    frameColor.setAlpha(128);
-    painter.setPen(frameColor);
-
-    const QColor backgrColor = KColorScheme(QPalette::Active, KColorScheme::View).background().color();
-    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 = i18nc("@info:status", "%1 free", KIO::convertSizeFromKiB(m_kBAvailable));
-    } else {
-        if (m_gettingSize) {
-            text = i18nc("@info:status", "Getting size...");
-        } else {
-            text = QString();
-            QMetaObject::invokeMethod(this, "hide", Qt::QueuedConnection);
-        }
-    }
-
-    // draw text
-    painter.setPen(KColorScheme(QPalette::Active, KColorScheme::View).foreground().color());
-    painter.drawText(QRect(1, 1, barWidth - 2, barHeight + 6),
-                     Qt::AlignCenter | Qt::TextWordWrap,
-                     text);
+    return m_text;
 }
 
-
 void StatusBarSpaceInfo::slotFoundMountPoint(const QString& mountPoint,
                                              quint64 kBSize,
                                              quint64 kBUsed,
                                              quint64 kBAvailable)
 {
-    Q_UNUSED(kBUsed);
+    Q_UNUSED(kBSize);
     Q_UNUSED(mountPoint);
 
     m_gettingSize = false;
-    m_kBSize = kBSize;
-    m_kBAvailable = kBAvailable;
-
-    update();
-}
-
-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()
 {
-    m_kBSize = 0;
-    m_kBAvailable = 0;
-
     // KDiskFreeSpace is for local paths only
     if (!m_url.isLocalFile()) {
         return;
     }
 
-    m_gettingSize = true;
     KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByPath(m_url.path());
-    if (!mp)
+    if (!mp) {
         return;
+    }
 
+    m_gettingSize = true;
     KDiskFreeSpace* job = new KDiskFreeSpace(this);
     connect(job, SIGNAL(foundMountPoint(const QString&,
                                         quint64,
@@ -156,35 +100,23 @@ void StatusBarSpaceInfo::refresh()
                                            quint64,
                                            quint64,
                                            quint64)));
-    connect(job, SIGNAL(done()),
-            this, SLOT(showResult()));
 
     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 = KColorScheme(QPalette::Active, KColorScheme::Button).background().color();
-
-    // 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"