Skip to content

Commit 22b973e

Browse files
committed
fix: improve text truncation with gradient fade effect
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. 测试多个应用项目显示截断标题时的性能表现
1 parent b992926 commit 22b973e

3 files changed

Lines changed: 61 additions & 19 deletions

File tree

panels/dock/taskmanager/package/AppItemTitle.qml

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2025-2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

55
import QtQuick
66
import QtQuick.Controls
7+
import Qt5Compat.GraphicalEffects
78

89
import org.deepin.ds.dock.taskmanager 1.0
910
import org.deepin.dtk 1.0 as D
@@ -30,7 +31,20 @@ Item {
3031
color: D.DTK.themeType === D.ApplicationHelper.DarkType ? "#FFFFFF" : "#000000"
3132
font: root.TextCalculator.calculator.font
3233
verticalAlignment: Text.AlignVCenter
33-
34+
35+
layer.enabled: root.TextCalculator.ellipsisWidth > 0
36+
layer.effect: OpacityMask {
37+
maskSource: Rectangle {
38+
id: maskRect
39+
width: root.TextCalculator.ellipsisWidth
40+
height: titleText.height
41+
gradient: Gradient {
42+
orientation: Gradient.Horizontal
43+
GradientStop { position: 1; color: "#00FFFFFF" }
44+
GradientStop { position: 0.6; color: "#FFFFFFFF" }
45+
}
46+
}
47+
}
3448
opacity: visible ? 1.0 : 0.0
3549

3650
Behavior on opacity {

panels/dock/taskmanager/textcalculator.cpp

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2025-2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -13,11 +13,6 @@ namespace dock
1313
{
1414
Q_LOGGING_CATEGORY(textCalculatorLog, "ds.taskmanager.textcalculator");
1515

16-
static bool isValidElidedText(const QString &text)
17-
{
18-
return !text.isEmpty() && text != "";
19-
}
20-
2116
TextCalculator::TextCalculator(QObject *parent)
2217
: QObject(parent)
2318
, m_optimalSingleTextWidth(0.0)
@@ -196,11 +191,19 @@ qreal TextCalculator::calculateElidedTextWidth(const QString &text, qreal maxWid
196191
}
197192

198193
QFontMetricsF fontMetrics(m_font);
199-
QString elidedText = fontMetrics.elidedText(text, Qt::ElideRight, maxWidth);
200-
if (!isValidElidedText(elidedText))
194+
QString visibleText = text;
195+
196+
while (!visibleText.isEmpty() &&
197+
fontMetrics.horizontalAdvance(visibleText) > maxWidth)
198+
{
199+
visibleText.chop(1);
200+
}
201+
202+
if (visibleText.isEmpty()) {
201203
return 0.0;
204+
}
202205

203-
return fontMetrics.horizontalAdvance(elidedText);
206+
return fontMetrics.horizontalAdvance(visibleText);
204207
}
205208

206209
QStringList TextCalculator::getApplicationTitles() const
@@ -258,8 +261,8 @@ void TextCalculator::calculateOptimalTextWidth()
258261
qreal newTotalWidth = 0.0;
259262
int charCount = 7; // Maximum character count limit
260263

261-
// Iterate from 7 characters to 1 character, finding the optimal solution
262-
for (; charCount >= 1; --charCount) {
264+
// Iterate from 7 characters to 2 characters, finding the optimal solution
265+
for (; charCount >= 2; --charCount) {
263266
// 1. Calculate baseline width (based on character count)
264267
qreal baselineWidth = calculateBaselineWidth(charCount);
265268

@@ -401,19 +404,36 @@ void TextCalculatorAttached::updateElidedText()
401404
if (!m_calculator) {
402405
qCDebug(textCalculatorLog) << "No calculator available for elided text update";
403406
m_elidedText.clear();
407+
m_ellipsisWidth = 0.0;
404408
emit elidedTextChanged();
409+
emit ellipsisWidthChanged();
405410
return;
406411
}
407412

408413
QFontMetricsF fontMetrics(m_calculator->font());
409414
qreal maxWidth = m_calculator->optimalSingleTextWidth();
415+
QString visibleText = m_text;
416+
417+
while (!visibleText.isEmpty() &&
418+
fontMetrics.horizontalAdvance(visibleText) > maxWidth)
419+
{
420+
visibleText.chop(1);
421+
}
410422

411-
QString newElidedText = fontMetrics.elidedText(m_text, Qt::ElideRight, maxWidth);
412-
if (!isValidElidedText(newElidedText)) {
413-
newElidedText = {};
423+
if (visibleText.isEmpty()) {
424+
visibleText = {};
414425
}
415-
if (m_elidedText != newElidedText) {
416-
m_elidedText = newElidedText;
426+
427+
if (visibleText != m_text) {
428+
m_ellipsisWidth = fontMetrics.horizontalAdvance(QString::fromUtf8(""));
429+
emit ellipsisWidthChanged();
430+
} else {
431+
m_ellipsisWidth = 0.0;
432+
emit ellipsisWidthChanged();
433+
}
434+
435+
if (m_elidedText != visibleText) {
436+
m_elidedText = visibleText;
417437
emit elidedTextChanged();
418438
}
419439
}

panels/dock/taskmanager/textcalculator.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2025-2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -17,6 +17,7 @@ class TextCalculatorAttached : public QObject
1717
QML_ELEMENT
1818
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
1919
Q_PROPERTY(QString elidedText READ elidedText NOTIFY elidedTextChanged)
20+
Q_PROPERTY(qreal ellipsisWidth READ ellipsisWidth NOTIFY ellipsisWidthChanged)
2021
Q_PROPERTY(TextCalculator *calculator READ calculator NOTIFY calculatorChanged)
2122

2223
public:
@@ -34,11 +35,17 @@ class TextCalculatorAttached : public QObject
3435

3536
QString elidedText() const;
3637

38+
qreal ellipsisWidth() const
39+
{
40+
return m_ellipsisWidth;
41+
}
42+
3743
void ensureInitialize();
3844

3945
Q_SIGNALS:
4046
void textChanged();
4147
void elidedTextChanged();
48+
void ellipsisWidthChanged();
4249
void calculatorChanged();
4350

4451
private Q_SLOTS:
@@ -47,6 +54,7 @@ private Q_SLOTS:
4754
private:
4855
QString m_text;
4956
QString m_elidedText;
57+
qreal m_ellipsisWidth = 0.0;
5058
TextCalculator *m_calculator;
5159
bool m_initialized = false;
5260
};

0 commit comments

Comments
 (0)