1 /* This file is part of the KDE project
3 Copyright (C) 2007 Lukas Appelhans <l.appelhans@gmx.de>
4 Copyright (C) 2007 Joris Guisson <joris.guisson@gmail.com>
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
12 #include "btadvanceddetailswidget.h"
14 #include <interfaces/torrentinterface.h>
15 #include <interfaces/trackerslist.h>
17 #include "bttransferhandler.h"
18 #include "btfiletreeview.h"
19 #include "bittorrentsettings.h"
22 #include <kmessagebox.h>
28 BTAdvancedDetailsWidget::BTAdvancedDetailsWidget(BTTransferHandler
* transfer
)
29 : m_transfer(transfer
)
31 /**A lot of code is from KTorrent's infowidget by Joris Guisson, thx for the nice work**/
34 tc
= m_transfer
->torrentControl();
40 transfer
->addObserver(this);
41 //This updates the widget with the right values
42 transferChangedEvent(transfer
);
45 BTAdvancedDetailsWidget::~BTAdvancedDetailsWidget()
47 m_transfer
->delObserver(this);
50 void BTAdvancedDetailsWidget::init()
52 setWindowTitle(i18n("Advanced-Details for %1", m_transfer
->source().fileName()));
54 fileTreeView
= new BTFileTreeView(tc
, tabWidget
->widget(0));
55 tabWidget
->widget(0)->layout()->addWidget(fileTreeView
);
59 const bt::TorrentStats
& s
= tc
->getStats();
60 totalChunksLabel
->setText(QString::number(s
.total_chunks
));
61 sizeChunkLabel
->setText(KGlobal::locale()->formatByteSize(s
.chunk_size
));
63 /**Set Column-widths**/
65 QList
<int> fileColumnWidths
= BittorrentSettings::fileColumnWidths();
66 if (!fileColumnWidths
.isEmpty())
69 foreach(int i
, fileColumnWidths
)
71 fileTreeView
->setColumnWidth(j
, i
);
77 fileTreeView
->setColumnWidth(0 , 250);
80 QList
<int> peersColumnWidths
= BittorrentSettings::peersColumnWidths();
81 if (!peersColumnWidths
.isEmpty())
84 foreach(int i
, peersColumnWidths
)
86 peersTreeWidget
->setColumnWidth(j
, i
);
92 peersTreeWidget
->setColumnWidth(0 , 250);
95 QList
<int> chunksColumnWidths
= BittorrentSettings::chunksColumnWidths();
96 if (!chunksColumnWidths
.isEmpty())
99 foreach(int i
, chunksColumnWidths
)
101 chunkTreeWidget
->setColumnWidth(j
, i
);
107 chunkTreeWidget
->setColumnWidth(0 , 250);
110 connect(deleteTrackerButton
, SIGNAL(clicked()), SLOT(deleteTracker()));
111 connect(updateTrackerButton
, SIGNAL(clicked()), SLOT(updateTracker()));
112 connect(addTrackerButton
, SIGNAL(clicked()), SLOT(addTracker()));
113 connect(changeTrackerButton
, SIGNAL(clicked()), SLOT(changeTracker()));
114 connect(defaultTrackerButton
, SIGNAL(clicked()), SLOT(setDefaultTracker()));
117 void BTAdvancedDetailsWidget::transferChangedEvent(TransferHandler
* transfer
)
120 TransferHandler::ChangesFlags transferFlags
= m_transfer
->changesFlags(this);
122 if (m_transfer
->status() == Job::Running
)
125 peersTreeWidget
->update();
129 m_transfer
->resetChangesFlags(this);
132 void BTAdvancedDetailsWidget::updateTracker()
136 if (tc
->getStats().trackerstatus
!= "Ok")
137 QTimer::singleShot(1000, this, SLOT(updateTracker()));
139 QTimer::singleShot(1000, this, SLOT(updateTrackerGUI()));
142 void BTAdvancedDetailsWidget::updateTrackerGUI()
145 const bt::TorrentStats
& s
= tc
->getStats();
150 t
= t
.addSecs(tc
->getTimeToNextTrackerUpdate());
151 trackerUpdateTime
->setText(t
.toString("mm:ss"));
154 //Update manual annunce button
155 updateTrackerButton
->setEnabled(s
.running
); // && tc->announceAllowed()
156 // only enable change when we can actually change and the torrent is running
157 changeTrackerButton
->setEnabled(s
.running
&& tc
->getTrackersList()->getTrackerURLs().size() > 1);
159 trackerStatus
->setText("<b>" + s
.trackerstatus
+ "</b>");
161 if (tc
->getTrackersList())
162 trackerUrl
->setText("<b>" + tc
->getTrackersList()->getTrackerURL().prettyUrl() + "</b>");
167 void BTAdvancedDetailsWidget::addTracker()
170 addTrackerDialog
= new KDialog(this);
171 QWidget
* widget
= new QWidget(this);
172 addTrackerWidget
.setupUi(widget
);
173 addTrackerDialog
->setMainWidget(widget
);
174 addTrackerDialog
->setButtons(KDialog::Ok
| KDialog::Cancel
);
175 addTrackerDialog
->exec();
177 if (addTrackerDialog
->result() == 1)//Dialog accepted
179 m_transfer
->addTracker(addTrackerWidget
.lineEdit
->text());
182 QTimer::singleShot(1000, this, SLOT(updateTrackerList()));
185 void BTAdvancedDetailsWidget::updateTrackerList()
188 trackerList
->clear();
189 const KUrl::List trackers
= tc
->getTrackersList()->getTrackerURLs();
191 if (trackers
.empty())
193 trackerList
->addItem(tc
->getTrackersList()->getTrackerURL().prettyUrl());
197 foreach (KUrl u
,trackers
)
198 trackerList
->addItem(u
.prettyUrl());
203 void BTAdvancedDetailsWidget::deleteTracker()
206 QListWidgetItem
* current
= trackerList
->currentItem();
210 KUrl
url(current
->text());
211 if(tc
->getTrackersList()->removeTracker(url
))
214 KMessageBox::sorry(0, i18n("Cannot remove torrent default tracker."));
217 void BTAdvancedDetailsWidget::setDefaultTracker()
220 tc
->getTrackersList()->restoreDefault();
223 // update the list of trackers
224 trackerList
->clear();
226 const KUrl::List trackers
= tc
->getTrackersList()->getTrackerURLs();
230 foreach (KUrl u
,trackers
)
231 trackerList
->addItem(u
.prettyUrl());
234 void BTAdvancedDetailsWidget::changeTracker()
237 QListWidgetItem
* current
= trackerList
->currentItem();
241 KUrl
url(current
->text());
242 tc
->getTrackersList()->setTracker(url
);
246 void BTAdvancedDetailsWidget::peerAdded(bt::PeerInterface
* peer
)
249 peersTreeWidget
->peerAdded(peer
);
252 void BTAdvancedDetailsWidget::peerRemoved(bt::PeerInterface
* peer
)
255 peersTreeWidget
->peerRemoved(peer
);
258 void BTAdvancedDetailsWidget::downloadStarted(bt::ChunkDownloadInterface
* chunk
)
261 items
.insert(chunk
, new ChunkDownloadViewItem(chunkTreeWidget
, chunk
, tc
));
264 void BTAdvancedDetailsWidget::downloadRemoved(bt::ChunkDownloadInterface
* chunk
)
267 ChunkDownloadViewItem
* v
= items
.find(chunk
);
275 void BTAdvancedDetailsWidget::stopped()
278 if (m_transfer
->status() != Job::Running
)
279 { //Cleanup Chunk- and Peers-View when a transfer stops
280 peersTreeWidget
->removeAll();
281 chunkTreeWidget
->clear();
288 void BTAdvancedDetailsWidget::destroyed()
291 peersTreeWidget
->removeAll();
292 chunkTreeWidget
->clear();
298 void BTAdvancedDetailsWidget::updateChunkView()
302 if (items
.count() == 0 || !tc
)
305 bt::PtrMap
<bt::ChunkDownloadInterface
*,ChunkDownloadViewItem
>::iterator i
;
307 for (i
= items
.begin(); i
!= items
.end(); i
++)
310 i
->second
->update(false);
313 const bt::TorrentStats
& s
= tc
->getStats();
314 downloadingChunksLabel
->setText(QString::number(s
.num_chunks_downloading
));
315 downloadedChunksLabel
->setText(QString::number(s
.num_chunks_downloaded
));
316 excludedChunksLabel
->setText(QString::number(s
.num_chunks_excluded
));
317 leftChunksLabel
->setText(QString::number(s
.num_chunks_left
));
320 void BTAdvancedDetailsWidget::hideEvent(QHideEvent
* event
)
322 kDebug(5001) << "Save config";
323 QList
<int> fileColumnWidths
;
324 for (int i
= 0; i
<1; i
++)
326 fileColumnWidths
.append(fileTreeView
->columnWidth(i
));
328 BittorrentSettings::setFileColumnWidths(fileColumnWidths
);
330 QList
<int> peersColumnWidths
;
331 for (int i
= 0; i
<13; i
++)
333 peersColumnWidths
.append(peersTreeWidget
->columnWidth(i
));
335 BittorrentSettings::setPeersColumnWidths(peersColumnWidths
);
337 QList
<int> chunksColumnWidths
;
338 for (int i
= 0; i
<3; i
++)
340 chunksColumnWidths
.append(chunkTreeWidget
->columnWidth(i
));
342 BittorrentSettings::setChunksColumnWidths(chunksColumnWidths
);
343 BittorrentSettings::self()->writeConfig();
346 #include "btadvanceddetailswidget.moc"