From e75326077b443f5f1f1b19dc960a3a8a83979d81 Mon Sep 17 00:00:00 2001 From: Chris Holland Date: Wed, 31 Jul 2019 21:46:53 -0400 Subject: [PATCH] Only check if place url is mount point once during polish event. The capacity bars will no longer update when capacity changes. It only checks the size on init. Updating during polish event is only a temporarily solution just to draft code flow for seperating logic from painting. Eventually this logic update should be in a worker thread detached from blocking the rendering thread that blocks launching the dolphin window. --- src/panels/places/placesitemlistwidget.cpp | 146 ++++++++++++--------- src/panels/places/placesitemlistwidget.h | 8 ++ 2 files changed, 95 insertions(+), 59 deletions(-) diff --git a/src/panels/places/placesitemlistwidget.cpp b/src/panels/places/placesitemlistwidget.cpp index 52b3baf309..4d88f8c55e 100644 --- a/src/panels/places/placesitemlistwidget.cpp +++ b/src/panels/places/placesitemlistwidget.cpp @@ -6,6 +6,8 @@ #include "placesitemlistwidget.h" +#include + #include #include @@ -18,6 +20,9 @@ PlacesItemListWidget::PlacesItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent) : KStandardItemListWidget(informant, parent) + , m_isMountPoint(false) + , m_drawCapacityBar(false) + , m_capacityBarRatio(0) { } @@ -36,78 +41,101 @@ QPalette::ColorRole PlacesItemListWidget::normalTextColorRole() const return QPalette::WindowText; } +void PlacesItemListWidget::updateCapacityBar() +{ + const QUrl url = data().value("url").toUrl(); + if (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(); + } else { + resetCapacityBar(); + } + } else { + resetCapacityBar(); + } +} + +void PlacesItemListWidget::resetCapacityBar() +{ + m_isMountPoint = false; + m_drawCapacityBar = false; + m_capacityBarRatio = 0; +} + +void PlacesItemListWidget::polishEvent() +{ + updateCapacityBar(); + + QGraphicsWidget::polishEvent(); +} + 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 (m_drawCapacityBar) { + const TextInfo* textInfo = m_textInfo.value("text"); + if (textInfo) { // See KStandarItemListWidget::paint() for info on why we check textInfo. + painter->save(); - 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 + ); - 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 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); - const qreal ratio = (qreal)info.used() / (qreal)info.size(); - // qDebug() << "ratio:" << ratio << "(" << info.used() << "/" << info.size() << ")"; + 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); - 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); + role = isSelected() ? QPalette::HighlightedText : QPalette::Highlight; + QColor normalUsedColor = styleOption().palette.color(group, role); - 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); + QColor dangerUsedColor = QColor::fromRgb(218, 38, 38); - role = isSelected() ? QPalette::HighlightedText : QPalette::Highlight; - QColor normalUsedColor = styleOption().palette.color(group, role); + // Background + painter->fillRect(capacityRect, bgColor); - QColor dangerUsedColor = QColor::fromRgb(218, 38, 38); + // Outline + // const QRect outlineRect(capacityRect.x(), capacityRect.y(), capacityRect.width() - 1, capacityRect.height() - 1); + // painter->setPen(outlineColor); + // painter->drawRect(outlineRect); - // 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(); - } + // 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 { + painter->fillRect(fillRect, dangerUsedColor); } + + painter->restore(); } } } diff --git a/src/panels/places/placesitemlistwidget.h b/src/panels/places/placesitemlistwidget.h index e5763ad07d..a82616ff3a 100644 --- a/src/panels/places/placesitemlistwidget.h +++ b/src/panels/places/placesitemlistwidget.h @@ -22,10 +22,18 @@ public: ~PlacesItemListWidget() override; void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; + void polishEvent() override; protected: bool isHidden() const override; QPalette::ColorRole normalTextColorRole() const override; + void updateCapacityBar(); + void resetCapacityBar(); + +private: + bool m_isMountPoint; + bool m_drawCapacityBar; + qreal m_capacityBarRatio; }; #endif