From 4b224516f4c646b81a1d7842bcedf1c8fbbfc15f Mon Sep 17 00:00:00 2001 From: Leo Treloar Date: Sat, 25 Dec 2021 22:38:46 +1100 Subject: [PATCH] Add name-only tooltip and make logicalHeightHints a pair of qreal and bool --- src/kitemviews/kfileitemlistwidget.cpp | 1 - src/kitemviews/kitemlistview.cpp | 7 +++- src/kitemviews/kitemlistview.h | 17 +++++++--- src/kitemviews/kitemlistwidget.h | 2 +- src/kitemviews/kstandarditemlistwidget.cpp | 23 +++++++------ src/kitemviews/kstandarditemlistwidget.h | 11 +++--- .../private/kitemlistsizehintresolver.cpp | 25 ++++++++------ .../private/kitemlistsizehintresolver.h | 3 +- src/views/dolphinview.cpp | 34 +++++++++++++++++-- src/views/dolphinview.h | 2 ++ 10 files changed, 89 insertions(+), 36 deletions(-) diff --git a/src/kitemviews/kfileitemlistwidget.cpp b/src/kitemviews/kfileitemlistwidget.cpp index 587603ab3..fc4e4bdac 100644 --- a/src/kitemviews/kfileitemlistwidget.cpp +++ b/src/kitemviews/kfileitemlistwidget.cpp @@ -109,7 +109,6 @@ QFont KFileItemListWidgetInformant::customizedFontForLinks(const QFont& baseFont return font; } - KFileItemListWidget::KFileItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent) : KStandardItemListWidget(informant, parent) { diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 9492f6a44..cb4d6960c 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -458,7 +458,7 @@ int KItemListView::lastVisibleIndex() const return m_layouter->lastVisibleIndex(); } -void KItemListView::calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint) const +void KItemListView::calculateItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint) const { widgetCreator()->calculateItemSizeHints(logicalHeightHints, logicalWidthHint, this); } @@ -495,6 +495,11 @@ QRectF KItemListView::itemContextRect(int index) const return contextRect; } +bool KItemListView::isElided(int index) const +{ + return m_sizeHintResolver->isElided(index); +} + void KItemListView::scrollToItem(int index) { QRectF viewGeometry = geometry(); diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index e28487b27..404cf320f 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -189,7 +189,7 @@ public: * @note the logical height (width) is actually the * width (height) if the scroll orientation is Qt::Vertical! */ - void calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint) const; + void calculateItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint) const; /** * If set to true, items having child-items can be expanded to show the child-items as @@ -221,6 +221,12 @@ public: */ QRectF itemContextRect(int index) const; + /** + * @return Whether or not the name of the file has been elided. At present this will + * only ever be true when in icons view. + */ + bool isElided(int index) const; + /** * Scrolls to the item with the index \a index so that the item * will be fully visible. @@ -384,6 +390,8 @@ protected: virtual void updateFont(); virtual void updatePalette(); + KItemListSizeHintResolver* m_sizeHintResolver; + protected Q_SLOTS: virtual void slotItemsInserted(const KItemRangeList& itemRanges); virtual void slotItemsRemoved(const KItemRangeList& itemRanges); @@ -723,7 +731,6 @@ private: QHash m_visibleCells; int m_scrollBarExtent; - KItemListSizeHintResolver* m_sizeHintResolver; KItemListViewLayouter* m_layouter; KItemListViewAnimation* m_animation; @@ -803,7 +810,7 @@ public: virtual void recycle(KItemListWidget* widget); - virtual void calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const = 0; + virtual void calculateItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const = 0; virtual qreal preferredRoleColumnWidth(const QByteArray& role, int index, @@ -822,7 +829,7 @@ public: KItemListWidget* create(KItemListView* view) override; - void calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const override; + void calculateItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const override; qreal preferredRoleColumnWidth(const QByteArray& role, int index, @@ -856,7 +863,7 @@ KItemListWidget* KItemListWidgetCreator::create(KItemListView* view) } template -void KItemListWidgetCreator::calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const +void KItemListWidgetCreator::calculateItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const { return m_informant->calculateItemSizeHints(logicalHeightHints, logicalWidthHint, view); } diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 2de82c6fb..c56c41ab3 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -35,7 +35,7 @@ public: KItemListWidgetInformant(); virtual ~KItemListWidgetInformant(); - virtual void calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const = 0; + virtual void calculateItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const = 0; virtual qreal preferredRoleColumnWidth(const QByteArray& role, int index, diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 175181271..3106b47b4 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -36,7 +36,7 @@ KStandardItemListWidgetInformant::~KStandardItemListWidgetInformant() { } -void KStandardItemListWidgetInformant::calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const +void KStandardItemListWidgetInformant::calculateItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const { switch (static_cast(view)->itemLayout()) { case KStandardItemListView::IconsLayout: @@ -121,7 +121,7 @@ QFont KStandardItemListWidgetInformant::customizedFontForLinks(const QFont& base return baseFont; } -void KStandardItemListWidgetInformant::calculateIconsLayoutItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const +void KStandardItemListWidgetInformant::calculateIconsLayoutItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const { const KItemListStyleOption& option = view->styleOption(); const QFont& normalFont = option.font; @@ -138,7 +138,7 @@ void KStandardItemListWidgetInformant::calculateIconsLayoutItemSizeHints(QVector 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; } @@ -146,7 +146,7 @@ void KStandardItemListWidgetInformant::calculateIconsLayoutItemSizeHints(QVector 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); @@ -154,6 +154,7 @@ void KStandardItemListWidgetInformant::calculateIconsLayoutItemSizeHints(QVector layout.beginLayout(); QTextLine line; int lineCount = 0; + bool isElided = false; while ((line = layout.createLine()).isValid()) { line.setLineWidth(maxWidth); line.naturalTextWidth(); @@ -161,6 +162,7 @@ void KStandardItemListWidgetInformant::calculateIconsLayoutItemSizeHints(QVector ++lineCount; if (lineCount == option.maxTextLines) { + isElided = layout.createLine().isValid(); break; } } @@ -169,13 +171,14 @@ void KStandardItemListWidgetInformant::calculateIconsLayoutItemSizeHints(QVector // 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& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const +void KStandardItemListWidgetInformant::calculateCompactLayoutItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const { const KItemListStyleOption& option = view->styleOption(); const QFontMetrics& normalFontMetrics = option.fontMetrics; @@ -190,7 +193,7 @@ void KStandardItemListWidgetInformant::calculateCompactLayoutItemSizeHints(QVect 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; } @@ -217,13 +220,13 @@ void KStandardItemListWidgetInformant::calculateCompactLayoutItemSizeHints(QVect width = maxWidth; } - logicalHeightHints[index] = width; + logicalHeightHints[index].first = width; } logicalWidthHint = height; } -void KStandardItemListWidgetInformant::calculateDetailsLayoutItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const +void KStandardItemListWidgetInformant::calculateDetailsLayoutItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const { const KItemListStyleOption& option = view->styleOption(); @@ -241,7 +244,7 @@ void KStandardItemListWidgetInformant::calculateDetailsLayoutItemSizeHints(QVect } const qreal contentHeight = qMax(option.iconSize, zoomLevel * option.fontMetrics.height()); - logicalHeightHints.fill(contentHeight + 2 * option.padding); + logicalHeightHints.fill(std::make_pair(contentHeight + 2 * option.padding, false)); logicalWidthHint = -1.0; } diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index 7d33419bc..f39f51fe4 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -23,12 +23,13 @@ class DOLPHIN_EXPORT KStandardItemListWidgetInformant : public KItemListWidgetIn public: KStandardItemListWidgetInformant(); ~KStandardItemListWidgetInformant() override; - - void calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const override; + + void calculateItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const override; qreal preferredRoleColumnWidth(const QByteArray& role, int index, const KItemListView* view) const override; + protected: /** * @return The value of the "text" role. The default implementation returns @@ -59,9 +60,9 @@ protected: */ virtual QFont customizedFontForLinks(const QFont& baseFont) const; - void calculateIconsLayoutItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const; - void calculateCompactLayoutItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const; - void calculateDetailsLayoutItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const; + void calculateIconsLayoutItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const; + void calculateCompactLayoutItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const; + void calculateDetailsLayoutItemSizeHints(QVector>& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const; friend class KStandardItemListWidget; // Accesses roleText() }; diff --git a/src/kitemviews/private/kitemlistsizehintresolver.cpp b/src/kitemviews/private/kitemlistsizehintresolver.cpp index 7deb5c621..0c2dd0b80 100644 --- a/src/kitemviews/private/kitemlistsizehintresolver.cpp +++ b/src/kitemviews/private/kitemlistsizehintresolver.cpp @@ -29,7 +29,12 @@ QSizeF KItemListSizeHintResolver::minSizeHint() QSizeF KItemListSizeHintResolver::sizeHint(int index) { updateCache(); - return QSizeF(m_logicalWidthHint, m_logicalHeightHintCache.at(index)); + return QSizeF(m_logicalWidthHint, m_logicalHeightHintCache.at(index).first); +} + +bool KItemListSizeHintResolver::isElided(int index) +{ + return m_logicalHeightHintCache.at(index).second; } void KItemListSizeHintResolver::itemsInserted(const KItemRangeList& itemRanges) @@ -44,7 +49,7 @@ void KItemListSizeHintResolver::itemsInserted(const KItemRangeList& itemRanges) // We build the new list from the end to the beginning to mimize the // number of moves. - m_logicalHeightHintCache.insert(m_logicalHeightHintCache.end(), insertedCount, 0.0); + m_logicalHeightHintCache.insert(m_logicalHeightHintCache.end(), insertedCount, std::make_pair(0.0, false)); int sourceIndex = currentCount - 1; int targetIndex = m_logicalHeightHintCache.count() - 1; @@ -63,7 +68,7 @@ void KItemListSizeHintResolver::itemsInserted(const KItemRangeList& itemRanges) // Then: insert QSizeF() for the items which are inserted into 'range'. while (targetIndex >= itemsToInsertBeforeCurrentRange + range.index) { - m_logicalHeightHintCache[targetIndex] = 0.0; + m_logicalHeightHintCache[targetIndex] = std::make_pair(0.0, false); --targetIndex; } } @@ -75,14 +80,14 @@ void KItemListSizeHintResolver::itemsInserted(const KItemRangeList& itemRanges) void KItemListSizeHintResolver::itemsRemoved(const KItemRangeList& itemRanges) { - const QVector::iterator begin = m_logicalHeightHintCache.begin(); - const QVector::iterator end = m_logicalHeightHintCache.end(); + const QVector>::iterator begin = m_logicalHeightHintCache.begin(); + const QVector>::iterator end = m_logicalHeightHintCache.end(); KItemRangeList::const_iterator rangeIt = itemRanges.constBegin(); const KItemRangeList::const_iterator rangeEnd = itemRanges.constEnd(); - QVector::iterator destIt = begin + rangeIt->index; - QVector::iterator srcIt = destIt + rangeIt->count; + QVector>::iterator destIt = begin + rangeIt->index; + QVector>::iterator srcIt = destIt + rangeIt->count; ++rangeIt; @@ -109,7 +114,7 @@ void KItemListSizeHintResolver::itemsRemoved(const KItemRangeList& itemRanges) void KItemListSizeHintResolver::itemsMoved(const KItemRange& range, const QList& movedToIndexes) { - QVector newLogicalHeightHintCache(m_logicalHeightHintCache); + QVector> newLogicalHeightHintCache(m_logicalHeightHintCache); const int movedRangeEnd = range.index + range.count; for (int i = range.index; i < movedRangeEnd; ++i) { @@ -124,7 +129,7 @@ void KItemListSizeHintResolver::itemsChanged(int index, int count, const QSet m_logicalHeightHintCache; + mutable QVector> m_logicalHeightHintCache; mutable qreal m_logicalWidthHint; mutable qreal m_minHeightHint; bool m_needsResolving; diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index bb537b982..573505e76 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -59,6 +59,7 @@ #include #include #include +#include #include DolphinView::DolphinView(const QUrl& url, QWidget* parent) : @@ -918,6 +919,11 @@ bool DolphinView::eventFilter(QObject* watched, QEvent* event) if (watched == m_view) { m_dragging = false; } + break; + + case QEvent::ToolTip: + tryShowNameToolTip(event); + default: break; } @@ -1637,13 +1643,15 @@ void DolphinView::updateViewState() void DolphinView::hideToolTip(const ToolTipManager::HideBehavior behavior) { -#ifdef HAVE_BALOO if (GeneralSettings::showToolTips()) { +#ifdef HAVE_BALOO m_toolTipManager->hideToolTip(behavior); - } #else Q_UNUSED(behavior) #endif + } else if (m_mode == DolphinView::IconsView) { + QToolTip::hideText(); + } } void DolphinView::slotTwoClicksRenamingTimerTimeout() @@ -2158,3 +2166,25 @@ void DolphinView::updatePlaceholderLabel() m_placeholderLabel->setVisible(true); } + +void DolphinView::tryShowNameToolTip(QEvent* event) +{ + if (!GeneralSettings::showToolTips() && m_mode == DolphinView::IconsView) { + QHelpEvent *hoverEvent = reinterpret_cast(event); + const int index = m_view->itemAt(hoverEvent->pos()); + + if (index == -1) { + return; + } + + // Check whether the filename has been elided + const bool isElided = m_view->isElided(index); + + if(isElided) { + const KFileItem item = m_model->fileItem(index); + const QString text = item.text(); + const QPoint pos = mapToGlobal(hoverEvent->pos()); + QToolTip::showText(pos, text); + } + } +} diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index 0f288f942..8566bc100 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -862,6 +862,8 @@ private: void updatePlaceholderLabel(); + void tryShowNameToolTip(QEvent* event); + private: void updatePalette(); void showLoadingPlaceholder(); -- 2.47.3