This commit is contained in:
AdKiller 2025-07-03 23:26:50 +05:00 committed by GitHub
commit b65de0b940
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 33 additions and 1 deletions

View file

@ -57,7 +57,7 @@ namespace
TRACKERERROR_ROW,
OTHERERROR_ROW,
WARNING_ROW,
ONLY_HTTP_ROW, // Only HTTP special row
NUM_SPECIAL_ROWS
};
@ -97,12 +97,15 @@ namespace
return TrackersFilterWidget::tr("All (%1)", "this is for the tracker filter");
case TRACKERLESS_ROW:
return TrackersFilterWidget::tr("Trackerless (%1)");
case ONLY_HTTP_ROW:
return TrackersFilterWidget::tr("Only HTTP (%1)");
case TRACKERERROR_ROW:
return TrackersFilterWidget::tr("Tracker error (%1)");
case OTHERERROR_ROW:
return TrackersFilterWidget::tr("Other error (%1)");
case WARNING_ROW:
return TrackersFilterWidget::tr("Warning (%1)");
default:
return {};
}
@ -141,6 +144,10 @@ TrackersFilterWidget::TrackersFilterWidget(QWidget *parent, TransferListWidget *
warningItem->setData(Qt::DisplayRole, formatItemText(WARNING_ROW, 0));
warningItem->setData(Qt::DecorationRole, UIThemeManager::instance()->getIcon(u"tracker-warning"_s, u"dialog-warning"_s));
auto *onlyHttpItem = new QListWidgetItem(this);
onlyHttpItem->setData(Qt::DisplayRole, formatItemText(ONLY_HTTP_ROW, 0));
onlyHttpItem->setData(Qt::DecorationRole, UIThemeManager::instance()->getIcon(u"trackers"_s, u"network-server"_s));
m_trackers[NULL_HOST] = {{}, trackerlessItem};
handleTorrentsLoaded(BitTorrent::Session::instance()->torrents());
@ -714,7 +721,27 @@ QSet<BitTorrent::TorrentID> TrackersFilterWidget::getTorrentIDs(const int row) c
return {m_trackerErrors.keyBegin(), m_trackerErrors.keyEnd()};
case WARNING_ROW:
return {m_warnings.keyBegin(), m_warnings.keyEnd()};
case ONLY_HTTP_ROW:
// Placeholder: implement the "only HTTP" logic later
return {}; // TODO: Populate with IDs of torrents having only HTTP trackers
default:
return m_trackers.value(trackerFromRow(row)).torrents;
}
bool TrackersFilterWidget::isOnlyHttpTrackers(const QList<BitTorrent::TrackerEntryStatus> &trackers)
{
if (trackers.isEmpty())
return false;
bool anyHttps = false;
for (const auto &tracker : trackers) {
const QString scheme = QUrl(tracker.url).scheme();
if (scheme.compare(u"https", Qt::CaseInsensitive) == 0)
anyHttps = true;
else if (!scheme.isEmpty() && scheme.compare(u"http", Qt::CaseInsensitive) != 0)
return false;
}
return !anyHttps;
}
}

View file

@ -85,6 +85,9 @@ private:
void downloadFavicon(const QString &trackerHost, const QString &faviconURL);
void removeTracker(const QString &tracker);
static bool isOnlyHttpTrackers(const QList<BitTorrent::TrackerEntryStatus> &trackers);
QSet<BitTorrent::TorrentID> m_onlyHttpTorrents;
struct TrackerData
{
QSet<BitTorrent::TorrentID> torrents;
@ -99,4 +102,6 @@ private:
int m_totalTorrents = 0;
bool m_downloadTrackerFavicon = false;
QHash<QString, QSet<QString>> m_downloadingFavicons; // <favicon URL, tracker hosts>
static bool isOnlyHttpTrackers(const QList<BitTorrent::TrackerEntryStatus> &trackers);
};