qBittorrent
TrackerFiltersList Class Referencefinal

#include <transferlistfilterswidget.h>

Inheritance diagram for TrackerFiltersList:
Collaboration diagram for TrackerFiltersList:

Public Slots

void trackerSuccess (const BitTorrent::TorrentID &id, const QString &tracker)
 
void trackerError (const BitTorrent::TorrentID &id, const QString &tracker)
 
void trackerWarning (const BitTorrent::TorrentID &id, const QString &tracker)
 
- Public Slots inherited from BaseFilterWidget
void toggleFilter (bool checked)
 

Public Member Functions

 TrackerFiltersList (QWidget *parent, TransferListWidget *transferList, bool downloadFavicon)
 
 ~TrackerFiltersList () override
 
void addItem (const QString &tracker, const BitTorrent::TorrentID &id)
 
void removeItem (const QString &tracker, const BitTorrent::TorrentID &id)
 
void changeTrackerless (bool trackerless, const BitTorrent::TorrentID &id)
 
void setDownloadTrackerFavicon (bool value)
 
- Public Member Functions inherited from BaseFilterWidget
 BaseFilterWidget (QWidget *parent, TransferListWidget *transferList)
 
QSize sizeHint () const override
 
QSize minimumSizeHint () const override
 

Private Slots

void handleFavicoDownloadFinished (const Net::DownloadResult &result)
 

Private Member Functions

void showMenu (const QPoint &) override
 
void applyFilter (int row) override
 
void handleNewTorrent (BitTorrent::Torrent *const torrent) override
 
void torrentAboutToBeDeleted (BitTorrent::Torrent *const torrent) override
 
QString trackerFromRow (int row) const
 
int rowFromTracker (const QString &tracker) const
 
QSet< BitTorrent::TorrentIDgetTorrentIDs (int row) const
 
void downloadFavicon (const QString &url)
 

Private Attributes

QHash< QString, QSet< BitTorrent::TorrentID > > m_trackers
 
QHash< BitTorrent::TorrentID, QSet< QString > > m_errors
 
QHash< BitTorrent::TorrentID, QSet< QString > > m_warnings
 
QStringList m_iconPaths
 
int m_totalTorrents
 
bool m_downloadTrackerFavicon
 

Additional Inherited Members

- Protected Attributes inherited from BaseFilterWidget
TransferListWidgettransferList
 

Detailed Description

Definition at line 98 of file transferlistfilterswidget.h.

Constructor & Destructor Documentation

◆ TrackerFiltersList()

TrackerFiltersList::TrackerFiltersList ( QWidget *  parent,
TransferListWidget transferList,
bool  downloadFavicon 
)

Definition at line 300 of file transferlistfilterswidget.cpp.

301  : BaseFilterWidget(parent, transferList)
302  , m_totalTorrents(0)
304 {
305  auto *allTrackers = new QListWidgetItem(this);
306  allTrackers->setData(Qt::DisplayRole, tr("All (0)", "this is for the tracker filter"));
307  allTrackers->setData(Qt::DecorationRole, UIThemeManager::instance()->getIcon("network-server"));
308  auto *noTracker = new QListWidgetItem(this);
309  noTracker->setData(Qt::DisplayRole, tr("Trackerless (0)"));
310  noTracker->setData(Qt::DecorationRole, UIThemeManager::instance()->getIcon("network-server"));
311  auto *errorTracker = new QListWidgetItem(this);
312  errorTracker->setData(Qt::DisplayRole, tr("Error (0)"));
313  errorTracker->setData(Qt::DecorationRole, style()->standardIcon(QStyle::SP_MessageBoxCritical));
314  auto *warningTracker = new QListWidgetItem(this);
315  warningTracker->setData(Qt::DisplayRole, tr("Warning (0)"));
316  warningTracker->setData(Qt::DecorationRole, style()->standardIcon(QStyle::SP_MessageBoxWarning));
317  m_trackers[NULL_HOST] = {};
318 
319  setCurrentRow(0, QItemSelectionModel::SelectCurrent);
320  toggleFilter(Preferences::instance()->getTrackerFilterState());
321 }
void toggleFilter(bool checked)
BaseFilterWidget(QWidget *parent, TransferListWidget *transferList)
TransferListWidget * transferList
static Preferences * instance()
void downloadFavicon(const QString &url)
QHash< QString, QSet< BitTorrent::TorrentID > > m_trackers
static UIThemeManager * instance()

