diff --git a/src/transferlistfilterswidget.h b/src/transferlistfilterswidget.h index c2bcf8f89..eb2ab4290 100644 --- a/src/transferlistfilterswidget.h +++ b/src/transferlistfilterswidget.h @@ -40,6 +40,7 @@ #include #include +#include "transferlistdelegate.h" #include "transferlistwidget.h" class TransferListFiltersWidget: public QFrame { @@ -47,13 +48,16 @@ class TransferListFiltersWidget: public QFrame { private: QStringList customLabels; + QList labelCounters; QListWidget* statusFilters; QListWidget* labelFilters; QVBoxLayout* vLayout; TransferListWidget *transferList; + int nb_labeled; + int nb_torrents; public: - TransferListFiltersWidget(QWidget *parent, TransferListWidget *transferList): QFrame(parent), transferList(transferList) { + TransferListFiltersWidget(QWidget *parent, TransferListWidget *transferList): QFrame(parent), transferList(transferList), nb_labeled(0), nb_torrents(0) { // Construct lists vLayout = new QVBoxLayout(); statusFilters = new QListWidget(); @@ -86,7 +90,8 @@ public: connect(statusFilters, SIGNAL(currentRowChanged(int)), transferList, SLOT(applyStatusFilter(int))); connect(transferList, SIGNAL(torrentStatusUpdate(uint,uint,uint,uint)), this, SLOT(updateTorrentNumbers(uint, uint, uint, uint))); connect(labelFilters, SIGNAL(currentRowChanged(int)), this, SLOT(applyLabelFilter(int))); - connect(transferList, SIGNAL(newLabel(QString)), this, SLOT(addLabel(QString))); + connect(transferList, SIGNAL(torrentAdded(QModelIndex)), this, SLOT(torrentAdded(QModelIndex))); + connect(transferList, SIGNAL(torrentAboutToBeRemoved(QModelIndex)), this, SLOT(torrentAboutToBeDeleted(QModelIndex))); // Load settings loadSettings(); @@ -131,6 +136,9 @@ public: settings.beginGroup(QString::fromUtf8("TransferListFilters")); statusFilters->setCurrentRow(settings.value("selectedFilterIndex", 0).toInt()); customLabels = settings.value("customLabels", QStringList()).toStringList(); + for(int i=0; isetText(label + " (0)"); customLabels << label; + labelCounters << 0; saveCustomLabels(); } @@ -179,6 +188,7 @@ protected slots: int row = labelFilters->row(labelFilters->selectedItems().first()); Q_ASSERT(row > 1); QString label = customLabels.takeAt(row - 2); + labelCounters.removeAt(row-2); labelFilters->removeItemWidget(labelFilters->selectedItems().first()); transferList->removeLabelFromRows(label); // Select first label @@ -199,6 +209,69 @@ protected slots: } } + void torrentChangedLabel(QString old_label, QString new_label) { + if(!old_label.isEmpty()) { + int i = customLabels.indexOf(old_label); + int new_count = labelCounters[i]-1; + Q_ASSERT(new_count >= 0); + labelCounters.replace(i, new_count); + labelFilters->item(i+2)->setText(old_label + " ("+ QString::number(new_count) +")"); + } + if(!new_label.isEmpty()) { + if(!customLabels.contains(new_label)) + addLabel(new_label); + int i = customLabels.indexOf(new_label); + int new_count = labelCounters[i]+1; + labelCounters.replace(i, new_count); + labelFilters->item(i+2)->setText(new_label + " ("+ QString::number(new_count) +")"); + } + } + + void torrentAdded(QModelIndex index) { + Q_ASSERT(index.isValid()); + QString label = transferList->model()->index(index.row(), TR_LABEL).data(Qt::DisplayRole).toString().trimmed(); + if(!label.isEmpty()) { + if(!customLabels.contains(label)) { + addLabel(label); + } + // Update label counter + int i = customLabels.indexOf(label); + int new_count = labelCounters[i]+1; + labelCounters.replace(i, new_count); + labelFilters->item(i+2)->setText(label + " ("+ QString::number(new_count) +")"); + ++nb_labeled; + } + ++nb_torrents; + Q_ASSERT(nb_torrents >= 0); + Q_ASSERT(nb_labeled >= 0); + Q_ASSERT(nb_labeled <= nb_torrents); + updateStickyLabelCounters(); + } + + void torrentAboutToBeDeleted(QModelIndex index) { + Q_ASSERT(index.isValid()); + QString label = transferList->model()->index(index.row(), TR_LABEL).data(Qt::DisplayRole).toString().trimmed(); + if(!label.isEmpty()) { + // Update label counter + int i = customLabels.indexOf(label); + Q_ASSERT(i >= 0); + int new_count = labelCounters[i]-1; + labelCounters.replace(i, new_count); + labelFilters->item(i+2)->setText(label + " ("+ QString::number(new_count) +")"); + --nb_labeled; + } + --nb_torrents; + Q_ASSERT(nb_torrents >= 0); + Q_ASSERT(nb_labeled >= 0); + Q_ASSERT(nb_labeled <= nb_torrents); + updateStickyLabelCounters(); + } + + void updateStickyLabelCounters() { + labelFilters->item(0)->setText(tr("All labels") + " ("+QString::number(nb_torrents)+")"); + labelFilters->item(1)->setText(tr("No label") + " ("+QString::number(nb_torrents-nb_labeled)+")"); + } + }; #endif // TRANSFERLISTFILTERSWIDGET_H diff --git a/src/transferlistwidget.cpp b/src/transferlistwidget.cpp index a4e32bffc..0b77c5c14 100644 --- a/src/transferlistwidget.cpp +++ b/src/transferlistwidget.cpp @@ -163,7 +163,6 @@ void TransferListWidget::addTorrent(QTorrentHandle& h) { listModel->setData(listModel->index(row, TR_SEEDS), QVariant((double)0.0)); listModel->setData(listModel->index(row, TR_PEERS), QVariant((double)0.0)); QString label = TorrentPersistentData::getLabel(h.hash()); - emit newLabel(label); listModel->setData(listModel->index(row, TR_LABEL), QVariant(label)); if(BTSession->isQueueingEnabled()) listModel->setData(listModel->index(row, TR_PRIORITY), QVariant((int)h.queue_position())); @@ -191,6 +190,9 @@ void TransferListWidget::addTorrent(QTorrentHandle& h) { // Select first torrent to be added if(listModel->rowCount() == 1) selectionModel()->setCurrentIndex(proxyModel->index(row, TR_NAME), QItemSelectionModel::SelectCurrent|QItemSelectionModel::Rows); + // Emit signal + emit torrentAdded(listModel->index(row, 0)); + // Refresh the list refreshList(); } catch(invalid_handle e) { // Remove added torrent @@ -206,6 +208,7 @@ void TransferListWidget::setRowColor(int row, QColor color) { } void TransferListWidget::deleteTorrent(int row, bool refresh_list) { + emit torrentAboutToBeRemoved(listModel->index(row, 0)); listModel->removeRow(row); if(refresh_list) refreshList(); @@ -235,6 +238,11 @@ void TransferListWidget::pauseTorrent(int row, bool refresh_list) { refreshList(); } + +int TransferListWidget::getNbTorrents() const { + return listModel->rowCount(); +} + // Wrapper slot for bittorrent signal void TransferListWidget::resumeTorrent(QTorrentHandle &h) { resumeTorrent(getRowFromHash(h.hash())); @@ -418,7 +426,9 @@ void TransferListWidget::setFinished(QTorrentHandle &h) { listModel->setData(listModel->index(row, TR_PRIORITY), QVariant((int)-1)); } } catch(invalid_handle e) { - if(row >= 0) deleteTorrent(row); + if(row >= 0) { + deleteTorrent(row); + } } } @@ -580,7 +590,8 @@ void TransferListWidget::deleteSelectedTorrents() { hashes << getHashFromRow(mapToSource(index).row()); } foreach(const QString &hash, hashes) { - deleteTorrent(getRowFromHash(hash), false); + int row = getRowFromHash(hash); + deleteTorrent(row, false); BTSession->deleteTorrent(hash, delete_local_files); } refreshList(); @@ -849,7 +860,6 @@ void TransferListWidget::askNewLabelForSelection() { bool ok; QString label = QInputDialog::getText(this, tr("New Label"), tr("Label:"), QLineEdit::Normal, "", &ok); if (ok && !label.isEmpty()) { - emit newLabel(label); // Assign label to selection setSelectionLabel(label); } @@ -859,8 +869,10 @@ void TransferListWidget::setSelectionLabel(QString label) { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); foreach(const QModelIndex &index, selectedIndexes) { QString hash = getHashFromRow(mapToSource(index).row()); + QString old_label = proxyModel->data(proxyModel->index(index.row(), TR_LABEL)).toString(); proxyModel->setData(proxyModel->index(index.row(), TR_LABEL), QVariant(label)); TorrentPersistentData::saveLabel(hash, label); + emit torrentChangedLabel(old_label, label); } } @@ -868,6 +880,7 @@ void TransferListWidget::removeLabelFromRows(QString label) { for(int i=0; irowCount(); ++i) { if(label == listModel->data(listModel->index(i, TR_LABEL), Qt::DisplayRole)) listModel->setData(listModel->index(i, TR_LABEL), "", Qt::DisplayRole); + emit torrentChangedLabel(label, ""); } } diff --git a/src/transferlistwidget.h b/src/transferlistwidget.h index 132870753..56758dd8e 100644 --- a/src/transferlistwidget.h +++ b/src/transferlistwidget.h @@ -58,6 +58,7 @@ private: public: TransferListWidget(QWidget *parent, GUI *main_window, Bittorrent* BTSession); ~TransferListWidget(); + int getNbTorrents() const; protected: int getRowFromHash(QString hash) const; @@ -120,8 +121,9 @@ public slots: signals: void currentTorrentChanged(QTorrentHandle &h); void torrentStatusUpdate(unsigned int nb_downloading, unsigned int nb_seeding, unsigned int nb_active, unsigned int nb_inactive); - void newLabel(QString label); - + void torrentAdded(QModelIndex index); + void torrentAboutToBeRemoved(QModelIndex index); + void torrentChangedLabel(QString old_label, QString new_label); }; #endif // TRANSFERLISTWIDGET_H