diff options
Diffstat (limited to 'src/statusbarspaceinfo.cpp')
-rw-r--r-- | src/statusbarspaceinfo.cpp | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/src/statusbarspaceinfo.cpp b/src/statusbarspaceinfo.cpp new file mode 100644 index 0000000..221a4f0 --- /dev/null +++ b/src/statusbarspaceinfo.cpp @@ -0,0 +1,192 @@ +/*************************************************************************** + * Copyright (C) 2006 by Peter Penz ([email protected]) and * + * and Patrice Tremblay * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * 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., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "statusbarspaceinfo.h" + +#include <qpainter.h> +#include <qtimer.h> +#include <kglobalsettings.h> +#include <kdiskfreesp.h> +#include <klocale.h> +#include <kio/job.h> + +StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget* parent) : + QWidget(parent), + m_gettingSize(false), + m_kBSize(0), + m_kBAvailable(0) +{ + setMinimumWidth(200); + + // Update the space information each 10 seconds. 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); +} + +StatusBarSpaceInfo::~StatusBarSpaceInfo() +{ +} + +void StatusBarSpaceInfo::setURL(const KURL& url) +{ + m_url = url; + refresh(); + update(); +} + +void StatusBarSpaceInfo::paintEvent(QPaintEvent* /* 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 = colorGroup().background(); + 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 + 1); + if (right < left) { + right = left; + } + painter.drawRect(QRect(left, barTop + 2, right, barHeight - 2)); + + text = i18n("%1 free") + .arg(KIO::convertSizeFromKB(m_kBAvailable)); + } + else { + if (m_gettingSize) { + text = i18n("Getting size..."); + } + else { + text = ""; + QTimer::singleShot(0, this, SLOT(hide())); + } + } + + // draw text (usually 'Y GB free') + painter.setPen(KGlobalSettings::textColor()); + painter.drawText(QRect(1, 1, barWidth - 2, barHeight + 4), + Qt::AlignHCenter | Qt::AlignVCenter | Qt::WordBreak, + text); +} + + +void StatusBarSpaceInfo::slotFoundMountPoint(const unsigned long& kBSize, + const unsigned long& /* kBUsed */, + const unsigned long& kBAvailable, + const QString& /* mountPoint */) +{ + 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(); +} + +void StatusBarSpaceInfo::slotDone() +{ + m_gettingSize = false; + if ((m_kBSize > 0) && (m_kBAvailable > 0)) { + show(); + } + + update(); +} + +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); +} + +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); + } + + return color; +} + +#include "statusbarspaceinfo.moc" |