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