From 2ba5c2cfc2cea534cccd860f94a7198530b83594 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Sun, 11 Mar 2012 19:02:45 +0100 Subject: [PATCH] First step to introduce dynamic roles Currently Dolphin is only capable of showing a fixed number of roles (e.g. name, size, date, owner, ...). Dolphin 2.1 should support also other roles like rating, tags, comments or other meta-information of images or audio-files. To support this the sorting-type and additional-type from DolphinView has been replaced by a role-type represented as QByteArray. --- src/CMakeLists.txt | 2 +- src/settings/additionalinfodialog.cpp | 28 ++-- src/settings/additionalinfodialog.h | 9 +- src/settings/applyviewpropsjob.cpp | 2 +- ...dolphin_directoryviewpropertysettings.kcfg | 8 +- src/settings/viewpropertiesdialog.cpp | 50 +++--- src/views/additionalinfoaccessor.cpp | 118 -------------- src/views/additionalinfoaccessor.h | 101 ------------ src/views/dolphinview.cpp | 154 +++++------------- src/views/dolphinview.h | 66 ++------ src/views/dolphinviewactionhandler.cpp | 112 ++++++------- src/views/dolphinviewactionhandler.h | 6 +- src/views/rolesaccessor.cpp | 72 ++++++++ src/views/rolesaccessor.h | 64 ++++++++ src/views/viewproperties.cpp | 101 +++++------- src/views/viewproperties.h | 8 +- 16 files changed, 339 insertions(+), 562 deletions(-) delete mode 100644 src/views/additionalinfoaccessor.cpp delete mode 100644 src/views/additionalinfoaccessor.h create mode 100644 src/views/rolesaccessor.cpp create mode 100644 src/views/rolesaccessor.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 16171ede0..90a1f9e44 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -47,7 +47,6 @@ set(dolphinprivate_LIB_SRCS settings/viewmodes/viewmodesettings.cpp settings/viewpropertiesdialog.cpp settings/viewpropsprogressinfo.cpp - views/additionalinfoaccessor.cpp views/dolphindirlister.cpp views/dolphinfileitemlistwidget.cpp views/dolphinitemlistcontainer.cpp @@ -58,6 +57,7 @@ set(dolphinprivate_LIB_SRCS views/dolphinviewactionhandler.cpp views/draganddrophelper.cpp views/renamedialog.cpp + views/rolesaccessor.cpp views/tooltips/filemetadatatooltip.cpp views/tooltips/tooltipmanager.cpp views/versioncontrol/updateitemstatesthread.cpp diff --git a/src/settings/additionalinfodialog.cpp b/src/settings/additionalinfodialog.cpp index 9b47e928f..6bcee4a1b 100644 --- a/src/settings/additionalinfodialog.cpp +++ b/src/settings/additionalinfodialog.cpp @@ -25,12 +25,12 @@ #include #include -#include "views/additionalinfoaccessor.h" +#include "views/rolesaccessor.h" AdditionalInfoDialog::AdditionalInfoDialog(QWidget* parent, - const QList& infoList) : + const QList& visibleRoles) : KDialog(parent), - m_infoList(infoList), + m_visibleRoles(visibleRoles), m_checkBoxes() { setCaption(i18nc("@title:window", "Additional Information")); @@ -48,11 +48,11 @@ AdditionalInfoDialog::AdditionalInfoDialog(QWidget* parent, layout->addWidget(header); // Add checkboxes - const AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance(); - const QList keys = infoAccessor.keys(); - foreach (DolphinView::AdditionalInfo info, keys) { - QCheckBox* checkBox = new QCheckBox(infoAccessor.translation(info), mainWidget); - checkBox->setChecked(infoList.contains(info)); + const RolesAccessor& rolesAccessor = RolesAccessor::instance(); + const QList roles = rolesAccessor.roles(); + foreach (const QByteArray& role, roles) { + QCheckBox* checkBox = new QCheckBox(rolesAccessor.translation(role), mainWidget); + checkBox->setChecked(visibleRoles.contains(role)); layout->addWidget(checkBox); m_checkBoxes.append(checkBox); } @@ -75,20 +75,20 @@ AdditionalInfoDialog::~AdditionalInfoDialog() saveDialogSize(dialogConfig, KConfigBase::Persistent); } -QList AdditionalInfoDialog::informationList() const +QList AdditionalInfoDialog::visibleRoles() const { - return m_infoList; + return m_visibleRoles; } void AdditionalInfoDialog::slotOk() { - m_infoList.clear(); + m_visibleRoles.clear(); - const QList keys = AdditionalInfoAccessor::instance().keys(); + const QList roles = RolesAccessor::instance().roles(); int index = 0; - foreach (DolphinView::AdditionalInfo info, keys) { + foreach (const QByteArray& role, roles) { if (m_checkBoxes[index]->isChecked()) { - m_infoList.append(info); + m_visibleRoles.append(role); } ++index; } diff --git a/src/settings/additionalinfodialog.h b/src/settings/additionalinfodialog.h index 6f38f617c..9048489cc 100644 --- a/src/settings/additionalinfodialog.h +++ b/src/settings/additionalinfodialog.h @@ -20,29 +20,28 @@ #ifndef ADDITIONALINFODIALOG_H #define ADDITIONALINFODIALOG_H -#include #include #include class QCheckBox; /** - * @brief Dialog for changing the additional information properties of a directory. + * @brief Dialog for changing the additional information shown in the view. */ class AdditionalInfoDialog : public KDialog { Q_OBJECT public: - AdditionalInfoDialog(QWidget* parent, const QList& infoList); + AdditionalInfoDialog(QWidget* parent, const QList& visibleRoles); virtual ~AdditionalInfoDialog(); - QList informationList() const; + QList visibleRoles() const; private slots: void slotOk(); private: - QList m_infoList; + QList m_visibleRoles; QList m_checkBoxes; }; diff --git a/src/settings/applyviewpropsjob.cpp b/src/settings/applyviewpropsjob.cpp index 59f1c0b86..0c00783a0 100644 --- a/src/settings/applyviewpropsjob.cpp +++ b/src/settings/applyviewpropsjob.cpp @@ -34,7 +34,7 @@ ApplyViewPropsJob::ApplyViewPropsJob(const KUrl& dir, m_viewProps->setViewMode(viewProps.viewMode()); m_viewProps->setPreviewsShown(viewProps.previewsShown()); m_viewProps->setHiddenFilesShown(viewProps.hiddenFilesShown()); - m_viewProps->setSorting(viewProps.sorting()); + m_viewProps->setSortRole(viewProps.sortRole()); m_viewProps->setSortOrder(viewProps.sortOrder()); KIO::ListJob* listJob = KIO::listRecursive(dir, KIO::HideProgressInfo); diff --git a/src/settings/dolphin_directoryviewpropertysettings.kcfg b/src/settings/dolphin_directoryviewpropertysettings.kcfg index 64242f8a3..db1a5cdc0 100644 --- a/src/settings/dolphin_directoryviewpropertysettings.kcfg +++ b/src/settings/dolphin_directoryviewpropertysettings.kcfg @@ -40,10 +40,10 @@ false - + This option defines which attribute (name, size, date, etc.) sorting is performed on. - DolphinView::SortByName + "name" @@ -58,8 +58,8 @@ true - - + + diff --git a/src/settings/viewpropertiesdialog.cpp b/src/settings/viewpropertiesdialog.cpp index c07c072d1..420daec8d 100644 --- a/src/settings/viewpropertiesdialog.cpp +++ b/src/settings/viewpropertiesdialog.cpp @@ -21,6 +21,7 @@ #include "viewpropertiesdialog.h" #include "additionalinfodialog.h" +#include "views/rolesaccessor.h" #include "views/dolphinview.h" #include "dolphin_generalsettings.h" #include "dolphin_iconsmodesettings.h" @@ -105,18 +106,12 @@ ViewPropertiesDialog::ViewPropertiesDialog(DolphinView* dolphinView) : m_sortOrder->addItem(i18nc("@item:inlistbox Sort", "Ascending")); m_sortOrder->addItem(i18nc("@item:inlistbox Sort", "Descending")); - // TODO: Provide a kind of SortingInfoAccessor similar to AdditionalInfoAccessor - // to assure that adding a sort-role requires to change only one file m_sorting = new KComboBox(sortingBox); - m_sorting->addItem(i18nc("@item:inlistbox Sort", "By Name")); - m_sorting->addItem(i18nc("@item:inlistbox Sort", "By Size")); - m_sorting->addItem(i18nc("@item:inlistbox Sort", "By Date")); - m_sorting->addItem(i18nc("@item:inlistbox Sort", "By Permissions")); - m_sorting->addItem(i18nc("@item:inlistbox Sort", "By Owner")); - m_sorting->addItem(i18nc("@item:inlistbox Sort", "By Group")); - m_sorting->addItem(i18nc("@item:inlistbox Sort", "By Type")); - m_sorting->addItem(i18nc("@item:inlistbox Sort", "By Link Destination")); - m_sorting->addItem(i18nc("@item:inlistbox Sort", "By Path")); + const RolesAccessor& rolesAccessor = RolesAccessor::instance(); + const QList roles = rolesAccessor.roles(); + foreach (const QByteArray& role, roles) { + m_sorting->addItem(rolesAccessor.translation(role), role); + } m_sortFoldersFirst = new QCheckBox(i18nc("@option:check", "Show folders first")); m_previewsShown = new QCheckBox(i18nc("@option:check", "Show preview")); @@ -249,7 +244,8 @@ void ViewPropertiesDialog::slotViewModeChanged(int index) void ViewPropertiesDialog::slotSortingChanged(int index) { - m_viewProps->setSorting(static_cast(index)); + const QByteArray role = m_sorting->itemData(index).toByteArray(); + m_viewProps->setSortRole(role); markAsDirty(true); } @@ -295,22 +291,22 @@ void ViewPropertiesDialog::markAsDirty(bool isDirty) void ViewPropertiesDialog::configureAdditionalInfo() { - QList infoList = m_viewProps->additionalInfoList(); - const bool useDefaultInfo = (m_viewProps->viewMode() == DolphinView::DetailsView) && - (infoList.isEmpty() || infoList.contains(DolphinView::NoInfo)); - if (useDefaultInfo) { + QList visibleRoles = m_viewProps->visibleRoles(); + const bool useDefaultRoles = (m_viewProps->viewMode() == DolphinView::DetailsView) && visibleRoles.isEmpty(); + if (useDefaultRoles) { // Using the details view without any additional information (-> additional column) // makes no sense and leads to a usability problem as no viewport area is available // anymore. Hence as fallback provide at least a size and date column. - infoList.clear(); - infoList.append(DolphinView::SizeInfo); - infoList.append(DolphinView::DateInfo); - m_viewProps->setAdditionalInfoList(infoList); + visibleRoles.clear(); + visibleRoles.append("name"); + visibleRoles.append("size"); + visibleRoles.append("date"); + m_viewProps->setVisibleRoles(visibleRoles); } - QPointer dialog = new AdditionalInfoDialog(this, infoList); + QPointer dialog = new AdditionalInfoDialog(this, visibleRoles); if (dialog->exec() == QDialog::Accepted) { - m_viewProps->setAdditionalInfoList(dialog->informationList()); + m_viewProps->setVisibleRoles(dialog->visibleRoles()); markAsDirty(true); } delete dialog; @@ -370,11 +366,11 @@ void ViewPropertiesDialog::applyViewProperties() } m_dolphinView->setMode(m_viewProps->viewMode()); - m_dolphinView->setSorting(m_viewProps->sorting()); + m_dolphinView->setSortRole(m_viewProps->sortRole()); m_dolphinView->setSortOrder(m_viewProps->sortOrder()); m_dolphinView->setSortFoldersFirst(m_viewProps->sortFoldersFirst()); m_dolphinView->setGroupedSorting(m_viewProps->groupedSorting()); - m_dolphinView->setAdditionalInfoList(m_viewProps->additionalInfoList()); + m_dolphinView->setVisibleRoles(m_viewProps->visibleRoles()); m_dolphinView->setPreviewsShown(m_viewProps->previewsShown()); m_dolphinView->setHiddenFilesShown(m_viewProps->hiddenFilesShown()); @@ -396,7 +392,11 @@ void ViewPropertiesDialog::loadSettings() // Load sort order and sorting const int sortOrderIndex = (m_viewProps->sortOrder() == Qt::AscendingOrder) ? 0 : 1; m_sortOrder->setCurrentIndex(sortOrderIndex); - m_sorting->setCurrentIndex(m_viewProps->sorting()); + + const QList roles = RolesAccessor::instance().roles(); + const int sortRoleIndex = roles.indexOf(m_viewProps->sortRole()); + m_sorting->setCurrentIndex(sortRoleIndex); + m_sortFoldersFirst->setChecked(m_viewProps->sortFoldersFirst()); // Load show preview, show in groups and show hidden files settings diff --git a/src/views/additionalinfoaccessor.cpp b/src/views/additionalinfoaccessor.cpp deleted file mode 100644 index b102282a6..000000000 --- a/src/views/additionalinfoaccessor.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2010 by Peter Penz * - * * - * 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 * - ***************************************************************************/ - -#include "additionalinfoaccessor.h" - -#include -#include - -class AdditionalInfoAccessorSingleton -{ -public: - AdditionalInfoAccessor instance; -}; -K_GLOBAL_STATIC(AdditionalInfoAccessorSingleton, s_additionalInfoManager) - -AdditionalInfoAccessor& AdditionalInfoAccessor::instance() -{ - return s_additionalInfoManager->instance; -} - -QList AdditionalInfoAccessor::keys() const -{ - return m_map.keys(); -} - -QByteArray AdditionalInfoAccessor::role(DolphinView::AdditionalInfo info) const -{ - return m_map[info]->role; -} - -DolphinView::AdditionalInfo AdditionalInfoAccessor::additionalInfo(const QByteArray& role) const -{ - return m_infoForRole.value(role); -} - -QString AdditionalInfoAccessor::actionCollectionName(DolphinView::AdditionalInfo info, - ActionCollectionType type) const -{ - QString name; - switch (type) { - case SortByType: - name = QLatin1String("sort_by_") + QLatin1String(m_map[info]->role); - break; - - case AdditionalInfoType: - name = QLatin1String("show_") + QLatin1String(m_map[info]->role); - break; - } - - return name; -} - -QString AdditionalInfoAccessor::translation(DolphinView::AdditionalInfo info) const -{ - return i18nc(m_map[info]->roleTranslationContext, m_map[info]->roleTranslation); -} - -QString AdditionalInfoAccessor::value(DolphinView::AdditionalInfo info) const -{ - return m_map[info]->value; -} - -DolphinView::Sorting AdditionalInfoAccessor::sorting(DolphinView::AdditionalInfo info) const -{ - return m_map[info]->sorting; -} - -AdditionalInfoAccessor::AdditionalInfoAccessor() : - m_map(), - m_infoForRole() -{ - static const AdditionalInfoAccessor::AdditionalInfo additionalInfo[] = { - // role roleTranslationContext roleTranslation value sorting - { "size", I18N_NOOP2_NOSTRIP("@label", "Size"), "Size", DolphinView::SortBySize}, - { "date", I18N_NOOP2_NOSTRIP("@label", "Date"), "Date", DolphinView::SortByDate}, - { "permissions", I18N_NOOP2_NOSTRIP("@label", "Permissions"), "Permissions", DolphinView::SortByPermissions}, - { "owner", I18N_NOOP2_NOSTRIP("@label", "Owner"), "Owner", DolphinView::SortByOwner}, - { "group", I18N_NOOP2_NOSTRIP("@label", "Group"), "Group", DolphinView::SortByGroup}, - { "type", I18N_NOOP2_NOSTRIP("@label", "Type"), "Type", DolphinView::SortByType}, - { "destination", I18N_NOOP2_NOSTRIP("@label", "Link Destination"), "LinkDestination", DolphinView::SortByDestination}, - { "path", I18N_NOOP2_NOSTRIP("@label", "Path"), "Path", DolphinView::SortByPath} - }; - - m_map.insert(DolphinView::SizeInfo, &additionalInfo[0]); - m_map.insert(DolphinView::DateInfo, &additionalInfo[1]); - m_map.insert(DolphinView::PermissionsInfo, &additionalInfo[2]); - m_map.insert(DolphinView::OwnerInfo, &additionalInfo[3]); - m_map.insert(DolphinView::GroupInfo, &additionalInfo[4]); - m_map.insert(DolphinView::TypeInfo, &additionalInfo[5]); - m_map.insert(DolphinView::DestinationInfo, &additionalInfo[6]); - m_map.insert(DolphinView::PathInfo, &additionalInfo[7]); - - QMapIterator it(m_map); - while (it.hasNext()) { - it.next(); - m_infoForRole.insert(it.value()->role, it.key()); - } -} - -AdditionalInfoAccessor::~AdditionalInfoAccessor() -{ -} diff --git a/src/views/additionalinfoaccessor.h b/src/views/additionalinfoaccessor.h deleted file mode 100644 index 0fd7eed0c..000000000 --- a/src/views/additionalinfoaccessor.h +++ /dev/null @@ -1,101 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2010 by Peter Penz * - * * - * 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 * - ***************************************************************************/ - -#ifndef ADDITIONALINFOACCESSOR_H -#define ADDITIONALINFOACCESSOR_H - -#include -#include -#include - -#include -#include - -/** - * @brief Allows to access the information that is available by KFileItemDelegate::Information. - * - * The information that is available by KFileItemDelegate::Information will be shown - * in Dolphin the following way: - * - As additional columns in the details view - * - As additional lines in the icons view - * - As menu entries in the "Sort By" and "Additional Information" groups - * - As popup menu entries in the details view header popup - * - As checkable entries in the View Properties dialog - * - * The AdditionalInfoAccessor provides a central place to get all available keys, - * the corresponding translations, action names, etc., so that modifications or - * extensions in KFileItemDelegate only require adjustments in the implementation - * of this class. - */ -class LIBDOLPHINPRIVATE_EXPORT AdditionalInfoAccessor -{ -public: - enum ActionCollectionType { - /// Action collection from "View -> Sort By" - SortByType, - /// Action collection from "View -> Additional Information" - AdditionalInfoType - }; - - static AdditionalInfoAccessor& instance(); - - /** - * @return List of all available information entries of KFileItemDelegate. - * All entries of this list are keys for accessing the corresponding - * data (see actionCollectionName(), translation(), bitValue()). - */ - QList keys() const; - - QByteArray role(DolphinView::AdditionalInfo info) const; - - DolphinView::AdditionalInfo additionalInfo(const QByteArray& role) const; - - QString actionCollectionName(DolphinView::AdditionalInfo info, ActionCollectionType type) const; - - QString translation(DolphinView::AdditionalInfo info) const; - - /** - * @return String representation of the value that is stored in the .directory - * by ViewProperties. - */ - // TODO Dolphin 3.0: Deprecate - just use role() instead. - QString value(DolphinView::AdditionalInfo info) const; - - DolphinView::Sorting sorting(DolphinView::AdditionalInfo info) const; - -protected: - AdditionalInfoAccessor(); - virtual ~AdditionalInfoAccessor(); - friend class AdditionalInfoAccessorSingleton; - -private: - struct AdditionalInfo { - const char* const role; - const char* const roleTranslationContext; - const char* const roleTranslation; - const char* const value; // TODO Dolphin 3.0: Deprecate and use role instead - const DolphinView::Sorting sorting; - }; - - QMap m_map; - QHash m_infoForRole; -}; - -#endif - diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index 148459f68..e945b00eb 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -56,7 +56,7 @@ #include #include -#include "additionalinfoaccessor.h" +#include "rolesaccessor.h" #include "dolphindirlister.h" #include "dolphinnewfilemenuobserver.h" #include "dolphin_detailsmodesettings.h" @@ -72,7 +72,6 @@ namespace { const int MaxModeEnum = DolphinView::CompactView; - const int MaxSortingEnum = DolphinView::SortByPath; }; DolphinView::DolphinView(const KUrl& url, QWidget* parent) : @@ -84,7 +83,7 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : m_dragging(false), m_url(url), m_mode(DolphinView::IconsView), - m_additionalInfoList(), + m_visibleRoles(), m_topLayout(0), m_dirLister(0), m_container(0), @@ -371,17 +370,17 @@ int DolphinView::zoomLevel() const return m_container->zoomLevel(); } -void DolphinView::setSorting(Sorting sorting) +void DolphinView::setSortRole(const QByteArray& role) { - if (sorting != this->sorting()) { - updateSorting(sorting); + if (role != sortRole()) { + updateSortRole(role); } } -DolphinView::Sorting DolphinView::sorting() const +QByteArray DolphinView::sortRole() const { - KItemModelBase* model = m_container->controller()->model(); - return sortingForSortRole(model->sortRole()); + const KItemModelBase* model = m_container->controller()->model(); + return model->sortRole(); } void DolphinView::setSortOrder(Qt::SortOrder order) @@ -410,22 +409,22 @@ bool DolphinView::sortFoldersFirst() const return model->sortFoldersFirst(); } -void DolphinView::setAdditionalInfoList(const QList& info) +void DolphinView::setVisibleRoles(const QList& roles) { - const QList previousList = info; + const QList previousRoles = roles; ViewProperties props(url()); - props.setAdditionalInfoList(info); + props.setVisibleRoles(roles); - m_additionalInfoList = info; - applyAdditionalInfoListToView(); + m_visibleRoles = roles; + m_container->setVisibleRoles(roles); - emit additionalInfoListChanged(m_additionalInfoList, previousList); + emit visibleRolesChanged(m_visibleRoles, previousRoles); } -QList DolphinView::additionalInfoList() const +QList DolphinView::visibleRoles() const { - return m_additionalInfoList; + return m_visibleRoles; } void DolphinView::reload() @@ -782,43 +781,35 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos) const QSet visibleRolesSet = view->visibleRoles().toSet(); // Add all roles to the menu that can be shown or hidden by the user - const AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance(); - const QList keys = infoAccessor.keys(); - foreach (const DolphinView::AdditionalInfo info, keys) { - const QByteArray& role = infoAccessor.role(info); + const RolesAccessor& rolesAccessor = RolesAccessor::instance(); + const QList roles = rolesAccessor.roles(); + foreach (const QByteArray& role, roles) { if (role != "name") { const QString text = fileItemModel()->roleDescription(role); QAction* action = menu.data()->addAction(text); action->setCheckable(true); action->setChecked(visibleRolesSet.contains(role)); - action->setData(info); + action->setData(role); } } QAction* action = menu.data()->exec(pos.toPoint()); if (action) { // Show or hide the selected role - const DolphinView::AdditionalInfo info = - static_cast(action->data().toInt()); + const QByteArray selectedRole = action->data().toByteArray(); ViewProperties props(url()); - QList infoList = props.additionalInfoList(); - - const QByteArray selectedRole = infoAccessor.role(info); QList visibleRoles = view->visibleRoles(); - if (action->isChecked()) { - const int index = keys.indexOf(info) + 1; + const int index = roles.indexOf(selectedRole) + 1; visibleRoles.insert(index, selectedRole); - infoList.insert(index, info); } else { visibleRoles.removeOne(selectedRole); - infoList.removeOne(info); } view->setVisibleRoles(visibleRoles); - props.setAdditionalInfoList(infoList); + props.setVisibleRoles(visibleRoles); } delete menu.data(); @@ -905,15 +896,15 @@ void DolphinView::emitSelectionChangedSignal() emit selectionChanged(selectedItems()); } -void DolphinView::updateSorting(DolphinView::Sorting sorting) +void DolphinView::updateSortRole(const QByteArray& role) { ViewProperties props(url()); - props.setSorting(sorting); + props.setSortRole(role); KItemModelBase* model = m_container->controller()->model(); - model->setSortRole(sortRoleForSorting(sorting)); + model->setSortRole(role); - emit sortingChanged(sorting); + emit sortRoleChanged(role); } void DolphinView::updateSortOrder(Qt::SortOrder order) @@ -1153,10 +1144,9 @@ void DolphinView::slotSortRoleChangedByHeader(const QByteArray& current, const Q Q_ASSERT(fileItemModel()->sortRole() == current); ViewProperties props(url()); - const Sorting sorting = sortingForSortRole(current); - props.setSorting(sorting); + props.setSortRole(current); - emit sortingChanged(sorting); + emit sortRoleChanged(current); } void DolphinView::slotVisibleRolesChangedByHeader(const QList& current, @@ -1165,21 +1155,14 @@ void DolphinView::slotVisibleRolesChangedByHeader(const QList& curre Q_UNUSED(previous); Q_ASSERT(m_container->controller()->view()->visibleRoles() == current); - const QList previousAdditionalInfoList = m_additionalInfoList; + const QList previousVisibleRoles = m_visibleRoles; - m_additionalInfoList.clear(); - m_additionalInfoList.reserve(current.count()); - const AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance(); - foreach (const QByteArray& role, current) { - if (role != "name") { - m_additionalInfoList.append(infoAccessor.additionalInfo(role)); - } - } + m_visibleRoles = current; ViewProperties props(url()); - props.setAdditionalInfoList(m_additionalInfoList); + props.setVisibleRoles(m_visibleRoles); - emit additionalInfoListChanged(m_additionalInfoList, previousAdditionalInfoList); + emit visibleRolesChanged(m_visibleRoles, previousVisibleRoles); } KFileItemModel* DolphinView::fileItemModel() const @@ -1245,11 +1228,10 @@ void DolphinView::applyViewProperties() emit groupedSortingChanged(groupedSorting); } - const DolphinView::Sorting sorting = props.sorting(); - const QByteArray newSortRole = sortRoleForSorting(sorting); - if (newSortRole != model->sortRole()) { - model->setSortRole(newSortRole); - emit sortingChanged(sorting); + const QByteArray sortRole = props.sortRole(); + if (sortRole != model->sortRole()) { + model->setSortRole(sortRole); + emit sortRoleChanged(sortRole); } const Qt::SortOrder sortOrder = props.sortOrder(); @@ -1264,12 +1246,12 @@ void DolphinView::applyViewProperties() emit sortFoldersFirstChanged(sortFoldersFirst); } - const QList infoList = props.additionalInfoList(); - if (infoList != m_additionalInfoList) { - const QList previousList = m_additionalInfoList; - m_additionalInfoList = infoList; - applyAdditionalInfoListToView(); - emit additionalInfoListChanged(m_additionalInfoList, previousList); + const QList visibleRoles = props.visibleRoles(); + if (visibleRoles != m_visibleRoles) { + const QList previousVisibleRoles = m_visibleRoles; + m_visibleRoles = visibleRoles; + m_container->setVisibleRoles(visibleRoles); + emit visibleRolesChanged(m_visibleRoles, previousVisibleRoles); } const bool previewsShown = props.previewsShown(); @@ -1288,21 +1270,6 @@ void DolphinView::applyViewProperties() m_container->endTransaction(); } -void DolphinView::applyAdditionalInfoListToView() -{ - const AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance(); - - QList visibleRoles; - visibleRoles.reserve(m_additionalInfoList.count() + 1); - visibleRoles.append("name"); - - foreach (AdditionalInfo info, m_additionalInfoList) { - visibleRoles.append(infoAccessor.role(info)); - } - - m_container->setVisibleRoles(visibleRoles); -} - void DolphinView::pasteToUrl(const KUrl& url) { markPastedUrlsAsSelected(QApplication::clipboard()->mimeData()); @@ -1356,41 +1323,6 @@ void DolphinView::updateWritableState() } } -QByteArray DolphinView::sortRoleForSorting(Sorting sorting) const -{ - switch (sorting) { - case SortByName: return "name"; - case SortBySize: return "size"; - case SortByDate: return "date"; - case SortByPermissions: return "permissions"; - case SortByOwner: return "owner"; - case SortByGroup: return "group"; - case SortByType: return "type"; - case SortByDestination: return "destination"; - case SortByPath: return "path"; - default: break; - } - - return QByteArray(); -} - -DolphinView::Sorting DolphinView::sortingForSortRole(const QByteArray& sortRole) const -{ - static QHash sortHash; - if (sortHash.isEmpty()) { - sortHash.insert("name", SortByName); - sortHash.insert("size", SortBySize); - sortHash.insert("date", SortByDate); - sortHash.insert("permissions", SortByPermissions); - sortHash.insert("owner", SortByOwner); - sortHash.insert("group", SortByGroup); - sortHash.insert("type", SortByType); - sortHash.insert("destination", SortByDestination); - sortHash.insert("path", SortByPath); - } - return sortHash.value(sortRole); -} - QString DolphinView::fileSizeText(KIO::filesize_t fileSize) { const KLocale* locale = KGlobal::locale(); diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index f2f15c592..628ab2dc5 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -93,34 +93,6 @@ public: CompactView }; - /** Defines the sort order for the items of a directory. */ - enum Sorting - { - SortByName = 0, - SortBySize, - SortByDate, - SortByPermissions, - SortByOwner, - SortByGroup, - SortByType, - SortByDestination, - SortByPath - }; - - /** Defines the additional information shown for the items of a directory. */ - enum AdditionalInfo - { - NoInfo = 0, - SizeInfo, - DateInfo, - PermissionsInfo, - OwnerInfo, - GroupInfo, - TypeInfo, - DestinationInfo, - PathInfo - }; - /** * @param url Specifies the content which should be shown. * @param parent Parent widget of the view. @@ -234,29 +206,21 @@ public: */ bool isZoomOutPossible() const; - /** Sets the sorting criterion (e.g., SortByName, SortBySize,...) of the items inside a directory (see DolphinView::Sorting). */ - void setSorting(Sorting sorting); - - /** Returns the sorting criterion (e.g., SortByName, SortBySize,...) of the items inside a directory (see DolphinView::Sorting). */ - Sorting sorting() const; + void setSortRole(const QByteArray& role); + QByteArray sortRole() const; - /** Sets the sort order (Qt::Ascending or Qt::Descending) for the items. */ void setSortOrder(Qt::SortOrder order); - - /** Returns the currently used sort order (Qt::Ascending or Qt::Descending). */ Qt::SortOrder sortOrder() const; /** Sets a separate sorting with folders first (true) or a mixed sorting of files and folders (false). */ void setSortFoldersFirst(bool foldersFirst); - - /** Returns if files and folders are sorted separately or not. */ bool sortFoldersFirst() const; /** Sets the additional information which should be shown for the items. */ - void setAdditionalInfoList(const QList& info); + void setVisibleRoles(const QList& roles); /** Returns the additional information which should be shown for the items. */ - QList additionalInfoList() const; + QList visibleRoles() const; /** Reloads the current directory. */ void reload(); @@ -450,17 +414,20 @@ signals: void groupedSortingChanged(bool groupedSorting); /** Is emitted if the sorting by name, size or date has been changed. */ - void sortingChanged(DolphinView::Sorting sorting); + void sortRoleChanged(const QByteArray& role); /** Is emitted if the sort order (ascending or descending) has been changed. */ void sortOrderChanged(Qt::SortOrder order); - /** Is emitted if the sorting of files and folders (separate with folders first or mixed) has been changed. */ + /** + * Is emitted if the sorting of files and folders (separate with folders + * first or mixed) has been changed. + */ void sortFoldersFirstChanged(bool foldersFirst); /** Is emitted if the additional information shown for this view has been changed. */ - void additionalInfoListChanged(const QList& current, - const QList& previous); + void visibleRolesChanged(const QList& current, + const QList& previous); /** Is emitted if the zoom level has been changed by zooming in or out. */ void zoomLevelChanged(int current, int previous); @@ -586,9 +553,9 @@ private slots: /** * Updates the view properties of the current URL to the - * sorting given by \a sorting. + * sorting given by \a role. */ - void updateSorting(DolphinView::Sorting sorting); + void updateSortRole(const QByteArray& role); /** * Updates the view properties of the current URL to the @@ -702,8 +669,6 @@ private: */ void applyViewProperties(); - void applyAdditionalInfoListToView(); - /** * Helper method for DolphinView::paste() and DolphinView::pasteIntoFolder(). * Pastes the clipboard data into the URL \a url. @@ -737,9 +702,6 @@ private: */ void updateWritableState(); - QByteArray sortRoleForSorting(Sorting sorting) const; - Sorting sortingForSortRole(const QByteArray& sortRole) const; - /** * Returns the text for the filesize by converting it to the best fitting * unit. @@ -756,7 +718,7 @@ private: KUrl m_url; Mode m_mode; - QList m_additionalInfoList; + QList m_visibleRoles; QVBoxLayout* m_topLayout; diff --git a/src/views/dolphinviewactionhandler.cpp b/src/views/dolphinviewactionhandler.cpp index f66aebc84..f6bc1374a 100644 --- a/src/views/dolphinviewactionhandler.cpp +++ b/src/views/dolphinviewactionhandler.cpp @@ -19,7 +19,7 @@ #include "dolphinviewactionhandler.h" -#include "additionalinfoaccessor.h" +#include "rolesaccessor.h" #include "settings/viewpropertiesdialog.h" #include "views/dolphinview.h" #include "views/zoomlevelinfo.h" @@ -65,16 +65,14 @@ void DolphinViewActionHandler::setCurrentView(DolphinView* view) this, SLOT(slotSortOrderChanged(Qt::SortOrder))); connect(view, SIGNAL(sortFoldersFirstChanged(bool)), this, SLOT(slotSortFoldersFirstChanged(bool))); - connect(view, SIGNAL(additionalInfoListChanged(QList, - QList)), - this, SLOT(slotAdditionalInfoListChanged(QList, - QList))); + connect(view, SIGNAL(visibleRolesChanged(QList,QList)), + this, SLOT(slotVisibleRolesChanged(QList,QList))); connect(view, SIGNAL(groupedSortingChanged(bool)), this, SLOT(slotGroupedSortingChanged(bool))); connect(view, SIGNAL(hiddenFilesShownChanged(bool)), this, SLOT(slotHiddenFilesShownChanged(bool))); - connect(view, SIGNAL(sortingChanged(DolphinView::Sorting)), - this, SLOT(slotSortingChanged(DolphinView::Sorting))); + connect(view, SIGNAL(sortRoleChanged(QByteArray)), + this, SLOT(slotSortRoleChanged(QByteArray))); connect(view, SIGNAL(zoomLevelChanged(int,int)), this, SLOT(slotZoomLevelChanged(int,int))); } @@ -218,40 +216,37 @@ QActionGroup* DolphinViewActionHandler::createAdditionalInformationActionGroup() showInformationMenu->setText(i18nc("@action:inmenu View", "Additional Information")); showInformationMenu->setDelayed(false); - const AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance(); + const RolesAccessor& rolesAccessor = RolesAccessor::instance(); - const QList infoList = infoAccessor.keys(); - foreach (DolphinView::AdditionalInfo info, infoList) { - const QString name = infoAccessor.actionCollectionName(info, AdditionalInfoAccessor::AdditionalInfoType); + const QList roles = rolesAccessor.roles(); + foreach (const QByteArray& role, roles) { + if (role == "name") { + // It should not be possible to hide the "name" role + continue; + } + + const QString name = QLatin1String("show_") + role; KToggleAction* action = m_actionCollection->add(name); - action->setText(infoAccessor.translation(info)); - action->setData(info); + action->setText(rolesAccessor.translation(role)); + action->setData(role); action->setActionGroup(additionalInfoGroup); } return additionalInfoGroup; } -Q_DECLARE_METATYPE(DolphinView::Sorting) - QActionGroup* DolphinViewActionHandler::createSortByActionGroup() { QActionGroup* sortByActionGroup = new QActionGroup(m_actionCollection); sortByActionGroup->setExclusive(true); - KToggleAction* sortByName = m_actionCollection->add("sort_by_name"); - sortByName->setText(i18nc("@action:inmenu Sort By", "Name")); - sortByName->setData(QVariant::fromValue(DolphinView::SortByName)); - sortByActionGroup->addAction(sortByName); - - const AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance(); - const QList infoList = infoAccessor.keys(); - foreach (DolphinView::AdditionalInfo info, infoList) { - const QString name = infoAccessor.actionCollectionName(info, AdditionalInfoAccessor::SortByType); + const RolesAccessor& rolesAccessor = RolesAccessor::instance(); + const QList roles = rolesAccessor.roles(); + foreach (const QByteArray& role, roles) { + const QString name = QLatin1String("sort_by_") + role; KToggleAction* action = m_actionCollection->add(name); - action->setText(infoAccessor.translation(info)); - const DolphinView::Sorting sorting = infoAccessor.sorting(info); - action->setData(QVariant::fromValue(sorting)); + action->setText(rolesAccessor.translation(role)); + action->setData(role); sortByActionGroup->addAction(action); } @@ -342,9 +337,9 @@ void DolphinViewActionHandler::updateViewActions() slotSortOrderChanged(m_currentView->sortOrder()); slotSortFoldersFirstChanged(m_currentView->sortFoldersFirst()); - slotAdditionalInfoListChanged(m_currentView->additionalInfoList(), QList()); + slotVisibleRolesChanged(m_currentView->visibleRoles(), QList()); slotGroupedSortingChanged(m_currentView->groupedSorting()); - slotSortingChanged(m_currentView->sorting()); + slotSortRoleChanged(m_currentView->sortRole()); slotZoomLevelChanged(m_currentView->zoomLevel(), -1); QAction* showHiddenFilesAction = m_actionCollection->action("show_hidden_files"); @@ -395,40 +390,40 @@ void DolphinViewActionHandler::toggleAdditionalInfo(QAction* action) { emit actionBeingHandled(); - const DolphinView::AdditionalInfo info = - static_cast(action->data().toInt()); + const QByteArray toggledRole = action->data().toByteArray(); - QList list = m_currentView->additionalInfoList(); + QList roles = m_currentView->visibleRoles(); const bool show = action->isChecked(); - const int index = list.indexOf(info); + const int index = roles.indexOf(toggledRole); const bool containsInfo = (index >= 0); if (show && !containsInfo) { - list.append(info); - m_currentView->setAdditionalInfoList(list); + roles.append(toggledRole); + m_currentView->setVisibleRoles(roles); } else if (!show && containsInfo) { - list.removeAt(index); - m_currentView->setAdditionalInfoList(list); - Q_ASSERT(list.indexOf(info) < 0); + roles.removeAt(index); + m_currentView->setVisibleRoles(roles); + Q_ASSERT(roles.indexOf(toggledRole) < 0); } } -void DolphinViewActionHandler::slotAdditionalInfoListChanged(const QList& current, - const QList& previous) +void DolphinViewActionHandler::slotVisibleRolesChanged(const QList& current, + const QList& previous) { Q_UNUSED(previous); - const AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance(); + const RolesAccessor& rolesAccessor = RolesAccessor::instance(); - const QList checkedInfo = current; - const QList infoList = infoAccessor.keys(); + const QSet checkedRoles = current.toSet(); + const QList roles = rolesAccessor.roles(); - foreach (DolphinView::AdditionalInfo info, infoList) { - const QString name = infoAccessor.actionCollectionName(info, AdditionalInfoAccessor::AdditionalInfoType); + foreach (const QByteArray& role, roles) { + const QString name = QLatin1String("show_") + role; QAction* action = m_actionCollection->action(name); - Q_ASSERT(action); - action->setChecked(checkedInfo.contains(info)); + if (action) { + action->setChecked(checkedRoles.contains(role)); + } } } @@ -488,23 +483,10 @@ KToggleAction* DolphinViewActionHandler::detailsModeAction() return detailsView; } -void DolphinViewActionHandler::slotSortingChanged(DolphinView::Sorting sorting) +void DolphinViewActionHandler::slotSortRoleChanged(const QByteArray& role) { - QAction* action = 0; - if (sorting == DolphinView::SortByName) { - action = m_actionCollection->action("sort_by_name"); - } else { - const AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance(); - const QList infoList = infoAccessor.keys(); - foreach (DolphinView::AdditionalInfo info, infoList) { - if (sorting == infoAccessor.sorting(info)) { - const QString name = infoAccessor.actionCollectionName(info, AdditionalInfoAccessor::SortByType); - action = m_actionCollection->action(name); - break; - } - } - } - + const QString name = QLatin1String("sort_by_") + role; + QAction* action = m_actionCollection->action(name); if (action) { action->setChecked(true); @@ -530,8 +512,8 @@ void DolphinViewActionHandler::slotZoomLevelChanged(int current, int previous) void DolphinViewActionHandler::slotSortTriggered(QAction* action) { - const DolphinView::Sorting sorting = action->data().value(); - m_currentView->setSorting(sorting); + const QByteArray role = action->data().toByteArray(); + m_currentView->setSortRole(role); } void DolphinViewActionHandler::slotAdjustViewProperties() diff --git a/src/views/dolphinviewactionhandler.h b/src/views/dolphinviewactionhandler.h index 647c6390c..ff72d9530 100644 --- a/src/views/dolphinviewactionhandler.h +++ b/src/views/dolphinviewactionhandler.h @@ -151,7 +151,7 @@ private Q_SLOTS: /** * Updates the state of the 'Sort by' actions. */ - void slotSortingChanged(DolphinView::Sorting sorting); + void slotSortRoleChanged(const QByteArray& role); /** * Updates the state of the 'Zoom In' and 'Zoom Out' actions. @@ -172,8 +172,8 @@ private Q_SLOTS: /** * Updates the state of the 'Additional Information' actions. */ - void slotAdditionalInfoListChanged(const QList& current, - const QList& previous); + void slotVisibleRolesChanged(const QList& current, + const QList& previous); /** * Switches between sorting by groups or not. diff --git a/src/views/rolesaccessor.cpp b/src/views/rolesaccessor.cpp new file mode 100644 index 000000000..3309f0eff --- /dev/null +++ b/src/views/rolesaccessor.cpp @@ -0,0 +1,72 @@ +/*************************************************************************** + * Copyright (C) 2010 by Peter Penz * + * * + * 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 * + ***************************************************************************/ + +#include "rolesaccessor.h" + +#include +#include + +class RolesAccessorSingleton +{ +public: + RolesAccessor instance; +}; +K_GLOBAL_STATIC(RolesAccessorSingleton, s_rolesAccessor) + +RolesAccessor& RolesAccessor::instance() +{ + return s_rolesAccessor->instance; +} + +QList RolesAccessor::roles() const +{ + return m_roles; +} + +QString RolesAccessor::translation(const QByteArray& role) const +{ + return i18nc(m_translation[role]->roleTranslationContext, m_translation[role]->roleTranslation); +} + +RolesAccessor::RolesAccessor() : + m_roles(), + m_translation() +{ + static const RolesAccessor::Translation translations[] = { + // role roleTranslationContext roleTranslation + { "name", I18N_NOOP2_NOSTRIP("@label", "Name") }, + { "size", I18N_NOOP2_NOSTRIP("@label", "Size") }, + { "date", I18N_NOOP2_NOSTRIP("@label", "Date") }, + { "permissions", I18N_NOOP2_NOSTRIP("@label", "Permissions") }, + { "owner", I18N_NOOP2_NOSTRIP("@label", "Owner") }, + { "group", I18N_NOOP2_NOSTRIP("@label", "Group") }, + { "type", I18N_NOOP2_NOSTRIP("@label", "Type") }, + { "destination", I18N_NOOP2_NOSTRIP("@label", "Link Destination") }, + { "path", I18N_NOOP2_NOSTRIP("@label", "Path") } + }; + + for (unsigned int i = 0; i < sizeof(translations) / sizeof(Translation); ++i) { + m_translation.insert(translations[i].role, &translations[i]); + m_roles.append(translations[i].role); + } +} + +RolesAccessor::~RolesAccessor() +{ +} diff --git a/src/views/rolesaccessor.h b/src/views/rolesaccessor.h new file mode 100644 index 000000000..3c95541d8 --- /dev/null +++ b/src/views/rolesaccessor.h @@ -0,0 +1,64 @@ +/*************************************************************************** + * Copyright (C) 2010 by Peter Penz * + * * + * 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 * + ***************************************************************************/ + +#ifndef ROLESACCESSOR_H +#define ROLESACCESSOR_H + +#include + +#include +#include + +/** + * @brief Allows to access the available roles that can be shown in a view. + */ +class LIBDOLPHINPRIVATE_EXPORT RolesAccessor +{ +public: + static RolesAccessor& instance(); + + /** + * @return List of all available roles. + */ + QList roles() const; + + /** + * @return Translation of the role that can be shown e.g. in the header + * of a view or as menu-entry. + */ + QString translation(const QByteArray& role) const; + +protected: + RolesAccessor(); + virtual ~RolesAccessor(); + friend class RolesAccessorSingleton; + +private: + struct Translation { + const char* const role; + const char* const roleTranslationContext; + const char* const roleTranslation; + }; + + QList m_roles; + QHash m_translation; +}; + +#endif + diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp index 36ec6bdb0..e7b0f9c55 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" @@ -36,7 +36,7 @@ namespace { // 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"; } @@ -81,7 +81,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 @@ -159,17 +159,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) @@ -198,51 +198,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)); + foreach (const QByteArray& role, roles) { + newVisibleRoles.append(prefix + role); } - if (oldInfoStringList != newInfoStringList) { + 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 @@ -251,47 +249,34 @@ 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"; + const QStringList visibleRoles = m_node->visibleRoles(); + 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) @@ -300,10 +285,10 @@ void ViewProperties::setDirProperties(const ViewProperties& props) setPreviewsShown(props.previewsShown()); setHiddenFilesShown(props.hiddenFilesShown()); setGroupedSorting(props.groupedSorting()); - setSorting(props.sorting()); + setSortRole(props.sortRole()); setSortOrder(props.sortOrder()); setSortFoldersFirst(props.sortFoldersFirst()); - setAdditionalInfoList(props.additionalInfoList()); + setVisibleRoles(props.visibleRoles()); } void ViewProperties::setAutoSaveEnabled(bool autoSave) diff --git a/src/views/viewproperties.h b/src/views/viewproperties.h index 50b3b3f1e..b46249eb2 100644 --- a/src/views/viewproperties.h +++ b/src/views/viewproperties.h @@ -65,8 +65,8 @@ public: void setGroupedSorting(bool grouped); bool groupedSorting() const; - void setSorting(DolphinView::Sorting sorting); - DolphinView::Sorting sorting() const; + void setSortRole(const QByteArray& role); + QByteArray sortRole() const; void setSortOrder(Qt::SortOrder sortOrder); Qt::SortOrder sortOrder() const; @@ -79,14 +79,14 @@ public: * Note that the additional-info property is the only property where * the value is dependent from another property (in this case the view-mode). */ - void setAdditionalInfoList(const QList& info); + void setVisibleRoles(const QList& info); /** * Returns the additional information for the current set view-mode. * Note that the additional-info property is the only property where * the value is dependent from another property (in this case the view-mode). */ - QList additionalInfoList() const; + QList visibleRoles() const; /** * Sets the directory properties view mode, show preview, -- 2.47.3