[PATCH] KFileWidget: Do not override filename with folder name if edited
authorAkseli Lahtinen <akselmo@akselmo.dev>
Thu, 17 Apr 2025 08:43:26 +0000 (08:43 +0000)
committerAurélien COUDERC <coucouf@debian.org>
Sun, 8 Jun 2025 12:42:29 +0000 (14:42 +0200)
If the filename input has been modified, do not override it with
the name of the folder when selecting a folder.

BUG: 502794
FIXED-IN: 6.14

Gbp-Pq: Name upstream_cd0810f8_KFileWidget-Do-not-override-filename-with-folder-name-if-edited.patch

autotests/kfilewidgettest.cpp
src/filewidgets/kdiroperator.h
src/filewidgets/kfilewidget.cpp

index cd04b57c4fd8aa13172555d13aa22b39270d9aed..e0ff3945dc50742feb49594172c20d6ed65e0dd0 100644 (file)
@@ -87,6 +87,8 @@ private Q_SLOTS:
     void testTokenizeForSave_data();
     void testTokenizeForSave();
     void testThumbnailPreviewSetting();
+    void testReplaceLocationEditFilename_data();
+    void testReplaceLocationEditFilename();
 };
 
 void KFileWidgetTest::initTestCase()
@@ -932,6 +934,89 @@ void KFileWidgetTest::testThumbnailPreviewSetting()
     fwPreviewFalse.cancelButton()->click();
 }
 
+struct LocationTestItem {
+    bool dir;
+    QString name;
+};
+
+void KFileWidgetTest::testReplaceLocationEditFilename_data()
+{
+    QTest::addColumn<LocationTestItem>("initialItem");
+    QTest::addColumn<LocationTestItem>("selectedItem");
+    QTest::addColumn<QString>("lineEditTextResult");
+    QTest::addColumn<bool>("overrideModifiedText");
+
+    QTest::newRow("replace-dir-with-dir") << LocationTestItem(true, "folder1") << LocationTestItem(true, "folder2") << "" << false;
+    QTest::newRow("replace-dir-with-file") << LocationTestItem(true, "folder1") << LocationTestItem(false, "file1") << "file1" << true;
+    QTest::newRow("replace-file-with-file") << LocationTestItem(false, "file1") << LocationTestItem(false, "file2") << "file2" << true;
+    QTest::newRow("replace-file-with-dir") << LocationTestItem(false, "file1") << LocationTestItem(true, "folder1") << "file1" << false;
+}
+
+// BUG: 502794
+// Test that we don't override file names with folder names
+void KFileWidgetTest::testReplaceLocationEditFilename()
+{
+    QFETCH(LocationTestItem, initialItem);
+    QFETCH(LocationTestItem, selectedItem);
+    QFETCH(QString, lineEditTextResult);
+    QFETCH(bool, overrideModifiedText);
+
+    // Setup - Create folders/files in temp dir
+    QTemporaryDir tempDir;
+    const QString tempDirPath = tempDir.path();
+    QUrl tempDirUrl = QUrl::fromLocalFile(tempDirPath);
+    QUrl replacedUrl = QUrl::fromLocalFile(tempDirPath + QLatin1Char('/') + initialItem.name);
+    QUrl selectedUrl = QUrl::fromLocalFile(tempDirPath + QLatin1Char('/') + selectedItem.name);
+
+    auto createTestItem = [tempDirUrl](LocationTestItem item, const QUrl &url) {
+        if (item.dir) {
+            QDir(tempDirUrl.toLocalFile()).mkdir(url.toLocalFile());
+            QVERIFY(QDir(url.toLocalFile()).exists());
+        } else {
+            QFile file(url.toLocalFile());
+            if (!file.open(QIODevice::WriteOnly)) {
+                qFatal("Couldn't create %s", qPrintable(url.toLocalFile()));
+            }
+            file.write(QByteArray("Test file"));
+            file.close();
+            QVERIFY(file.exists());
+        }
+    };
+
+    createTestItem(initialItem, replacedUrl);
+    createTestItem(selectedItem, selectedUrl);
+
+    // Open the filewidget in tempdir
+    KFileWidget fw(tempDirUrl);
+    fw.setOperationMode(KFileWidget::Saving);
+
+    // Highlight the item, then another
+    auto highlightItem = [&fw](QUrl url) {
+        KFileItem fileItem(url);
+        QSignalSpy fileHighlightedSpy(fw.dirOperator(), &KDirOperator::fileHighlighted);
+        fw.dirOperator()->highlightFile(fileItem);
+        fileHighlightedSpy.wait(500);
+        QVERIFY(fileHighlightedSpy.count());
+    };
+
+    highlightItem(replacedUrl);
+    highlightItem(selectedUrl);
+
+    // Compare that we have the wanted result when selecting items
+    QCOMPARE(fw.locationEdit()->lineEdit()->text(), lineEditTextResult);
+
+    // Make sure we don't overwrite any text user has modified in some cases
+    const QString modifiedText("New Filename.txt");
+    fw.locationEdit()->setEditText(modifiedText);
+    highlightItem(selectedUrl);
+
+    if (overrideModifiedText) {
+        QCOMPARE(fw.locationEdit()->lineEdit()->text(), lineEditTextResult);
+    } else {
+        QCOMPARE(fw.locationEdit()->lineEdit()->text(), modifiedText);
+    }
+}
+
 QTEST_MAIN(KFileWidgetTest)
 
 #include "kfilewidgettest.moc"
index 19be170ec5cdf5681ceea25535df18c18ba3a69e..c34880564eca702f2030837179004a178006fea4 100644 (file)
@@ -1042,6 +1042,7 @@ private:
     KIOFILEWIDGETS_NO_EXPORT void setViewInternal(QAbstractItemView *view);
 
     friend class KDirOperatorPrivate;
+    friend class KFileWidgetTest; // For testing
     std::unique_ptr<KDirOperatorPrivate> d;
 };
 
index 5b4d6b7386afaddfa3ac782c9b5c49318d1f104f..37f5e874ac878b81a646886a97e884e5faf42cbe 100644 (file)
@@ -918,6 +918,10 @@ void KFileWidgetPrivate::fileHighlighted(const KFileItem &i)
         return;
     }
 
+    if (!i.isNull() && i.isDir() && !(m_ops->mode() & KFile::Directory)) {
+        return;
+    }
+
     const bool modified = m_locationEdit->lineEdit()->isModified();
 
     if (!(m_ops->mode() & KFile::Files)) {