From 47f9a4907bf9ed08341b39083a431a6511c54994 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 15 Feb 2018 00:02:08 +0100 Subject: [PATCH] improved cost of reseting search in SharedFileDialog by saving hidden indexes list --- .../gui/FileTransfer/SharedFilesDialog.cpp | 55 ++++++++++--------- .../src/gui/FileTransfer/SharedFilesDialog.h | 4 ++ 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp index a8ebf7363..504ab96ea 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp @@ -966,6 +966,9 @@ void SharedFilesDialog::recursRestoreExpandedItems(const QModelIndex& index, con bool invisible = vis.find(local_path) != vis.end(); ui.dirTreeView->setRowHidden(index.row(),index.parent(),invisible ) ; + if(invisible) + mHiddenIndexes.push_back(proxyModel->mapToSource(index)); + if(!invisible && exp.find(local_path) != exp.end()) { #ifdef DEBUG_SHARED_FILES_DIALOG @@ -1330,26 +1333,9 @@ void SharedFilesDialog::startFilter() #define EXPAND_WHILE_SEARCHING 1 -static void recursMakeAllVisible(QTreeView *tree,const QModelIndex& indx) -{ - tree->setRowHidden(indx.row(), indx.parent(), false) ; - - int rowCount = tree->model()->rowCount(indx); - - for (int row = 0; row < rowCount; ++row) - { - QModelIndex child_index = indx.child(row,0); - - recursMakeAllVisible(tree,child_index); - } -#ifdef EXPAND_WHILE_SEARCHING - tree->setExpanded(indx,false) ; -#endif -} - //#define DEBUG_SHARED_FILES_DIALOG -static void recursMakeVisible(QTreeView *tree,const QSortFilterProxyModel *proxyModel,const QModelIndex& indx,uint32_t depth,const std::vector >& pointers) +void recursMakeVisible(QTreeView *tree,const QSortFilterProxyModel *proxyModel,const QModelIndex& indx,uint32_t depth,const std::vector >& pointers,QList& hidden_list) { #ifdef DEBUG_SHARED_FILES_DIALOG for(uint32_t i=0;imapToSource(child_index).internalPointer() << " visible" << std::endl; #endif - recursMakeVisible(tree,proxyModel,child_index,depth+1,pointers) ; + recursMakeVisible(tree,proxyModel,child_index,depth+1,pointers,hidden_list) ; found = true ; } else { tree->setRowHidden(child_index.row(), indx, true) ; + hidden_list.push_back(proxyModel->mapToSource(child_index)) ; #ifdef EXPAND_WHILE_SEARCHING tree->setExpanded(child_index,false) ; #endif @@ -1395,7 +1382,23 @@ static void recursMakeVisible(QTreeView *tree,const QSortFilterProxyModel *proxy } if(!found && depth == 0) + { tree->setRowHidden(indx.row(), indx.parent(), true) ; + hidden_list.push_back(proxyModel->mapToSource(indx)) ; + } +} + +void SharedFilesDialog::restoreInvisibleItems() +{ + for(QList::const_iterator it(mHiddenIndexes.begin());it!=mHiddenIndexes.end();++it) + { + QModelIndex indx = proxyModel->mapFromSource(*it); + + if(indx.isValid()) + ui.dirTreeView->setRowHidden(indx.row(), indx.parent(), false) ; + } + + mHiddenIndexes.clear(); } class QCursorContextBlocker @@ -1436,6 +1439,7 @@ void SharedFilesDialog::FilterItems() std::cerr << "New last text. Performing the filter" << std::endl; mLastFilterText = text ; model->update() ; + restoreInvisibleItems(); QCursorContextBlocker q(ui.dirTreeView) ; @@ -1447,14 +1451,7 @@ void SharedFilesDialog::FilterItems() std::list result_list ; if(text == "") - { - int rowCount = ui.dirTreeView->model()->rowCount(); - - for (int row = 0; row < rowCount; ++row) - recursMakeAllVisible(ui.dirTreeView,ui.dirTreeView->model()->index(row, COLUMN_NAME)) ; - return ; - } if(text.length() < 3) return ; @@ -1525,7 +1522,7 @@ void SharedFilesDialog::FilterItems() int rowCount = ui.dirTreeView->model()->rowCount(); for (int row = 0; row < rowCount; ++row) - recursMakeVisible(ui.dirTreeView,proxyModel,ui.dirTreeView->model()->index(row, COLUMN_NAME),0,pointers); + recursMakeVisible(ui.dirTreeView,proxyModel,ui.dirTreeView->model()->index(row, COLUMN_NAME),0,pointers,mHiddenIndexes); } else { @@ -1554,6 +1551,7 @@ bool SharedFilesDialog::flat_FilterItem(const QModelIndex &index, const QString else { ui.dirTreeView->setRowHidden(index.row(), index.parent(), true); + mHiddenIndexes.push_back(proxyModel->mapToSource(index)); return true ; } } @@ -1584,7 +1582,10 @@ bool SharedFilesDialog::tree_FilterItem(const QModelIndex &index, const QString if (visible || visibleChildCount) { ui.dirTreeView->setRowHidden(index.row(), index.parent(), false); } else { + { ui.dirTreeView->setRowHidden(index.row(), index.parent(), true); + mHiddenIndexes.push_back(proxyModel->mapToSource(index)); + } } return (visible || visibleChildCount); diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.h b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.h index e1c5235f5..f7c866d70 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.h +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.h @@ -107,6 +107,8 @@ protected: bool tree_FilterItem(const QModelIndex &index, const QString &text, int level); bool flat_FilterItem(const QModelIndex &index, const QString &text, int level); + void restoreInvisibleItems(); + QModelIndexList getSelected(); /** Defines the actions for the context menu for QTreeWidget */ @@ -133,6 +135,8 @@ protected: QString lastFilterString; QString mLastFilterText ; + + QList mHiddenIndexes; }; class LocalSharedFilesDialog : public SharedFilesDialog