]> cloud.milkyroute.net Git - dolphin.git/commitdiff
KFileItemModel: fix `setData` in the renaming usage
authorJin Liu <m.liu.jin@gmail.com>
Fri, 11 Oct 2024 08:08:31 +0000 (16:08 +0800)
committerJin Liu <m.liu.jin@gmail.com>
Sat, 12 Oct 2024 13:17:38 +0000 (21:17 +0800)
The `setData` function is used by inline renaming to
update the `text` role (i.e. file name) in the model
before actually do the renaming.

However, the current implementation only updates `text`
and url in KFileItem in this case, leaving the `url` role
and the `m_items` cache untouched. This makes the cache
incoherent, so `index()` won't find the renamed item. It
also makes the `url` role incoherent with the `text` role.

This also fixes the problem mentioned in bug #481561
where when inline renaming fails, it still shows the new
name. (Because `m_model->index` fails to find the new name
and rename it back on job failure.)

BUG: 481561

src/kitemviews/kfileitemmodel.cpp

index 3e4a8c663c1def71aa5aa086562fb3776d0a42be..a7796bc9330ce1774ef2faefc3d95ffd89b7ad85 100644 (file)
@@ -202,13 +202,20 @@ bool KFileItemModel::setData(int index, const QHash<QByteArray, QVariant> &value
         return false;
     }
 
-    m_itemData[index]->values = currentValues;
     if (changedRoles.contains("text")) {
         QUrl url = m_itemData[index]->item.url();
+        m_items.remove(url);
         url = url.adjusted(QUrl::RemoveFilename);
         url.setPath(url.path() + currentValues["text"].toString());
         m_itemData[index]->item.setUrl(url);
+        m_items.insert(url, index);
+
+        if (!changedRoles.contains("url")) {
+            changedRoles.insert("url");
+            currentValues["url"] = url;
+        }
     }
+    m_itemData[index]->values = currentValues;
 
     emitItemsChangedAndTriggerResorting(KItemRangeList() << KItemRange(index, 1), changedRoles);