X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/2ba5c2cfc2cea534cccd860f94a7198530b83594..7f96282e41012a367b956f8a36758c32c51767c8:/src/views/viewproperties.cpp diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp index e7b0f9c55..8dadf4e49 100644 --- a/src/views/viewproperties.cpp +++ b/src/views/viewproperties.cpp @@ -20,7 +20,6 @@ #include "viewproperties.h" -#include "rolesaccessor.h" #include "dolphin_directoryviewpropertysettings.h" #include "dolphin_generalsettings.h" @@ -29,11 +28,16 @@ #include #include +#include #include #include #include namespace { + const int AdditionalInfoViewPropertiesVersion = 1; + const int NameRolePropertiesVersion = 2; + const int CurrentViewPropertiesVersion = 3; + // String representation to mark the additional properties of // the details view as customized by the user. See // ViewProperties::visibleRoles() for more information. @@ -55,7 +59,7 @@ ViewProperties::ViewProperties(const KUrl& url) : if (useGlobalViewProps) { m_filePath = destinationDir("global"); } else if (url.protocol().contains("search")) { - m_filePath = destinationDir("search"); + m_filePath = destinationDir("search/") + directoryHashForUrl(url); useDetailsViewWithPath = true; } else if (url.protocol() == QLatin1String("trash")) { m_filePath = destinationDir("trash"); @@ -64,6 +68,10 @@ ViewProperties::ViewProperties(const KUrl& url) : m_filePath = url.toLocalFile(); const QFileInfo info(m_filePath); if (!info.isWritable() || !isPartOfHome(m_filePath)) { +#ifdef Q_OS_WIN + // m_filePath probably begins with C:/ - the colon is not a valid character for paths though + m_filePath = QDir::separator() + m_filePath.remove(QLatin1Char(':')); +#endif m_filePath = destinationDir("local") + m_filePath; } } else { @@ -250,17 +258,27 @@ QList ViewProperties::visibleRoles() const // is accepted. QList roles; - roles.append("name"); + roles.append("text"); // Iterate through all stored keys and append all roles that match to // the curren view mode. const QString prefix = viewModePrefix(); const int prefixLength = prefix.length(); - const QStringList visibleRoles = m_node->visibleRoles(); + + QStringList visibleRoles = m_node->visibleRoles(); + const int version = m_node->version(); + if (visibleRoles.isEmpty() && version <= AdditionalInfoViewPropertiesVersion) { + // Convert the obsolete additionalInfo-property from older versions into the + // visibleRoles-property + visibleRoles = const_cast(this)->convertAdditionalInfo(); + } else if (version <= NameRolePropertiesVersion) { + visibleRoles = const_cast(this)->convertNameRole(); + } + foreach (const QString& visibleRole, visibleRoles) { if (visibleRole.startsWith(prefix)) { const QByteArray role = visibleRole.right(visibleRole.length() - prefixLength).toLatin1(); - if (role != "name") { + if (role != "text") { roles.append(role); } } @@ -268,7 +286,7 @@ QList ViewProperties::visibleRoles() const // For the details view the size and date should be shown per default // until the additional information has been explicitly changed by the user - const bool useDefaultValues = roles.count() == 1 // "name" + const bool useDefaultValues = roles.count() == 1 // "text" && (m_node->viewMode() == DolphinView::DetailsView) && !visibleRoles.contains(CustomizedDetailsString); if (useDefaultValues) { @@ -279,6 +297,19 @@ QList ViewProperties::visibleRoles() const return roles; } +void ViewProperties::setHeaderColumnWidths(const QList& widths) +{ + if (m_node->headerColumnWidths() != widths) { + m_node->setHeaderColumnWidths(widths); + update(); + } +} + +QList ViewProperties::headerColumnWidths() const +{ + return m_node->headerColumnWidths(); +} + void ViewProperties::setDirProperties(const ViewProperties& props) { setViewMode(props.viewMode()); @@ -289,6 +320,7 @@ void ViewProperties::setDirProperties(const ViewProperties& props) setSortOrder(props.sortOrder()); setSortFoldersFirst(props.sortFoldersFirst()); setVisibleRoles(props.visibleRoles()); + setHeaderColumnWidths(props.headerColumnWidths()); } void ViewProperties::setAutoSaveEnabled(bool autoSave) @@ -310,6 +342,7 @@ void ViewProperties::update() void ViewProperties::save() { KStandardDirs::makeDir(m_filePath); + m_node->setVersion(CurrentViewPropertiesVersion); m_node->writeConfig(); m_changedProps = false; } @@ -342,6 +375,56 @@ QString ViewProperties::viewModePrefix() const return prefix; } +QStringList ViewProperties::convertAdditionalInfo() +{ + QStringList visibleRoles; + + const QStringList additionalInfo = m_node->additionalInfo(); + if (!additionalInfo.isEmpty()) { + // Convert the obsolete values like Icons_Size, Details_Date, ... + // to Icons_size, Details_date, ... where the suffix just represents + // the internal role. One special-case must be handled: "LinkDestination" + // has been used for "destination". + visibleRoles.reserve(additionalInfo.count()); + foreach (const QString& info, additionalInfo) { + QString visibleRole = info; + int index = visibleRole.indexOf('_'); + if (index >= 0 && index + 1 < visibleRole.length()) { + ++index; + if (visibleRole[index] == QLatin1Char('L')) { + visibleRole.replace("LinkDestination", "destination"); + } else { + visibleRole[index] = visibleRole[index].toLower(); + } + } + visibleRoles.append(visibleRole); + } + } + + m_node->setAdditionalInfo(QStringList()); + m_node->setVisibleRoles(visibleRoles); + update(); + + return visibleRoles; +} + +QStringList ViewProperties::convertNameRole() +{ + QStringList visibleRoles = m_node->visibleRoles(); + for (int i = 0; i < visibleRoles.count(); ++i) { + if (visibleRoles[i].endsWith("_name")) { + const int leftLength = visibleRoles[i].length() - 5; + visibleRoles[i] = visibleRoles[i].left(leftLength) + "_text"; + } + } + + m_node->setVisibleRoles(visibleRoles); + update(); + + return visibleRoles; +} + + bool ViewProperties::isPartOfHome(const QString& filePath) { // For performance reasons cache the path in a static QString @@ -354,3 +437,12 @@ bool ViewProperties::isPartOfHome(const QString& filePath) return filePath.startsWith(homePath); } + +QString ViewProperties::directoryHashForUrl(const KUrl& url) +{ + const QByteArray hashValue = QCryptographicHash::hash(url.prettyUrl().toLatin1(), + QCryptographicHash::Sha1); + QString hashString = hashValue.toBase64(); + hashString.replace('/', '-'); + return hashString; +}