this, SLOT(slotSortingChanged(DolphinView::Sorting)));
connect(view, SIGNAL(sortOrderChanged(Qt::SortOrder)),
this, SLOT(slotSortOrderChanged(Qt::SortOrder)));
+ connect(view, SIGNAL(sortFoldersFirstChanged(bool)),
+ this, SLOT(slotSortFoldersFirstChanged(bool)));
connect(view, SIGNAL(showHiddenFilesChanged()),
this, SLOT(slotShowHiddenFilesChanged()));
connect(view, SIGNAL(showPreviewChanged()),
}
}
+void DolphinColumnView::slotSortFoldersFirstChanged(bool foldersFirst)
+{
+ foreach (DolphinColumnWidget* column, m_columns) {
+ column->setSortFoldersFirst(foldersFirst);
+ }
+}
+
void DolphinColumnView::slotShowHiddenFilesChanged()
{
const bool show = m_controller->dolphinView()->showHiddenFiles();
void slotSortingChanged(DolphinView::Sorting sorting);
void slotSortOrderChanged(Qt::SortOrder order);
+ void slotSortFoldersFirstChanged(bool foldersFirst);
void slotShowHiddenFilesChanged();
void slotShowPreviewChanged();
const DolphinView* dolphinView = m_view->m_controller->dolphinView();
m_proxyModel->setSorting(dolphinView->sorting());
m_proxyModel->setSortOrder(dolphinView->sortOrder());
+ m_proxyModel->setSortFoldersFirst(dolphinView->sortFoldersFirst());
setModel(m_proxyModel);
m_proxyModel->setSortOrder(order);
}
+void DolphinColumnWidget::setSortFoldersFirst(bool foldersFirst)
+{
+ m_proxyModel->setSortFoldersFirst(foldersFirst);
+}
+
void DolphinColumnWidget::setShowHiddenFiles(bool show)
{
if (show != m_dirLister->showingDotFiles()) {
void setSorting(DolphinView::Sorting sorting);
void setSortOrder(Qt::SortOrder order);
+ void setSortFoldersFirst(bool foldersFirst);
void setShowHiddenFiles(bool show);
void setShowPreview(bool show);
emit sortOrderChanged(order);
}
+void DolphinController::indicateSortFoldersFirstChange(bool foldersFirst)
+{
+ emit sortFoldersFirstChanged(foldersFirst);
+}
+
void DolphinController::indicateAdditionalInfoChange(const KFileItemDelegate::InformationList& info)
{
emit additionalInfoChanged(info);
* - indicateDroppedUrls()
* - indicateSortingChange()
* - indicateSortOrderChanged()
+ * - indicateSortFoldersFirstChanged()
* - triggerItem()
* - requestTab()
* - handleKeyPressEvent()
*/
void indicateSortOrderChange(Qt::SortOrder order);
+ /**
+ * Informs the abstract Dolphin view about a change between separate sorting
+ * (with folders first) and mixed sorting of files and folders done inside
+ * the view implementation. This method should be invoked by the view
+ * implementation (e. g. the details view uses this method in combination
+ * with the details header).
+ */
+ void indicateSortFoldersFirstChange(bool foldersFirst);
+
/**
* Informs the abstract Dolphin view about an additional information change
* done inside the view implementation. This method should be invoked by the
*/
void sortOrderChanged(Qt::SortOrder order);
+ /**
+ * Is emitted if 'sort folders first' has been changed to \a foldersFirst
+ * by the view implementation (see indicateSortOrderChanged().
+ * The abstract Dolphin view connects
+ * to this signal to update its menu actions.
+ */
+ void sortFoldersFirstChanged(bool foldersFirst);
+
/**
* Is emitted if the additional info has been changed to \a info
* by the view implementation. The abstract Dolphin view connects
<Action name="sort_by_tags" />
<Separator/>
<Action name="descending" />
+ <Action name="folders_first" />
</Menu>
<Menu name="additional_info">
<text context="@title:menu">Additional Information</text>
KDirSortFilterProxyModel::sort((int) m_sorting, m_sortOrder);
}
+void DolphinSortFilterProxyModel::setSortFoldersFirst(bool foldersFirst)
+{
+ if (foldersFirst != sortFoldersFirst()) {
+ KDirSortFilterProxyModel::setSortFoldersFirst(foldersFirst);
+
+ // We need to make sure that the files and folders are really resorted.
+ // Without the following two lines, QSortFilterProxyModel::sort(int column, Qt::SortOrder order)
+ // would do nothing because neither the column nor the sort order have changed.
+ // TODO: remove this hack if we find a better way to force the ProxyModel to re-sort the data.
+ Qt::SortOrder tmpSortOrder = (m_sortOrder == Qt::AscendingOrder ? Qt::DescendingOrder : Qt::AscendingOrder);
+ KDirSortFilterProxyModel::sort((int) m_sorting, tmpSortOrder);
+
+ // Now comes the real sorting with the old column and sort order
+ KDirSortFilterProxyModel::sort((int) m_sorting, m_sortOrder);
+ }
+}
+
void DolphinSortFilterProxyModel::sort(int column, Qt::SortOrder sortOrder)
{
m_sorting = sortingForColumn(column);
void setSortOrder(Qt::SortOrder sortOrder);
Qt::SortOrder sortOrder() const;
+ void setSortFoldersFirst(bool foldersFirst);
+
/**
* @reimplemented, @internal
*
<Action name="sort_by_tags" />
<Separator/>
<Action name="descending" />
+ <Action name="folders_first" />
</Menu>
<Menu name="additional_info">
<text context="@title:menu">Additional Information</text>
this, SLOT(updateSorting(DolphinView::Sorting)));
connect(m_controller, SIGNAL(sortOrderChanged(Qt::SortOrder)),
this, SLOT(updateSortOrder(Qt::SortOrder)));
+ connect(m_controller, SIGNAL(sortFoldersFirstChanged(bool)),
+ this, SLOT(updateSortFoldersFirst(bool)));
connect(m_controller, SIGNAL(additionalInfoChanged(const KFileItemDelegate::InformationList&)),
this, SLOT(updateAdditionalInfo(const KFileItemDelegate::InformationList&)));
connect(m_controller, SIGNAL(itemTriggered(const KFileItem&)),
return m_proxyModel->sortOrder();
}
+void DolphinView::setSortFoldersFirst(bool foldersFirst)
+{
+ if (sortFoldersFirst() != foldersFirst) {
+ updateSortFoldersFirst(foldersFirst);
+ }
+}
+
+bool DolphinView::sortFoldersFirst() const
+{
+ return m_proxyModel->sortFoldersFirst();
+}
+
void DolphinView::setAdditionalInfo(KFileItemDelegate::InformationList info)
{
const KUrl viewPropsUrl = viewPropertiesUrl();
setSortOrder(order);
}
+void DolphinView::toggleSortFoldersFirst()
+{
+ setSortFoldersFirst(!sortFoldersFirst());
+}
+
void DolphinView::toggleAdditionalInfo(QAction* action)
{
const KFileItemDelegate::Information info =
emit sortOrderChanged(order);
}
+void DolphinView::updateSortFoldersFirst(bool foldersFirst)
+{
+ ViewProperties props(viewPropertiesUrl());
+ props.setSortFoldersFirst(foldersFirst);
+
+ m_proxyModel->setSortFoldersFirst(foldersFirst);
+
+ emit sortFoldersFirstChanged(foldersFirst);
+}
+
void DolphinView::updateAdditionalInfo(const KFileItemDelegate::InformationList& info)
{
ViewProperties props(viewPropertiesUrl());
emit sortOrderChanged(sortOrder);
}
+ const bool sortFoldersFirst = props.sortFoldersFirst();
+ if (sortFoldersFirst != m_proxyModel->sortFoldersFirst()) {
+ m_proxyModel->setSortFoldersFirst(sortFoldersFirst);
+ emit sortFoldersFirstChanged(sortFoldersFirst);
+ }
+
KFileItemDelegate::InformationList info = props.additionalInfo();
if (info != m_fileItemDelegate->showInformation()) {
m_fileItemDelegate->setShowInformation(info);
/** Returns the current 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 setAdditionalInfo(KFileItemDelegate::InformationList info);
/** Switches between an ascending and descending sorting order. */
void toggleSortOrder();
+ /** Switches between a separate sorting (with folders first) and a mixed sorting of files and folders. */
+ void toggleSortFoldersFirst();
+
/**
* Switches on or off the displaying of additional information
* as specified by \a action.
/** 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. */
+ void sortFoldersFirstChanged(bool foldersFirst);
+
/** Is emitted if the additional information shown for this view has been changed. */
void additionalInfoChanged();
*/
void updateSortOrder(Qt::SortOrder order);
+ /**
+ * Updates the view properties of the current URL to the
+ * sorting of files and folders (separate with folders first or mixed) given by \a foldersFirst.
+ */
+ void updateSortFoldersFirst(bool foldersFirst);
+
/**
* Updates the view properties of the current URL to the
* additional information given by \a info.
this, SLOT(slotShowPreviewChanged()));
connect(view, SIGNAL(sortOrderChanged(Qt::SortOrder)),
this, SLOT(slotSortOrderChanged(Qt::SortOrder)));
+ connect(view, SIGNAL(sortFoldersFirstChanged(bool)),
+ this, SLOT(slotSortFoldersFirstChanged(bool)));
connect(view, SIGNAL(additionalInfoChanged()),
this, SLOT(slotAdditionalInfoChanged()));
connect(view, SIGNAL(categorizedSortingChanged()),
sortDescending->setText(i18nc("@action:inmenu Sort", "Descending"));
connect(sortDescending, SIGNAL(triggered()), this, SLOT(toggleSortOrder()));
+ KToggleAction* sortFoldersFirst = m_actionCollection->add<KToggleAction>("folders_first");
+ sortFoldersFirst->setText(i18nc("@action:inmenu Sort", "Folders First"));
+ connect(sortFoldersFirst, SIGNAL(triggered()), this, SLOT(toggleSortFoldersFirst()));
+
QActionGroup* sortByActionGroup = createSortByActionGroup();
connect(sortByActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(slotSortTriggered(QAction*)));
showPreviewAction->setChecked(m_currentView->showPreview());
slotSortOrderChanged(m_currentView->sortOrder());
+ slotSortFoldersFirstChanged(m_currentView->sortFoldersFirst());
slotAdditionalInfoChanged();
slotCategorizedSortingChanged();
slotSortingChanged(m_currentView->sorting());
m_currentView->toggleSortOrder();
}
+void DolphinViewActionHandler::toggleSortFoldersFirst()
+{
+ m_currentView->toggleSortFoldersFirst();
+}
+
void DolphinViewActionHandler::slotSortOrderChanged(Qt::SortOrder order)
{
QAction* descending = m_actionCollection->action("descending");
descending->setChecked(sortDescending);
}
+void DolphinViewActionHandler::slotSortFoldersFirstChanged(bool foldersFirst)
+{
+ m_actionCollection->action("folders_first")->setChecked(foldersFirst);
+}
+
void DolphinViewActionHandler::toggleAdditionalInfo(QAction* action)
{
emit actionBeingHandled();
/** Switches between an ascending and descending sorting order. */
void toggleSortOrder();
+ /** Switches between a separate sorting and a mixed sorting of files and folders. */
+ void toggleSortFoldersFirst();
+
/**
* Updates the state of the 'Sort Ascending/Descending' action.
*/
void slotSortOrderChanged(Qt::SortOrder order);
+ /**
+ * Updates the state of the 'Sort Folders First' action.
+ */
+ void slotSortFoldersFirstChanged(bool foldersFirst);
+
/**
* Updates the state of the 'Sort by' actions.
*/
<max code="true">Qt::DescendingOrder</max>
</entry>
+ <entry name="SortFoldersFirst" type="Bool" >
+ <label context="@label">Show folders first when sorting files and folders</label>
+ <default>true</default>
+ </entry>
+
<entry name="AdditionalInfo" type="Int">
<label context="@label">Additional information</label>
<default>0</default>
m_viewMode(0),
m_sortOrder(0),
m_sorting(0),
+ m_sortFoldersFirst(0),
m_showPreview(0),
m_showInGroups(0),
m_showHiddenFiles(0),
// m_sorting->addItem(i18nc("@item:inlistbox Sort", "By Tags"));
// }
#endif
+ m_sortFoldersFirst = new QCheckBox(i18nc("@option:check", "Show folders first"));
m_showPreview = new QCheckBox(i18nc("@option:check", "Show preview"));
m_showInGroups = new QCheckBox(i18nc("@option:check", "Show in groups"));
m_showHiddenFiles = new QCheckBox(i18nc("@option:check", "Show hidden files"));
QVBoxLayout* propsBoxLayout = new QVBoxLayout(propsBox);
propsBoxLayout->addWidget(propsGrid);
+ propsBoxLayout->addWidget(m_sortFoldersFirst);
propsBoxLayout->addWidget(m_showPreview);
propsBoxLayout->addWidget(m_showInGroups);
propsBoxLayout->addWidget(m_showHiddenFiles);
this, SLOT(slotSortOrderChanged(int)));
connect(m_additionalInfo, SIGNAL(clicked()),
this, SLOT(configureAdditionalInfo()));
+ connect(m_sortFoldersFirst, SIGNAL(clicked()),
+ this, SLOT(slotSortFoldersFirstChanged()));
connect(m_showPreview, SIGNAL(clicked()),
this, SLOT(slotShowPreviewChanged()));
connect(m_showInGroups, SIGNAL(clicked()),
markAsDirty(true);
}
+void ViewPropertiesDialog::slotSortFoldersFirstChanged()
+{
+ const bool foldersFirst = m_sortFoldersFirst->isChecked();
+ m_viewProps->setSortFoldersFirst(foldersFirst);
+ markAsDirty(true);
+}
+
void ViewPropertiesDialog::slotShowPreviewChanged()
{
const bool show = m_showPreview->isChecked();
m_dolphinView->setMode(m_viewProps->viewMode());
m_dolphinView->setSorting(m_viewProps->sorting());
m_dolphinView->setSortOrder(m_viewProps->sortOrder());
+ m_dolphinView->setSortFoldersFirst(m_viewProps->sortFoldersFirst());
m_dolphinView->setCategorizedSorting(m_viewProps->categorizedSorting());
m_dolphinView->setAdditionalInfo(m_viewProps->additionalInfo());
m_dolphinView->setShowPreview(m_viewProps->showPreview());
(index == DolphinView::IconsView);
m_additionalInfo->setEnabled(enabled);
+ m_sortFoldersFirst->setChecked(m_viewProps->sortFoldersFirst());
// load show preview, show in groups and show hidden files settings
m_showPreview->setChecked(m_viewProps->showPreview());
void slotSortingChanged(int index);
void slotSortOrderChanged(int index);
void slotCategorizedSortingChanged();
+ void slotSortFoldersFirstChanged();
void slotShowPreviewChanged();
void slotShowHiddenFilesChanged();
void markAsDirty(bool isDirty);
KComboBox* m_viewMode;
KComboBox* m_sortOrder;
KComboBox* m_sorting;
+ QCheckBox* m_sortFoldersFirst;
QCheckBox* m_showPreview;
QCheckBox* m_showInGroups;
QCheckBox* m_showHiddenFiles;
return static_cast<Qt::SortOrder>(m_node->sortOrder());
}
+void ViewProperties::setSortFoldersFirst(bool foldersFirst)
+{
+ if (m_node->sortFoldersFirst() != foldersFirst) {
+ m_node->setSortFoldersFirst(foldersFirst);
+ updateTimeStamp();
+ }
+}
+
+bool ViewProperties::sortFoldersFirst() const
+{
+ return m_node->sortFoldersFirst();
+}
+
void ViewProperties::setAdditionalInfo(KFileItemDelegate::InformationList list)
{
int info = NoInfo;
void setSortOrder(Qt::SortOrder sortOrder);
Qt::SortOrder sortOrder() const;
+ void setSortFoldersFirst(bool foldersFirst);
+ bool sortFoldersFirst() const;
+
/**
* Sets the additional information for the current set view-mode.
* Note that the additional-info property is the only property where