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; };