X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/d7f89808f7620e5b4cecc606e1fd3ac1df43c1b4..cc0ce2a7aade290595bb34891bb8a6ed4c78fd4d:/src/kitemviews/kfileitemlistwidget.cpp diff --git a/src/kitemviews/kfileitemlistwidget.cpp b/src/kitemviews/kfileitemlistwidget.cpp index 4eccf6862..7e28c5d37 100644 --- a/src/kitemviews/kfileitemlistwidget.cpp +++ b/src/kitemviews/kfileitemlistwidget.cpp @@ -38,13 +38,13 @@ #include #include -//#define KFILEITEMLISTWIDGET_DEBUG +// #define KFILEITEMLISTWIDGET_DEBUG KFileItemListWidget::KFileItemListWidget(QGraphicsItem* parent) : KItemListWidget(parent), m_isCut(false), m_isHidden(false), - m_isDir(false), + m_isExpandable(false), m_dirtyLayout(true), m_dirtyContent(true), m_dirtyContentRoles(), @@ -52,7 +52,8 @@ KFileItemListWidget::KFileItemListWidget(QGraphicsItem* parent) : m_pixmapPos(), m_pixmap(), m_scaledPixmapSize(), - m_hoverPixmapRect(), + m_originalPixmapSize(), + m_iconRect(), m_hoverPixmap(), m_textPos(), m_text(), @@ -78,6 +79,7 @@ void KFileItemListWidget::setLayout(Layout layout) if (m_layout != layout) { m_layout = layout; m_dirtyLayout = true; + updateAdditionalInfoTextColor(); update(); } } @@ -89,12 +91,12 @@ KFileItemListWidget::Layout KFileItemListWidget::layout() const void KFileItemListWidget::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { - KItemListWidget::paint(painter, option, widget); - const_cast(this)->triggerCacheRefreshing(); + KItemListWidget::paint(painter, option, widget); + // Draw expansion toggle '>' or 'V' - if (m_isDir && !m_expansionArea.isEmpty()) { + if (m_isExpandable && !m_expansionArea.isEmpty()) { QStyleOption arrowOption; arrowOption.rect = m_expansionArea.toRect(); const QStyle::PrimitiveElement arrow = data()["isExpanded"].toBool() @@ -146,8 +148,11 @@ void KFileItemListWidget::paint(QPainter* painter, const QStyleOptionGraphicsIte } #ifdef KFILEITEMLISTWIDGET_DEBUG - painter->setPen(Qt::red); painter->setBrush(Qt::NoBrush); + painter->setPen(Qt::green); + painter->drawRect(m_iconRect); + + painter->setPen(Qt::red); painter->drawText(QPointF(0, itemListStyleOption.fontMetrics.height()), QString::number(index())); painter->drawRect(rect()); #endif @@ -156,11 +161,7 @@ void KFileItemListWidget::paint(QPainter* painter, const QStyleOptionGraphicsIte QRectF KFileItemListWidget::iconRect() const { const_cast(this)->triggerCacheRefreshing(); - - QRectF bounds = m_hoverPixmapRect; - const qreal margin = styleOption().margin; - bounds.adjust(-margin, -margin, margin, margin); - return bounds; + return m_iconRect; } QRectF KFileItemListWidget::textRect() const @@ -172,7 +173,7 @@ QRectF KFileItemListWidget::textRect() const QRectF KFileItemListWidget::expansionToggleRect() const { const_cast(this)->triggerCacheRefreshing(); - return m_isDir ? m_expansionArea : QRectF(); + return m_isExpandable ? m_expansionArea : QRectF(); } QRectF KFileItemListWidget::selectionToggleRect() const @@ -281,7 +282,7 @@ void KFileItemListWidget::setTextColor(const QColor& color) QColor KFileItemListWidget::textColor() const { - if (m_customTextColor.isValid()) { + if (m_customTextColor.isValid() && !isSelected()) { return m_customTextColor; } @@ -408,7 +409,7 @@ void KFileItemListWidget::triggerCacheRefreshing() refreshCache(); const QHash values = data(); - m_isDir = values["isDir"].toBool(); + m_isExpandable = values["isExpandable"].toBool(); m_isHidden = values["name"].toString().startsWith(QLatin1Char('.')); updateExpansionArea(); @@ -427,15 +428,17 @@ void KFileItemListWidget::updateExpansionArea() Q_ASSERT(values.contains("expansionLevel")); const KItemListStyleOption& option = styleOption(); const int expansionLevel = values.value("expansionLevel", 0).toInt(); - - const qreal widgetHeight = size().height(); - const qreal expansionLevelSize = KIconLoader::SizeSmall; - const qreal x = option.margin + expansionLevel * widgetHeight; - const qreal y = (widgetHeight - expansionLevelSize) / 2; - m_expansionArea = QRectF(x, y, expansionLevelSize, expansionLevelSize); - } else { - m_expansionArea = QRectF(); + if (expansionLevel >= 0) { + const qreal widgetHeight = size().height(); + const qreal expansionLevelSize = KIconLoader::SizeSmall; + const qreal x = option.margin + expansionLevel * widgetHeight; + const qreal y = (widgetHeight - expansionLevelSize) / 2; + m_expansionArea = QRectF(x, y, expansionLevelSize, expansionLevelSize); + return; + } } + + m_expansionArea = QRectF(); } void KFileItemListWidget::updatePixmapCache() @@ -463,7 +466,8 @@ void KFileItemListWidget::updatePixmapCache() if (!updatePixmap && m_dirtyContent) { updatePixmap = m_dirtyContentRoles.isEmpty() || m_dirtyContentRoles.contains("iconPixmap") - || m_dirtyContentRoles.contains("iconName"); + || m_dirtyContentRoles.contains("iconName") + || m_dirtyContentRoles.contains("iconOverlays"); } if (updatePixmap) { @@ -477,7 +481,7 @@ void KFileItemListWidget::updatePixmapCache() iconName = QLatin1String("unknown"); } m_pixmap = pixmapForIcon(iconName, iconHeight); - m_hoverPixmapRect.setSize(m_pixmap.size()); + m_originalPixmapSize = m_pixmap.size(); } else if (m_pixmap.size() != QSize(iconHeight, iconHeight)) { // A custom pixmap has been applied. Assure that the pixmap // is scaled to the available size. @@ -486,7 +490,7 @@ void KFileItemListWidget::updatePixmapCache() if (scale) { KPixmapModifier::scale(m_pixmap, QSize(iconHeight, iconHeight)); } - m_hoverPixmapRect.setSize(m_pixmap.size()); + m_originalPixmapSize = m_pixmap.size(); // To simplify the handling of scaling the original pixmap // will be embedded into a square pixmap. @@ -494,20 +498,32 @@ void KFileItemListWidget::updatePixmapCache() squarePixmap.fill(Qt::transparent); QPainter painter(&squarePixmap); - int x, y; - if (iconOnTop) { - x = (iconHeight - m_pixmap.width()) / 2; // Center horizontally - y = iconHeight - m_pixmap.height(); // Align on bottom - painter.drawPixmap(x, y, m_pixmap); - } else { - x = iconHeight - m_pixmap.width(); // Align right - y = (iconHeight - m_pixmap.height()) / 2; // Center vertically - painter.drawPixmap(x, y, m_pixmap); + const int x = (iconHeight - m_pixmap.width()) / 2; // Center horizontally + int y = iconHeight - m_pixmap.height(); // Move to bottom + if (!iconOnTop) { + y /= 2.0; // Center vertically } + painter.drawPixmap(x, y, m_pixmap); m_pixmap = squarePixmap; } else { - m_hoverPixmapRect.setSize(m_pixmap.size()); + m_originalPixmapSize = m_pixmap.size(); + } + + const QStringList overlays = values["iconOverlays"].toStringList(); + + // Strangely KFileItem::overlays() returns empty string-values, so + // we need to check first whether an overlay must be drawn at all. + // It is more efficient to do it here, as KIconLoader::drawOverlays() + // assumes that an overlay will be drawn and has some additional + // setup time. + foreach (const QString& overlay, overlays) { + if (!overlay.isEmpty()) { + // There is at least one overlay, draw all overlays above m_pixmap + // and cancel the check + KIconLoader::global()->drawOverlays(overlays, m_pixmap, KIconLoader::Desktop); + break; + } } if (m_isCut) { @@ -535,10 +551,24 @@ void KFileItemListWidget::updatePixmapCache() m_pixmapPos.setY(option.margin); // Center the hover rectangle horizontally and align it on bottom - const qreal x = m_pixmapPos.x() + (m_scaledPixmapSize.width() - m_hoverPixmapRect.width()) / 2.0; - const qreal y = m_pixmapPos.y() + m_scaledPixmapSize.height() - m_hoverPixmapRect.height(); - m_hoverPixmapRect.moveTopLeft(QPointF(x, y)); + qreal hoverWidth = m_originalPixmapSize.width(); + qreal hoverHeight = m_originalPixmapSize.height(); + if (scaledIconHeight != m_pixmap.height()) { + const qreal scaleFactor = qreal(scaledIconHeight) / qreal(m_pixmap.height()); + hoverWidth *= scaleFactor; + hoverHeight *= scaleFactor; + } + const qreal hoverX = m_pixmapPos.x() + (m_scaledPixmapSize.width() - hoverWidth) / 2.0; + qreal hoverY = m_scaledPixmapSize.height() - hoverHeight; + if (!iconOnTop) { + hoverY /= 2.0; + } + hoverY += m_pixmapPos.y(); + m_iconRect = QRectF(hoverX, hoverY, hoverWidth, hoverHeight); + const qreal margin = option.margin; + m_iconRect.adjust(-margin, -margin, margin, margin); + // Prepare the pixmap that is used when the item gets hovered if (isHovered()) { m_hoverPixmap = m_pixmap; @@ -632,9 +662,9 @@ void KFileItemListWidget::updateIconsLayoutTextCache() m_text[Name].setTextWidth(maxWidth); m_textPos[Name] = QPointF(option.margin, widgetHeight - textLinesCount * fontHeight - option.margin); m_textRect = QRectF(option.margin + (maxWidth - requiredWidthForName) / 2, - m_textPos[Name].y(), - requiredWidthForName, - m_text[Name].size().height()); + m_textPos[Name].y(), + requiredWidthForName, + textLinesCountForName * fontHeight); // Calculate the position for each additional information qreal y = m_textPos[Name].y() + textLinesCountForName * fontHeight; @@ -818,7 +848,7 @@ void KFileItemListWidget::drawPixmap(QPainter* painter, const QPixmap& pixmap) painter->drawPixmap(m_pixmapPos, scaledPixmap); #ifdef KFILEITEMLISTWIDGET_DEBUG - painter->setPen(Qt::green); + painter->setPen(Qt::blue); painter->drawRect(QRectF(m_pixmapPos, QSizeF(scaledPixmap.size()))); #endif } else {