X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/10f0f8d5585e89fba5c0570b4144c9df369c3bfd..6c60bf0ad54258976d9dcbd6586b26c65d8d4b78:/src/views/viewproperties.cpp diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp index e67cbd87a..19aca4583 100644 --- a/src/views/viewproperties.cpp +++ b/src/views/viewproperties.cpp @@ -20,7 +20,7 @@ #include "viewproperties.h" -#include "additionalinfoaccessor.h" +#include "rolesaccessor.h" #include "dolphin_directoryviewpropertysettings.h" #include "dolphin_generalsettings.h" @@ -33,12 +33,13 @@ #include #include -#include "settings/dolphinsettings.h" - namespace { + const int CurrentViewPropertiesVersion = 2; + const int AdditionalInfoViewPropertiesVersion = 1; + // String representation to mark the additional properties of // the details view as customized by the user. See - // ViewProperties::additionalInfoList() for more information. + // ViewProperties::visibleRoles() for more information. const char* CustomizedDetailsString = "CustomizedDetails"; } @@ -47,7 +48,7 @@ ViewProperties::ViewProperties(const KUrl& url) : m_autoSave(true), m_node(0) { - GeneralSettings* settings = DolphinSettings::instance().generalSettings(); + GeneralSettings* settings = GeneralSettings::self(); const bool useGlobalViewProps = settings->globalViewProps(); bool useDetailsViewWithPath = false; @@ -83,7 +84,7 @@ ViewProperties::ViewProperties(const KUrl& url) : if (useDefaultProps) { if (useDetailsViewWithPath) { setViewMode(DolphinView::DetailsView); - setAdditionalInfoList(QList() << DolphinView::PathInfo); + setVisibleRoles(QList() << "path"); } else { // The global view-properties act as default for directories without // any view-property configuration @@ -143,17 +144,17 @@ void ViewProperties::setHiddenFilesShown(bool show) } } -void ViewProperties::setCategorizedSorting(bool categorized) +void ViewProperties::setGroupedSorting(bool grouped) { - if (m_node->categorizedSorting() != categorized) { - m_node->setCategorizedSorting(categorized); + if (m_node->groupedSorting() != grouped) { + m_node->setGroupedSorting(grouped); update(); } } -bool ViewProperties::categorizedSorting() const +bool ViewProperties::groupedSorting() const { - return m_node->categorizedSorting(); + return m_node->groupedSorting(); } bool ViewProperties::hiddenFilesShown() const @@ -161,17 +162,17 @@ bool ViewProperties::hiddenFilesShown() const return m_node->hiddenFilesShown(); } -void ViewProperties::setSorting(DolphinView::Sorting sorting) +void ViewProperties::setSortRole(const QByteArray& role) { - if (m_node->sorting() != sorting) { - m_node->setSorting(sorting); + if (m_node->sortRole() != role) { + m_node->setSortRole(role); update(); } } -DolphinView::Sorting ViewProperties::sorting() const +QByteArray ViewProperties::sortRole() const { - return static_cast(m_node->sorting()); + return m_node->sortRole().toLatin1(); } void ViewProperties::setSortOrder(Qt::SortOrder sortOrder) @@ -200,62 +201,49 @@ bool ViewProperties::sortFoldersFirst() const return m_node->sortFoldersFirst(); } -void ViewProperties::setAdditionalInfoList(const QList& list) +void ViewProperties::setVisibleRoles(const QList& roles) { - // See ViewProperties::additionalInfoList() for the storage format + // See ViewProperties::visibleRoles() for the storage format // of the additional information. // Remove the old values stored for the current view-mode - const QStringList oldInfoStringList = m_node->additionalInfo(); + const QStringList oldVisibleRoles = m_node->visibleRoles(); const QString prefix = viewModePrefix(); - QStringList newInfoStringList = oldInfoStringList; - for (int i = newInfoStringList.count() - 1; i >= 0; --i) { - if (newInfoStringList.at(i).startsWith(prefix)) { - newInfoStringList.removeAt(i); + QStringList newVisibleRoles = oldVisibleRoles; + for (int i = newVisibleRoles.count() - 1; i >= 0; --i) { + if (newVisibleRoles[i].startsWith(prefix)) { + newVisibleRoles.removeAt(i); } } // Add the updated values for the current view-mode - AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance(); - foreach (DolphinView::AdditionalInfo info, list) { - newInfoStringList.append(prefix + infoAccessor.value(info)); - } - - // Only update the information if it has been changed - bool changed = oldInfoStringList.count() != newInfoStringList.count(); - if (!changed) { - foreach (const QString& oldInfoString, oldInfoStringList) { - if (!newInfoStringList.contains(oldInfoString)) { - changed = true; - break; - } - } + foreach (const QByteArray& role, roles) { + newVisibleRoles.append(prefix + role); } - if (changed) { + if (oldVisibleRoles != newVisibleRoles) { const bool markCustomizedDetails = (m_node->viewMode() == DolphinView::DetailsView) - && !newInfoStringList.contains(CustomizedDetailsString); + && !newVisibleRoles.contains(CustomizedDetailsString); if (markCustomizedDetails) { // The additional information of the details-view has been modified. Set a marker, - // so that it is allowed to also show no additional information - // (see fallback in ViewProperties::additionalInfoV2, if no additional information is - // available). - newInfoStringList.append(CustomizedDetailsString); + // so that it is allowed to also show no additional information without doing the + // fallback to show the size and date per default. + newVisibleRoles.append(CustomizedDetailsString); } - m_node->setAdditionalInfo(newInfoStringList); + m_node->setVisibleRoles(newVisibleRoles); update(); } } -QList ViewProperties::additionalInfoList() const +QList ViewProperties::visibleRoles() const { // The shown additional information is stored for each view-mode separately as // string with the view-mode as prefix. Example: // - // AdditionalInfo=Details_Size,Details_Date,Details_Owner,Icon_Size + // AdditionalInfo=Details_size,Details_date,Details_owner,Icons_size // - // To get the representation as QList, the current + // To get the representation as QList, the current // view-mode must be checked and the values of this mode added to the list. // // For the details-view a special case must be respected: Per default the size @@ -264,47 +252,41 @@ QList ViewProperties::additionalInfoList() const // by "CustomizedDetails"), also a details-view with no additional information // is accepted. - QList usedInfo; + QList roles; + roles.append("name"); - // infoHash allows to get the mapped DolphinView::AdditionalInfo value - // for a stored string-value in a fast way - static QHash infoHash; - if (infoHash.isEmpty()) { - AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance(); - const QList keys = infoAccessor.keys(); - foreach (DolphinView::AdditionalInfo key, keys) { - infoHash.insert(infoAccessor.value(key), key); - } - } - - // Iterate through all stored keys stored as strings and map them to - // the corresponding DolphinView::AdditionalInfo values. + // 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 infoStringList = m_node->additionalInfo(); - foreach (const QString& infoString, infoStringList) { - if (infoString.startsWith(prefix)) { - const QString key = infoString.right(infoString.length() - prefixLength); - if (infoHash.contains(key)) { - usedInfo.append(infoHash.value(key)); - } else { - kWarning() << "Did not find the key" << key << "in the information string"; + + QStringList visibleRoles = m_node->visibleRoles(); + if (visibleRoles.isEmpty() && m_node->version() <= AdditionalInfoViewPropertiesVersion) { + // Convert the obsolete additionalInfo-property from older versions into the + // visibleRoles-property + visibleRoles = const_cast(this)->convertAdditionalInfo(); + } + + foreach (const QString& visibleRole, visibleRoles) { + if (visibleRole.startsWith(prefix)) { + const QByteArray role = visibleRole.right(visibleRole.length() - prefixLength).toLatin1(); + if (role != "name") { + roles.append(role); } } } // 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 = usedInfo.isEmpty() + const bool useDefaultValues = roles.count() == 1 // "name" && (m_node->viewMode() == DolphinView::DetailsView) - && !infoStringList.contains(CustomizedDetailsString); - Q_UNUSED(useDefaultValues); + && !visibleRoles.contains(CustomizedDetailsString); if (useDefaultValues) { - usedInfo.append(DolphinView::SizeInfo); - usedInfo.append(DolphinView::DateInfo); + roles.append("size"); + roles.append("date"); } - return usedInfo; + return roles; } void ViewProperties::setDirProperties(const ViewProperties& props) @@ -312,11 +294,11 @@ void ViewProperties::setDirProperties(const ViewProperties& props) setViewMode(props.viewMode()); setPreviewsShown(props.previewsShown()); setHiddenFilesShown(props.hiddenFilesShown()); - setCategorizedSorting(props.categorizedSorting()); - setSorting(props.sorting()); + setGroupedSorting(props.groupedSorting()); + setSortRole(props.sortRole()); setSortOrder(props.sortOrder()); setSortFoldersFirst(props.sortFoldersFirst()); - setAdditionalInfoList(props.additionalInfoList()); + setVisibleRoles(props.visibleRoles()); } void ViewProperties::setAutoSaveEnabled(bool autoSave) @@ -338,6 +320,7 @@ void ViewProperties::update() void ViewProperties::save() { KStandardDirs::makeDir(m_filePath); + m_node->setVersion(CurrentViewPropertiesVersion); m_node->writeConfig(); m_changedProps = false; } @@ -370,6 +353,39 @@ 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; +} + bool ViewProperties::isPartOfHome(const QString& filePath) { // For performance reasons cache the path in a static QString