References Preferences::instance(), UIThemeManager::instance(), m_trackers, anonymous_namespace{transferlistfilterswidget.cpp}::NULL_HOST, and BaseFilterWidget::toggleFilter().

Here is the call graph for this function:

◆ ~TrackerFiltersList()

TrackerFiltersList::~TrackerFiltersList ( )
override

Definition at line 323 of file transferlistfilterswidget.cpp.

324 {
325  for (const QString &iconPath : asConst(m_iconPaths))
326  Utils::Fs::forceRemove(iconPath);
327 }
constexpr std::add_const_t< T > & asConst(T &t) noexcept
Definition: global.h:42
bool forceRemove(const QString &filePath)
Definition: fs.cpp:173

References asConst(), Utils::Fs::forceRemove(), and m_iconPaths.

Here is the call graph for this function:

Member Function Documentation

◆ addItem()

void TrackerFiltersList::addItem ( const QString &  tracker,
const BitTorrent::TorrentID id 
)

Definition at line 329 of file transferlistfilterswidget.cpp.

330 {
331  const QString host {getHost(tracker)};
332  const bool exists {m_trackers.contains(host)};
333  QListWidgetItem *trackerItem {nullptr};
334 
335  if (exists)
336  {
337  if (m_trackers.value(host).contains(id))
338  return;
339 
340  trackerItem = item((host == NULL_HOST)
342  : rowFromTracker(host));
343  }
344  else
345  {
346  trackerItem = new QListWidgetItem();
347  trackerItem->setData(Qt::DecorationRole, UIThemeManager::instance()->getIcon("network-server"));
348 
349  const QString scheme = getScheme(tracker);
350  downloadFavicon(QString::fromLatin1("%1://%2/favicon.ico").arg((scheme.startsWith("http") ? scheme : "http"), host));
351  }
352  if (!trackerItem) return;
353 
354  QSet<BitTorrent::TorrentID> &torrentIDs {m_trackers[host]};
355  torrentIDs.insert(id);
356 
357  if (host == NULL_HOST)
358  {
359  trackerItem->setText(tr("Trackerless (%1)").arg(torrentIDs.size()));
360  if (currentRow() == TRACKERLESS_ROW)
362  return;
363  }
364 
365  trackerItem->setText(QString::fromLatin1("%1 (%2)").arg(host, QString::number(torrentIDs.size())));
366  if (exists)
367  {
368  if (currentRow() == rowFromTracker(host))
369  applyFilter(currentRow());
370  return;
371  }
372 
373  Q_ASSERT(count() >= 4);
375  int insPos = count();
376  for (int i = 4; i < count(); ++i)
377  {
378  if (naturalLessThan(host, item(i)->text()))
379  {
380  insPos = i;
381  break;
382  }
383  }
384  QListWidget::insertItem(insPos, trackerItem);
385  updateGeometry();
386 }
void applyFilter(int row) override
int rowFromTracker(const QString &tracker) const

References applyFilter(), downloadFavicon(), anonymous_namespace{transferlistfilterswidget.cpp}::getHost(), anonymous_namespace{transferlistfilterswidget.cpp}::getScheme(), UIThemeManager::instance(), m_trackers, anonymous_namespace{transferlistfilterswidget.cpp}::NULL_HOST, rowFromTracker(), and anonymous_namespace{transferlistfilterswidget.cpp}::TRACKERLESS_ROW.

Referenced by TransferListFiltersWidget::addTrackers(), changeTrackerless(), and handleNewTorrent().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ applyFilter()

void TrackerFiltersList::applyFilter ( int  row)
overrideprivatevirtual

Implements BaseFilterWidget.

Definition at line 576 of file transferlistfilterswidget.cpp.

577 {
578  if (row == ALL_ROW)
580  else if (isVisible())
582 }
QSet< BitTorrent::TorrentID > getTorrentIDs(int row) const
void applyTrackerFilter(const QSet< BitTorrent::TorrentID > &torrentIDs)

