#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),
+ QProgressBar(parent),
m_gettingSize(false),
- m_kBSize(0),
- m_kBAvailable(0)
+ 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.
{
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% 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 = QString::null;
- QTimer::singleShot(0, this, SLOT(hide()));
- }
- }
-
- // 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);
+ 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"