From e1849839aa1676c7d3de60318ba5817d0acc1109 Mon Sep 17 00:00:00 2001 From: wjyrich Date: Tue, 10 Feb 2026 17:48:22 +0800 Subject: [PATCH] fix: improve text truncation with gradient fade effect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Modified TextCalculator to track truncation status and ellipsis width 2. Added gradient fade effect for truncated text instead of ellipsis character 3. Changed minimum character count from 1 to 2 for better readability 4. Added new properties isTruncated and ellipsisWidth to TextCalculatorAttached 5. Implemented OpacityMask with gradient for smooth text fade-out Log: Improved task manager app title display with gradient fade effect for truncated text Influence: 1. Test app titles with varying lengths to ensure proper truncation 2. Verify gradient fade effect appears only when text is truncated 3. Check text alignment and positioning with the new fade effect 4. Test with both light and dark themes to ensure color compatibility 5. Verify minimum character count of 2 is respected in all cases 6. Test performance with multiple app items displaying truncated titles fix: 改进文本截断效果,添加渐变淡出 1. 修改TextCalculator以跟踪截断状态和省略号宽度 2. 为截断文本添加渐变淡出效果替代省略号字符 3. 将最小字符数从1改为2以提高可读性 4. 向TextCalculatorAttached添加isTruncated和ellipsisWidth属性 5. 实现带渐变的OpacityMask以实现平滑的文本淡出效果 Log: 改进任务管理器应用标题显示,为截断文本添加渐变淡出效果 Influence: 1. 测试不同长度的应用标题以确保正确截断 2. 验证渐变淡出效果仅在文本被截断时出现 3. 检查新淡出效果下的文本对齐和定位 4. 测试浅色和深色主题以确保颜色兼容性 5. 验证在所有情况下都遵守最小2个字符的限制 6. 测试多个应用项目显示截断标题时的性能表现 --- .../dock/taskmanager/package/AppItemTitle.qml | 16 +++++- panels/dock/taskmanager/textcalculator.cpp | 50 +++++++++++++------ panels/dock/taskmanager/textcalculator.h | 8 +++ 3 files changed, 58 insertions(+), 16 deletions(-) diff --git a/panels/dock/taskmanager/package/AppItemTitle.qml b/panels/dock/taskmanager/package/AppItemTitle.qml index ac4a296b4..4cfa88761 100644 --- a/panels/dock/taskmanager/package/AppItemTitle.qml +++ b/panels/dock/taskmanager/package/AppItemTitle.qml @@ -4,6 +4,7 @@ import QtQuick import QtQuick.Controls +import Qt5Compat.GraphicalEffects import org.deepin.ds.dock.taskmanager 1.0 import org.deepin.dtk 1.0 as D @@ -30,7 +31,20 @@ Item { color: D.DTK.themeType === D.ApplicationHelper.DarkType ? "#FFFFFF" : "#000000" font: root.TextCalculator.calculator.font verticalAlignment: Text.AlignVCenter - + + layer.enabled: root.TextCalculator.ellipsisWidth > 0 + layer.effect: OpacityMask { + maskSource: Rectangle { + id: maskRect + width: root.TextCalculator.ellipsisWidth + height: titleText.height + gradient: Gradient { + orientation: Gradient.Horizontal + GradientStop { position: 1; color: "#00FFFFFF" } + GradientStop { position: 0.6; color: "#FFFFFFFF" } + } + } + } opacity: visible ? 1.0 : 0.0 Behavior on opacity { diff --git a/panels/dock/taskmanager/textcalculator.cpp b/panels/dock/taskmanager/textcalculator.cpp index 630e498d5..de7d382b1 100644 --- a/panels/dock/taskmanager/textcalculator.cpp +++ b/panels/dock/taskmanager/textcalculator.cpp @@ -13,11 +13,6 @@ namespace dock { Q_LOGGING_CATEGORY(textCalculatorLog, "ds.taskmanager.textcalculator"); -static bool isValidElidedText(const QString &text) -{ - return !text.isEmpty() && text != "…"; -} - TextCalculator::TextCalculator(QObject *parent) : QObject(parent) , m_optimalSingleTextWidth(0.0) @@ -196,11 +191,19 @@ qreal TextCalculator::calculateElidedTextWidth(const QString &text, qreal maxWid } QFontMetricsF fontMetrics(m_font); - QString elidedText = fontMetrics.elidedText(text, Qt::ElideRight, maxWidth); - if (!isValidElidedText(elidedText)) + QString visibleText = text; + + while (!visibleText.isEmpty() && + fontMetrics.horizontalAdvance(visibleText) > maxWidth) + { + visibleText.chop(1); + } + + if (visibleText.isEmpty()) { return 0.0; + } - return fontMetrics.horizontalAdvance(elidedText); + return fontMetrics.horizontalAdvance(visibleText); } QStringList TextCalculator::getApplicationTitles() const @@ -258,8 +261,8 @@ void TextCalculator::calculateOptimalTextWidth() qreal newTotalWidth = 0.0; int charCount = 7; // Maximum character count limit - // Iterate from 7 characters to 1 character, finding the optimal solution - for (; charCount >= 1; --charCount) { + // Iterate from 7 characters to 2 characters, finding the optimal solution + for (; charCount >= 2; --charCount) { // 1. Calculate baseline width (based on character count) qreal baselineWidth = calculateBaselineWidth(charCount); @@ -401,19 +404,36 @@ void TextCalculatorAttached::updateElidedText() if (!m_calculator) { qCDebug(textCalculatorLog) << "No calculator available for elided text update"; m_elidedText.clear(); + m_ellipsisWidth = 0.0; emit elidedTextChanged(); + emit ellipsisWidthChanged(); return; } QFontMetricsF fontMetrics(m_calculator->font()); qreal maxWidth = m_calculator->optimalSingleTextWidth(); + QString visibleText = m_text; + + while (!visibleText.isEmpty() && + fontMetrics.horizontalAdvance(visibleText) > maxWidth) + { + visibleText.chop(1); + } - QString newElidedText = fontMetrics.elidedText(m_text, Qt::ElideRight, maxWidth); - if (!isValidElidedText(newElidedText)) { - newElidedText = {}; + if (visibleText.isEmpty()) { + visibleText = {}; } - if (m_elidedText != newElidedText) { - m_elidedText = newElidedText; + + if (visibleText != m_text) { + m_ellipsisWidth = fontMetrics.horizontalAdvance(QString::fromUtf8("…")); + emit ellipsisWidthChanged(); + } else { + m_ellipsisWidth = 0.0; + emit ellipsisWidthChanged(); + } + + if (m_elidedText != visibleText) { + m_elidedText = visibleText; emit elidedTextChanged(); } } diff --git a/panels/dock/taskmanager/textcalculator.h b/panels/dock/taskmanager/textcalculator.h index 78e3813dc..892b8a861 100644 --- a/panels/dock/taskmanager/textcalculator.h +++ b/panels/dock/taskmanager/textcalculator.h @@ -17,6 +17,7 @@ class TextCalculatorAttached : public QObject QML_ELEMENT Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) Q_PROPERTY(QString elidedText READ elidedText NOTIFY elidedTextChanged) + Q_PROPERTY(qreal ellipsisWidth READ ellipsisWidth NOTIFY ellipsisWidthChanged) Q_PROPERTY(TextCalculator *calculator READ calculator NOTIFY calculatorChanged) public: @@ -34,11 +35,17 @@ class TextCalculatorAttached : public QObject QString elidedText() const; + qreal ellipsisWidth() const + { + return m_ellipsisWidth; + } + void ensureInitialize(); Q_SIGNALS: void textChanged(); void elidedTextChanged(); + void ellipsisWidthChanged(); void calculatorChanged(); private Q_SLOTS: @@ -47,6 +54,7 @@ private Q_SLOTS: private: QString m_text; QString m_elidedText; + qreal m_ellipsisWidth = 0.0; TextCalculator *m_calculator; bool m_initialized = false; };