References anonymous_namespace{transferlistfilterswidget.cpp}::ALL_ROW, TransferListWidget::applyTrackerFilter(), TransferListWidget::applyTrackerFilterAll(), getTorrentIDs(), and BaseFilterWidget::transferList.

Referenced by addItem(), removeItem(), trackerError(), trackerSuccess(), and trackerWarning().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ changeTrackerless()

void TrackerFiltersList::changeTrackerless ( bool  trackerless,
const BitTorrent::TorrentID id 
)

Definition at line 433 of file transferlistfilterswidget.cpp.

434 {
435  if (trackerless)
436  addItem(NULL_HOST, id);
437  else
438  removeItem(NULL_HOST, id);
439 }
void removeItem(const QString &tracker, const BitTorrent::TorrentID &id)
void addItem(const QString &tracker, const BitTorrent::TorrentID &id)

References addItem(), anonymous_namespace{transferlistfilterswidget.cpp}::NULL_HOST, and removeItem().

Referenced by TransferListFiltersWidget::changeTrackerless().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ downloadFavicon()

void TrackerFiltersList::downloadFavicon ( const QString &  url)
private

Definition at line 516 of file transferlistfilterswidget.cpp.

517 {
518  if (!m_downloadTrackerFavicon) return;
522 }
DownloadHandler * download(const DownloadRequest &downloadRequest)
static DownloadManager * instance()
void handleFavicoDownloadFinished(const Net::DownloadResult &result)
nonstd::expected< void, QString > saveToFile(const QString &path, const QByteArray &data)
Definition: io.cpp:69

References Net::DownloadManager::download(), handleFavicoDownloadFinished(), Net::DownloadManager::instance(), m_downloadTrackerFavicon, and Utils::IO::saveToFile().

Referenced by addItem(), handleFavicoDownloadFinished(), and setDownloadTrackerFavicon().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getTorrentIDs()

QSet< BitTorrent::TorrentID > TrackerFiltersList::getTorrentIDs ( int  row) const
private

Definition at line 633 of file transferlistfilterswidget.cpp.

634 {
635  switch (row)
636  {
637  case TRACKERLESS_ROW:
638  return m_trackers.value(NULL_HOST);
639  case ERROR_ROW:
640  return {m_errors.keyBegin(), m_errors.keyEnd()};
641  case WARNING_ROW:
642  return {m_warnings.keyBegin(), m_warnings.keyEnd()};
643  default:
644  return m_trackers.value(trackerFromRow(row));
645  }
646 }
QHash< BitTorrent::TorrentID, QSet< QString > > m_errors
QString trackerFromRow(int row) const
QHash< BitTorrent::TorrentID, QSet< QString > > m_warnings

References anonymous_namespace{transferlistfilterswidget.cpp}::ERROR_ROW, m_errors, m_trackers, m_warnings, anonymous_namespace{transferlistfilterswidget.cpp}::NULL_HOST, trackerFromRow(), anonymous_namespace{transferlistfilterswidget.cpp}::TRACKERLESS_ROW, and anonymous_namespace{transferlistfilterswidget.cpp}::WARNING_ROW.

Referenced by applyFilter().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ handleFavicoDownloadFinished

void TrackerFiltersList::handleFavicoDownloadFinished ( const Net::DownloadResult result)
privateslot

Definition at line 524 of file transferlistfilterswidget.cpp.

525 {
526  if (result.status != Net::DownloadStatus::Success)
527  {
528  if (result.url.endsWith(".ico", Qt::CaseInsensitive))
529  downloadFavicon(result.url.left(result.url.size() - 4) + ".png");
530  return;
531  }
532 
533  const QString host = getHost(result.url);
534 
535  if (!m_trackers.contains(host))
536  {
538  return;
539  }
540 
541  QListWidgetItem *trackerItem = item(rowFromTracker(host));
542  if (!trackerItem) return;
543 
544  QIcon icon(result.filePath);
545  //Detect a non-decodable icon
546  QList<QSize> sizes = icon.availableSizes();
547  bool invalid = (sizes.isEmpty() || icon.pixmap(sizes.first()).isNull());
548  if (invalid)
549  {
550  if (result.url.endsWith(".ico", Qt::CaseInsensitive))
551  downloadFavicon(result.url.left(result.url.size() - 4) + ".png");
553  }
554  else
555  {
556  trackerItem->setData(Qt::DecorationRole, QIcon(result.filePath));
557  m_iconPaths.append(result.filePath);
558  }
559 }
DownloadStatus status

