* fix a lot of compiler warnings
[kdenetwork.git] / kget / transfer-plugins / bittorrent / btadvanceddetailswidget.cpp
blobeac6b364609b6d30aa8928af828574dcb5ae4cfd
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"
21 #include <kdebug.h>
22 #include <kmessagebox.h>
23 #include <kurl.h>
24 #include <kglobal.h>
25 #include <kdialog.h>
26 #include <QTimer>
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**/
32 setupUi(this);
34 tc = m_transfer->torrentControl();
36 tc->setMonitor(this);
38 init();
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);
57 updateTrackerList();
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())
68 int j = 0;
69 foreach(int i, fileColumnWidths)
71 fileTreeView->setColumnWidth(j, i);
72 j++;
75 else
77 fileTreeView->setColumnWidth(0 , 250);
80 QList<int> peersColumnWidths = BittorrentSettings::peersColumnWidths();
81 if (!peersColumnWidths.isEmpty())
83 int j = 0;
84 foreach(int i, peersColumnWidths)
86 peersTreeWidget->setColumnWidth(j, i);
87 j++;
90 else
92 peersTreeWidget->setColumnWidth(0 , 250);
95 QList<int> chunksColumnWidths = BittorrentSettings::chunksColumnWidths();
96 if (!chunksColumnWidths.isEmpty())
98 int j = 0;
99 foreach(int i, chunksColumnWidths)
101 chunkTreeWidget->setColumnWidth(j, i);
102 j++;
105 else
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)
119 kDebug(5001);
120 TransferHandler::ChangesFlags transferFlags = m_transfer->changesFlags(this);
122 if (m_transfer->status() == Job::Running)
124 updateChunkView();
125 peersTreeWidget->update();
126 updateTrackerGUI();
129 m_transfer->resetChangesFlags(this);
132 void BTAdvancedDetailsWidget::updateTracker()
134 kDebug(5001);
135 tc->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()
144 kDebug(5001);
145 const bt::TorrentStats & s = tc->getStats();
147 if (s.running)
149 QTime t;
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>");
163 else
164 trackerUrl->clear();
167 void BTAdvancedDetailsWidget::addTracker()
169 kDebug(5001);
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()
187 kDebug(5001);
188 trackerList->clear();
189 const KUrl::List trackers = tc->getTrackersList()->getTrackerURLs();
191 if (trackers.empty())
193 trackerList->addItem(tc->getTrackersList()->getTrackerURL().prettyUrl());
195 else
197 foreach (KUrl u,trackers)
198 trackerList->addItem(u.prettyUrl());
200 updateTracker();
203 void BTAdvancedDetailsWidget::deleteTracker()
205 kDebug(5001);
206 QListWidgetItem* current = trackerList->currentItem();
207 if(!current)
208 return;
210 KUrl url(current->text());
211 if(tc->getTrackersList()->removeTracker(url))
212 delete current;
213 else
214 KMessageBox::sorry(0, i18n("Cannot remove torrent default tracker."));
217 void BTAdvancedDetailsWidget::setDefaultTracker()
219 kDebug(5001);
220 tc->getTrackersList()->restoreDefault();
221 tc->updateTracker();
223 // update the list of trackers
224 trackerList->clear();
226 const KUrl::List trackers = tc->getTrackersList()->getTrackerURLs();
227 if(trackers.empty())
228 return;
230 foreach (KUrl u,trackers)
231 trackerList->addItem(u.prettyUrl());
234 void BTAdvancedDetailsWidget::changeTracker()
236 kDebug(5001);
237 QListWidgetItem* current = trackerList->currentItem();
238 if(!current)
239 return;
241 KUrl url(current->text());
242 tc->getTrackersList()->setTracker(url);
243 tc->updateTracker();
246 void BTAdvancedDetailsWidget::peerAdded(bt::PeerInterface* peer)
248 kDebug(5001);
249 peersTreeWidget->peerAdded(peer);
252 void BTAdvancedDetailsWidget::peerRemoved(bt::PeerInterface* peer)
254 kDebug(5001);
255 peersTreeWidget->peerRemoved(peer);
258 void BTAdvancedDetailsWidget::downloadStarted(bt::ChunkDownloadInterface* chunk)
260 kDebug(5001);
261 items.insert(chunk, new ChunkDownloadViewItem(chunkTreeWidget, chunk, tc));
264 void BTAdvancedDetailsWidget::downloadRemoved(bt::ChunkDownloadInterface* chunk)
266 kDebug(5001);
267 ChunkDownloadViewItem* v = items.find(chunk);
268 if (v)
270 items.erase(chunk);
271 delete v;
275 void BTAdvancedDetailsWidget::stopped()
277 kDebug(5001);
278 if (m_transfer->status() != Job::Running)
279 { //Cleanup Chunk- and Peers-View when a transfer stops
280 peersTreeWidget->removeAll();
281 chunkTreeWidget->clear();
282 items.clear();
284 tc->setMonitor(0);
285 deleteLater();
288 void BTAdvancedDetailsWidget::destroyed()
290 kDebug(5001);
291 peersTreeWidget->removeAll();
292 chunkTreeWidget->clear();
293 items.clear();
294 tc->setMonitor(0);
295 deleteLater();
298 void BTAdvancedDetailsWidget::updateChunkView()
300 kDebug(5001);
302 if (items.count() == 0 || !tc)
303 return;
305 bt::PtrMap<bt::ChunkDownloadInterface*,ChunkDownloadViewItem>::iterator i;
307 for (i = items.begin(); i != items.end(); i++)
309 if (i->second)
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"