Use a progress bar with custom text for showing the free disk space, otherwise the custom widget just does not fit well into styles like Oxygen.

svn path=/trunk/KDE/kdebase/apps/; revision=725516
This commit is contained in:
Peter Penz 2007-10-15 15:59:57 +00:00
parent a23a882c68
commit d059b705a9
2 changed files with 29 additions and 124 deletions

View file

@ -20,27 +20,19 @@
#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),
m_gettingSize(false),
m_kBSize(0),
m_kBAvailable(0)
QProgressBar(parent),
m_text()
{
setMinimumWidth(200);
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.
@ -60,57 +52,11 @@ void StatusBarSpaceInfo::setUrl(const KUrl& url)
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,
@ -119,33 +65,28 @@ void StatusBarSpaceInfo::slotFoundMountPoint(const QString& mountPoint,
Q_UNUSED(kBUsed);
Q_UNUSED(mountPoint);
m_gettingSize = false;
m_kBSize = kBSize;
m_kBAvailable = kBAvailable;
m_text = i18nc("@info:status", "%1 free", KIO::convertSizeFromKiB(kBAvailable));
update();
}
void StatusBarSpaceInfo::showResult()
{
m_gettingSize = false;
update();
setMinimum(0);
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;
m_text = i18nc("@info:status", "Getting size...");
setMinimum(0);
setMaximum(0);
KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByPath(m_url.path());
if (!mp)
if (!mp) {
return;
}
KDiskFreeSpace* job = new KDiskFreeSpace(this);
connect(job, SIGNAL(foundMountPoint(const QString&,
@ -156,35 +97,8 @@ void StatusBarSpaceInfo::refresh()
quint64,
quint64,
quint64)));
connect(job, SIGNAL(done()),
this, SLOT(showResult()));
job->readDF(mp->mountPoint());
}
QColor StatusBarSpaceInfo::progressColor(const QColor& bgColor) const
{
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);
}
return color;
}
#include "statusbarspaceinfo.moc"

View file

@ -22,9 +22,10 @@
#include <kurl.h>
#include <QtGui/QColor>
#include <QtGui/QKeyEvent>
#include <QtGui/QWidget>
#include <QColor>
#include <QKeyEvent>
#include <QProgressBar>
#include <QString>
class KDiskFreeSp;
@ -32,7 +33,7 @@ class KDiskFreeSp;
* @short Shows the available space for the volume represented
* by the given URL as part of the status bar.
*/
class StatusBarSpaceInfo : public QWidget
class StatusBarSpaceInfo : public QProgressBar
{
Q_OBJECT
@ -41,38 +42,28 @@ public:
virtual ~StatusBarSpaceInfo();
void setUrl(const KUrl& url);
const KUrl& url() const
{
return m_url;
}
const KUrl& url() const;
protected:
/** @see QWidget::paintEvent() */
virtual void paintEvent(QPaintEvent* event);
/** @see QProgressBar::text() */
virtual QString text() const;
private slots:
void slotFoundMountPoint(const QString& mountPoint,
quint64 kBSize,
quint64 kBUsed,
quint64 kBAvailable);
void showResult();
/** Refreshes the space information for the current set URL. */
void refresh();
private:
/**
* Returns a color for the progress bar by respecting
* the given background color \a bgColor. It is assured
* that enough contrast is given to have a visual indication.
*/
QColor progressColor(const QColor& bgColor) const;
private:
KUrl m_url;
bool m_gettingSize;
quint64 m_kBSize;
quint64 m_kBAvailable;
QString m_text;
};
inline const KUrl& StatusBarSpaceInfo::url() const
{
return m_url;
}
#endif