From 9cd504156b4fff688cd427af7244f6522f2e5da8 Mon Sep 17 00:00:00 2001 From: Vincent Reher Date: Tue, 2 Nov 2021 09:11:34 -0700 Subject: [PATCH] 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_detailedlistview.rc | 13 +- konqueror/listview/konq_infolistview.rc | 13 +- konqueror/listview/konq_listview.cpp | 231 +++++++++++++++++++- konqueror/listview/konq_listview.h | 25 +++ konqueror/listview/konq_listview.kcfg | 32 ++- konqueror/listview/konq_listviewitems.cpp | 16 +- konqueror/listview/konq_textview.rc | 12 +- konqueror/listview/konq_treeview.rc | 13 +- libkonq/konq_propsview.cpp | 22 ++ libkonq/konq_propsview.h | 3 + 10 files changed, 362 insertions(+), 18 deletions(-) diff --git a/konqueror/listview/konq_detailedlistview.rc b/konqueror/listview/konq_detailedlistview.rc index 593e7f027..79059c6d4 100644 --- a/konqueror/listview/konq_detailedlistview.rc +++ b/konqueror/listview/konq_detailedlistview.rc @@ -1,5 +1,5 @@ - + &Edit Selection @@ -24,8 +24,15 @@ - - + Sort + + + + + + + + Show Details diff --git a/konqueror/listview/konq_infolistview.rc b/konqueror/listview/konq_infolistview.rc index 280b2d0ce..451eb5785 100644 --- a/konqueror/listview/konq_infolistview.rc +++ b/konqueror/listview/konq_infolistview.rc @@ -1,5 +1,5 @@ - + &Edit Selection @@ -24,8 +24,15 @@ - - + Sort + + + + + + + + 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 */ ); } diff --git a/konqueror/listview/konq_listview.h b/konqueror/listview/konq_listview.h index 4c3719bd0..666ae7743 100644 --- a/konqueror/listview/konq_listview.h +++ b/konqueror/listview/konq_listview.h @@ -63,8 +63,10 @@ class KonqListView : public KonqDirPart { friend class KonqBaseListViewWidget; friend class ListViewBrowserExtension; + Q_OBJECT TQ_PROPERTY( bool supportsUndo READ supportsUndo ) + public: KonqListView( TQWidget *parentWidget, TQObject *parent, const char *name, const TQString& mode ); virtual ~KonqListView(); @@ -128,6 +130,11 @@ protected slots: void slotSaveColumnWidths(); // delayed void slotHeaderClicked(int sec); + void slotToggleDisplayDirectoriesFirst(); + void slotToggleDisplayHiddenFirst(); + void slotSortAlternate(); + void slotSortReverse(); + // This comes from KonqDirPart, it's for the "Find" feature virtual void slotStarted() { m_pListView->slotStarted(); } virtual void slotCanceled() { m_pListView->slotCanceled(); } @@ -148,12 +155,27 @@ private: KMimeTypeResolver *m_mimeTypeResolver; TQTimer *m_headerTimer; + bool toggleColumnAlternate = true; + TQString m_sortColumnNamePrimary; + int m_sortColumnIndexPrimary; + int m_sortColumnOrderPrimary; + TQString m_sortColumnNameAlternate; + int m_sortColumnIndexAlternate; + int m_sortColumnOrderAlternate; + + void resetSortConfig(); + void checkSortConfig(); + void sortListView(uint which); + TDEAction *m_paSelect; TDEAction *m_paUnselect; TDEAction *m_paSelectAll; TDEAction *m_paUnselectAll; TDEAction *m_paInvertSelection; + TDEAction *m_paSortAlternate; + TDEAction *m_paSortReverse; + // These 2 actions are 'fake' actions. They are defined so that the keyboard shortcuts // can be set from the 'Configure Shortcuts..." dialog. // The real actions are performed in the TDEListViewLineEdit::keyPressEvent() in tdeui @@ -174,6 +196,9 @@ private: TDEToggleAction *m_paShowGroup; TDEToggleAction *m_paShowPermissions; TDEToggleAction *m_paShowURL; + + TDEToggleAction *m_paDisplayDirectoriesFirst; + TDEToggleAction *m_paDisplayHiddenFirst; }; class ListViewBrowserExtension : public KonqDirPartBrowserExtension diff --git a/konqueror/listview/konq_listview.kcfg b/konqueror/listview/konq_listview.kcfg index bce9798a6..5c31c5cea 100644 --- a/konqueror/listview/konq_listview.kcfg +++ b/konqueror/listview/konq_listview.kcfg @@ -7,7 +7,6 @@ - FileName @@ -19,6 +18,36 @@ + + TBD + + + + + -1 + + + + + true + + + + + TBD + + + + + -1 + + + + + true + + + 25 * TDEApplication::kApplication()->fontMetrics().width( "m" ) @@ -33,5 +62,4 @@ - \ No newline at end of file diff --git a/konqueror/listview/konq_listviewitems.cpp b/konqueror/listview/konq_listviewitems.cpp index 45ff99c1c..cf4322ef0 100644 --- a/konqueror/listview/konq_listviewitems.cpp +++ b/konqueror/listview/konq_listviewitems.cpp @@ -84,10 +84,18 @@ void KonqListViewItem::updateContents() // Set the text of each column setText( 0, m_fileitem->text() ); - // The order is: .dir (0), dir (1), .file (2), file (3) - sortChar = S_ISDIR( m_fileitem->mode() ) ? 1 : 3; - if ( m_fileitem->text()[0] == '.' ) - --sortChar; + bool m_groupDirectoriesFirst = m_pListViewWidget->props()->isDirsFirst(); + bool m_groupHiddenFirst = m_pListViewWidget->props()->isHiddenFirst(); + + // The default TDE order is: .dir (0), dir (1), .file (2), file (3) + + if ( m_groupDirectoriesFirst ) + sortChar = S_ISDIR( m_fileitem->mode() ) ? 1 : 3; + else + sortChar = 3; + + if ( m_groupHiddenFirst && m_fileitem->text()[0] == '.' ) + --sortChar; //now we have the first column, so let's do the rest diff --git a/konqueror/listview/konq_textview.rc b/konqueror/listview/konq_textview.rc index 612deb5cb..20b20f451 100644 --- a/konqueror/listview/konq_textview.rc +++ b/konqueror/listview/konq_textview.rc @@ -1,5 +1,5 @@ - + &Edit Selection @@ -13,7 +13,15 @@ &View - + Sort + + + + + + + + Show Details diff --git a/konqueror/listview/konq_treeview.rc b/konqueror/listview/konq_treeview.rc index 7f8981779..711f267be 100644 --- a/konqueror/listview/konq_treeview.rc +++ b/konqueror/listview/konq_treeview.rc @@ -1,5 +1,5 @@ - + &Edit Selection @@ -24,8 +24,15 @@ - - + Sort + + + + + + + + Show Details diff --git a/libkonq/konq_propsview.cpp b/libkonq/konq_propsview.cpp index f9a69b8f6..af7a65eae 100644 --- a/libkonq/konq_propsview.cpp +++ b/libkonq/konq_propsview.cpp @@ -67,6 +67,7 @@ struct KonqPropsView::Private TQStringList* previewsToShow; bool previewsEnabled:1; bool caseInsensitiveSort:1; + bool hiddenfirst:1; bool dirsfirst:1; bool descending:1; TQString sortcriterion; @@ -91,6 +92,7 @@ KonqPropsView::KonqPropsView( TDEInstance * instance, KonqPropsView * defaultPro m_iItemTextPos = config->readNumEntry( "ItemTextPos", TQIconView::Bottom ); d->sortcriterion = config->readEntry( "SortingCriterion", "sort_nci" ); d->dirsfirst = config->readBoolEntry( "SortDirsFirst", true ); + d->hiddenfirst = config->readBoolEntry( "SortHiddenFirst", true ); d->descending = config->readBoolEntry( "SortDescending", false ); m_bShowDot = config->readBoolEntry( "ShowDotFiles", false ); m_bShowDirectoryOverlays = config->readBoolEntry( "ShowDirectoryOverlays", false ); @@ -143,6 +145,11 @@ bool KonqPropsView::isDirsFirst() const return d->dirsfirst; } +bool KonqPropsView::isHiddenFirst() const +{ + return d->hiddenfirst; +} + bool KonqPropsView::isDescending() const { return d->descending; @@ -200,6 +207,7 @@ bool KonqPropsView::enterDir( const KURL & dir ) m_iItemTextPos = m_defaultProps->itemTextPos(); d->sortcriterion = m_defaultProps->sortCriterion(); d->dirsfirst = m_defaultProps->isDirsFirst(); + d->hiddenfirst = m_defaultProps->isHiddenFirst(); d->descending = m_defaultProps->isDescending(); m_bShowDot = m_defaultProps->isShowingDotFiles(); d->caseInsensitiveSort=m_defaultProps->isCaseInsensitiveSort(); @@ -219,6 +227,7 @@ bool KonqPropsView::enterDir( const KURL & dir ) m_iItemTextPos = config->readNumEntry( "ItemTextPos", m_iItemTextPos ); d->sortcriterion = config->readEntry( "SortingCriterion" , d->sortcriterion ); d->dirsfirst = config->readBoolEntry( "SortDirsFirst", d->dirsfirst ); + d->hiddenfirst = config->readBoolEntry( "SortHiddenFirst", d->hiddenfirst ); d->descending = config->readBoolEntry( "SortDescending", d->descending ); m_bShowDot = config->readBoolEntry( "ShowDotFiles", m_bShowDot ); d->caseInsensitiveSort=config->readBoolEntry("CaseInsensitiveSort",d->caseInsensitiveSort); @@ -328,6 +337,19 @@ void KonqPropsView::setDirsFirst( bool first) } } +void KonqPropsView::setHiddenFirst(bool first) +{ + d->hiddenfirst = first; + if ( m_defaultProps && !m_bSaveViewPropertiesLocally ) + m_defaultProps->setHiddenFirst( first ); + else if (currentConfig()) + { + TDEConfigGroupSaver cgs(currentConfig(), currentGroup()); + currentConfig()->writeEntry( "SortHiddenFirst", d->hiddenfirst ); + currentConfig()->sync(); + } +} + void KonqPropsView::setDescending( bool descend) { d->descending = descend; diff --git a/libkonq/konq_propsview.h b/libkonq/konq_propsview.h index 73d8b8e6d..84ffcf029 100644 --- a/libkonq/konq_propsview.h +++ b/libkonq/konq_propsview.h @@ -93,6 +93,9 @@ public: void setDirsFirst ( bool first ); bool isDirsFirst() const; + void setHiddenFirst ( bool first ); + bool isHiddenFirst() const; + void setDescending (bool descending); bool isDescending() const;