diff options
| author | Méven Car <[email protected]> | 2025-02-07 11:16:05 +0100 |
|---|---|---|
| committer | Méven Car <[email protected]> | 2025-02-08 09:43:09 +0100 |
| commit | c12946ee2ec8dbbb8645ca5763584574458a0a6c (patch) | |
| tree | 60155025c6d2af3456830df4e69714c4b0d8c1c0 | |
| parent | d828d3a8b443b4c40e31fc72bc8d152e18737e1c (diff) | |
Viewproperties: prevent loosing view settings
When they match the hardcoded internal settings, when they should be
kept as long as they don't match the currently set default
viewproperties.
Is saved in metadata the diff with the hardcoded internal defaults
still. A stable default reference allows to change defaults without
changing existing saved viewproperties.
CCBUG: 495878
| -rw-r--r-- | src/tests/viewpropertiestest.cpp | 64 | ||||
| -rw-r--r-- | src/views/viewproperties.cpp | 24 |
2 files changed, 85 insertions, 3 deletions
diff --git a/src/tests/viewpropertiestest.cpp b/src/tests/viewpropertiestest.cpp index e4d434383..f23ad4fc8 100644 --- a/src/tests/viewpropertiestest.cpp +++ b/src/tests/viewpropertiestest.cpp @@ -29,6 +29,7 @@ private Q_SLOTS: void testParamMigrationToFileAttrKeepDirectory(); void testExtendedAttributeFull(); void testUseAsDefaultViewSettings(); + void testUseAsCustomDefaultViewSettings(); private: bool m_globalViewProps; @@ -339,6 +340,69 @@ void ViewPropertiesTest::testUseAsDefaultViewSettings() QCOMPARE(testData->viewMode(), defaultData->viewMode()); } +void ViewPropertiesTest::testUseAsCustomDefaultViewSettings() +{ + // Create new test directory for this test to make sure the settings are defaults + auto testDir = new TestDir(QDir::homePath() + "/.viewPropertiesTest-"); + auto cleanupTestDir = qScopeGuard([testDir] { + delete testDir; + }); + + // Create a global viewproperties folder + QUrl globalPropertiesPath = + QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation).append("/view_properties/").append(QStringLiteral("global"))); + QVERIFY(QDir().mkpath(globalPropertiesPath.toLocalFile())); + auto cleanupGlobalDir = qScopeGuard([globalPropertiesPath] { + QDir().rmdir(globalPropertiesPath.toLocalFile()); + }); + ViewProperties globalProps(globalPropertiesPath); + + // Check that theres no .directory file and metadata is supported + QString dotDirectoryFile = testDir->url().toLocalFile() + "/.directory"; + QVERIFY(!QFile::exists(dotDirectoryFile)); + KFileMetaData::UserMetaData testDirMetadata(testDir->url().toLocalFile()); + KFileMetaData::UserMetaData globalDirMetadata(globalPropertiesPath.toLocalFile()); + if (!testDirMetadata.isSupported()) { + QSKIP("need extended attribute/filesystem metadata to be usefull"); + } + + // Equivalent of useAsDefault in ViewPropertiesDialog + // This sets the DetailsView as default viewMode + GeneralSettings::setGlobalViewProps(true); + globalProps.setViewMode(DolphinView::Mode::DetailsView); + globalProps.setDirProperties(globalProps); + globalProps.save(); + GeneralSettings::setGlobalViewProps(false); + + // Make sure globalDirProperties are not empty, so they will be used + auto globalDirPropString = globalDirMetadata.attribute(QStringLiteral("kde.fm.viewproperties#1")); + QVERIFY(!globalDirPropString.isEmpty()); + + // Load default data + QScopedPointer<ViewProperties> globalDirProperties(new ViewProperties(globalPropertiesPath)); + auto defaultData = globalDirProperties.data(); + QCOMPARE(defaultData->viewMode(), DolphinView::Mode::DetailsView); + + // Load testdir data, set to icon, i.e default hardcoded, not current user default + QScopedPointer<ViewProperties> testDirProperties(new ViewProperties(testDir->url())); + testDirProperties->setViewMode(DolphinView::Mode::IconsView); + testDirProperties->save(); + + // testDirProperties is not default + auto testDirPropString = testDirMetadata.attribute(QStringLiteral("kde.fm.viewproperties#1")); + QVERIFY(!testDirPropString.isEmpty()); + QCOMPARE(testDirProperties.data()->viewMode(), DolphinView::Mode::IconsView); + + // testDirProperties is now default + testDirProperties->setViewMode(DolphinView::Mode::DetailsView); + testDirProperties->save(); + + // no more metedata => the defaults settings are in effect for the folder + testDirPropString = testDirMetadata.attribute(QStringLiteral("kde.fm.viewproperties#1")); + QVERIFY(testDirPropString.isEmpty()); + QCOMPARE(testDirProperties.data()->viewMode(), DolphinView::Mode::DetailsView); +} + QTEST_GUILESS_MAIN(ViewPropertiesTest) #include "viewpropertiestest.moc" diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp index 7e589019a..5dbdd938e 100644 --- a/src/views/viewproperties.cpp +++ b/src/views/viewproperties.cpp @@ -531,9 +531,27 @@ void ViewProperties::save() const auto metaDataKey = QStringLiteral("kde.fm.viewproperties#1"); const auto items = m_node->items(); - const bool allDefault = std::all_of(items.cbegin(), items.cend(), [this](const KConfigSkeletonItem *item) { - return item->name() == "Timestamp" || (item->name() == "Version" && m_node->version() == CurrentViewPropertiesVersion) || item->isDefault(); - }); + const auto defaultConfig = defaultProperties(); + bool allDefault = true; + for (const auto item : items) { + if (item->name() == "Timestamp") { + continue; + } + if (item->name() == "Version") { + if (m_node->version() != CurrentViewPropertiesVersion) { + allDefault = false; + break; + } else { + continue; + } + } + auto defaultItem = defaultConfig->findItem(item->name()); + if (!defaultItem || defaultItem->property() != item->property()) { + allDefault = false; + break; + } + } + if (allDefault) { if (metaData.hasAttribute(metaDataKey)) { qCDebug(DolphinDebug) << "clearing extended attributes for " << m_filePath; |
