diff --git a/Changelog b/Changelog index 6f8e4e201..7f7d1744d 100644 --- a/Changelog +++ b/Changelog @@ -24,6 +24,8 @@ - BUGFIX: Fixed Memory leaks in search engine - BUGFIX: Remove torrent file from scanned directory if it is already in download list - BUGFIX: Fixed possible segfault on loading due to columns size loading + - BUGFIX: Fixed problems that could happen with delete selection action + - COSMETIC: Now displaying the number of downloads in tab title - COSMETIC: Redesigned download from url dialog - COSMETIC: Added a message to warn user that we started download from an url - COSMETIC: Renamed main tab from "Downloads" to "Transfers" diff --git a/src/GUI.cpp b/src/GUI.cpp index f6add4427..a9940195e 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -122,6 +122,8 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent){ // download thread downloader = new downloadThread(this); connect(downloader, SIGNAL(downloadFinished(QString, QString, int, QString)), this, SLOT(processDownloadedFile(QString, QString, int, QString))); + nbTorrents = 0; + tabs->setTabText(0, tr("Transfers") +" (0)"); //Resume unfinished torrent downloads resumeUnfinished(); // Add torrent given on command line @@ -1115,6 +1117,8 @@ void GUI::deleteAll(){ } // Clear Download list DLListModel->removeRows(0, DLListModel->rowCount()); + nbTorrents = 0; + tabs->setTabText(0, tr("Transfers") +" (0)"); //Update info Bar setInfoBar(tr("Download list cleared.")); } @@ -1138,34 +1142,41 @@ void GUI::deleteSelection(){ QString(), 0, 1) == 0) { //User clicked YES QModelIndex index; + QList > sortedIndexes; + // We have to remove items from the bottom + // to the top in order not to change indexes + // of files to delete. foreach(index, selectedIndexes){ if(index.column() == NAME){ - // Get the file name - QString fileName = index.data().toString(); - // Get handle and pause the torrent - torrent_handle h = handles.value(fileName); - s->remove_torrent(h); - // remove it from scan dir or it will start again - if(isScanningDir){ - QFile::remove(scan_dir+fileName+".torrent"); - } - // Remove torrent from handles - handles.remove(fileName); - // Remove it from torrent backup directory - torrentBackup.remove(fileName+".torrent"); - torrentBackup.remove(fileName+".fastresume"); - torrentBackup.remove(fileName+".paused"); - torrentBackup.remove(fileName+".incremental"); - // Update info bar - setInfoBar("'" + fileName +"' "+tr("removed.", " removed.")); - // Delete item from download list - int row = getRowFromName(fileName); - if(row == -1){ - std::cout << "Error: Couldn't find filename in download list...\n"; - continue; - } - DLListModel->removeRow(row); + qDebug("row to delete: %d", index.row()); + misc::insertSort2(sortedIndexes, QPair(index.row(), index), Qt::DescendingOrder); + } + } + QPair sortedIndex; + foreach(sortedIndex, sortedIndexes){ + qDebug("deleting row: %d, %d, col: %d", sortedIndex.first, sortedIndex.second.row(), sortedIndex.second.column()); + // Get the file name + QString fileName = sortedIndex.second.data().toString(); + // Delete item from download list + DLListModel->removeRow(sortedIndex.first); + // Get handle and pause the torrent + torrent_handle h = handles.value(fileName); + s->remove_torrent(h); + // Remove torrent from handles + handles.remove(fileName); + // remove it from scan dir or it will start again + if(isScanningDir){ + QFile::remove(scan_dir+fileName+".torrent"); } + // Remove it from torrent backup directory + torrentBackup.remove(fileName+".torrent"); + torrentBackup.remove(fileName+".fastresume"); + torrentBackup.remove(fileName+".paused"); + torrentBackup.remove(fileName+".incremental"); + // Update info bar + setInfoBar("'" + fileName +"' "+tr("removed.", " removed.")); + --nbTorrents; + tabs->setTabText(0, tr("Transfers") +" ("+QString(misc::toString(nbTorrents).c_str())+")"); } } } @@ -1328,6 +1339,8 @@ void GUI::addTorrents(const QStringList& pathsList, bool fromScanDir, const QStr setInfoBar("'" + file + "' "+tr("resumed. (fast resume)")); } } + ++nbTorrents; + tabs->setTabText(0, tr("Transfers") +" ("+QString(misc::toString(nbTorrents).c_str())+")"); }catch (invalid_encoding& e){ // Raised by bdecode() std::cout << "Could not decode file, reason: " << e.what() << '\n'; // Display warning to tell user we can't decode the torrent file diff --git a/src/GUI.h b/src/GUI.h index 9dc57a26e..7388bee07 100644 --- a/src/GUI.h +++ b/src/GUI.h @@ -82,6 +82,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{ QStandardItemModel *SearchListModel; SearchListDelegate *SearchDelegate; QStringList supported_preview_extensions; + unsigned int nbTorrents; // Preview previewSelect *previewSelection; QProcess *previewProcess; diff --git a/src/misc.h b/src/misc.h index 6b556c962..ae03328a5 100644 --- a/src/misc.h +++ b/src/misc.h @@ -135,6 +135,20 @@ class misc : public QObject{ list.insert(i, value); } + template static void insertSort2(QList > &list, const QPair& value, Qt::SortOrder sortOrder){ + int i = 0; + if(sortOrder == Qt::AscendingOrder){ + while(i < list.size() and value.first > list.at(i).first){ + ++i; + } + }else{ + while(i < list.size() and value.first < list.at(i).first){ + ++i; + } + } + list.insert(i, value); + } + // Can't use template class for QString because >,< use unicode code for sorting // which is not what a human would expect when sorting strings. static void insertSortString(QList > &list, QPair value, Qt::SortOrder sortOrder){