From d47427a2d51fcc7f8e1f8926a706e04ff01603ed Mon Sep 17 00:00:00 2001 From: Arno Date: Sat, 20 Aug 2016 08:31:29 +0200 Subject: Present torrent files as a tree A torrent info dictionary has two modes: single and multi files. When in multi-mode, the name-entry is the directory containing the files. Represent it as a tree. During testing I discovered a fatal bug in the torrent parser: If we encounter an invalid string, we have to move mPos forward, else we will loop indefinitely until we're OOM. I also added some icons for folders, files and trackers. --- torrentdisplay.cpp | 66 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 19 deletions(-) (limited to 'torrentdisplay.cpp') diff --git a/torrentdisplay.cpp b/torrentdisplay.cpp index e56343c..11b98b5 100644 --- a/torrentdisplay.cpp +++ b/torrentdisplay.cpp @@ -79,7 +79,9 @@ TorrentDisplay::TorrentDisplay(QWidget *parent, Qt::WindowFlags f) : QDialog(par setWindowTitle(tr("Torrent Info")); } -void TorrentDisplay::setData(const QList data) { +#include + +void TorrentDisplay::setData(const QList data, const QString &filename) { if(data.isEmpty()){ return; } @@ -97,26 +99,12 @@ void TorrentDisplay::setData(const QList data) { QVariantHash infoD = it.value().toHash(); int piece_length = infoD.value("piece length").toInt(); mPieceLength->setText(QString::number(piece_length)); - if(infoD.contains("name")){ - QString fn = infoD.value("name").toString(); - qint64 length = infoD.value("length").toLongLong(); - QStandardItem *i1 = new QStandardItem(fn); - QStandardItem *i2 = new QStandardItem(QString::number(length)); - i2->setData(length); - mFileModel->invisibleRootItem()->appendRow(QList() << i1 << i2); - } if(infoD.contains("files")){ - QVariantList fList = infoD.value("files").toList(); - foreach(QVariant fn, fList){ - QVariantHash curH = fn.toHash(); - QVariantList path = curH.value("path").toList(); - QStandardItem *i1 = new QStandardItem(path.last().toString()); - qint64 length = curH.value("length").toLongLong(); - QStandardItem *i2 = new QStandardItem(QString::number(length)); - i2->setData(length); - mFileModel->invisibleRootItem()->appendRow(QList() << i1 << i2); - } + setMulti(infoD, filename); + }else{ + setSingle(infoD, filename); } + mFileView->expandAll(); mFileView->resizeColumnToContents(0); mFileView->resizeColumnToContents(1); } @@ -138,6 +126,7 @@ void TorrentDisplay::setData(const QList data) { QVariantList l3 = l2.toList(); foreach(QVariant ann, l3){ QStandardItem *i1 = new QStandardItem(ann.toString()); + i1->setIcon(QIcon(":/butt_plug.png")); mAnnounceModel->invisibleRootItem()->appendRow(QList() << i1); } } @@ -147,3 +136,42 @@ void TorrentDisplay::setData(const QList data) { } } } + +void TorrentDisplay::setMulti(const QVariantHash &data, const QString &filename){ + QStandardItem *root = mFileModel->invisibleRootItem(); + QStandardItem *torrentItem = new QStandardItem(filename); + torrentItem->setIcon(QIcon(":/huge_bra.png")); + root->appendRow(QList() << torrentItem << new QStandardItem()); + QString folderName = data.value("name").toString(); + if(folderName.isEmpty()){ + folderName = ""; + } + QStandardItem *folderItem = new QStandardItem(folderName); + folderItem->setIcon(QIcon(":/gaping_ass.png")); + torrentItem->appendRow(QList() << folderItem << new QStandardItem); + QVariantList fileList = data.value("files").toList(); + foreach(QVariant entry, fileList){ + QVariantHash e = entry.toHash(); + QVariantList path = e.value("path").toList(); + QStandardItem *i1 = new QStandardItem(path.last().toString()); + i1->setIcon(QIcon(":/huge_bra.png")); + qint64 len = e.value("length").toLongLong(); + QStandardItem *i2 = new QStandardItem(QString::number(len)); + i2->setData(len); + folderItem->appendRow(QList() << i1 << i2); + } +} + +void TorrentDisplay::setSingle(const QVariantHash &data, const QString &filename){ + QStandardItem *root = mFileModel->invisibleRootItem(); + QStandardItem *torrentItem = new QStandardItem(filename); + torrentItem->setIcon(QIcon(":/huge_bra.png")); + root->appendRow(QList() << torrentItem << new QStandardItem); + QString fn = data.value("name").toString(); + QStandardItem *i1 = new QStandardItem(fn); + i1->setIcon(QIcon(":/huge_bra.png")); + qint64 len = data.value("length").toLongLong(); + QStandardItem *i2 = new QStandardItem(QString::number(len)); + i2->setData(len); + torrentItem->appendRow(QList() << i1 << i2); +} -- cgit v1.2.3-70-g09d2