diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -230,6 +230,14 @@ */ static qreal columnPadding(const KItemListStyleOption& option); +protected: + struct TextInfo + { + QPointF pos; + QStaticText staticText; + }; + QHash m_textInfo; + private: bool m_isCut; bool m_isHidden; @@ -250,13 +258,6 @@ QRectF m_iconRect; // Cache for KItemListWidget::iconRect() QPixmap m_hoverPixmap; // Cache for modified m_pixmap when hovering the item - struct TextInfo - { - QPointF pos; - QStaticText staticText; - }; - QHash m_textInfo; - QRectF m_textRect; QList m_sortedVisibleRoles; diff --git a/src/panels/places/placesitemlistwidget.h b/src/panels/places/placesitemlistwidget.h --- a/src/panels/places/placesitemlistwidget.h +++ b/src/panels/places/placesitemlistwidget.h @@ -34,6 +34,8 @@ PlacesItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent); ~PlacesItemListWidget() override; + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; + protected: bool isHidden() const override; QPalette::ColorRole normalTextColorRole() const override; diff --git a/src/panels/places/placesitemlistwidget.cpp b/src/panels/places/placesitemlistwidget.cpp --- a/src/panels/places/placesitemlistwidget.cpp +++ b/src/panels/places/placesitemlistwidget.cpp @@ -19,6 +19,16 @@ #include "placesitemlistwidget.h" +#include +#include + +#include +#include +#include + +#define CAPACITYBAR_HEIGHT 2 +#define CAPACITYBAR_MARGIN 2 + PlacesItemListWidget::PlacesItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent) : KStandardItemListWidget(informant, parent) { @@ -39,3 +49,59 @@ return QPalette::WindowText; } +void PlacesItemListWidget::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) +{ + KStandardItemListWidget::paint(painter, option, widget); + + bool drawCapacityBar = false; + const QUrl url = data().value("url").toUrl(); + if (url.isLocalFile()) { + const QString mountPointPath = url.toLocalFile(); + KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByPath(mountPointPath); + bool isMountPoint = (mp && mp->mountPoint() == mountPointPath); + + if (isMountPoint) { + const KDiskFreeSpaceInfo info = KDiskFreeSpaceInfo::freeSpaceInfo(mountPointPath); + drawCapacityBar = info.size() != 0; + if (drawCapacityBar) { + const TextInfo* textInfo = m_textInfo.value("text"); + if (textInfo) { // See KStandarItemListWidget::paint() for info on why we check if textInfo is null. + painter->save(); + + 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()), + CAPACITYBAR_HEIGHT + ); + + const qreal ratio = (qreal)info.used() / (qreal)info.size(); + + const QPalette pal = styleOption().palette; + const QPalette::ColorGroup group = isActiveWindow() ? QPalette::Active : QPalette::Inactive; + + // Background + const QColor bgColor = isSelected() + ? pal.color(group, QPalette::Highlight).darker(180) + : pal.color(group, QPalette::Window).darker(120); + + painter->fillRect(capacityRect, bgColor); + + + // Fill + const QRect fillRect(capacityRect.x(), capacityRect.y(), capacityRect.width() * ratio, capacityRect.height()); + if (ratio >= 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 = pal.color(group, role); + painter->fillRect(fillRect, normalUsedColor); + } + + painter->restore(); + } + } + } + } +}