- // +------+
- // | Icon |
- // +------+
- //
- // Name role that
- // might get wrapped above
- // several lines.
- // Additional role 1
- // Additional role 2
-
- const QHash<QByteArray, QVariant> values = data();
-
- const KItemListStyleOption& option = styleOption();
- const qreal padding = option.padding;
- const qreal maxWidth = size().width() - 2 * padding;
- const qreal widgetHeight = size().height();
- const qreal lineSpacing = option.fontMetrics.lineSpacing();
-
- // Initialize properties for the "name" role. It will be used as anchor
- // for initializing the position of the other roles.
- TextInfo* nameTextInfo = m_textInfo.value("name");
- nameTextInfo->staticText.setText(KStringHandler::preProcessWrap(values["name"].toString()));
-
- // Calculate the number of lines required for the name and the required width
- qreal nameWidth = 0;
- qreal nameHeight = 0;
- QTextLine line;
-
- QTextLayout layout(nameTextInfo->staticText.text(), option.font);
- layout.setTextOption(nameTextInfo->staticText.textOption());
- layout.beginLayout();
- while ((line = layout.createLine()).isValid()) {
- line.setLineWidth(maxWidth);
- nameWidth = qMax(nameWidth, line.naturalTextWidth());
- nameHeight += line.height();
- }
- layout.endLayout();
-
- // Use one line for each additional information
- const int additionalRolesCount = qMax(visibleRoles().count() - 1, 0);
- nameTextInfo->staticText.setTextWidth(maxWidth);
- nameTextInfo->pos = QPointF(padding, widgetHeight -
- nameHeight -
- additionalRolesCount * lineSpacing -
- padding);
- m_textRect = QRectF(padding + (maxWidth - nameWidth) / 2,
- nameTextInfo->pos.y(),
- nameWidth,
- nameHeight);
-
- // Calculate the position for each additional information
- qreal y = nameTextInfo->pos.y() + nameHeight;
- foreach (const QByteArray& role, m_sortedVisibleRoles) {
- if (role == "name") {
- continue;
- }
-
- const QString text = roleText(role, values);
- TextInfo* textInfo = m_textInfo.value(role);
- textInfo->staticText.setText(text);
-
- qreal requiredWidth = 0;
-
- QTextLayout layout(text, option.font);
- layout.setTextOption(textInfo->staticText.textOption());
- layout.beginLayout();
- QTextLine textLine = layout.createLine();
- if (textLine.isValid()) {
- textLine.setLineWidth(maxWidth);
- requiredWidth = textLine.naturalTextWidth();
- if (textLine.textLength() < text.length()) {
- // TODO: QFontMetrics::elidedText() works different regarding the given width
- // in comparison to QTextLine::setLineWidth(). It might happen that the text does
- // not get elided although it does not fit into the given width. As workaround
- // the padding is substracted.
- const QString elidedText = option.fontMetrics.elidedText(text, Qt::ElideRight, maxWidth - padding);
- textInfo->staticText.setText(elidedText);
- }
- }
- layout.endLayout();
-
- textInfo->pos = QPointF(padding, y);
- textInfo->staticText.setTextWidth(maxWidth);
-
- const QRectF textRect(padding + (maxWidth - requiredWidth) / 2, y, requiredWidth, lineSpacing);
- m_textRect |= textRect;
-
- y += lineSpacing;
- }
-
- // Add a padding to the text rectangle
- m_textRect.adjust(-padding, -padding, padding, padding);
-}
-
-void KFileItemListWidget::updateCompactLayoutTextCache()
-{
- // +------+ Name role
- // | Icon | Additional role 1
- // +------+ Additional role 2
-
- const QHash<QByteArray, QVariant> values = data();
-
- const KItemListStyleOption& option = styleOption();
- const qreal widgetHeight = size().height();
- const qreal lineSpacing = option.fontMetrics.lineSpacing();
- const qreal textLinesHeight = qMax(visibleRoles().count(), 1) * lineSpacing;
- const int scaledIconSize = (textLinesHeight < option.iconSize) ? widgetHeight - 2 * option.padding : option.iconSize;
-
- qreal maximumRequiredTextWidth = 0;
- const qreal x = option.padding * 3 + scaledIconSize;
- qreal y = qRound((widgetHeight - textLinesHeight) / 2);
- const qreal maxWidth = size().width() - x - option.padding;
- foreach (const QByteArray& role, m_sortedVisibleRoles) {
- const QString text = roleText(role, values);
- TextInfo* textInfo = m_textInfo.value(role);
- textInfo->staticText.setText(text);
-
- qreal requiredWidth = option.fontMetrics.width(text);
- if (requiredWidth > maxWidth) {
- requiredWidth = maxWidth;
- const QString elidedText = option.fontMetrics.elidedText(text, Qt::ElideRight, maxWidth);
- textInfo->staticText.setText(elidedText);
- }
-
- textInfo->pos = QPointF(x, y);
- textInfo->staticText.setTextWidth(maxWidth);
-
- maximumRequiredTextWidth = qMax(maximumRequiredTextWidth, requiredWidth);
-
- y += lineSpacing;
- }
-
- m_textRect = QRectF(x - option.padding, 0, maximumRequiredTextWidth + 2 * option.padding, widgetHeight);
-}
-
-void KFileItemListWidget::updateDetailsLayoutTextCache()
-{
- // Precondition: Requires already updated m_expansionArea
- // to determine the left position.
-
- // +------+
- // | Icon | Name role Additional role 1 Additional role 2
- // +------+
- m_textRect = QRectF();
-
- const KItemListStyleOption& option = styleOption();
- const QHash<QByteArray, QVariant> values = data();