mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
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:
parent
a1f6f0ad8c
commit
2f749e2bf5
@ -51,9 +51,10 @@
|
|||||||
#define SS_TEXT_COL 0
|
#define SS_TEXT_COL 0
|
||||||
#define SS_COUNT_COL 1
|
#define SS_COUNT_COL 1
|
||||||
#define SS_SEARCH_ID_COL 2
|
#define SS_SEARCH_ID_COL 2
|
||||||
|
#define SS_FILE_TYPE_COL 3
|
||||||
#define SS_DATA_COL SS_TEXT_COL
|
#define SS_DATA_COL SS_TEXT_COL
|
||||||
|
|
||||||
#define ROLE_ADVANCED Qt::UserRole
|
#define ROLE_KEYWORDS Qt::UserRole
|
||||||
|
|
||||||
#define IMAGE_COPYLINK ":/images/copyrslink.png"
|
#define IMAGE_COPYLINK ":/images/copyrslink.png"
|
||||||
|
|
||||||
@ -120,10 +121,10 @@ SearchDialog::SearchDialog(QWidget *parent)
|
|||||||
connect ( ui.searchSummaryWidget, SIGNAL( currentItemChanged ( QTreeWidgetItem *, QTreeWidgetItem * ) ),
|
connect ( ui.searchSummaryWidget, SIGNAL( currentItemChanged ( QTreeWidgetItem *, QTreeWidgetItem * ) ),
|
||||||
this, SLOT( selectSearchResults( void ) ) );
|
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.filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(filterItems()));
|
||||||
connect( ui.filterColumnComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterColumnChanged()));
|
connect( ui.filterColumnComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterItems()));
|
||||||
|
|
||||||
/* hide the Tree +/- */
|
/* hide the Tree +/- */
|
||||||
ui.searchResultWidget -> setRootIsDecorated( true );
|
ui.searchResultWidget -> setRootIsDecorated( true );
|
||||||
@ -415,14 +416,14 @@ void SearchDialog::searchtableWidget2CostumPopupMenu( QPoint /*point*/ )
|
|||||||
|
|
||||||
QTreeWidgetItem* ci = ui.searchSummaryWidget->currentItem();
|
QTreeWidgetItem* ci = ui.searchSummaryWidget->currentItem();
|
||||||
QAction* action = contextMnu.addAction(tr("Search again"), this, SLOT(searchAgain()));
|
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);
|
action->setDisabled(true);
|
||||||
}
|
}
|
||||||
contextMnu.addAction(QIcon(IMAGE_REMOVE), tr("Remove"), this, SLOT(searchRemove()));
|
contextMnu.addAction(QIcon(IMAGE_REMOVE), tr("Remove"), this, SLOT(searchRemove()));
|
||||||
contextMnu.addAction(QIcon(IMAGE_REMOVE), tr("Remove All"), this, SLOT(searchRemoveAll()));
|
contextMnu.addAction(QIcon(IMAGE_REMOVE), tr("Remove All"), this, SLOT(searchRemoveAll()));
|
||||||
contextMnu.addSeparator();
|
contextMnu.addSeparator();
|
||||||
action = contextMnu.addAction(QIcon(IMAGE_COPYLINK), tr("Copy RetroShare Link"), this, SLOT(copySearchLink()));
|
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);
|
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.
|
// 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) ;
|
QString sid_hexa = QString::number(searchId,16) ;
|
||||||
|
|
||||||
QTreeWidgetItem *item2 = new QTreeWidgetItem();
|
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_COUNT_COL, QString::number(0));
|
||||||
item2->setText(SS_SEARCH_ID_COL, sid_hexa);
|
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->addTopLevelItem(item2);
|
||||||
ui.searchSummaryWidget->setCurrentItem(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.
|
// 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.
|
// 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);
|
rsFiles -> SearchBoolExp(expression, results, DIR_FLAGS_REMOTE | DIR_FLAGS_NETWORK_WIDE | DIR_FLAGS_BROWSABLE);
|
||||||
|
|
||||||
/* abstraction to allow reusee of tree rendering code */
|
/* abstraction to allow reusee of tree rendering code */
|
||||||
resultsToTree((advSearchDialog->getSearchAsString()).toStdString(),req_id, results);
|
resultsToTree(advSearchDialog->getSearchAsString(),req_id, results);
|
||||||
|
|
||||||
// // debug stuff
|
// // debug stuff
|
||||||
// Expression *expression2 = LinearizedExpression::toExpr(e) ;
|
// Expression *expression2 = LinearizedExpression::toExpr(e) ;
|
||||||
@ -593,24 +600,26 @@ void SearchDialog::searchAgain()
|
|||||||
{
|
{
|
||||||
/* get the current search text from the summary window */
|
/* get the current search text from the summary window */
|
||||||
QTreeWidgetItem* ci = ui.searchSummaryWidget->currentItem();
|
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;
|
return;
|
||||||
|
|
||||||
/* get the search text */
|
/* 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();
|
searchRemove();
|
||||||
|
|
||||||
|
/* search for the same keywords and filetype again */
|
||||||
|
ui.FileTypeComboBox->setCurrentIndex(fileType);
|
||||||
searchKeywords(txt);
|
searchKeywords(txt);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SearchDialog::searchKeywords(const QString& keywords)
|
void SearchDialog::searchKeywords(const QString& keywords)
|
||||||
{
|
{
|
||||||
std::string txt = keywords.toUtf8().constData();
|
if (keywords.length() < 3)
|
||||||
|
|
||||||
if(txt.length() < 3)
|
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
std::cerr << "SearchDialog::searchKeywords() : " << txt << std::endl;
|
|
||||||
|
|
||||||
QStringList qWords = keywords.split(" ", QString::SkipEmptyParts);
|
QStringList qWords = keywords.split(" ", QString::SkipEmptyParts);
|
||||||
std::list<std::string> words;
|
std::list<std::string> words;
|
||||||
QStringListIterator qWordsIter(qWords);
|
QStringListIterator qWordsIter(qWords);
|
||||||
@ -631,14 +640,14 @@ void SearchDialog::searchKeywords(const QString& keywords)
|
|||||||
if(ui._anonF2Fsearch_CB->isChecked())
|
if(ui._anonF2Fsearch_CB->isChecked())
|
||||||
{
|
{
|
||||||
if(n==1)
|
if(n==1)
|
||||||
req_id = rsTurtle->turtleSearch(txt) ;
|
req_id = rsTurtle->turtleSearch(words.front()) ;
|
||||||
else
|
else
|
||||||
req_id = rsTurtle->turtleSearch(lin_exp) ;
|
req_id = rsTurtle->turtleSearch(lin_exp) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
req_id = ((((uint32_t)rand()) << 16)^0x1e2fd5e4) + (((uint32_t)rand())^0x1b19acfe) ; // generate a random 32 bits request id
|
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())
|
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 */
|
/* abstraction to allow reusee of tree rendering code */
|
||||||
resultsToTree(txt,req_id, finalResults);
|
resultsToTree(keywords,req_id, finalResults);
|
||||||
ui.lineEdit->clear() ;
|
ui.lineEdit->clear() ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -710,15 +719,14 @@ void SearchDialog::processResultQueue()
|
|||||||
|
|
||||||
int nb_treated_elements = 0 ;
|
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 ;
|
qulonglong search_id = searchResultsQueue.back().first ;
|
||||||
FileDetail file = searchResultsQueue.back().second ;
|
FileDetail file = searchResultsQueue.back().second ;
|
||||||
|
|
||||||
searchResultsQueue.pop_back() ;
|
searchResultsQueue.pop_back() ;
|
||||||
|
|
||||||
/* which extensions do we use? */
|
|
||||||
std::string txt = ui.lineEdit->text().toStdString();
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
std::cout << "Updating file detail:" << std::endl ;
|
std::cout << "Updating file detail:" << std::endl ;
|
||||||
std::cout << " size = " << file.size << std::endl ;
|
std::cout << " size = " << file.size << std::endl ;
|
||||||
@ -726,38 +734,16 @@ void SearchDialog::processResultQueue()
|
|||||||
std::cout << " s_id = " << search_id << std::endl ;
|
std::cout << " s_id = " << search_id << std::endl ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ui.FileTypeComboBox->currentIndex() == FILETYPE_IDX_ANY)
|
insertFile(search_id,file);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
ui.searchResultWidget->setSortingEnabled(true);
|
||||||
if(!searchResultsQueue.empty())
|
if(!searchResultsQueue.empty())
|
||||||
QTimer::singleShot(1000,this,SLOT(processResultQueue())) ;
|
QTimer::singleShot(500,this,SLOT(processResultQueue())) ;
|
||||||
else
|
else
|
||||||
_queueIsAlreadyTakenCareOf = false ;
|
_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) ;
|
QString sid_hexa = QString::number(searchId,16) ;
|
||||||
|
|
||||||
@ -833,7 +819,7 @@ void SearchDialog::insertDirectory(const std::string &txt, qulonglong searchId,
|
|||||||
if(!found)
|
if(!found)
|
||||||
{
|
{
|
||||||
QTreeWidgetItem *item2 = new QTreeWidgetItem();
|
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->setText(SS_COUNT_COL, QString::number(1));
|
||||||
item2->setTextAlignment( SS_COUNT_COL, Qt::AlignRight );
|
item2->setTextAlignment( SS_COUNT_COL, Qt::AlignRight );
|
||||||
item2->setText(SS_SEARCH_ID_COL, sid_hexa);
|
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);
|
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.
|
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)
|
if(!found)
|
||||||
{
|
{
|
||||||
QTreeWidgetItem *item2 = new QTreeWidgetItem();
|
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->setText(SS_COUNT_COL, QString::number(1));
|
||||||
item2->setTextAlignment( SS_COUNT_COL, Qt::AlignRight );
|
item2->setTextAlignment( SS_COUNT_COL, Qt::AlignRight );
|
||||||
item2->setText(SS_SEARCH_ID_COL, sid_hexa);
|
item2->setText(SS_SEARCH_ID_COL, sid_hexa);
|
||||||
@ -909,31 +891,56 @@ void SearchDialog::insertDirectory(const std::string &txt, qulonglong searchId,
|
|||||||
}
|
}
|
||||||
|
|
||||||
selectSearchResults();
|
selectSearchResults();
|
||||||
|
|
||||||
if (ui.filterLineEdit->text().isEmpty() == false) {
|
|
||||||
filterItems(ui.filterLineEdit->text());
|
|
||||||
}
|
|
||||||
// TODO: check for duplicate directories
|
// 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:
|
// algo:
|
||||||
//
|
//
|
||||||
// 1 - look in result window whether the file already exist.
|
// 1 - look in result window whether the file already exist.
|
||||||
// 1.1 - If yes, just increment the source number.
|
// 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.
|
// 2 - look in the summary whether there exist the same request id.
|
||||||
// 1.1 - If yes, just increment the result number.
|
// 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())
|
if(nb_results.find(searchId) == nb_results.end())
|
||||||
nb_results[searchId] = 0 ;
|
nb_results[searchId] = 0 ;
|
||||||
|
|
||||||
if((int) nb_results[searchId] >= ui._max_results_SB->value())
|
if (nb_results[searchId] >= ui._max_results_SB->value())
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
// 1 - look in result window whether the file already exists.
|
// 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;
|
int anonymousSource = 0;
|
||||||
QString modifiedResult;
|
QString modifiedResult;
|
||||||
|
|
||||||
QString sid_hexa = QString::number(searchId,16) ;
|
|
||||||
|
|
||||||
QList<QTreeWidgetItem*> itms = ui.searchResultWidget->findItems(QString::fromStdString(file.hash),Qt::MatchExactly,SR_HASH_COL) ;
|
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)
|
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();
|
friendSource = modifiedResultCount.at(0).toInt();
|
||||||
anonymousSource = modifiedResultCount.at(1).toInt() + 1;
|
anonymousSource = modifiedResultCount.at(1).toInt() + 1;
|
||||||
}
|
}
|
||||||
anonymousSource = anonymousSource + friendSource;
|
|
||||||
modifiedResult = QString::number(friendSource) + "/" + QString::number(anonymousSource);
|
modifiedResult = QString::number(friendSource) + "/" + QString::number(anonymousSource);
|
||||||
(*it)->setText(SR_ID_COL,modifiedResult);
|
(*it)->setText(SR_ID_COL,modifiedResult);
|
||||||
QTreeWidgetItem *item = (*it);
|
QTreeWidgetItem *item = (*it);
|
||||||
@ -1017,10 +1021,6 @@ void SearchDialog::insertFile(const std::string& txt,qulonglong searchId, const
|
|||||||
{
|
{
|
||||||
foreground = QColor(0, 0, 209);
|
foreground = QColor(0, 0, 209);
|
||||||
}
|
}
|
||||||
else if (sources < 12)
|
|
||||||
{
|
|
||||||
foreground = QColor(0, 0, 228);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
foreground = QColor(0, 0, 228);
|
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()));
|
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_SIZE_COL, QString::number(file.size).rightJustified(15, '0')); // very important for sorting
|
||||||
item->setText(SR_AGE_COL, QString("%1").arg(file.age,15,10));
|
item->setText(SR_AGE_COL, QString::number(file.age).rightJustified(15, '0'));
|
||||||
item->setTextAlignment( SR_SIZE_COL, Qt::AlignRight );
|
item->setTextAlignment( SR_SIZE_COL, Qt::AlignRight );
|
||||||
if(searchType == FRIEND_SEARCH)
|
if(searchType == FRIEND_SEARCH)
|
||||||
{
|
{
|
||||||
@ -1065,7 +1065,6 @@ void SearchDialog::insertFile(const std::string& txt,qulonglong searchId, const
|
|||||||
anonymousSource = 1;
|
anonymousSource = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
anonymousSource = anonymousSource + friendSource;
|
|
||||||
modifiedResult =QString::number(friendSource) + "/" + QString::number(anonymousSource);
|
modifiedResult =QString::number(friendSource) + "/" + QString::number(anonymousSource);
|
||||||
item->setText(SR_ID_COL,modifiedResult);
|
item->setText(SR_ID_COL,modifiedResult);
|
||||||
item->setTextAlignment( SR_ID_COL, Qt::AlignRight );
|
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);
|
ui.searchResultWidget->addTopLevelItem(item);
|
||||||
|
|
||||||
|
/* hide/show this search result */
|
||||||
|
hideOrShowSearchResult(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add to the summary as well */
|
/* update 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.
|
if(!found) // only increment result when it's a new item.
|
||||||
{
|
{
|
||||||
int s = ui.searchSummaryWidget->topLevelItem(i)->text(SS_COUNT_COL).toInt() ;
|
int s = ui.searchSummaryWidget->topLevelItem(summaryItemIndex)->text(SS_COUNT_COL).toInt() ;
|
||||||
ui.searchSummaryWidget->topLevelItem(i)->setText(SS_COUNT_COL,QString::number(s+1));
|
ui.searchSummaryWidget->topLevelItem(summaryItemIndex)->setText(SS_COUNT_COL,QString::number(s+1));
|
||||||
}
|
|
||||||
found2 = true ;
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!found2)
|
|
||||||
{
|
|
||||||
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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
ui.searchResultWidget->setSortingEnabled(false);
|
||||||
|
|
||||||
@ -1156,7 +1129,7 @@ void SearchDialog::resultsToTree(std::string txt,qulonglong searchId, const std:
|
|||||||
fd.age = it->age;
|
fd.age = it->age;
|
||||||
fd.rank = 0;
|
fd.rank = 0;
|
||||||
|
|
||||||
insertFile(txt,searchId,fd, FRIEND_SEARCH);
|
insertFile(searchId,fd, FRIEND_SEARCH);
|
||||||
} else if (it->type == DIR_TYPE_DIR) {
|
} else if (it->type == DIR_TYPE_DIR) {
|
||||||
// insertDirectory(txt, searchId, *it, NULL);
|
// insertDirectory(txt, searchId, *it, NULL);
|
||||||
insertDirectory(txt, searchId, *it);
|
insertDirectory(txt, searchId, *it);
|
||||||
@ -1167,19 +1140,15 @@ void SearchDialog::resultsToTree(std::string txt,qulonglong searchId, const std:
|
|||||||
|
|
||||||
void SearchDialog::selectSearchResults(int index)
|
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 */
|
/* highlight this search in summary window */
|
||||||
|
QString searchId;
|
||||||
QTreeWidgetItem *ci = ui.searchSummaryWidget->currentItem();
|
QTreeWidgetItem *ci = ui.searchSummaryWidget->currentItem();
|
||||||
if (!ci)
|
if (ci) {
|
||||||
return;
|
|
||||||
|
|
||||||
/* get the searchId text */
|
/* get the searchId text */
|
||||||
QString searchId = ci->text(SS_SEARCH_ID_COL);
|
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
|
#ifdef DEBUG
|
||||||
std::cerr << "SearchDialog::selectSearchResults(): searchId: " << searchId.toStdString();
|
std::cerr << "SearchDialog::selectSearchResults(): searchId: " << searchId.toStdString();
|
||||||
std::cerr << std::endl;
|
std::cerr << std::endl;
|
||||||
@ -1189,28 +1158,50 @@ void SearchDialog::selectSearchResults(int index)
|
|||||||
int items = ui.searchResultWidget->topLevelItemCount();
|
int items = ui.searchResultWidget->topLevelItemCount();
|
||||||
for(int i = 0; i < items; i++)
|
for(int i = 0; i < items; i++)
|
||||||
{
|
{
|
||||||
/* get item */
|
hideOrShowSearchResult(ui.searchResultWidget->topLevelItem(i), searchId, index);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ui.searchResultWidget->update();
|
ui.searchResultWidget->update();
|
||||||
ui.filterLineEdit->clear();
|
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)
|
void SearchDialog::setIconAndType(QTreeWidgetItem *item, const QString& filename)
|
||||||
{
|
{
|
||||||
item->setIcon(SR_NAME_COL, FilesDefs::getIconFromFilename(filename));
|
item->setIcon(SR_NAME_COL, FilesDefs::getIconFromFilename(filename));
|
||||||
@ -1268,80 +1259,31 @@ void SearchDialog::sendLinkTo( )
|
|||||||
/* window will destroy itself! */
|
/* window will destroy itself! */
|
||||||
}
|
}
|
||||||
|
|
||||||
// not in use for the moment
|
void SearchDialog::selectFileType(int index)
|
||||||
void SearchDialog::onComboIndexChanged(int index)
|
|
||||||
{
|
{
|
||||||
if (!FileTypeExtensionMap->contains(index) && index != FILETYPE_IDX_DIRECTORY)
|
if (!FileTypeExtensionMap->contains(index) && index != FILETYPE_IDX_DIRECTORY)
|
||||||
return;
|
return;
|
||||||
QString alltypes = FileTypeExtensionMap->value(index);
|
|
||||||
QStringList types = alltypes.split(" ");
|
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();
|
int items = ui.searchResultWidget->topLevelItemCount();
|
||||||
for (int i = 0; i < items; i++) {
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SearchDialog::filterColumnChanged()
|
|
||||||
{
|
{
|
||||||
filterItems(ui.filterLineEdit->text());
|
hideOrShowSearchResult(ui.searchResultWidget->topLevelItem(i), searchId, index);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SearchDialog::filterItems(const QString &text)
|
void SearchDialog::filterItems()
|
||||||
{
|
{
|
||||||
int filterColumn = FilterColumnFromComboBox(ui.filterColumnComboBox->currentIndex());
|
|
||||||
|
|
||||||
int count = ui.searchResultWidget->topLevelItemCount ();
|
int count = ui.searchResultWidget->topLevelItemCount ();
|
||||||
for (int index = 0; index < count; index++) {
|
for (int index = 0; index < count; index++) {
|
||||||
filterItem(ui.searchResultWidget->topLevelItem(index), text, filterColumn);
|
hideOrShowSearchResult(ui.searchResultWidget->topLevelItem(index));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,21 +80,21 @@ private slots:
|
|||||||
void advancedSearch(Expression*);
|
void advancedSearch(Expression*);
|
||||||
|
|
||||||
void selectSearchResults(int index = -1);
|
void selectSearchResults(int index = -1);
|
||||||
|
void hideOrShowSearchResult(QTreeWidgetItem* resultItem, QString currentSearchId = QString(), int fileTypeIndex = -1);
|
||||||
|
|
||||||
void sendLinkTo();
|
void sendLinkTo();
|
||||||
|
|
||||||
void onComboIndexChanged(int index);
|
void selectFileType(int index);
|
||||||
|
|
||||||
void filterColumnChanged();
|
void filterItems();
|
||||||
void filterItems(const QString &text);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** render the results to the tree widget display */
|
/** render the results to the tree widget display */
|
||||||
void initSearchResult(const std::string& txt,qulonglong searchId, bool advanced) ;
|
void initSearchResult(const QString& txt,qulonglong searchId, int fileType, bool advanced) ;
|
||||||
void resultsToTree(std::string,qulonglong searchId, const std::list<DirDetails>&);
|
void resultsToTree(const QString& txt,qulonglong searchId, const std::list<DirDetails>&);
|
||||||
void insertFile(const std::string& txt,qulonglong searchId, const FileDetail& file, int searchType = ANONYMOUS_SEARCH) ;
|
void insertFile(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 QString &txt, qulonglong searchId, const DirDetails &dir, QTreeWidgetItem *item);
|
||||||
void insertDirectory(const std::string &txt, qulonglong searchId, const DirDetails &dir);
|
void insertDirectory(const QString &txt, qulonglong searchId, const DirDetails &dir);
|
||||||
void setIconAndType(QTreeWidgetItem *item, const QString& filename);
|
void setIconAndType(QTreeWidgetItem *item, const QString& filename);
|
||||||
void downloadDirectory(const QTreeWidgetItem *item, const QString &base);
|
void downloadDirectory(const QTreeWidgetItem *item, const QString &base);
|
||||||
void getSourceFriendsForHash(const std::string& hash,std::list<std::string>& srcIds);
|
void getSourceFriendsForHash(const std::string& hash,std::list<std::string>& srcIds);
|
||||||
|
Loading…
Reference in New Issue
Block a user