1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
#include <QGridLayout>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGroupBox>
#include <QLineEdit>
#include <QStandardItemModel>
#include <QTreeView>
#include <QStandardItem>
#include <QPushButton>
#include <QLabel>
#include <QDateTime>
#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<QVariant> 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>()){
QVariantHash h = cur.toHash();
QHash<QString, QVariant>::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<QStandardItem*>() << 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<QStandardItem*>() << 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<QStandardItem*>() << i1);
}
}
}
++it;
}
}
}
}
|