]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/statusbarspaceinfo.cpp
The feature freeze is near: Add video support to the Information Panel. Phonon is...
[dolphin.git] / src / statusbarspaceinfo.cpp
index d63b12eb7fbb70e97bef2250ffbf71869e45fae1..c9173b8f9ef2feee26d18ca34c8ed2dbda5cbe7b 100644 (file)
  *   You should have received a copy of the GNU General Public License     *
  *   along with this program; if not, write to the                         *
  *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
  ***************************************************************************/
 
 #include "statusbarspaceinfo.h"
 
-#include <QPainter>
-#include <QPaintEvent>
-#include <QTimer>
-
-#include <kglobalsettings.h>
-#include <kdiskfreesp.h>
+#include <KDiskFreeSpaceInfo>
+#include <kmountpoint.h>
 #include <klocale.h>
 #include <kio/job.h>
 
+#include <QTimer>
+#include <QKeyEvent>
+
 StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget* parent) :
-    QWidget(parent),
-    m_gettingSize(false),
+    KCapacityBar(KCapacityBar::DrawTextInline, parent),
     m_kBSize(0),
-    m_kBAvailable(0)
+    m_timer(0)
 {
-    setMinimumWidth(200);
+    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()
@@ -52,142 +50,64 @@ void StatusBarSpaceInfo::setUrl(const KUrl& url)
 {
     m_url = url;
     refresh();
-    update();
 }
 
-void StatusBarSpaceInfo::paintEvent(QPaintEvent* /* event */)
+void StatusBarSpaceInfo::showEvent(QShowEvent* event)
 {
-    QPainter painter(this);
-    const int barWidth = width();
-    const int barTop = 2;
-    const int barHeight = height() - 4;
-
-    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% of %2 used", QString::number(100 - (int)(100.0 * m_kBAvailable / m_kBSize)), KIO::convertSizeFromKiB(m_kBSize));
-    }
-    else {
-        if (m_gettingSize) {
-            text = i18n("Getting size...");
-        }
-        else {
-            text = "";
-            QTimer::singleShot(0, this, SLOT(hide()));
-        }
+    KCapacityBar::showEvent(event);
+    if (!event->spontaneous()) {
+        refresh();
+        m_timer->start(10000);
     }
-
-    // draw text (usually 'X% of Y GB used')
-    painter.setPen(KGlobalSettings::textColor());
-    painter.drawText(QRect(1, 1, barWidth - 2, barHeight + 6),
-                     Qt::AlignCenter | Qt::TextWordWrap,
-                     text);
 }
 
-
-void StatusBarSpaceInfo::slotFoundMountPoint(const unsigned long& kBSize,
-                                             const unsigned long& /* kBUsed */,
-                                             const unsigned long& kBAvailable,
-                                             const QString& /* mountPoint */)
+void StatusBarSpaceInfo::hideEvent(QHideEvent* event)
 {
-    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();
+    m_timer->stop();
+    KCapacityBar::hideEvent(event);
 }
 
-void StatusBarSpaceInfo::slotDone()
+void StatusBarSpaceInfo::refresh()
 {
-    m_gettingSize = false;
-    if ((m_kBSize > 0) && (m_kBAvailable > 0)) {
-       show();
+    if (!isVisible()) {
+        return;
     }
 
-    update();
-}
+    // KDiskFreeSpace is for local paths only
+    if (!m_url.isLocalFile()) {
+        setText(i18nc("@info:status", "Unknown size"));
+        setValue(0);
+        update();
+        return;
+    }
 
-void StatusBarSpaceInfo::refresh()
-{
-    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(slotDone()));
-
-    job->readDF(mountPoint);
-}
+    KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByPath(m_url.toLocalFile());
+    if (!mp) {
+        return;
+    }
 
-QColor StatusBarSpaceInfo::progressColor(const QColor& bgColor) const
-{
-    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);
+    KDiskFreeSpaceInfo job = KDiskFreeSpaceInfo::freeSpaceInfo(mp->mountPoint());
+    if (!job.isValid()) {
+        setText(i18nc("@info:status", "Unknown size"));
+        setValue(0);
+        update();
+        return;
     }
 
-    return color;
+    KIO::filesize_t kBSize = job.size() / 1024;
+    KIO::filesize_t kBUsed = job.used() / 1024;
+
+    const bool valuesChanged = (kBUsed != static_cast<quint64>(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();
+    }
 }
 
 #include "statusbarspaceinfo.moc"