diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index d036aae662..cda7cbfd10 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -171,6 +171,14 @@ protected: void hideEvent(QHideEvent* event) override; bool event(QEvent *event) override; +protected: + struct TextInfo + { + QPointF pos; + QStaticText staticText; + }; + QHash m_textInfo; + public slots: void finishRoleEditing(); @@ -239,13 +247,6 @@ private: 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.cpp b/src/panels/places/placesitemlistwidget.cpp index 0551829afd..52b3baf309 100644 --- a/src/panels/places/placesitemlistwidget.cpp +++ b/src/panels/places/placesitemlistwidget.cpp @@ -6,6 +6,16 @@ #include "placesitemlistwidget.h" +#include +#include + +#include +#include + +#define CAPACITYBAR_HEIGHT 2 +#define CAPACITYBAR_MARGIN 2 + + PlacesItemListWidget::PlacesItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent) : KStandardItemListWidget(informant, parent) { @@ -26,3 +36,78 @@ QPalette::ColorRole PlacesItemListWidget::normalTextColorRole() const 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 textInfo. + 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(); + // qDebug() << "ratio:" << ratio << "(" << info.used() << "/" << info.size() << ")"; + + 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); + + // Outline + // const QRect outlineRect(capacityRect.x(), capacityRect.y(), capacityRect.width() - 1, capacityRect.height() - 1); + // painter->setPen(outlineColor); + // painter->drawRect(outlineRect); + + // Fill + const QRect fillRect(capacityRect.x(), capacityRect.y(), capacityRect.width() * ratio, capacityRect.height()); + if (ratio < 0.95) { // Fill + painter->fillRect(fillRect, normalUsedColor); + } else { + painter->fillRect(fillRect, dangerUsedColor); + } + + painter->restore(); + } + } + } + } +} diff --git a/src/panels/places/placesitemlistwidget.h b/src/panels/places/placesitemlistwidget.h index 82372d6220..e5763ad07d 100644 --- a/src/panels/places/placesitemlistwidget.h +++ b/src/panels/places/placesitemlistwidget.h @@ -21,6 +21,8 @@ public: 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;