References downloadFavicon(), Net::DownloadResult::filePath, Utils::Fs::forceRemove(), anonymous_namespace{transferlistfilterswidget.cpp}::getHost(), m_iconPaths, m_trackers, rowFromTracker(), Net::DownloadResult::status, Net::Success, and Net::DownloadResult::url.

Referenced by downloadFavicon().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ handleNewTorrent()

void TrackerFiltersList::handleNewTorrent ( BitTorrent::Torrent *const  torrent)
overrideprivatevirtual

Implements BaseFilterWidget.

Definition at line 584 of file transferlistfilterswidget.cpp.

585 {
586  const BitTorrent::TorrentID torrentID {torrent->id()};
587  const QVector<BitTorrent::TrackerEntry> trackers {torrent->trackers()};
588  for (const BitTorrent::TrackerEntry &tracker : trackers)
589  addItem(tracker.url, torrentID);
590 
591  // Check for trackerless torrent
592  if (trackers.isEmpty())
593  addItem(NULL_HOST, torrentID);
594 
595  item(ALL_ROW)->setText(tr("All (%1)", "this is for the tracker filter").arg(++m_totalTorrents));
596 }
TorrentID id() const
Definition: torrent.cpp:54
virtual QVector< TrackerEntry > trackers() const =0
Definition: trackerentry.h:38

References addItem(), anonymous_namespace{transferlistfilterswidget.cpp}::ALL_ROW, BitTorrent::Torrent::id(), m_totalTorrents, anonymous_namespace{transferlistfilterswidget.cpp}::NULL_HOST, and BitTorrent::Torrent::trackers().

Here is the call graph for this function:

◆ removeItem()

void TrackerFiltersList::removeItem ( const QString &  tracker,
const BitTorrent::TorrentID id 
)

Definition at line 388 of file transferlistfilterswidget.cpp.

389 {
390  const QString host = getHost(tracker);
391  QSet<BitTorrent::TorrentID> torrentIDs = m_trackers.value(host);
392 
393  if (torrentIDs.empty())
394  return;
395  torrentIDs.remove(id);
396 
397  int row = 0;
398  QListWidgetItem *trackerItem = nullptr;
399 
400  if (!host.isEmpty())
401  {
402  // Remove from 'Error' and 'Warning' view
403  trackerSuccess(id, tracker);
404  row = rowFromTracker(host);
405  trackerItem = item(row);
406 
407  if (torrentIDs.empty())
408  {
409  if (currentRow() == row)
410  setCurrentRow(0, QItemSelectionModel::SelectCurrent);
411  delete trackerItem;
412  m_trackers.remove(host);
413  updateGeometry();
414  return;
415  }
416 
417  if (trackerItem)
418  trackerItem->setText(QString::fromLatin1("%1 (%2)").arg(host, QString::number(torrentIDs.size())));
419  }
420  else
421  {
422  row = 1;
423  trackerItem = item(TRACKERLESS_ROW);
424  trackerItem->setText(tr("Trackerless (%1)").arg(torrentIDs.size()));
425  }
426 
427  m_trackers.insert(host, torrentIDs);
428 
429  if (currentRow() == row)
430  applyFilter(row);
431 }
void trackerSuccess(const BitTorrent::TorrentID &id, const QString &tracker)

References applyFilter(), anonymous_namespace{transferlistfilterswidget.cpp}::getHost(), m_trackers, rowFromTracker(), anonymous_namespace{transferlistfilterswidget.cpp}::TRACKERLESS_ROW, and trackerSuccess().

Referenced by changeTrackerless(), TransferListFiltersWidget::removeTrackers(), and torrentAboutToBeDeleted().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ rowFromTracker()

int TrackerFiltersList::rowFromTracker ( const QString &  tracker) const
private

Definition at line 622 of file transferlistfilterswidget.cpp.

