From 2ba5c2cfc2cea534cccd860f94a7198530b83594 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Sun, 11 Mar 2012 19:02:45 +0100 Subject: 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/settings/additionalinfodialog.cpp | 28 ++++++------ src/settings/additionalinfodialog.h | 9 ++-- src/settings/applyviewpropsjob.cpp | 2 +- .../dolphin_directoryviewpropertysettings.kcfg | 8 ++-- src/settings/viewpropertiesdialog.cpp | 50 +++++++++++----------- 5 files changed, 48 insertions(+), 49 deletions(-) (limited to 'src/settings') 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 -- cgit v1.3