+namespace
+{
+const int AdditionalInfoViewPropertiesVersion = 1;
+const int NameRolePropertiesVersion = 2;
+const int DateRolePropertiesVersion = 4;
+const int CurrentViewPropertiesVersion = 4;
+
+// String representation to mark the additional properties of
+// the details view as customized by the user. See
+// ViewProperties::visibleRoles() for more information.
+const char CustomizedDetailsString[] = "CustomizedDetails";
+
+// Filename that is used for storing the properties
+const char ViewPropertiesFileName[] = ".directory";
+}
+
+ViewPropertySettings *ViewProperties::loadProperties(const QString &folderPath) const
+{
+ const QString settingsFile = folderPath + QDir::separator() + ViewPropertiesFileName;
+
+ KFileMetaData::UserMetaData metadata(folderPath);
+ if (!metadata.isSupported()) {
+ return new ViewPropertySettings(KSharedConfig::openConfig(settingsFile, KConfig::SimpleConfig));
+ }
+
+ std::unique_ptr<QTemporaryFile> tempFile(new QTemporaryFile());
+ tempFile->setAutoRemove(false);
+ if (!tempFile->open()) {
+ qCWarning(DolphinDebug) << "Could not open temp file";
+ return nullptr;
+ }
+ if (QFile::exists(settingsFile)) {
+ // copy settings to tempfile to load them separately
+ QFile::remove(tempFile->fileName());
+ QFile::copy(settingsFile, tempFile->fileName());
+
+ auto config = KConfig(tempFile->fileName(), KConfig::SimpleConfig);
+ // ignore settings that are outside of dolphin scope
+ if (config.hasGroup("Dolphin") || config.hasGroup("Settings")) {
+ const auto groupList = config.groupList();
+ for (const auto &group : groupList) {
+ if (group != QStringLiteral("Dolphin") && group != QStringLiteral("Settings")) {
+ config.deleteGroup(group);
+ }
+ }
+ return new ViewPropertySettings(KSharedConfig::openConfig(tempFile->fileName(), KConfig::SimpleConfig));
+
+ } else if (!config.groupList().isEmpty()) {
+ // clear temp file content
+ QFile::remove(tempFile->fileName());
+ }
+ }
+
+ // load from metadata
+ const QString viewPropertiesString = metadata.attribute(QStringLiteral("kde.fm.viewproperties#1"));
+ if (viewPropertiesString.isEmpty()) {
+ return nullptr;
+ }
+ // load view properties from xattr to temp file then loads into ViewPropertySettings
+ QFile outputFile(tempFile->fileName());
+ outputFile.open(QIODevice::WriteOnly);
+ outputFile.write(viewPropertiesString.toUtf8());
+ outputFile.close();
+ return new ViewPropertySettings(KSharedConfig::openConfig(tempFile->fileName(), KConfig::SimpleConfig));
+}
+
+ViewPropertySettings *ViewProperties::defaultProperties() const
+{
+ auto props = loadProperties(destinationDir(QStringLiteral("global")));
+ if (props == nullptr) {
+ qCWarning(DolphinDebug) << "Could not load default global viewproperties";
+ QTemporaryFile tempFile;
+ tempFile.setAutoRemove(false);
+ if (!tempFile.open()) {
+ qCWarning(DolphinDebug) << "Could not open temp file";
+ props = new ViewPropertySettings;
+ } else {
+ props = new ViewPropertySettings(KSharedConfig::openConfig(tempFile.fileName(), KConfig::SimpleConfig));
+ }
+ }