X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/2e6dc566dd2f2027203df72302aa75110a31c4ae..13ebb2fa798436615ee87891b8b586d1605ca2dc:/src/statusbarspaceinfo.cpp diff --git a/src/statusbarspaceinfo.cpp b/src/statusbarspaceinfo.cpp index 69296e7b3..c9173b8f9 100644 --- a/src/statusbarspaceinfo.cpp +++ b/src/statusbarspaceinfo.cpp @@ -20,33 +20,26 @@ #include "statusbarspaceinfo.h" -#include -#include +#include #include #include #include #include -#include #include 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) - QPalette palette; - palette.setColor(QPalette::Background, Qt::transparent); - setPalette(palette); - - // 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() @@ -57,134 +50,64 @@ void StatusBarSpaceInfo::setUrl(const KUrl& url) { m_url = url; refresh(); - QTimer::singleShot(300, this, SLOT(update())); } -void StatusBarSpaceInfo::paintEvent(QPaintEvent* /* event */) +void StatusBarSpaceInfo::showEvent(QShowEvent* event) { - 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(KColorScheme::View).background(); - 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((m_kBAvailable * - static_cast(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 free", KIO::convertSizeFromKiB(m_kBAvailable)); - } else { - if (m_gettingSize) { - text = i18n("Getting size..."); - } else { - text = QString(); - QTimer::singleShot(0, this, SLOT(hide())); - } + KCapacityBar::showEvent(event); + if (!event->spontaneous()) { + refresh(); + m_timer->start(10000); } - - // draw text - painter.setPen(KColorScheme(KColorScheme::View).foreground()); - painter.drawText(QRect(1, 1, barWidth - 2, barHeight + 6), - Qt::AlignCenter | Qt::TextWordWrap, - text); } - -void StatusBarSpaceInfo::slotFoundMountPoint(const quint64& kBSize, - const quint64& kBUsed, - const quint64& kBAvailable, - const QString& mountPoint) +void StatusBarSpaceInfo::hideEvent(QHideEvent* event) { - Q_UNUSED(kBUsed); - Q_UNUSED(mountPoint); - - m_gettingSize = false; - m_kBSize = kBSize; - m_kBAvailable = kBAvailable; - - update(); -} - -void StatusBarSpaceInfo::showResult() -{ - m_gettingSize = false; - update(); + m_timer->stop(); + KCapacityBar::hideEvent(event); } void StatusBarSpaceInfo::refresh() { - m_kBSize = 0; - m_kBAvailable = 0; + if (!isVisible()) { + return; + } // KDiskFreeSpace is for local paths only if (!m_url.isLocalFile()) { + setText(i18nc("@info:status", "Unknown size")); + setValue(0); + update(); return; } - m_gettingSize = true; - KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByPath(m_url.path()); - if (!mp) + KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByPath(m_url.toLocalFile()); + if (!mp) { return; + } - KDiskFreeSpace* job = new KDiskFreeSpace(this); - connect(job, SIGNAL(foundMountPoint(const quint64&, - const quint64&, - const quint64&, - const QString&)), - this, SLOT(slotFoundMountPoint(const quint64&, - const quint64&, - const quint64&, - const QString&))); - connect(job, SIGNAL(done()), - this, SLOT(showResult())); - - job->readDF(mp->mountPoint()); -} - -QColor StatusBarSpaceInfo::progressColor(const QColor& bgColor) const -{ - QColor color = KColorScheme(KColorScheme::Button).background(); - - // 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(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"