]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Merge branch 'release/21.12'
authorFelix Ernst <fe.a.ernst@gmail.com>
Sat, 29 Jan 2022 17:14:49 +0000 (18:14 +0100)
committerFelix Ernst <fe.a.ernst@gmail.com>
Sat, 29 Jan 2022 17:14:49 +0000 (18:14 +0100)
1  2 
src/kitemviews/kstandarditemlistwidget.cpp

index b17fac6d55568fef1a6aa508c3658ccadce446a2,9c527fa171deb2e4b74672b9cf6ca40c8e642e67..04d8e0f7e2f166e5d71e69d642bb8163155842b3
@@@ -36,7 -36,7 +36,7 @@@ KStandardItemListWidgetInformant::~KSta
  {
  }
  
 -void KStandardItemListWidgetInformant::calculateItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const
 +void KStandardItemListWidgetInformant::calculateItemSizeHints(QVector<std::pair<qreal, bool>>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const
  {
      switch (static_cast<const KStandardItemListView*>(view)->itemLayout()) {
      case KStandardItemListView::IconsLayout:
@@@ -121,7 -121,7 +121,7 @@@ QFont KStandardItemListWidgetInformant:
      return baseFont;
  }
  
 -void KStandardItemListWidgetInformant::calculateIconsLayoutItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const
 +void KStandardItemListWidgetInformant::calculateIconsLayoutItemSizeHints(QVector<std::pair<qreal, bool>>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const
  {
      const KItemListStyleOption& option = view->styleOption();
      const QFont& normalFont = option.font;
      textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
  
      for (int index = 0; index < logicalHeightHints.count(); ++index) {
 -        if (logicalHeightHints.at(index) > 0.0) {
 +        if (logicalHeightHints.at(index).first > 0.0) {
              continue;
          }
  
          const QFont& font = itemIsLink(index, view) ? linkFont : normalFont;
  
          const QString& text = KStringHandler::preProcessWrap(itemText(index, view));
 -
 +        
          // Calculate the number of lines required for wrapping the name
          qreal textHeight = 0;
          QTextLayout layout(text, font);
          layout.beginLayout();
          QTextLine line;
          int lineCount = 0;
 +        bool isElided = false;
          while ((line = layout.createLine()).isValid()) {
              line.setLineWidth(maxWidth);
              line.naturalTextWidth();
  
              ++lineCount;
              if (lineCount == option.maxTextLines) {
 +                isElided = layout.createLine().isValid();
                  break;
              }
          }
          // Add one line for each additional information
          textHeight += additionalRolesSpacing;
  
 -        logicalHeightHints[index] = textHeight + spacingAndIconHeight;
 +        logicalHeightHints[index].first = textHeight + spacingAndIconHeight;
 +        logicalHeightHints[index].second = isElided;
      }
  
      logicalWidthHint = itemWidth;
  }
  
 -void KStandardItemListWidgetInformant::calculateCompactLayoutItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const
 +void KStandardItemListWidgetInformant::calculateCompactLayoutItemSizeHints(QVector<std::pair<qreal, bool>>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const
  {
      const KItemListStyleOption& option = view->styleOption();
      const QFontMetrics& normalFontMetrics = option.fontMetrics;
      const QFontMetrics linkFontMetrics(customizedFontForLinks(option.font));
  
      for (int index = 0; index < logicalHeightHints.count(); ++index) {
 -        if (logicalHeightHints.at(index) > 0.0) {
 +        if (logicalHeightHints.at(index).first > 0.0) {
              continue;
          }
  
              width = maxWidth;
          }
  
 -        logicalHeightHints[index] = width;
 +        logicalHeightHints[index].first = width;
      }
  
      logicalWidthHint = height;
  }
  
 -void KStandardItemListWidgetInformant::calculateDetailsLayoutItemSizeHints(QVector<qreal>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const
 +void KStandardItemListWidgetInformant::calculateDetailsLayoutItemSizeHints(QVector<std::pair<qreal, bool>>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const
  {
      const KItemListStyleOption& option = view->styleOption();
-     float zoomLevel = 1;
-     if (option.iconSize >= KIconLoader::SizeEnormous) {
-         zoomLevel = 2;
-     } else if (option.iconSize >= KIconLoader::SizeHuge) {
-         zoomLevel = 1.8;
-     } else if (option.iconSize >= KIconLoader::SizeLarge) {
-         zoomLevel = 1.6;
-     } else if (option.iconSize >= KIconLoader::SizeMedium) {
-         zoomLevel = 1.4;
-     } else if (option.iconSize >= KIconLoader::SizeSmallMedium) {
-         zoomLevel = 1.2;
-     }
-     const qreal contentHeight = qMax<qreal>(option.iconSize, zoomLevel * option.fontMetrics.height());
-     logicalHeightHints.fill(std::make_pair(contentHeight + 2 * option.padding, false));
+     const qreal height = option.padding * 2 + qMax(option.iconSize, option.fontMetrics.height());
+     logicalHeightHints.fill(height);
      logicalWidthHint = -1.0;
  }
  
@@@ -264,7 -247,6 +250,7 @@@ KStandardItemListWidget::KStandardItemL
      m_pixmapPos(),
      m_pixmap(),
      m_scaledPixmapSize(),
 +    m_columnWidthSum(),
      m_iconRect(),
      m_hoverPixmap(),
      m_textRect(),
@@@ -308,18 -290,6 +294,18 @@@ KStandardItemListWidget::Layout KStanda
      return m_layout;
  }
  
 +void KStandardItemListWidget::setHighlightEntireRow(bool highlightEntireRow) {
 +    if (m_highlightEntireRow != highlightEntireRow) {
 +        m_highlightEntireRow = highlightEntireRow;
 +        m_dirtyLayout = true;
 +        update();
 +    }
 +}
 +
 +bool KStandardItemListWidget::highlightEntireRow() const {
 +    return m_highlightEntireRow;
 +}
 +
  void KStandardItemListWidget::setSupportsItemExpanding(bool supportsItemExpanding)
  {
      if (m_supportsItemExpanding != supportsItemExpanding) {
@@@ -521,11 -491,7 +507,11 @@@ QRectF KStandardItemListWidget::selecti
      case DetailsLayout: {
          const int padding = styleOption().padding;
          QRectF adjustedIconRect = iconRect().adjusted(-padding, -padding, padding, padding);
 -        return adjustedIconRect | m_textRect;
 +        QRectF result = adjustedIconRect | m_textRect;
 +        if (m_highlightEntireRow) {
 +            result.setRight(m_columnWidthSum + leadingPadding());
 +        }
 +        return result;
      }
  
      default:
@@@ -742,11 -708,6 +728,11 @@@ void KStandardItemListWidget::columnWid
      m_dirtyLayout = true;
  }
  
 +void KStandardItemListWidget::leadingPaddingChanged(qreal padding) {
 +    Q_UNUSED(padding)
 +    m_dirtyLayout = true;
 +}
 +
  void KStandardItemListWidget::styleOptionChanged(const KItemListStyleOption& current,
                                               const KItemListStyleOption& previous)
  {
@@@ -939,13 -900,10 +925,13 @@@ void KStandardItemListWidget::triggerCa
      m_isHidden = isHidden();
      m_customizedFont = customizedFont(styleOption().font);
      m_customizedFontMetrics = QFontMetrics(m_customizedFont);
 +    m_columnWidthSum = std::accumulate(m_sortedVisibleRoles.begin(), m_sortedVisibleRoles.end(),
 +                                       qreal(), [this](qreal sum, const auto &role){ return sum + columnWidth(role); });
  
      updateExpansionArea();
      updateTextsCache();
      updatePixmapCache();
 +    clearHoverCache();
  
      m_dirtyLayout = false;
      m_dirtyContent = false;
@@@ -963,8 -921,7 +949,8 @@@ void KStandardItemListWidget::updateExp
              const qreal inc = (widgetHeight - option.iconSize) / 2;
              const qreal x = expandedParentsCount * widgetHeight + inc;
              const qreal y = inc;
 -            m_expansionArea = QRectF(x, y, option.iconSize, option.iconSize);
 +            const qreal xPadding = m_highlightEntireRow ? leadingPadding() : 0;
 +            m_expansionArea = QRectF(xPadding + x, y, option.iconSize, option.iconSize);
              return;
          }
      }
@@@ -1401,7 -1358,7 +1387,7 @@@ void KStandardItemListWidget::updateDet
      if (m_supportsItemExpanding) {
          firstColumnInc += (m_expansionArea.left() + m_expansionArea.right() + widgetHeight) / 2;
      } else {
 -        firstColumnInc += option.padding;
 +        firstColumnInc += option.padding + leadingPadding();
      }
  
      qreal x = firstColumnInc;
  
          const bool isTextRole = (role == "text");
          if (isTextRole) {
 -            availableTextWidth -= firstColumnInc;
 +            availableTextWidth -= firstColumnInc - leadingPadding();
          }
  
          if (requiredWidth > availableTextWidth) {
  
              // 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;
 +            x -= firstColumnInc - leadingPadding();
          } else if (isRoleRightAligned(role)) {
              textInfo->pos.rx() += roleWidth - requiredWidth - columnWidthInc;
          }
@@@ -1451,11 -1408,8 +1437,11 @@@ void KStandardItemListWidget::updateAdd
      QColor c1;
      if (m_customTextColor.isValid()) {
          c1 = m_customTextColor;
 -    } else if (isSelected() && m_layout != DetailsLayout) {
 -        c1 = styleOption().palette.highlightedText().color();
 +    } else if (isSelected()) {
 +        // The detail text colour needs to match the main text (HighlightedText) for the same level
 +        // of readability. We short circuit early here to avoid interpolating with another colour.
 +        m_additionalInfoTextColor = styleOption().palette.color(QPalette::HighlightedText);
 +        return;
      } else {
          c1 = styleOption().palette.text().color();
      }
@@@ -1494,15 -1448,15 +1480,15 @@@ void KStandardItemListWidget::drawSibli
      const int x = (m_expansionArea.left() + m_expansionArea.right() - siblingSize) / 2;
      QRect siblingRect(x, 0, siblingSize, siblingSize);
  
 -    QStyleOption option;
 -    option.palette.setColor(QPalette::Text, option.palette.color(normalTextColorRole()));
      bool isItemSibling = true;
  
      const QBitArray siblings = siblingsInformation();
 +    QStyleOption option;
 +    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) {
          option.rect = siblingRect;
          option.state = siblings.at(i) ? QStyle::State_Sibling : QStyle::State_None;
 -
          if (isItemSibling) {
              option.state |= QStyle::State_Item;
              if (m_isExpandable) {
              if (data().value("isExpanded").toBool()) {
                  option.state |= QStyle::State_Open;
              }
 +            option.palette.setColor(QPalette::Text, highlightColor);
              isItemSibling = false;
 +        } else {
 +            option.palette.setColor(QPalette::Text, normalColor);
          }
  
          style()->drawPrimitive(QStyle::PE_IndicatorBranch, &option, painter);