+void KStandardItemListWidget::startActivateSoonAnimation(int timeUntilActivation)
+{
+ if (m_activateSoonAnimation) {
+ m_activateSoonAnimation->stop(); // automatically DeleteWhenStopped
+ }
+
+ m_activateSoonAnimation = new QVariantAnimation{this};
+ m_activateSoonAnimation->setStartValue(0.0);
+ m_activateSoonAnimation->setEndValue(1.0);
+ m_activateSoonAnimation->setDuration(timeUntilActivation);
+
+ const QVariant originalIconName{data()["iconName"]};
+ connect(m_activateSoonAnimation, &QVariantAnimation::valueChanged, this, [originalIconName, this](const QVariant &value) {
+ auto progress = value.toFloat();
+
+ QVariant wantedIconName;
+ if (progress < 0.333) {
+ wantedIconName = "folder-open";
+ } else if (progress < 0.666) {
+ wantedIconName = originalIconName;
+ } else {
+ wantedIconName = "folder-open";
+ }
+
+ QHash<QByteArray, QVariant> itemData{data()};
+ if (itemData["iconName"] != wantedIconName) {
+ itemData.insert("iconName", wantedIconName);
+ setData(itemData);
+ invalidateIconCache();
+ }
+ });
+
+ connect(m_activateSoonAnimation, &QObject::destroyed, this, [originalIconName, this]() {
+ QHash<QByteArray, QVariant> itemData{data()};
+ if (itemData["iconName"] == "folder-open") {
+ itemData.insert("iconName", originalIconName);
+ setData(itemData);
+ invalidateIconCache();
+ }
+ });
+
+ m_activateSoonAnimation->start(QAbstractAnimation::DeleteWhenStopped);
+}
+
+bool KStandardItemListWidget::isIconControlledByActivateSoonAnimation() const
+{
+ return m_activateSoonAnimation && data()["iconName"] == "folder-open";
+}
+