X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/5252c12db4929886dbe502013e0a1fee6500f568..d34f1d1b466a8163a2274fa6763e1049233f00bb:/src/viewproperties.cpp diff --git a/src/viewproperties.cpp b/src/viewproperties.cpp index 52129bd80..2de807273 100644 --- a/src/viewproperties.cpp +++ b/src/viewproperties.cpp @@ -1,6 +1,6 @@ /*************************************************************************** - * Copyright (C) 2006 by Peter Penz * - * peter.penz@gmx.at * + * Copyright (C) 2006 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 * @@ -15,84 +15,88 @@ * 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., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ -#include +#include "viewproperties.h" -#include -#include -#include +#include "dolphinsettings.h" +#include "dolphin_directoryviewpropertysettings.h" +#include "dolphin_generalsettings.h" +#include #include #include #include -#include "viewproperties.h" +#ifdef HAVE_NEPOMUK + #include +#endif -#include "dolphinsettings.h" +#include +#include +#include + +bool ViewProperties::m_nepomukSupport = false; #define FILE_NAME "/.directory" -ViewProperties::ViewProperties(KUrl url) : - m_changedProps(false), - m_autoSave(true), - m_subDirValidityHidden(false), - m_node(0) +ViewProperties::ViewProperties(const KUrl& url) : + m_changedProps(false), + m_autoSave(true), + m_node(0) { - url.cleanPath(true); - m_filepath = url.path(); +#ifdef HAVE_NEPOMUK + static bool checkedNepomukSupport = false; + if (!checkedNepomukSupport) { + m_nepomukSupport = !Nepomuk::ResourceManager::instance()->init(); + checkedNepomukSupport = true; + } +#endif + + KUrl cleanUrl(url); + cleanUrl.cleanPath(); + m_filepath = cleanUrl.path(); if ((m_filepath.length() < 1) || (m_filepath.at(0) != QChar('/'))) { - m_node = new ViewPropertySettings(); + const QString file = destinationDir("global") + FILE_NAME; + m_node = new ViewPropertySettings(KSharedConfig::openConfig(file)); return; } - // we try and save it to a file 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 - QString rootDir("/"); // TODO: should this be set to the root of the bookmark, if any? - if (url.isLocalFile()) { - QFileInfo info(m_filepath); - + // We try and save it to a file 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. + GeneralSettings* settings = DolphinSettings::instance().generalSettings(); + const bool useGlobalViewProps = settings->globalViewProps(); + if (useGlobalViewProps) { + m_filepath = destinationDir("global"); + } else if (cleanUrl.isLocalFile()) { + const QFileInfo info(m_filepath); if (!info.isWritable()) { - QString basePath = KGlobal::instance()->instanceName(); - basePath.append("/view_properties/local"); - rootDir = locateLocal("data", basePath); - m_filepath = rootDir + m_filepath; + m_filepath = destinationDir("local") + m_filepath; } - } - else { - QString basePath = KGlobal::instance()->instanceName(); - basePath.append("/view_properties/remote/").append(url.host()); - rootDir = locateLocal("data", basePath); - m_filepath = rootDir + m_filepath; + } else { + m_filepath = destinationDir("remote") + m_filepath; } - m_node = new ViewPropertySettings(KSharedConfig::openConfig(m_filepath + FILE_NAME)); + const QString file = m_filepath + FILE_NAME; + m_node = new ViewPropertySettings(KSharedConfig::openConfig(file)); - QDir dir(m_filepath); - const bool isValidForSubDirs = m_node->validForSubDirs(); - while ((dir.path() != rootDir) && dir.cdUp()) { - QString parentPath(dir.path() + FILE_NAME); + const bool useDefaultProps = !useGlobalViewProps && + (!QFileInfo(file).exists() || + (m_node->timestamp() < settings->viewPropsTimestamp())); + if (useDefaultProps) { + // If the .directory file does not exist or the timestamp is too old, + // use the values from the global .directory file instead, which acts + // as default view for new folders in this case. + settings->setGlobalViewProps(true); - if (!QFile::exists(parentPath)) - { - continue; - } - - ViewPropertySettings parentNode(KSharedConfig::openConfig(dir.path() + FILE_NAME)); - const bool inheritProps = parentNode.validForSubDirs() && - (parentNode.timestamp() > m_node->timestamp()); - - if (inheritProps) { - *m_node = parentNode; - break; - } - } + ViewProperties defaultProps(url); + setDirProperties(defaultProps); - if (isValidForSubDirs) { - m_subDirValidityHidden = true; + settings->setGlobalViewProps(false); + m_changedProps = false; } } @@ -103,6 +107,7 @@ ViewProperties::~ViewProperties() } delete m_node; + m_node = 0; } void ViewProperties::setViewMode(DolphinView::Mode mode) @@ -118,7 +123,21 @@ DolphinView::Mode ViewProperties::viewMode() const return static_cast(m_node->viewMode()); } -void ViewProperties::setShowHiddenFilesEnabled(bool show) +void ViewProperties::setShowPreview(bool show) +{ + if (m_node->showPreview() != show) { + m_node->setShowPreview(show); + updateTimeStamp(); + } +} + +bool ViewProperties::showPreview() const +{ + return m_node->showPreview(); +} + + +void ViewProperties::setShowHiddenFiles(bool show) { if (m_node->showHiddenFiles() != show) { m_node->setShowHiddenFiles(show); @@ -126,7 +145,21 @@ void ViewProperties::setShowHiddenFilesEnabled(bool show) } } -bool ViewProperties::isShowHiddenFilesEnabled() const +void ViewProperties::setCategorizedSorting(bool categorized) +{ + if (m_node->categorizedSorting() != categorized) { + m_node->setCategorizedSorting(categorized); + updateTimeStamp(); + } +} + +bool ViewProperties::categorizedSorting() const +{ + return m_node->categorizedSorting(); +} + + +bool ViewProperties::showHiddenFiles() const { return m_node->showHiddenFiles(); } @@ -141,7 +174,15 @@ void ViewProperties::setSorting(DolphinView::Sorting sorting) DolphinView::Sorting ViewProperties::sorting() const { - return static_cast(m_node->sorting()); + // If Nepomuk is not available, return SortByName as fallback if SortByRating + // or SortByTags is stored. + DolphinView::Sorting sorting = static_cast(m_node->sorting()); + const bool sortByName = !m_nepomukSupport && + ((sorting == DolphinView::SortByRating) || (sorting == DolphinView::SortByTags)); + if (sortByName) { + sorting = DolphinView::SortByName; + } + return sorting; } void ViewProperties::setSortOrder(Qt::SortOrder sortOrder) @@ -157,17 +198,78 @@ Qt::SortOrder ViewProperties::sortOrder() const return static_cast(m_node->sortOrder()); } -void ViewProperties::setValidForSubDirs(bool valid) +void ViewProperties::setAdditionalInfo(KFileItemDelegate::InformationList list) { - if (m_node->validForSubDirs() != valid) { - m_node->setValidForSubDirs(valid); + int info = NoInfo; + foreach (KFileItemDelegate::Information currentInfo, list) { + switch (currentInfo) { + case KFileItemDelegate::Size: + info = info | SizeInfo; + break; + case KFileItemDelegate::ModificationTime: + info = info | DateInfo; + break; + case KFileItemDelegate::Permissions: + info = info | PermissionsInfo; + break; + case KFileItemDelegate::Owner: + info = info | OwnerInfo; + break; + case KFileItemDelegate::OwnerAndGroup: + info = info | GroupInfo; + break; + case KFileItemDelegate::FriendlyMimeType: + info = info | TypeInfo; + break; + default: + break; + } + } + + const int encodedInfo = encodedAdditionalInfo(info); + if (m_node->additionalInfo() != encodedInfo) { + m_node->setAdditionalInfo(encodedInfo); updateTimeStamp(); } } -bool ViewProperties::isValidForSubDirs() const +KFileItemDelegate::InformationList ViewProperties::additionalInfo() const { - return m_node->validForSubDirs(); + const int info = decodedAdditionalInfo(); + + KFileItemDelegate::InformationList list; + if (info & SizeInfo) { + list.append(KFileItemDelegate::Size); + } + if (info & DateInfo) { + list.append(KFileItemDelegate::ModificationTime); + } + if (info & PermissionsInfo) { + list.append(KFileItemDelegate::Permissions); + } + if (info & OwnerInfo) { + list.append(KFileItemDelegate::Owner); + } + if (info & GroupInfo) { + list.append(KFileItemDelegate::OwnerAndGroup); + } + if (info & TypeInfo) { + list.append(KFileItemDelegate::FriendlyMimeType); + } + + return list; +} + + +void ViewProperties::setDirProperties(const ViewProperties& props) +{ + setViewMode(props.viewMode()); + setShowPreview(props.showPreview()); + setShowHiddenFiles(props.showHiddenFiles()); + setCategorizedSorting(props.categorizedSorting()); + setSorting(props.sorting()); + setSortOrder(props.sortOrder()); + setAdditionalInfo(props.additionalInfo()); } void ViewProperties::setAutoSaveEnabled(bool autoSave) @@ -193,16 +295,61 @@ void ViewProperties::save() m_changedProps = false; } -ViewProperties& ViewProperties::operator = (const ViewProperties& props) +KUrl ViewProperties::mirroredDirectory() +{ + QString basePath = KGlobal::mainComponent().componentName(); + basePath.append("/view_properties/"); + return KUrl(KStandardDirs::locateLocal("data", basePath)); +} + +QString ViewProperties::destinationDir(const QString& subDir) const +{ + QString basePath = KGlobal::mainComponent().componentName(); + basePath.append("/view_properties/").append(subDir); + return KStandardDirs::locateLocal("data", basePath); +} + +int ViewProperties::encodedAdditionalInfo(int info) const +{ + int encodedInfo = m_node->additionalInfo(); + + switch (viewMode()) { + case DolphinView::DetailsView: + encodedInfo = (encodedInfo & 0xFFFF00) | info; + break; + case DolphinView::IconsView: + encodedInfo = (encodedInfo & 0xFF00FF) | (info << 8); + break; + case DolphinView::ColumnView: + encodedInfo = (encodedInfo & 0x00FFFF) | (info << 16); + break; + default: break; + } + + return encodedInfo; +} + +int ViewProperties::decodedAdditionalInfo() const { - if (&props != this) { - m_changedProps = props.m_changedProps; - m_autoSave = props.m_autoSave; - m_subDirValidityHidden = props.m_subDirValidityHidden; - m_filepath = props.m_filepath; - m_node = new ViewPropertySettings(); - //*m_node = *(props.m_node); + int decodedInfo = m_node->additionalInfo(); + + switch (viewMode()) { + case DolphinView::DetailsView: + decodedInfo = decodedInfo & 0xFF; + if (decodedInfo == NoInfo) { + // a details view without any additional info makes no sense, hence + // provide at least a size-info and date-info as fallback + decodedInfo = SizeInfo | DateInfo; + } + break; + case DolphinView::IconsView: + decodedInfo = (decodedInfo >> 8) & 0xFF; + break; + case DolphinView::ColumnView: + decodedInfo = (decodedInfo >> 16) & 0xFF; + break; + default: break; } - return *this; + return decodedInfo; }