From: Janet Blackquill Date: Fri, 25 Feb 2022 16:35:05 +0000 (+0000) Subject: KStandardItemListWidget: handle RtL drawing properly X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/ddba4f5fd88c4fa855e3f2eb0d9d95a6290d150a KStandardItemListWidget: handle RtL drawing properly BUG: 449211 --- diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index c5621840a..74d48e325 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -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 + expansionOffset + : 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 @@ -1361,7 +1376,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); @@ -1369,7 +1388,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() @@ -1389,14 +1412,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)) { @@ -1407,9 +1431,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) { @@ -1419,7 +1447,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) { @@ -1431,7 +1467,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; } @@ -1483,13 +1519,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) { @@ -1511,7 +1556,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); + } } }