X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/3dbee30c1aecfa4924c587e764a13ae5755c9279..41f7f4e4e89b97b5c7f31452774c37ce953dd125:/src/views/viewproperties.cpp diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp index c8d92be6d..48ed65471 100644 --- a/src/views/viewproperties.cpp +++ b/src/views/viewproperties.cpp @@ -22,20 +22,17 @@ #include "dolphin_directoryviewpropertysettings.h" #include "dolphin_generalsettings.h" - -#include -#include +#include "dolphindebug.h" #include -#include -#include -#include -#include + +#include namespace { const int AdditionalInfoViewPropertiesVersion = 1; const int NameRolePropertiesVersion = 2; - const int CurrentViewPropertiesVersion = 3; + 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 @@ -49,40 +46,56 @@ namespace { ViewProperties::ViewProperties(const QUrl& url) : m_changedProps(false), m_autoSave(true), - m_node(0) + m_node(nullptr) { GeneralSettings* settings = GeneralSettings::self(); const bool useGlobalViewProps = settings->globalViewProps() || url.isEmpty(); bool useDetailsViewWithPath = false; + bool useRecentDocumentsView = false; + bool useDownloadsView = false; // We try and save it to the file .directory in the directory being viewed. // If the directory is not writable by the user or the directory is not local, // we store the properties information in a local file. if (useGlobalViewProps) { - m_filePath = destinationDir("global"); - } else if (url.scheme().contains("search")) { - m_filePath = destinationDir("search/") + directoryHashForUrl(url); + m_filePath = destinationDir(QStringLiteral("global")); + } else if (url.scheme().contains(QStringLiteral("search"))) { + m_filePath = destinationDir(QStringLiteral("search/")) + directoryHashForUrl(url); useDetailsViewWithPath = true; } else if (url.scheme() == QLatin1String("trash")) { - m_filePath = destinationDir("trash"); + m_filePath = destinationDir(QStringLiteral("trash")); useDetailsViewWithPath = true; + } else if (url.scheme() == QLatin1String("recentdocuments")) { + m_filePath = destinationDir(QStringLiteral("recentdocuments")); + useRecentDocumentsView = true; } else if (url.isLocalFile()) { m_filePath = url.toLocalFile(); - const QFileInfo dirInfo(m_filePath); - const QFileInfo fileInfo(m_filePath + QDir::separator() + ViewPropertiesFileName); - // Check if the directory is writable and check if the ".directory" file exists and - // is read- and writable. - if (!dirInfo.isWritable() - || (fileInfo.exists() && !(fileInfo.isReadable() && fileInfo.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; + + bool useDestinationDir = !isPartOfHome(m_filePath); + if (!useDestinationDir) { + const KFileItem fileItem(url); + useDestinationDir = fileItem.isSlow(); + } + + if (!useDestinationDir) { + const QFileInfo dirInfo(m_filePath); + const QFileInfo fileInfo(m_filePath + QDir::separator() + ViewPropertiesFileName); + useDestinationDir = !dirInfo.isWritable() || (dirInfo.size() > 0 && fileInfo.exists() && !(fileInfo.isReadable() && fileInfo.isWritable())); + } + + if (useDestinationDir) { + #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(QStringLiteral("local")) + m_filePath; + } + + if (m_filePath == QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)) { + useDownloadsView = true; } } else { - m_filePath = destinationDir("remote") + m_filePath; + m_filePath = destinationDir(QStringLiteral("remote")) + m_filePath; } const QString file = m_filePath + QDir::separator() + ViewPropertiesFileName; @@ -97,6 +110,17 @@ ViewProperties::ViewProperties(const QUrl& url) : if (useDetailsViewWithPath) { setViewMode(DolphinView::DetailsView); setVisibleRoles({"path"}); + } else if (useRecentDocumentsView || useDownloadsView) { + setSortRole(QByteArrayLiteral("modificationtime")); + setSortOrder(Qt::DescendingOrder); + + if (useRecentDocumentsView) { + setViewMode(DolphinView::DetailsView); + setVisibleRoles({QByteArrayLiteral("path")}); + } else if (useDownloadsView) { + setSortFoldersFirst(false); + setGroupedSorting(true); + } } else { // The global view-properties act as default for directories without // any view-property configuration. Constructing a ViewProperties @@ -123,6 +147,11 @@ ViewProperties::ViewProperties(const QUrl& url) : Q_ASSERT(m_node->version() == NameRolePropertiesVersion); } + if (m_node->version() < DateRolePropertiesVersion) { + convertDateRoleToModificationTimeRole(); + Q_ASSERT(m_node->version() == DateRolePropertiesVersion); + } + m_node->setVersion(CurrentViewPropertiesVersion); } } @@ -134,7 +163,7 @@ ViewProperties::~ViewProperties() } delete m_node; - m_node = 0; + m_node = nullptr; } void ViewProperties::setViewMode(DolphinView::Mode mode) @@ -249,6 +278,7 @@ void ViewProperties::setVisibleRoles(const QList& roles) } // Add the updated values for the current view-mode + newVisibleRoles.reserve(roles.count()); foreach (const QByteArray& role, roles) { newVisibleRoles.append(prefix + role); } @@ -280,7 +310,7 @@ QList ViewProperties::visibleRoles() const // // For the details-view a special case must be respected: Per default the size // and date should be shown without creating a .directory file. Only if - // the user explictly has modified the properties of the details view (marked + // the user explicitly has modified the properties of the details view (marked // by "CustomizedDetails"), also a details-view with no additional information // is accepted. @@ -308,7 +338,7 @@ QList ViewProperties::visibleRoles() const && !visibleRoles.contains(CustomizedDetailsString); if (useDefaultValues) { roles.append("size"); - roles.append("date"); + roles.append("modificationtime"); } return roles; @@ -359,7 +389,7 @@ void ViewProperties::update() void ViewProperties::save() { - kDebug() << "Saving view-properties to" << m_filePath; + qCDebug(DolphinDebug) << "Saving view-properties to" << m_filePath; QDir dir; dir.mkpath(m_filePath); m_node->setVersion(CurrentViewPropertiesVersion); @@ -385,10 +415,10 @@ QString ViewProperties::viewModePrefix() const QString prefix; switch (m_node->viewMode()) { - case DolphinView::IconsView: prefix = "Icons_"; break; - case DolphinView::CompactView: prefix = "Compact_"; break; - case DolphinView::DetailsView: prefix = "Details_"; break; - default: kWarning() << "Unknown view-mode of the view properties"; + case DolphinView::IconsView: prefix = QStringLiteral("Icons_"); break; + case DolphinView::CompactView: prefix = QStringLiteral("Compact_"); break; + case DolphinView::DetailsView: prefix = QStringLiteral("Details_"); break; + default: qCWarning(DolphinDebug) << "Unknown view-mode of the view properties"; } return prefix; @@ -411,7 +441,7 @@ void ViewProperties::convertAdditionalInfo() if (index >= 0 && index + 1 < visibleRole.length()) { ++index; if (visibleRole[index] == QLatin1Char('L')) { - visibleRole.replace("LinkDestination", "destination"); + visibleRole.replace(QLatin1String("LinkDestination"), QLatin1String("destination")); } else { visibleRole[index] = visibleRole[index].toLower(); } @@ -438,7 +468,7 @@ void ViewProperties::convertNameRoleToTextRole() QString sortRole = m_node->sortRole(); if (sortRole == QLatin1String("name")) { - sortRole = QLatin1String("text"); + sortRole = QStringLiteral("text"); } m_node->setVisibleRoles(visibleRoles); @@ -447,6 +477,27 @@ void ViewProperties::convertNameRoleToTextRole() update(); } +void ViewProperties::convertDateRoleToModificationTimeRole() +{ + QStringList visibleRoles = m_node->visibleRoles(); + for (int i = 0; i < visibleRoles.count(); ++i) { + if (visibleRoles[i].endsWith(QLatin1String("_date"))) { + const int leftLength = visibleRoles[i].length() - 5; + visibleRoles[i] = visibleRoles[i].left(leftLength) + "_modificationtime"; + } + } + + QString sortRole = m_node->sortRole(); + if (sortRole == QLatin1String("date")) { + sortRole = QStringLiteral("modificationtime"); + } + + m_node->setVisibleRoles(visibleRoles); + m_node->setSortRole(sortRole); + m_node->setVersion(DateRolePropertiesVersion); + update(); +} + bool ViewProperties::isPartOfHome(const QString& filePath) { // For performance reasons cache the path in a static QString