X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/5593c252e8d9638c86dcc2bb9edd394ea14f8ba1..bb67def173f31819bb9a696627f9af71c7037dcd:/src/views/viewproperties.cpp diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp index 597baa293..1f73f3b33 100644 --- a/src/views/viewproperties.cpp +++ b/src/views/viewproperties.cpp @@ -1,41 +1,25 @@ -/*************************************************************************** - * Copyright (C) 2006-2010 by Peter Penz * - * Copyright (C) 2006 by Aaron J. Seigo * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ +/* + * SPDX-FileCopyrightText: 2006-2010 Peter Penz + * SPDX-FileCopyrightText: 2006 Aaron J. Seigo + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ #include "viewproperties.h" #include "dolphin_directoryviewpropertysettings.h" #include "dolphin_generalsettings.h" - -#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,38 +33,54 @@ 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(QStringLiteral("global")); - } else if (url.scheme().contains(QStringLiteral("search"))) { + } else if (url.scheme().contains(QLatin1String("search"))) { m_filePath = destinationDir(QStringLiteral("search/")) + directoryHashForUrl(url); useDetailsViewWithPath = true; } else if (url.scheme() == QLatin1String("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 + + 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(QStringLiteral("remote")) + m_filePath; } @@ -97,6 +97,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 +134,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 +150,7 @@ ViewProperties::~ViewProperties() } delete m_node; - m_node = 0; + m_node = nullptr; } void ViewProperties::setViewMode(DolphinView::Mode mode) @@ -250,7 +266,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) { + for (const QByteArray& role : roles) { newVisibleRoles.append(prefix + role); } @@ -281,7 +297,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. @@ -293,7 +309,7 @@ QList ViewProperties::visibleRoles() const const int prefixLength = prefix.length(); const QStringList visibleRoles = m_node->visibleRoles(); - foreach (const QString& visibleRole, visibleRoles) { + for (const QString& visibleRole : visibleRoles) { if (visibleRole.startsWith(prefix)) { const QByteArray role = visibleRole.right(visibleRole.length() - prefixLength).toLatin1(); if (role != "text") { @@ -309,7 +325,7 @@ QList ViewProperties::visibleRoles() const && !visibleRoles.contains(CustomizedDetailsString); if (useDefaultValues) { roles.append("size"); - roles.append("date"); + roles.append("modificationtime"); } return roles; @@ -376,7 +392,7 @@ bool ViewProperties::exist() const QString ViewProperties::destinationDir(const QString& subDir) const { - QString path = QStandardPaths::writableLocation(QStandardPaths::DataLocation); + QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); path.append("/view_properties/").append(subDir); return path; } @@ -406,7 +422,7 @@ void ViewProperties::convertAdditionalInfo() // the internal role. One special-case must be handled: "LinkDestination" // has been used for "destination". visibleRoles.reserve(additionalInfo.count()); - foreach (const QString& info, additionalInfo) { + for (const QString& info : additionalInfo) { QString visibleRole = info; int index = visibleRole.indexOf('_'); if (index >= 0 && index + 1 < visibleRole.length()) { @@ -448,6 +464,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