#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "torrentdisplay.h" TorrentDisplay::TorrentDisplay(QWidget *parent) : QDialog(parent) { //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, &QPushButton::clicked, this, &TorrentDisplay::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")); //actions QAction *copyFnToClip = new QAction(QIcon(":/edit-copy.png"), tr("Filename to Clip"), this); copyFnToClip->setShortcut(tr("CTRL+C")); connect(copyFnToClip, &QAction::triggered, this, &TorrentDisplay::copyToClipboard); addActions(QList() << copyFnToClip); } void TorrentDisplay::setData(const QList data, const QString &filename) { if(data.isEmpty()){ return; } mFileModel->clear(); mFileModel->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Length")); mAnnounceModel->clear(); mAnnounceModel->setHorizontalHeaderLabels(QStringList() << tr("Tracker")); for(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("files")){ setMulti(infoD, filename); }else{ setSingle(infoD, filename); } mFileView->expandAll(); mFileView->resizeColumnToContents(0); mFileView->resizeColumnToContents(1); } if(it.key() == "creation date"){ uint secs = it.value().toUInt(); QDateTime when = QDateTime::fromSecsSinceEpoch(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(); for(QVariant l2 : l1){ QVariantList l3 = l2.toList(); for(QVariant ann : l3){ QStandardItem *i1 = new QStandardItem(ann.toString()); i1->setIcon(QIcon(":/butt_plug.png")); mAnnounceModel->invisibleRootItem()->appendRow(QList() << i1); } } } ++it; } } } } void TorrentDisplay::copyToClipboard(){ QModelIndex idx = mFileView->selectionModel()->currentIndex(); QClipboard *clip = QApplication::clipboard(); clip->setText(idx.data().toString()); } void TorrentDisplay::contextMenuEvent(QContextMenuEvent *e){ QMenu contextMenu(this); contextMenu.addActions(actions()); contextMenu.exec(e->globalPos()); } 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(); for(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); }