#include #include #include #include #include #include #include #include #include #include #include #include "torrentdisplay.h" TorrentDisplay::TorrentDisplay(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) { //windows doesn't like it after setting up the GUI setMinimumWidth(600); //general info QGridLayout *torGenLayout = new QGridLayout; QLabel *l1 = new QLabel(tr("Created")); mCreated = new QLineEdit; mCreated->setReadOnly(true); QLabel *l2 = new QLabel(tr("Created by")); mCreatedBy = new QLineEdit; mCreatedBy->setReadOnly(true); QLabel *l3 = new QLabel(tr("Encoding")); mEncoding = new QLineEdit; mEncoding->setReadOnly(true); QLabel *l4 = new QLabel(tr("Piece length")); mPieceLength = new QLineEdit; mPieceLength->setReadOnly(true); torGenLayout->addWidget(l1, 0, 0); torGenLayout->addWidget(mCreated, 0, 1); torGenLayout->addWidget(l2, 1, 0); torGenLayout->addWidget(mCreatedBy, 1, 1); torGenLayout->addWidget(l3, 2, 0); torGenLayout->addWidget(mEncoding, 2, 1); torGenLayout->addWidget(l4, 3, 0); torGenLayout->addWidget(mPieceLength, 3, 1); QGroupBox *torGenGroup = new QGroupBox(tr("General")); torGenGroup->setLayout(torGenLayout); //files mFileModel = new QStandardItemModel; mFileView = new QTreeView; mFileView->setSortingEnabled(true); mFileView->setModel(mFileModel); QHBoxLayout *fileLayout = new QHBoxLayout; fileLayout->addWidget(mFileView); QGroupBox *fileGroup = new QGroupBox(tr("Files")); fileGroup->setLayout(fileLayout); //announce list mAnnounceModel = new QStandardItemModel; mAnnounceView = new QTreeView; mAnnounceView->setSortingEnabled(true); mAnnounceView->setModel(mAnnounceModel); QHBoxLayout *announceLayout = new QHBoxLayout; announceLayout->addWidget(mAnnounceView); QGroupBox *announceGroup = new QGroupBox(tr("Announce")); announceGroup->setLayout(announceLayout); //close button QHBoxLayout *buttonLayout = new QHBoxLayout; QPushButton *closeBtn = new QPushButton(tr("Close")); buttonLayout->addStretch(); buttonLayout->addWidget(closeBtn); buttonLayout->addStretch(); connect(closeBtn, SIGNAL(clicked()), this, SLOT(hide())); //dialog layout QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(torGenGroup); mainLayout->addWidget(fileGroup); mainLayout->addWidget(announceGroup); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); setWindowTitle(tr("Torrent Info")); } void TorrentDisplay::setData(const QList data) { if(data.isEmpty()){ return; } mFileModel->clear(); mFileModel->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Length")); mAnnounceModel->clear(); mAnnounceModel->setHorizontalHeaderLabels(QStringList() << tr("Tracker")); foreach(QVariant cur, data){ if(cur.canConvert()){ QVariantHash h = cur.toHash(); QHash::const_iterator it = h.constBegin(); while(it != h.constEnd()){ if(it.key() == "info"){ 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); } } mFileView->resizeColumnToContents(0); mFileView->resizeColumnToContents(1); } if(it.key() == "creation date"){ qint64 secs = it.value().toLongLong(); QDateTime when = QDateTime::fromTime_t(secs); mCreated->setText(when.toString(Qt::RFC2822Date)); } if(it.key() == "encoding"){ mEncoding->setText(it.value().toString()); } if(it.key() == "created by"){ mCreatedBy->setText(it.value().toString()); } //this is a list of lists if(it.key() == "announce-list"){ QVariantList l1 = it.value().toList(); foreach(QVariant l2, l1){ QVariantList l3 = l2.toList(); foreach(QVariant ann, l3){ QStandardItem *i1 = new QStandardItem(ann.toString()); mAnnounceModel->invisibleRootItem()->appendRow(QList() << i1); } } } ++it; } } } }