623 {
624  Q_ASSERT(!tracker.isEmpty());
625  for (int i = 4; i < count(); ++i)
626  {
627  if (tracker == trackerFromRow(i))
628  return i;
629  }
630  return -1;
631 }

References trackerFromRow().

Referenced by addItem(), handleFavicoDownloadFinished(), and removeItem().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ setDownloadTrackerFavicon()

void TrackerFiltersList::setDownloadTrackerFavicon ( bool  value)

Definition at line 441 of file transferlistfilterswidget.cpp.

442 {
443  if (value == m_downloadTrackerFavicon) return;
445 
447  {
448  for (auto i = m_trackers.cbegin(); i != m_trackers.cend(); ++i)
449  {
450  const QString &tracker = i.key();
451  if (!tracker.isEmpty())
452  {
453  const QString scheme = getScheme(tracker);
454  downloadFavicon(QString("%1://%2/favicon.ico")
455  .arg((scheme.startsWith("http") ? scheme : "http"), getHost(tracker)));
456  }
457  }
458  }
459 }
T value(const QString &key, const T &defaultValue={})
Definition: preferences.cpp:64

References downloadFavicon(), anonymous_namespace{transferlistfilterswidget.cpp}::getHost(), anonymous_namespace{transferlistfilterswidget.cpp}::getScheme(), m_downloadTrackerFavicon, m_trackers, and anonymous_namespace{preferences.cpp}::value().

Referenced by TransferListFiltersWidget::setDownloadTrackerFavicon().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ showMenu()

void TrackerFiltersList::showMenu ( const QPoint &  )
overrideprivatevirtual

Implements BaseFilterWidget.

Definition at line 561 of file transferlistfilterswidget.cpp.

