From: Akseli Lahtinen Date: Thu, 17 Apr 2025 08:43:26 +0000 (+0000) Subject: [PATCH] KFileWidget: Do not override filename with folder name if edited X-Git-Tag: archive/raspbian/6.13.0-6+rpi1^2~10 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ca4fd30bd068f9380b058c310e9da8f088a80609;p=kf6-kio.git [PATCH] KFileWidget: Do not override filename with folder name if edited 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 --- diff --git a/autotests/kfilewidgettest.cpp b/autotests/kfilewidgettest.cpp index cd04b57..e0ff394 100644 --- a/autotests/kfilewidgettest.cpp +++ b/autotests/kfilewidgettest.cpp @@ -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("initialItem"); + QTest::addColumn("selectedItem"); + QTest::addColumn("lineEditTextResult"); + QTest::addColumn("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" diff --git a/src/filewidgets/kdiroperator.h b/src/filewidgets/kdiroperator.h index 19be170..c348805 100644 --- a/src/filewidgets/kdiroperator.h +++ b/src/filewidgets/kdiroperator.h @@ -1042,6 +1042,7 @@ private: KIOFILEWIDGETS_NO_EXPORT void setViewInternal(QAbstractItemView *view); friend class KDirOperatorPrivate; + friend class KFileWidgetTest; // For testing std::unique_ptr d; }; diff --git a/src/filewidgets/kfilewidget.cpp b/src/filewidgets/kfilewidget.cpp index 5b4d6b7..37f5e87 100644 --- a/src/filewidgets/kfilewidget.cpp +++ b/src/filewidgets/kfilewidget.cpp @@ -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)) {