From f3e908c45cbbee7f047ab52c3e65df3b0ecb4127 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 | 18 ++++++++++++++++-- panels/dock/taskmanager/textcalculator.h | 16 ++++++++++++++++ 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/panels/dock/taskmanager/package/AppItemTitle.qml b/panels/dock/taskmanager/package/AppItemTitle.qml index ac4a296b4..604056c6d 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.isTruncated + 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..0042c49aa 100644 --- a/panels/dock/taskmanager/textcalculator.cpp +++ b/panels/dock/taskmanager/textcalculator.cpp @@ -258,8 +258,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,7 +401,11 @@ void TextCalculatorAttached::updateElidedText() if (!m_calculator) { qCDebug(textCalculatorLog) << "No calculator available for elided text update"; m_elidedText.clear(); + m_ellipsisWidth = 0.0; + m_isTruncated = false; emit elidedTextChanged(); + emit ellipsisWidthChanged(); + emit isTruncatedChanged(); return; } @@ -411,7 +415,17 @@ void TextCalculatorAttached::updateElidedText() QString newElidedText = fontMetrics.elidedText(m_text, Qt::ElideRight, maxWidth); if (!isValidElidedText(newElidedText)) { newElidedText = {}; + } else { + m_isTruncated = (m_text != newElidedText); + emit isTruncatedChanged(); + newElidedText.replace(QString::fromUtf8("…"), ""); + } + + if (m_isTruncated) { + m_ellipsisWidth = fontMetrics.horizontalAdvance(QString::fromUtf8("…")); + emit ellipsisWidthChanged(); } + if (m_elidedText != newElidedText) { m_elidedText = newElidedText; emit elidedTextChanged(); diff --git a/panels/dock/taskmanager/textcalculator.h b/panels/dock/taskmanager/textcalculator.h index 78e3813dc..19546f397 100644 --- a/panels/dock/taskmanager/textcalculator.h +++ b/panels/dock/taskmanager/textcalculator.h @@ -17,6 +17,8 @@ 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(bool isTruncated READ isTruncated NOTIFY isTruncatedChanged) Q_PROPERTY(TextCalculator *calculator READ calculator NOTIFY calculatorChanged) public: @@ -34,11 +36,23 @@ class TextCalculatorAttached : public QObject QString elidedText() const; + qreal ellipsisWidth() const + { + return m_ellipsisWidth; + } + + bool isTruncated() const + { + return m_isTruncated; + } + void ensureInitialize(); Q_SIGNALS: void textChanged(); void elidedTextChanged(); + void ellipsisWidthChanged(); + void isTruncatedChanged(); void calculatorChanged(); private Q_SLOTS: @@ -47,6 +61,8 @@ private Q_SLOTS: private: QString m_text; QString m_elidedText; + qreal m_ellipsisWidth = 0.0; + bool m_isTruncated = false; TextCalculator *m_calculator; bool m_initialized = false; };