562 {
563  QMenu *menu = new QMenu(this);
564  menu->setAttribute(Qt::WA_DeleteOnClose);
565 
566  menu->addAction(UIThemeManager::instance()->getIcon("media-playback-start"), tr("Resume torrents")
568  menu->addAction(UIThemeManager::instance()->getIcon("media-playback-pause"), tr("Pause torrents")
570  menu->addAction(UIThemeManager::instance()->getIcon("edit-delete"), tr("Delete torrents")
572 
573  menu->popup(QCursor::pos());
574 }

References TransferListWidget::deleteVisibleTorrents(), UIThemeManager::instance(), TransferListWidget::pauseVisibleTorrents(), TransferListWidget::startVisibleTorrents(), and BaseFilterWidget::transferList.

Here is the call graph for this function:

◆ torrentAboutToBeDeleted()

void TrackerFiltersList::torrentAboutToBeDeleted ( BitTorrent::Torrent *const  torrent)
overrideprivatevirtual

Implements BaseFilterWidget.

Definition at line 598 of file transferlistfilterswidget.cpp.

599 {
600  const BitTorrent::TorrentID torrentID {torrent->id()};
601  const QVector<BitTorrent::TrackerEntry> trackers {torrent->trackers()};
602  for (const BitTorrent::TrackerEntry &tracker : trackers)
603  removeItem(tracker.url, torrentID);
604 
605  // Check for trackerless torrent
606  if (trackers.isEmpty())
607  removeItem(NULL_HOST, torrentID);
608 
609  item(ALL_ROW)->setText(tr("All (%1)", "this is for the tracker filter").arg(--m_totalTorrents));
610 }

References anonymous_namespace{transferlistfilterswidget.cpp}::ALL_ROW, BitTorrent::Torrent::id(), m_totalTorrents, anonymous_namespace{transferlistfilterswidget.cpp}::NULL_HOST, removeItem(), and BitTorrent::Torrent::trackers().

Here is the call graph for this function:

◆ trackerError

void TrackerFiltersList::trackerError ( const BitTorrent::TorrentID id,
const QString &  tracker 
)
slot

Definition at line 492 of file transferlistfilterswidget.cpp.

493 {
494  QSet<QString> &trackers {m_errors[id]};
495  if (trackers.contains(tracker))
496  return;
497 
498  trackers.insert(tracker);
499  item(ERROR_ROW)->setText(tr("Error (%1)").arg(m_errors.size()));
500  if (currentRow() == ERROR_ROW)
502 }

References applyFilter(), anonymous_namespace{transferlistfilterswidget.cpp}::ERROR_ROW, and m_errors.

Referenced by TransferListFiltersWidget::TransferListFiltersWidget().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ trackerFromRow()

QString TrackerFiltersList::trackerFromRow ( int  row) const
private

Definition at line 612 of file transferlistfilterswidget.cpp.

613 {
614  Q_ASSERT(row > 1);
615  const QString tracker = item(row)->text();
616  QStringList parts = tracker.split(' ');
617  Q_ASSERT(parts.size() >= 2);
618  parts.removeLast(); // Remove trailing number
619  return parts.join(' ');
620 }

Referenced by getTorrentIDs(), and rowFromTracker().

Here is the caller graph for this function:

◆ trackerSuccess

void TrackerFiltersList::trackerSuccess ( const BitTorrent::TorrentID id,
const QString &  tracker 
)
slot

Definition at line 461 of file transferlistfilterswidget.cpp.

462 {
463  const auto errorHashesIter = m_errors.find(id);
464  if (errorHashesIter != m_errors.end())
465  {
466  QSet<QString> &errored = *errorHashesIter;
467  errored.remove(tracker);
468  if (errored.empty())
469  {
470  m_errors.erase(errorHashesIter);
471  item(ERROR_ROW)->setText(tr("Error (%1)").arg(m_errors.size()));
472  if (currentRow() == ERROR_ROW)
474  }
475  }
476 
477  const auto warningHashesIter = m_warnings.find(id);
478  if (warningHashesIter != m_warnings.end())
479  {
480  QSet<QString> &warned = *warningHashesIter;
481  warned.remove(tracker);
482  if (warned.empty())
483  {
484  m_warnings.erase(warningHashesIter);
485  item(WARNING_ROW)->setText(tr("Warning (%1)").arg(m_warnings.size()));
486  if (currentRow() == WARNING_ROW)
488  }
489  }
490 }

References applyFilter(), anonymous_namespace{transferlistfilterswidget.cpp}::ERROR_ROW, m_errors, m_warnings, and anonymous_namespace{transferlistfilterswidget.cpp}::WARNING_ROW.

Referenced by removeItem(), and TransferListFiltersWidget::TransferListFiltersWidget().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ trackerWarning

void TrackerFiltersList::trackerWarning ( const BitTorrent::TorrentID id,
const QString &  tracker 
)
slot

Definition at line 504 of file transferlistfilterswidget.cpp.

505 {
506  QSet<QString> &trackers {m_warnings[id]};
507  if (trackers.contains(tracker))
508  return;
509 
510  trackers.insert(tracker);
511  item(WARNING_ROW)->setText(tr("Warning (%1)").arg(m_warnings.size()));
512  if (currentRow() == WARNING_ROW)
514 }

References applyFilter(), m_warnings, and anonymous_namespace{transferlistfilterswidget.cpp}::WARNING_ROW.

Referenced by TransferListFiltersWidget::TransferListFiltersWidget().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ m_downloadTrackerFavicon

bool TrackerFiltersList::m_downloadTrackerFavicon
private

Definition at line 138 of file transferlistfilterswidget.h.

Referenced by downloadFavicon(), and setDownloadTrackerFavicon().

◆ m_errors

QHash<BitTorrent::TorrentID, QSet<QString> > TrackerFiltersList::m_errors
private

Definition at line 134 of file transferlistfilterswidget.h.

Referenced by getTorrentIDs(), trackerError(), and trackerSuccess().

◆ m_iconPaths

QStringList TrackerFiltersList::m_iconPaths
private

◆ m_totalTorrents

int TrackerFiltersList::m_totalTorrents
private

Definition at line 137 of file transferlistfilterswidget.h.

Referenced by handleNewTorrent(), and torrentAboutToBeDeleted().

◆ m_trackers

QHash<QString, QSet<BitTorrent::TorrentID> > TrackerFiltersList::m_trackers
private

◆ m_warnings

QHash<BitTorrent::TorrentID, QSet<QString> > TrackerFiltersList::m_warnings
private

Definition at line 135 of file transferlistfilterswidget.h.

Referenced by getTorrentIDs(), trackerSuccess(), and trackerWarning().


The documentation for this class was generated from the following files: