X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/a05343530d0f43434715888902067512309098ce..3ccc0420a694deeb0d236c7b39ce569bd074f3e8:/src/kitemviews/kstandarditemlistwidget.cpp diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 585a96fbf..db4e4a90e 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -419,7 +419,7 @@ void KStandardItemListWidget::paint(QPainter* painter, const QStyleOptionGraphic QPointF pos = ratingTextInfo->pos; const Qt::Alignment align = ratingTextInfo->staticText.textOption().alignment(); if (align & Qt::AlignHCenter) { - pos.rx() += (size().width() - m_rating.width()) / 2 - 2; + pos.rx() += (size().width() - m_rating.width() / m_rating.devicePixelRatioF()) / 2 - 2; } painter->drawPixmap(pos, m_rating); } @@ -954,8 +954,11 @@ void KStandardItemListWidget::updateExpansionArea() if (expandedParentsCount >= 0) { const int widgetIconSize = iconSize(); const qreal widgetHeight = size().height(); - const qreal inc = (widgetHeight - widgetIconSize) / 2; - const qreal x = expandedParentsCount * widgetHeight + inc; + const qreal inc = (widgetHeight - iconSize()) / 2; + const qreal x = + layoutDirection() == Qt::LeftToRight + ? expandedParentsCount * widgetHeight + inc + : size().width() - iconSize() - (expandedParentsCount * widgetHeight + inc); const qreal y = inc; const qreal xPadding = m_highlightEntireRow ? leadingPadding() : 0; m_expansionArea = QRectF(xPadding + x, y, widgetIconSize, widgetIconSize); @@ -1092,8 +1095,20 @@ void KStandardItemListWidget::updatePixmapCache() } else { // Center horizontally and vertically within the icon-area const TextInfo* textInfo = m_textInfo.value("text"); - m_pixmapPos.setX(textInfo->pos.x() - 2.0 * padding - - (scaledIconSize + m_scaledPixmapSize.width()) / 2.0); + const auto width = (scaledIconSize + m_scaledPixmapSize.width()) / 2.0; + const auto iPadding = 2.0 * padding; + const auto x = textInfo->pos.x(); + + const QHash values = data(); + const int expandedParentsCount = values.value("expandedParentsCount", 0).toInt(); + const int expansionOffset = + (m_layout == DetailsLayout) ? + size().height() + size().height() * expandedParentsCount : + 0; + + m_pixmapPos.setX(layoutDirection() == Qt::LeftToRight + ? x - iPadding - width + : size().width() - iPadding - width - expansionOffset); // Derive icon's vertical center from the center of the text frame, including // any necessary adjustment if the font's midline is offset from the frame center @@ -1196,7 +1211,11 @@ QString KStandardItemListWidget::elideRightKeepExtension(const QString &text, in QString ret = m_customizedFontMetrics.elidedText(text.chopped(extensionLength), Qt::ElideRight, elidingWidth - extensionWidth); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) ret.append(text.rightRef(extensionLength)); +#else + ret.append(QStringView(text).right(extensionLength)); +#endif return ret; } } @@ -1310,7 +1329,7 @@ void KStandardItemListWidget::updateIconsLayoutTextCache() requiredWidth = m_customizedFontMetrics.horizontalAdvance(elidedText); } else if (role == "rating") { // Use the width of the rating pixmap, because the rating text is empty. - requiredWidth = m_rating.width(); + requiredWidth = m_rating.width() / m_rating.devicePixelRatioF(); } } layout.endLayout(); @@ -1319,7 +1338,11 @@ void KStandardItemListWidget::updateIconsLayoutTextCache() textInfo->staticText.setTextWidth(maxWidth); const QRectF textRect(padding + (maxWidth - requiredWidth) / 2, y, requiredWidth, lineSpacing); - m_textRect |= textRect; + + // Ignore empty roles. Avoids a text rect taller than the area that actually contains text. + if (!textRect.isEmpty()) { + m_textRect |= textRect; + } y += lineSpacing; } @@ -1357,7 +1380,11 @@ void KStandardItemListWidget::updateCompactLayoutTextCache() textInfo->staticText.setText(elidedText); } - textInfo->pos = QPointF(x, y); + if (layoutDirection() == Qt::LeftToRight) { + textInfo->pos = QPointF(x, y); + } else { + textInfo->pos = QPointF(x - size().height(), y); + } textInfo->staticText.setTextWidth(maxWidth); maximumRequiredTextWidth = qMax(maximumRequiredTextWidth, requiredWidth); @@ -1365,7 +1392,11 @@ void KStandardItemListWidget::updateCompactLayoutTextCache() y += lineSpacing; } - m_textRect = QRectF(x - option.padding, 0, maximumRequiredTextWidth + 2 * option.padding, widgetHeight); + if (layoutDirection() == Qt::LeftToRight) { + m_textRect = QRectF(x - option.padding, 0, maximumRequiredTextWidth + 2 * option.padding, widgetHeight); + } else { + m_textRect = QRectF(x - option.padding - size().height(), 0, maximumRequiredTextWidth + 2 * option.padding, widgetHeight); + } } void KStandardItemListWidget::updateDetailsLayoutTextCache() @@ -1385,14 +1416,15 @@ void KStandardItemListWidget::updateDetailsLayoutTextCache() const int fontHeight = m_customizedFontMetrics.height(); const qreal columnWidthInc = columnPadding(option); - qreal firstColumnInc = iconSize(); + + qreal firstColumnOffset = iconSize(); if (m_supportsItemExpanding) { - firstColumnInc += (m_expansionArea.left() + m_expansionArea.right() + widgetHeight) / 2; + firstColumnOffset += (m_expansionArea.width() + widgetHeight) / 2; } else { - firstColumnInc += option.padding + leadingPadding(); + firstColumnOffset += option.padding + leadingPadding(); } - qreal x = firstColumnInc; + qreal x = firstColumnOffset; const qreal y = qMax(qreal(option.padding), (widgetHeight - fontHeight) / 2); for (const QByteArray& role : qAsConst(m_sortedVisibleRoles)) { @@ -1403,9 +1435,13 @@ void KStandardItemListWidget::updateDetailsLayoutTextCache() const qreal roleWidth = columnWidth(role); qreal availableTextWidth = roleWidth - columnWidthInc; + const QHash values = data(); + const int expandedParentsCount = values.value("expandedParentsCount", 0).toInt(); + const int expansionOffset = size().height() * expandedParentsCount; + const bool isTextRole = (role == "text"); if (isTextRole) { - availableTextWidth -= firstColumnInc - leadingPadding(); + availableTextWidth -= firstColumnOffset - leadingPadding(); } if (requiredWidth > availableTextWidth) { @@ -1415,7 +1451,15 @@ void KStandardItemListWidget::updateDetailsLayoutTextCache() TextInfo* textInfo = m_textInfo.value(role); textInfo->staticText.setText(text); - textInfo->pos = QPointF(x + columnWidthInc / 2, y); + textInfo->pos = QPointF(x - (layoutDirection() == Qt::LeftToRight ? 0 : firstColumnOffset), y); + if (layoutDirection() == Qt::LeftToRight) { + textInfo->pos.rx() += columnWidthInc/2 + expansionOffset; + } else { + textInfo->pos.rx() -= expansionOffset; + if (textInfo->pos.x() < iconSize()) { + textInfo->pos.rx() = iconSize(); + } + } x += roleWidth; if (isTextRole) { @@ -1427,7 +1471,7 @@ void KStandardItemListWidget::updateDetailsLayoutTextCache() // The column after the name should always be aligned on the same x-position independent // from the expansion-level shown in the name column - x -= firstColumnInc - leadingPadding(); + x -= firstColumnOffset - leadingPadding(); } else if (isRoleRightAligned(role)) { textInfo->pos.rx() += roleWidth - requiredWidth - columnWidthInc; } @@ -1479,13 +1523,22 @@ void KStandardItemListWidget::drawPixmap(QPainter* painter, const QPixmap& pixma void KStandardItemListWidget::drawSiblingsInformation(QPainter* painter) { const int siblingSize = size().height(); - const int x = (m_expansionArea.left() + m_expansionArea.right() - siblingSize) / 2; - QRect siblingRect(x, 0, siblingSize, siblingSize); + const int x = (m_expansionArea.width() - siblingSize) / 2; + + const QHash values = data(); + const int expandedParentsCount = values.value("expandedParentsCount", 0).toInt(); + const int expansionOffset = siblingSize * expandedParentsCount; + + QRect siblingRect( + layoutDirection() == Qt::LeftToRight + ? x + expansionOffset + : size().width() - x - siblingSize - expansionOffset, 0, siblingSize, siblingSize); bool isItemSibling = true; const QBitArray siblings = siblingsInformation(); QStyleOption option; + option.direction = layoutDirection(); const auto normalColor = option.palette.color(normalTextColorRole()); const auto highlightColor = option.palette.color(expansionAreaHovered() ? QPalette::Highlight : normalTextColorRole()); for (int i = siblings.count() - 1; i >= 0; --i) { @@ -1507,7 +1560,11 @@ void KStandardItemListWidget::drawSiblingsInformation(QPainter* painter) style()->drawPrimitive(QStyle::PE_IndicatorBranch, &option, painter); - siblingRect.translate(-siblingRect.width(), 0); + if (layoutDirection() == Qt::LeftToRight) { + siblingRect.translate(-siblingRect.width(), 0); + } else { + siblingRect.translate(siblingRect.width(), 0); + } } }