Improved Search Dialog (Patch from AsamK)

-don't add friend sources count to anonymous count each time a result for the same file is received!, this could lead to enormously large sources numbers
  -don't readd search in summary list if it was already removed by the user
  -don't clear the filter when new search results are added
  -when using the file name filter only show result from the current search, not also from previous searches
  -fixed adding only file types which were searched for, for this I created a new hidden column in summary list to store the file type
  -fixed sorting by file size/age, pad string with '0' instead of ' ' Search feature: a quirk I've found
  -decrease gui hanging:
     -when adding search results temporarily disable sorting
     -only add 250 instead of 500 items in one go
     -don't call selectSearchResults() for each item added to the result list; instead call hideOrShowSearchResult() which only sets the hidden status of the added item, not the complete list
     -replace std::string with QString, removes unnecessary conversions


git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@5093 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
csoler 2012-04-12 19:30:41 +00:00
parent a1f6f0ad8c
commit 2f749e2bf5
2 changed files with 158 additions and 216 deletions

View File

@ -51,9 +51,10 @@
#define SS_TEXT_COL 0
#define SS_COUNT_COL 1
#define SS_SEARCH_ID_COL 2
#define SS_FILE_TYPE_COL 3
#define SS_DATA_COL SS_TEXT_COL
#define ROLE_ADVANCED Qt::UserRole
#define ROLE_KEYWORDS Qt::UserRole
#define IMAGE_COPYLINK ":/images/copyrslink.png"
@ -120,10 +121,10 @@ SearchDialog::SearchDialog(QWidget *parent)
connect ( ui.searchSummaryWidget, SIGNAL( currentItemChanged ( QTreeWidgetItem *, QTreeWidgetItem * ) ),
this, SLOT( selectSearchResults( void ) ) );
connect(ui.FileTypeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectSearchResults(int)));
connect(ui.FileTypeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectFileType(int)));
connect(ui.filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(filterItems(QString)));
connect( ui.filterColumnComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterColumnChanged()));
connect(ui.filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(filterItems()));
connect( ui.filterColumnComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterItems()));
/* hide the Tree +/- */
ui.searchResultWidget -> setRootIsDecorated( true );
@ -415,14 +416,14 @@ void SearchDialog::searchtableWidget2CostumPopupMenu( QPoint /*point*/ )
QTreeWidgetItem* ci = ui.searchSummaryWidget->currentItem();
QAction* action = contextMnu.addAction(tr("Search again"), this, SLOT(searchAgain()));
if (!ci || ci->data(SS_DATA_COL, ROLE_ADVANCED).toBool()) {
if (!ci || ci->data(SS_DATA_COL, ROLE_KEYWORDS).toString().isEmpty()) {
action->setDisabled(true);
}
contextMnu.addAction(QIcon(IMAGE_REMOVE), tr("Remove"), this, SLOT(searchRemove()));
contextMnu.addAction(QIcon(IMAGE_REMOVE), tr("Remove All"), this, SLOT(searchRemoveAll()));
contextMnu.addSeparator();
action = contextMnu.addAction(QIcon(IMAGE_COPYLINK), tr("Copy RetroShare Link"), this, SLOT(copySearchLink()));
if (!ci || ci->data(SS_DATA_COL, ROLE_ADVANCED).toBool()) {
if (!ci || ci->data(SS_DATA_COL, ROLE_KEYWORDS).toString().isEmpty()) {
action->setDisabled(true);
}
@ -540,16 +541,22 @@ void SearchDialog::showAdvSearchDialog(bool show)
// Creates a new entry in the search summary, not to leave it blank whatever happens.
//
void SearchDialog::initSearchResult(const std::string& txt,qulonglong searchId, bool advanced)
void SearchDialog::initSearchResult(const QString& txt, qulonglong searchId, int fileType, bool advanced)
{
QString sid_hexa = QString::number(searchId,16) ;
QTreeWidgetItem *item2 = new QTreeWidgetItem();
item2->setText(SS_TEXT_COL, QString::fromUtf8(txt.c_str()));
if (fileType == FILETYPE_IDX_ANY) {
item2->setText(SS_TEXT_COL, txt);
} else {
item2->setText(SS_TEXT_COL, txt + " (" + ui.FileTypeComboBox->itemText(fileType) + ")");
}
item2->setText(SS_COUNT_COL, QString::number(0));
item2->setText(SS_SEARCH_ID_COL, sid_hexa);
item2->setText(SS_FILE_TYPE_COL, QString::number(fileType));
item2->setData(SS_DATA_COL, ROLE_ADVANCED, advanced);
if (!advanced)
item2->setData(SS_DATA_COL, ROLE_KEYWORDS, txt);
ui.searchSummaryWidget->addTopLevelItem(item2);
ui.searchSummaryWidget->setCurrentItem(item2);
@ -570,12 +577,12 @@ void SearchDialog::advancedSearch(Expression* expression)
// This will act before turtle results come to the interface, thanks to the signals scheduling policy.
// The text "bool exp" should be replaced by an appropriate text describing the actual search.
initSearchResult(std::string("bool exp"),req_id, true) ;
initSearchResult("bool exp",req_id, ui.FileTypeComboBox->currentIndex(), true) ;
rsFiles -> SearchBoolExp(expression, results, DIR_FLAGS_REMOTE | DIR_FLAGS_NETWORK_WIDE | DIR_FLAGS_BROWSABLE);
/* abstraction to allow reusee of tree rendering code */
resultsToTree((advSearchDialog->getSearchAsString()).toStdString(),req_id, results);
resultsToTree(advSearchDialog->getSearchAsString(),req_id, results);
// // debug stuff
// Expression *expression2 = LinearizedExpression::toExpr(e) ;
@ -593,24 +600,26 @@ void SearchDialog::searchAgain()
{
/* get the current search text from the summary window */
QTreeWidgetItem* ci = ui.searchSummaryWidget->currentItem();
if (!ci || ci->data(SS_DATA_COL, ROLE_ADVANCED).toBool())
if (!ci || ci->data(SS_DATA_COL, ROLE_KEYWORDS).toString().isEmpty())
return;
/* get the search text */
QString txt = ci->text(SS_TEXT_COL);
QString txt = ci->data(SS_DATA_COL, ROLE_KEYWORDS).toString();
int fileType = ci->text(SS_FILE_TYPE_COL).toInt();
/* remove the old search */
searchRemove();
/* search for the same keywords and filetype again */
ui.FileTypeComboBox->setCurrentIndex(fileType);
searchKeywords(txt);
}
void SearchDialog::searchKeywords(const QString& keywords)
{
std::string txt = keywords.toUtf8().constData();
if(txt.length() < 3)
if (keywords.length() < 3)
return ;
std::cerr << "SearchDialog::searchKeywords() : " << txt << std::endl;
QStringList qWords = keywords.split(" ", QString::SkipEmptyParts);
std::list<std::string> words;
QStringListIterator qWordsIter(qWords);
@ -631,14 +640,14 @@ void SearchDialog::searchKeywords(const QString& keywords)
if(ui._anonF2Fsearch_CB->isChecked())
{
if(n==1)
req_id = rsTurtle->turtleSearch(txt) ;
req_id = rsTurtle->turtleSearch(words.front()) ;
else
req_id = rsTurtle->turtleSearch(lin_exp) ;
}
else
req_id = ((((uint32_t)rand()) << 16)^0x1e2fd5e4) + (((uint32_t)rand())^0x1b19acfe) ; // generate a random 32 bits request id
initSearchResult(txt,req_id, false) ; // this will act before turtle results come to the interface, thanks to the signals scheduling policy.
initSearchResult(keywords,req_id, ui.FileTypeComboBox->currentIndex(), false) ; // this will act before turtle results come to the interface, thanks to the signals scheduling policy.
if(ui._friendListsearch_SB->isChecked() || ui._ownFiles_CB->isChecked())
{
@ -681,7 +690,7 @@ void SearchDialog::searchKeywords(const QString& keywords)
}
/* abstraction to allow reusee of tree rendering code */
resultsToTree(txt,req_id, finalResults);
resultsToTree(keywords,req_id, finalResults);
ui.lineEdit->clear() ;
}
}
@ -710,15 +719,14 @@ void SearchDialog::processResultQueue()
int nb_treated_elements = 0 ;
while(!searchResultsQueue.empty() && nb_treated_elements++ < 500)
ui.searchResultWidget->setSortingEnabled(false);
while(!searchResultsQueue.empty() && nb_treated_elements++ < 250)
{
qulonglong search_id = searchResultsQueue.back().first ;
FileDetail file = searchResultsQueue.back().second ;
searchResultsQueue.pop_back() ;
/* which extensions do we use? */
std::string txt = ui.lineEdit->text().toStdString();
#ifdef DEBUG
std::cout << "Updating file detail:" << std::endl ;
std::cout << " size = " << file.size << std::endl ;
@ -726,38 +734,16 @@ void SearchDialog::processResultQueue()
std::cout << " s_id = " << search_id << std::endl ;
#endif
if (ui.FileTypeComboBox->currentIndex() == FILETYPE_IDX_ANY)
insertFile(txt,search_id,file);
else
{
// amend the text description of the search
txt += " (" + ui.FileTypeComboBox->currentText().toStdString() + ")";
// collect the extensions to use
QString extStr = SearchDialog::FileTypeExtensionMap->value(ui.FileTypeComboBox->currentIndex());
QStringList extList = extStr.split(" ");
// get this file's extension
QString qName = QString::fromUtf8(file.name.c_str());
int extIndex = qName.lastIndexOf(".");
if (extIndex >= 0)
{
QString qExt = qName.mid(extIndex+1).toUpper();
if (qExt != "" )
for (int i = 0; i < extList.size(); ++i)
if (qExt == extList.at(i).toUpper())
insertFile(txt,search_id,file);
}
}
insertFile(search_id,file);
}
ui.searchResultWidget->setSortingEnabled(true);
if(!searchResultsQueue.empty())
QTimer::singleShot(1000,this,SLOT(processResultQueue())) ;
QTimer::singleShot(500,this,SLOT(processResultQueue())) ;
else
_queueIsAlreadyTakenCareOf = false ;
}
void SearchDialog::insertDirectory(const std::string &txt, qulonglong searchId, const DirDetails &dir, QTreeWidgetItem *item)
void SearchDialog::insertDirectory(const QString &txt, qulonglong searchId, const DirDetails &dir, QTreeWidgetItem *item)
{
QString sid_hexa = QString::number(searchId,16) ;
@ -833,7 +819,7 @@ void SearchDialog::insertDirectory(const std::string &txt, qulonglong searchId,
if(!found)
{
QTreeWidgetItem *item2 = new QTreeWidgetItem();
item2->setText(SS_TEXT_COL, QString::fromStdString(txt));
item2->setText(SS_TEXT_COL, txt);
item2->setText(SS_COUNT_COL, QString::number(1));
item2->setTextAlignment( SS_COUNT_COL, Qt::AlignRight );
item2->setText(SS_SEARCH_ID_COL, sid_hexa);
@ -855,13 +841,9 @@ void SearchDialog::insertDirectory(const std::string &txt, qulonglong searchId,
insertDirectory(txt, searchId, details, child);
}
}
if (ui.filterLineEdit->text().isEmpty() == false) {
filterItems(ui.filterLineEdit->text());
}
}
void SearchDialog::insertDirectory(const std::string &txt, qulonglong searchId, const DirDetails &dir)
void SearchDialog::insertDirectory(const QString &txt, qulonglong searchId, const DirDetails &dir)
{
return ; // Remove this statement to allow adding directories to the search results.
@ -899,7 +881,7 @@ void SearchDialog::insertDirectory(const std::string &txt, qulonglong searchId,
if(!found)
{
QTreeWidgetItem *item2 = new QTreeWidgetItem();
item2->setText(SS_TEXT_COL, QString::fromStdString(txt));
item2->setText(SS_TEXT_COL, txt);
item2->setText(SS_COUNT_COL, QString::number(1));
item2->setTextAlignment( SS_COUNT_COL, Qt::AlignRight );
item2->setText(SS_SEARCH_ID_COL, sid_hexa);
@ -909,31 +891,56 @@ void SearchDialog::insertDirectory(const std::string &txt, qulonglong searchId,
}
selectSearchResults();
if (ui.filterLineEdit->text().isEmpty() == false) {
filterItems(ui.filterLineEdit->text());
}
// TODO: check for duplicate directories
}
void SearchDialog::insertFile(const std::string& txt,qulonglong searchId, const FileDetail& file, int searchType)
void SearchDialog::insertFile(qulonglong searchId, const FileDetail& file, int searchType)
{
// algo:
//
// 1 - look in result window whether the file already exist.
// 1.1 - If yes, just increment the source number.
// 2.2 - Otherwize, add an entry.
// 2.2 - Otherwise, add an entry.
// 2 - look in the summary whether there exist the same request id.
// 1.1 - If yes, just increment the result number.
// 2.2 - Otherwize, add an entry.
// 2.2 - Otherwise, ignore this file
//
//
static std::map<qulonglong,uint32_t> nb_results ;
QString sid_hexa = QString::number(searchId,16) ;
//check if search ID is still in the summary list, if not it was already closed by
// the user, so nothing has to be done here
int summaryItemCount = ui.searchSummaryWidget->topLevelItemCount();
int summaryItemIndex = -1 ;
for (int i = 0; i < summaryItemCount; i++) {
if(ui.searchSummaryWidget->topLevelItem(i)->text(SS_SEARCH_ID_COL) == sid_hexa) {
summaryItemIndex = i ;
break ;
}
}
if (summaryItemIndex == -1)
return;
/* which extensions do we use? */
int fileTypeIndex = ui.searchSummaryWidget->topLevelItem(summaryItemIndex)->text(SS_FILE_TYPE_COL).toInt();
if (fileTypeIndex != FILETYPE_IDX_ANY) {
// collect the extensions to use
QStringList extList = FileTypeExtensionMap->value(fileTypeIndex).split(" ");
// check this file's extension
QString qName = QString::fromUtf8(file.name.c_str());
if (!extList.contains(QFileInfo(qName).suffix(), Qt::CaseInsensitive)) {
return;
}
}
static std::map<qulonglong,int> nb_results ;
if(nb_results.find(searchId) == nb_results.end())
nb_results[searchId] = 0 ;
if((int) nb_results[searchId] >= ui._max_results_SB->value())
if (nb_results[searchId] >= ui._max_results_SB->value())
return ;
// 1 - look in result window whether the file already exists.
@ -944,8 +951,6 @@ void SearchDialog::insertFile(const std::string& txt,qulonglong searchId, const
int anonymousSource = 0;
QString modifiedResult;
QString sid_hexa = QString::number(searchId,16) ;
QList<QTreeWidgetItem*> itms = ui.searchResultWidget->findItems(QString::fromStdString(file.hash),Qt::MatchExactly,SR_HASH_COL) ;
for(QList<QTreeWidgetItem*>::const_iterator it(itms.begin());it!=itms.end();++it)
@ -963,7 +968,6 @@ void SearchDialog::insertFile(const std::string& txt,qulonglong searchId, const
friendSource = modifiedResultCount.at(0).toInt();
anonymousSource = modifiedResultCount.at(1).toInt() + 1;
}
anonymousSource = anonymousSource + friendSource;
modifiedResult = QString::number(friendSource) + "/" + QString::number(anonymousSource);
(*it)->setText(SR_ID_COL,modifiedResult);
QTreeWidgetItem *item = (*it);
@ -1017,10 +1021,6 @@ void SearchDialog::insertFile(const std::string& txt,qulonglong searchId, const
{
foreground = QColor(0, 0, 209);
}
else if (sources < 12)
{
foreground = QColor(0, 0, 228);
}
else
{
foreground = QColor(0, 0, 228);
@ -1048,11 +1048,11 @@ void SearchDialog::insertFile(const std::string& txt,qulonglong searchId, const
setIconAndType(item, QString::fromUtf8(file.name.c_str()));
/*
* to facilitate downlaods we need to save the file size too
* to facilitate downloads we need to save the file size too
*/
item->setText(SR_SIZE_COL, QString("%1").arg(file.size,15,10)); // very important for sorting
item->setText(SR_AGE_COL, QString("%1").arg(file.age,15,10));
item->setText(SR_SIZE_COL, QString::number(file.size).rightJustified(15, '0')); // very important for sorting
item->setText(SR_AGE_COL, QString::number(file.age).rightJustified(15, '0'));
item->setTextAlignment( SR_SIZE_COL, Qt::AlignRight );
if(searchType == FRIEND_SEARCH)
{
@ -1065,7 +1065,6 @@ void SearchDialog::insertFile(const std::string& txt,qulonglong searchId, const
anonymousSource = 1;
}
anonymousSource = anonymousSource + friendSource;
modifiedResult =QString::number(friendSource) + "/" + QString::number(anonymousSource);
item->setText(SR_ID_COL,modifiedResult);
item->setTextAlignment( SR_ID_COL, Qt::AlignRight );
@ -1099,46 +1098,20 @@ void SearchDialog::insertFile(const std::string& txt,qulonglong searchId, const
}
ui.searchResultWidget->addTopLevelItem(item);
/* hide/show this search result */
hideOrShowSearchResult(item);
}
/* add to the summary as well */
int items2 = ui.searchSummaryWidget->topLevelItemCount();
bool found2 = false ;
for(int i = 0; i < items2; i++)
if(ui.searchSummaryWidget->topLevelItem(i)->text(SS_SEARCH_ID_COL) == sid_hexa)
{
if(!found) // only increment result when it's a new item.
{
int s = ui.searchSummaryWidget->topLevelItem(i)->text(SS_COUNT_COL).toInt() ;
ui.searchSummaryWidget->topLevelItem(i)->setText(SS_COUNT_COL,QString::number(s+1));
}
found2 = true ;
break ;
}
if(!found2)
/* update the summary as well */
if(!found) // only increment result when it's a new item.
{
QTreeWidgetItem *item2 = new QTreeWidgetItem();
item2->setText(SS_TEXT_COL, QString::fromStdString(txt));
item2->setText(SS_COUNT_COL, QString::number(1));
item2->setTextAlignment( SS_COUNT_COL, Qt::AlignRight );
item2->setText(SS_SEARCH_ID_COL, sid_hexa);
ui.searchSummaryWidget->addTopLevelItem(item2);
ui.searchSummaryWidget->setCurrentItem(item2);
}
/* select this search result */
selectSearchResults();
if (ui.filterLineEdit->text().isEmpty() == false) {
filterItems(ui.filterLineEdit->text());
int s = ui.searchSummaryWidget->topLevelItem(summaryItemIndex)->text(SS_COUNT_COL).toInt() ;
ui.searchSummaryWidget->topLevelItem(summaryItemIndex)->setText(SS_COUNT_COL,QString::number(s+1));
}
}
void SearchDialog::resultsToTree(std::string txt,qulonglong searchId, const std::list<DirDetails>& results)
void SearchDialog::resultsToTree(const QString& txt,qulonglong searchId, const std::list<DirDetails>& results)
{
ui.searchResultWidget->setSortingEnabled(false);
@ -1156,7 +1129,7 @@ void SearchDialog::resultsToTree(std::string txt,qulonglong searchId, const std:
fd.age = it->age;
fd.rank = 0;
insertFile(txt,searchId,fd, FRIEND_SEARCH);
insertFile(searchId,fd, FRIEND_SEARCH);
} else if (it->type == DIR_TYPE_DIR) {
// insertDirectory(txt, searchId, *it, NULL);
insertDirectory(txt, searchId, *it);
@ -1167,19 +1140,15 @@ void SearchDialog::resultsToTree(std::string txt,qulonglong searchId, const std:
void SearchDialog::selectSearchResults(int index)
{
int cindex = ui.FileTypeComboBox->currentIndex();
index = (index == -1) ? (cindex == -1 ? 0 : cindex):index;
QString alltypes = FileTypeExtensionMap->value(index);
QStringList types = alltypes.split(" ");
/* highlight this search in summary window */
QString searchId;
QTreeWidgetItem *ci = ui.searchSummaryWidget->currentItem();
if (!ci)
return;
/* get the searchId text */
QString searchId = ci->text(SS_SEARCH_ID_COL);
if (ci) {
/* get the searchId text */
searchId = ci->text(SS_SEARCH_ID_COL);
if (ui.FileTypeComboBox->currentIndex() != FILETYPE_IDX_ANY)
ui.FileTypeComboBox->setCurrentIndex(ci->text(SS_FILE_TYPE_COL).toInt());
}
#ifdef DEBUG
std::cerr << "SearchDialog::selectSearchResults(): searchId: " << searchId.toStdString();
std::cerr << std::endl;
@ -1189,28 +1158,50 @@ void SearchDialog::selectSearchResults(int index)
int items = ui.searchResultWidget->topLevelItemCount();
for(int i = 0; i < items; i++)
{
/* get item */
QTreeWidgetItem *ti = ui.searchResultWidget->topLevelItem(i);
if (ti->text(SR_SEARCH_ID_COL) == searchId)
{
if (index == FILETYPE_IDX_ANY)
ti->setHidden(false);
else if (index == FILETYPE_IDX_DIRECTORY && ti->text(SR_HASH_COL).isEmpty())
ti->setHidden(false);
else if (types.contains(QFileInfo(ti->text(SR_NAME_COL)).suffix(), Qt::CaseInsensitive))
ti->setHidden(false);
else
ti->setHidden(true);
}
else
{
ti->setHidden(true);
}
hideOrShowSearchResult(ui.searchResultWidget->topLevelItem(i), searchId, index);
}
ui.searchResultWidget->update();
ui.filterLineEdit->clear();
}
void SearchDialog::hideOrShowSearchResult(QTreeWidgetItem* resultItem, QString currentSearchId, int fileTypeIndex)
{
if (currentSearchId.isEmpty()) {
QTreeWidgetItem *ci = ui.searchSummaryWidget->currentItem();
if (ci)
/* get the searchId text */
currentSearchId = ci->text(SS_SEARCH_ID_COL);
}
if (resultItem->text(SR_SEARCH_ID_COL) != currentSearchId) {
resultItem->setHidden(true);
return;
}
// check if file type matches
if (fileTypeIndex == -1)
fileTypeIndex = ui.FileTypeComboBox->currentIndex();
if (fileTypeIndex != FILETYPE_IDX_ANY) {
if (!(fileTypeIndex == FILETYPE_IDX_DIRECTORY && resultItem->text(SR_HASH_COL).isEmpty())) {
QStringList extList = FileTypeExtensionMap->value(fileTypeIndex).split(" ");
if (!extList.contains(QFileInfo(resultItem->text(SR_NAME_COL)).suffix(), Qt::CaseInsensitive)) {
resultItem->setHidden(true);
return;
}
}
}
// file type matches, now filter text
if (ui.filterLineEdit->text().isEmpty()) {
resultItem->setHidden(false);
} else {
int filterColumn = FilterColumnFromComboBox(ui.filterColumnComboBox->currentIndex());
filterItem(resultItem, ui.filterLineEdit->text(), filterColumn);
}
}
void SearchDialog::setIconAndType(QTreeWidgetItem *item, const QString& filename)
{
item->setIcon(SR_NAME_COL, FilesDefs::getIconFromFilename(filename));
@ -1268,80 +1259,31 @@ void SearchDialog::sendLinkTo( )
/* window will destroy itself! */
}
// not in use for the moment
void SearchDialog::onComboIndexChanged(int index)
void SearchDialog::selectFileType(int index)
{
if (!FileTypeExtensionMap->contains(index) && index != FILETYPE_IDX_DIRECTORY)
return;
QString alltypes = FileTypeExtensionMap->value(index);
QStringList types = alltypes.split(" ");
int items = ui.searchResultWidget->topLevelItemCount();
for (int i = 0; i < items; i++) {
QTreeWidgetItem *ti = ui.searchResultWidget->topLevelItem(i);
QString name = ti->text(SR_NAME_COL);
if (index == FILETYPE_IDX_ANY) {
if (ti->isHidden()) {
QTreeWidgetItem *ci = ui.searchSummaryWidget->currentItem();
if (!ci) {
ti->setHidden(false);
continue;
}
if (ti->text(SR_SEARCH_ID_COL) == ci->text(SS_SEARCH_ID_COL)) {
ti->setHidden(false);
}
}
} else if (index == FILETYPE_IDX_DIRECTORY) {
if (ti->text(SR_HASH_COL).isEmpty()) {
if (ti->isHidden()) {
QTreeWidgetItem *ci = ui.searchSummaryWidget->currentItem();
if (!ci) {
ti->setHidden(false);
continue;
}
if (ti->text(SR_SEARCH_ID_COL) == ci->text(SS_SEARCH_ID_COL)) {
ti->setHidden(false);
}
}
} else {
ti->setHidden(true);
}
} else {
if (name.lastIndexOf(".") >= 0) {
QString ext = name.mid(name.lastIndexOf(".") + 1);
if (!ext.isEmpty() && types.contains(ext, Qt::CaseInsensitive)) {
if (ti->isHidden()) {
QTreeWidgetItem *ci = ui.searchSummaryWidget->currentItem();
if (!ci) {
ti->setHidden(false);
continue;
}
if (ti->text(SR_SEARCH_ID_COL) == ci->text(SS_SEARCH_ID_COL)) {
ti->setHidden(false);
}
}
} else {
ti->setHidden(true);
}
} else {
ti->setHidden(true);
}
}
}
QString searchId;
QTreeWidgetItem *ci = ui.searchSummaryWidget->currentItem();
if (ci) {
/* get the searchId text */
searchId = ci->text(SS_SEARCH_ID_COL);
}
/* show only matching file types in main window */
int items = ui.searchResultWidget->topLevelItemCount();
for(int i = 0; i < items; i++)
{
hideOrShowSearchResult(ui.searchResultWidget->topLevelItem(i), searchId, index);
}
}
void SearchDialog::filterColumnChanged()
void SearchDialog::filterItems()
{
filterItems(ui.filterLineEdit->text());
}
void SearchDialog::filterItems(const QString &text)
{
int filterColumn = FilterColumnFromComboBox(ui.filterColumnComboBox->currentIndex());
int count = ui.searchResultWidget->topLevelItemCount ();
for (int index = 0; index < count; index++) {
filterItem(ui.searchResultWidget->topLevelItem(index), text, filterColumn);
hideOrShowSearchResult(ui.searchResultWidget->topLevelItem(index));
}
}

View File

@ -80,24 +80,24 @@ private slots:
void advancedSearch(Expression*);
void selectSearchResults(int index = -1);
void hideOrShowSearchResult(QTreeWidgetItem* resultItem, QString currentSearchId = QString(), int fileTypeIndex = -1);
void sendLinkTo();
void onComboIndexChanged(int index);
void selectFileType(int index);
void filterColumnChanged();
void filterItems(const QString &text);
void filterItems();
private:
/** render the results to the tree widget display */
void initSearchResult(const std::string& txt,qulonglong searchId, bool advanced) ;
void resultsToTree(std::string,qulonglong searchId, const std::list<DirDetails>&);
void insertFile(const std::string& txt,qulonglong searchId, const FileDetail& file, int searchType = ANONYMOUS_SEARCH) ;
void insertDirectory(const std::string &txt, qulonglong searchId, const DirDetails &dir, QTreeWidgetItem *item);
void insertDirectory(const std::string &txt, qulonglong searchId, const DirDetails &dir);
void setIconAndType(QTreeWidgetItem *item, const QString& filename);
void downloadDirectory(const QTreeWidgetItem *item, const QString &base);
void getSourceFriendsForHash(const std::string& hash,std::list<std::string>& srcIds);
void initSearchResult(const QString& txt,qulonglong searchId, int fileType, bool advanced) ;
void resultsToTree(const QString& txt,qulonglong searchId, const std::list<DirDetails>&);
void insertFile(qulonglong searchId,const FileDetail &file, int searchType = ANONYMOUS_SEARCH) ;
void insertDirectory(const QString &txt, qulonglong searchId, const DirDetails &dir, QTreeWidgetItem *item);
void insertDirectory(const QString &txt, qulonglong searchId, const DirDetails &dir);
void setIconAndType(QTreeWidgetItem *item, const QString& filename);
void downloadDirectory(const QTreeWidgetItem *item, const QString &base);
void getSourceFriendsForHash(const std::string& hash,std::list<std::string>& srcIds);
/** the advanced search dialog instance */
AdvancedSearchDialog * advSearchDialog;