X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/8f76df41da41f012697c8bb9d6ebcddb9b315c4f..56888a56:/src/panels/places/placesitemlistwidget.cpp diff --git a/src/panels/places/placesitemlistwidget.cpp b/src/panels/places/placesitemlistwidget.cpp index c49446901..2d5111c56 100644 --- a/src/panels/places/placesitemlistwidget.cpp +++ b/src/panels/places/placesitemlistwidget.cpp @@ -6,23 +6,23 @@ #include "placesitemlistwidget.h" -#include - -#include #include +#include + +#include -#include -#include +#include +#include +#include #define CAPACITYBAR_HEIGHT 2 #define CAPACITYBAR_MARGIN 2 +#define CAPACITYBAR_CACHE_TTL 60000 PlacesItemListWidget::PlacesItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent) : KStandardItemListWidget(informant, parent) - , m_isMountPoint(false) , m_drawCapacityBar(false) - , m_capacityBarRatio(0) { } @@ -43,34 +43,56 @@ QPalette::ColorRole PlacesItemListWidget::normalTextColorRole() const void PlacesItemListWidget::updateCapacityBar() { - const bool isDevice = !data().value("udi").toString().isEmpty(); + const QString udi = data().value("udi").toString(); + if (udi.isEmpty()) { + resetCapacityBar(); + return; + } + const Solid::Device device = Solid::Device(udi); + if (device.isDeviceInterface(Solid::DeviceInterface::NetworkShare) + || device.isDeviceInterface(Solid::DeviceInterface::OpticalDrive) + || device.isDeviceInterface(Solid::DeviceInterface::OpticalDisc)) { + resetCapacityBar(); + return; + } const QUrl url = data().value("url").toUrl(); - if (isDevice && url.isLocalFile()) { - const QString mountPointPath = url.toLocalFile(); - qDebug() << "url:" << mountPointPath; - KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByPath(mountPointPath); - m_isMountPoint = (mp && mp->mountPoint() == mountPointPath); - qDebug() << " isMountPoint:" << m_isMountPoint; - if (m_isMountPoint) { - const KDiskFreeSpaceInfo info = KDiskFreeSpaceInfo::freeSpaceInfo(mountPointPath); - m_drawCapacityBar = info.size() != 0; - m_capacityBarRatio = (qreal)info.used() / (qreal)info.size(); - qDebug() << " capacityBarRatio:" << m_capacityBarRatio << "(" << info.used() << "/" << info.size() << ")"; - - // update(); - return; - } + + if (url.isEmpty() || m_freeSpaceInfo.job || !m_freeSpaceInfo.lastUpdated.hasExpired()) { + // No url, job running or cache is still valid. + return; } - // else - resetCapacityBar(); + m_freeSpaceInfo.job = KIO::fileSystemFreeSpace(url); + connect( + m_freeSpaceInfo.job, + &KIO::FileSystemFreeSpaceJob::result, + this, + [this](KIO::Job *job, KIO::filesize_t size, KIO::filesize_t available) { + // even if we receive an error we want to refresh lastUpdated to avoid repeatedly querying in this case + m_freeSpaceInfo.lastUpdated.setRemainingTime(CAPACITYBAR_CACHE_TTL); + + if (job->error()) { + return; + } + + m_freeSpaceInfo.size = size; + m_freeSpaceInfo.used = size - available; + m_freeSpaceInfo.usedRatio = (qreal)m_freeSpaceInfo.used / (qreal)m_freeSpaceInfo.size; + m_drawCapacityBar = size > 0; + + update(); + } + ); } void PlacesItemListWidget::resetCapacityBar() { - m_isMountPoint = false; m_drawCapacityBar = false; - m_capacityBarRatio = 0; + delete m_freeSpaceInfo.job; + m_freeSpaceInfo.lastUpdated.setRemainingTime(0); + m_freeSpaceInfo.size = 0; + m_freeSpaceInfo.used = 0; + m_freeSpaceInfo.usedRatio = 0; } void PlacesItemListWidget::polishEvent() @@ -84,12 +106,13 @@ void PlacesItemListWidget::paint(QPainter* painter, const QStyleOptionGraphicsIt { KStandardItemListWidget::paint(painter, option, widget); - if (m_drawCapacityBar) { + // We check if option=nullptr since it is null when the place is dragged (Bug #430441) + if (m_drawCapacityBar && option) { const TextInfo* textInfo = m_textInfo.value("text"); if (textInfo) { // See KStandarItemListWidget::paint() for info on why we check textInfo. painter->save(); - QRect capacityRect( + const QRect capacityRect( textInfo->pos.x(), option->rect.top() + option->rect.height() - CAPACITYBAR_HEIGHT - CAPACITYBAR_MARGIN, qMin((qreal)option->rect.width(), selectionRect().width()) - (textInfo->pos.x() - option->rect.left()), @@ -98,45 +121,28 @@ void PlacesItemListWidget::paint(QPainter* painter, const QStyleOptionGraphicsIt const QPalette pal = palette(); const QPalette::ColorGroup group = isActiveWindow() ? QPalette::Active : QPalette::Inactive; - // QColor bgColor = QColor::fromRgb(230, 230, 230); - // QColor outlineColor = QColor::fromRgb(208, 208, 208); - // QColor bgColor = QColor::fromRgb(0, 230, 0); - // QColor outlineColor = QColor::fromRgb(208, 0, 0, 127); - // QColor normalUsedColor = QColor::fromRgb(38, 160, 218); - // QColor dangerUsedColor = QColor::fromRgb(218, 38, 38); - // QColor bgColor = pal.base().color().darker(130); - // QColor outlineColor = pal.base().color().darker(150); - - QPalette::ColorRole role; - // role = isSelected() ? QPalette::Highlight : QPalette::Window; - // QColor bgColor = styleOption().palette.color(group, role).darker(150); - // QColor outlineColor = styleOption().palette.color(group, role).darker(170); - QColor bgColor = isSelected() - ? styleOption().palette.color(group, QPalette::Highlight).darker(180) - : styleOption().palette.color(group, QPalette::Window).darker(120); - - role = isSelected() ? QPalette::HighlightedText : QPalette::Highlight; - QColor normalUsedColor = styleOption().palette.color(group, role); - - QColor dangerUsedColor = QColor::fromRgb(218, 38, 38); // Background - painter->fillRect(capacityRect, bgColor); + const QColor bgColor = isSelected() + ? pal.color(group, QPalette::Highlight).darker(180) + : pal.color(group, QPalette::Window).darker(120); - // Outline - // const QRect outlineRect(capacityRect.x(), capacityRect.y(), capacityRect.width() - 1, capacityRect.height() - 1); - // painter->setPen(outlineColor); - // painter->drawRect(outlineRect); + painter->fillRect(capacityRect, bgColor); // Fill - const QRect fillRect(capacityRect.x(), capacityRect.y(), capacityRect.width() * m_capacityBarRatio, capacityRect.height()); - if (m_capacityBarRatio < 0.95) { // Fill - painter->fillRect(fillRect, normalUsedColor); - } else { + const QRect fillRect(capacityRect.x(), capacityRect.y(), capacityRect.width() * m_freeSpaceInfo.usedRatio, capacityRect.height()); + if (m_freeSpaceInfo.usedRatio >= 0.95) { // More than 95% full! + const QColor dangerUsedColor = KColorScheme(group, KColorScheme::View).foreground(KColorScheme::NegativeText).color(); painter->fillRect(fillRect, dangerUsedColor); + } else { + const QPalette::ColorRole role = isSelected() ? QPalette::HighlightedText : QPalette::Highlight; + const QColor normalUsedColor = styleOption().palette.color(group, role); + painter->fillRect(fillRect, normalUsedColor); } painter->restore(); } } + + updateCapacityBar(); }