From 9cd504156b4fff688cd427af7244f6522f2e5da8 Mon Sep 17 00:00:00 2001 From: Vincent Reher Date: Tue, 2 Nov 2021 09:11:34 -0700 Subject: Introduce additional sorting / grouping options and actions for Konqueror listviews, available through new submenu: View => Sort Options: (1) "Group Directories First" - Toggle on/off option to group directories before non-directories. Comparable to iconview's "Folders First" option. (2) "Group Hidden First" - Toggle on/off option to group hidden entities (aka dotfiles) before non-hidden. Option-related settings are stored in config/konqlistviewrc Actions: (1) "Reverse Sort Order" - Toggle sort order of the current sort column. Action bound to key Ctrl+R. (2) "Alternate Sort Order" - Toggle sorting between 2 most recent sort columns selected by mouse click. The existing sort order for the sort columns is preserved. Action bound to key Ctrl+S. Action-related settings are stored in config/konquerorrc/[Listview_file] Signed-off-by: Vincent Reher Signed-off-by: Michele Calgaro --- konqueror/listview/konq_listview.cpp | 231 ++++++++++++++++++++++++++++++++++- 1 file changed, 230 insertions(+), 1 deletion(-) (limited to 'konqueror/listview/konq_listview.cpp') diff --git a/konqueror/listview/konq_listview.cpp b/konqueror/listview/konq_listview.cpp index 67da49c6d..f8307e84c 100644 --- a/konqueror/listview/konq_listview.cpp +++ b/konqueror/listview/konq_listview.cpp @@ -268,6 +268,8 @@ KonqListView::KonqListView( TQWidget *parentWidget, TQObject *parent, const char m_mimeTypeResolver = new KMimeTypeResolver(this); setXMLFile( xmlFile ); + m_sortColumnIndexPrimary = 0; + m_sortColumnIndexAlternate = 1; setupActions(); @@ -285,7 +287,6 @@ KonqListView::KonqListView( TQWidget *parentWidget, TQObject *parent, const char // Note: File Type is in fact the mimetype comment. We use UDS_FILE_TYPE but that's not what we show in fact :/ m_pListView->confColumns[10].setData(I18N_NOOP("File Type"),"Type",TDEIO::UDS_FILE_TYPE,m_paShowType); - connect( m_pListView, TQT_SIGNAL( selectionChanged() ), m_extension, TQT_SLOT( updateActions() ) ); connect( m_pListView, TQT_SIGNAL( selectionChanged() ), @@ -538,6 +539,9 @@ void KonqListView::slotColumnToggled() // Update column sizes slotHeaderSizeChanged(); + + // Columns may have been rearranged, so do this to be safe: + resetSortConfig(); } void KonqListView::slotHeaderClicked(int sec) @@ -560,15 +564,224 @@ void KonqListView::slotHeaderClicked(int sec) m_pListView->setAscending(TRUE); } else + { m_pListView->setAscending(!m_pListView->ascending()); + } + checkSortConfig() ; KonqListViewSettings config( m_pListView->url().protocol() ); config.readConfig(); + + if (sec == m_sortColumnIndexPrimary) { + kdDebug(1202)<<"Changing sort order on primary sort column"<ascending(); + config.setPrimarySortOrder(m_pListView->ascending()); + } + else if (sec == m_sortColumnIndexAlternate) { + kdDebug(1202)<<"Changing sort order on alternate sort column"<ascending(); + config.setAlternateSortOrder(m_pListView->ascending()); + } + else if ( toggleColumnAlternate ) { + kdDebug(1202)<<"Setting new alternate sort column"<ascending() ); config.writeConfig(); } +void KonqListView::resetSortConfig() +{ + int defaultVisibleColumn; + int columnNumber; + + defaultVisibleColumn = 0; // First visible column from left + columnNumber = -1; + for (uint i = 0; i < m_pListView->NumberOfAtoms; i++) { + if (m_pListView->confColumns[i].displayInColumn == defaultVisibleColumn) { + columnNumber = i; + } + } + if (columnNumber == -1) { + // This should not happen! + kdDebug() << "We did not find columnNumber" <confColumns[columnNumber].desktopFileName; + } + + defaultVisibleColumn = 1 ; // Second visible column from left + columnNumber = -1; + for (uint i = 0; i < m_pListView->NumberOfAtoms; i++) { + if (m_pListView->confColumns[i].displayInColumn == defaultVisibleColumn) { + columnNumber = i; + } + } + if (columnNumber == -1) { + // This should not happen! + kdDebug() << "We did not find columnNumber" <confColumns[columnNumber].desktopFileName; + } + + m_sortColumnOrderPrimary = true ; + m_sortColumnOrderAlternate = true ; + + kdDebug(1202) << "Initialized m_sortColumnIndexPrimary to " <url().protocol() ); + config.setPrimarySortCol(m_sortColumnNamePrimary); + config.setPrimarySortIndex(m_sortColumnIndexPrimary); + config.setPrimarySortOrder(m_sortColumnOrderPrimary); + config.setAlternateSortCol(m_sortColumnNameAlternate); + config.setAlternateSortIndex(m_sortColumnIndexAlternate); + config.setAlternateSortOrder(m_sortColumnOrderAlternate); + config.writeConfig() ; +} + +void KonqListView::checkSortConfig() +{ + KonqListViewSettings config( m_pListView->url().protocol() ); + config.readConfig(); + + m_sortColumnIndexPrimary = config.primarySortIndex(); + m_sortColumnNamePrimary = config.primarySortCol(); + m_sortColumnOrderPrimary = config.primarySortOrder(); + + m_sortColumnIndexAlternate = config.alternateSortIndex(); + m_sortColumnNameAlternate = config.alternateSortCol(); + m_sortColumnOrderAlternate = config.alternateSortOrder(); + + if (m_sortColumnIndexPrimary >= 0 && m_sortColumnIndexAlternate >= 0) + return ; + + resetSortConfig(); +} + +#define LV_SORT_CHANGE_COLUMN 1 +#define LV_SORT_CHANGE_ORDER 2 + +void KonqListView::sortListView(uint which) +{ + TQString sortColumnNameCurrent = m_pListView->sortedByColumn; + if (sortColumnNameCurrent == "" ) { + sortColumnNameCurrent = "FileName" ; + m_pListView->sortedByColumn = sortColumnNameCurrent ; + } + TQString sortColumnNameNext; + int sortColumnIndex; + bool sortOrder; + + checkSortConfig() ; + KonqListViewSettings config( m_pListView->url().protocol() ); + config.readConfig(); + + switch (which) + { + case LV_SORT_CHANGE_COLUMN: + if (m_sortColumnNamePrimary == sortColumnNameCurrent) + { + sortColumnNameNext = m_sortColumnNameAlternate; + sortColumnIndex = m_sortColumnIndexAlternate; + sortOrder = m_sortColumnOrderAlternate; + kdDebug(1202) << "Changing sort column to alternate"<setSorting( sortColumnIndex, sortOrder ); + m_pListView->sortedByColumn = sortColumnNameNext; + config.setSortBy( sortColumnNameNext ); + break; + + case LV_SORT_CHANGE_ORDER: + sortOrder = !m_pListView->ascending(); + + if ( m_sortColumnNamePrimary == sortColumnNameCurrent ) + { + sortColumnIndex = m_sortColumnIndexPrimary; + m_sortColumnOrderPrimary = sortOrder; + config.setPrimarySortOrder( sortOrder ); + kdDebug(1202) << "Changing sort order of primary"<setAscending(sortOrder) ; + config.setSortOrder(sortOrder); + m_pListView->setSorting( sortColumnIndex, sortOrder ); + break; + + default: + // Do nothing in case of invalid call + return; + } + + m_pListView->sort(); + + config.writeConfig(); +} + +void KonqListView::slotSortAlternate() +{ + KonqListView::sortListView(LV_SORT_CHANGE_COLUMN); +} + +void KonqListView::slotSortReverse() +{ + KonqListView::sortListView(LV_SORT_CHANGE_ORDER); +} + +void KonqListView::slotToggleDisplayDirectoriesFirst() +{ + m_pProps->setDirsFirst( m_paDisplayDirectoriesFirst->isChecked() ); + m_pListView->updateListContents(); + m_pListView->sort(); +} + +void KonqListView::slotToggleDisplayHiddenFirst() +{ + m_pProps->setHiddenFirst( m_paDisplayHiddenFirst->isChecked() ); + m_pListView->updateListContents(); + m_pListView->sort(); +} + void KonqListView::headerDragged(int sec, int from, int to) { kdDebug(1202)<<"section: "<setCheckedState(i18n("Hide &Hidden Files")); m_paCaseInsensitive = new TDEToggleAction(i18n("Case Insensitive Sort"), 0, this, TQT_SLOT(slotCaseInsensitive()),actionCollection(), "sort_caseinsensitive" ); + m_paSortAlternate = new TDEAction( i18n( "&Alternate Sort Order" ), CTRL+Key_S, this, + TQT_SLOT( slotSortAlternate() ), actionCollection(), "alternate_sort_order"); + m_paSortReverse = new TDEAction( i18n( "&Reverse Sort Order" ), CTRL+Key_R, this, + TQT_SLOT( slotSortReverse() ), actionCollection(), "reverse_sort_order"); + + m_paDisplayDirectoriesFirst = new TDEToggleAction( i18n("Group &Directories First"), 0, this, + TQT_SLOT(slotToggleDisplayDirectoriesFirst()), actionCollection(), "group_directories_first"); + m_paDisplayDirectoriesFirst->setChecked(m_pProps->isHiddenFirst()); + + m_paDisplayHiddenFirst = new TDEToggleAction( i18n("Group &Hidden First"), 0, this, + TQT_SLOT(slotToggleDisplayHiddenFirst()), actionCollection(), "group_hidden_first"); + m_paDisplayHiddenFirst->setChecked(m_pProps->isHiddenFirst()); + newIconSize( TDEIcon::SizeSmall /* default size */ ); } -- cgit v1.2.1