More dbg-output and small fixes...
[kdenetwork.git] / kget / transfer-plugins / bittorrent / btadvanceddetailswidget.cpp
blobee584b2d996a2a8e6f3514aed9786ffaf960f2b7
1 /* This file is part of the KDE project
3 Copyright (C) 2007 Lukas Appelhans <l.appelhans@gmx.de>
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9 */
11 #include "btadvanceddetailswidget.h"
13 #include <interfaces/torrentinterface.h>
14 #include <interfaces/trackerslist.h>
16 #include "bttransferhandler.h"
17 #include "btfiletreeview.h"
18 #include "bittorrentsettings.h"
20 #include <kdebug.h>
21 #include <kmessagebox.h>
22 #include <kurl.h>
23 #include <kglobal.h>
25 BTAdvancedDetailsWidget::BTAdvancedDetailsWidget(BTTransferHandler * transfer)
26 : m_transfer(transfer)
28 /**A lot of code is from KTorrent's infowidget by Joris Guisson, thx for the nice work**/
29 setupUi(this);
31 tc = m_transfer->torrentControl();
33 tc->setMonitor(this);
35 init();
37 transfer->addObserver(this);
38 //This updates the widget with the right values
39 transferChangedEvent(transfer);
42 BTAdvancedDetailsWidget::~BTAdvancedDetailsWidget()
44 m_transfer->delObserver(this);
47 void BTAdvancedDetailsWidget::init()
49 setWindowTitle(i18n("Advanced-Details for %1", m_transfer->source().fileName()));
50 const KUrl::List trackers = tc->getTrackersList()->getTrackerURLs();
52 fileTreeView = new BTFileTreeView(tc, tabWidget->widget(0));
53 tabWidget->widget(0)->layout()->addWidget(fileTreeView);
55 if (trackers.empty())
57 trackerList->addItem(tc->getTrackersList()->getTrackerURL().prettyUrl());
59 else
61 foreach (KUrl u,trackers)
62 trackerList->addItem(u.prettyUrl());
64 updateTracker();
66 const bt::TorrentStats & s = tc->getStats();
67 totalChunksLabel->setText(QString::number(s.total_chunks));
68 sizeChunkLabel->setText(KGlobal::locale()->formatByteSize(s.chunk_size));
70 /**Set Column-widths**/
72 QList<int> fileColumnWidths = BittorrentSettings::fileColumnWidths();
73 if (!fileColumnWidths.isEmpty())
75 int j = 0;
76 foreach(int i, fileColumnWidths)
78 fileTreeView->setColumnWidth(j, i);
79 j++;
82 else
84 fileTreeView->setColumnWidth(0 , 250);
87 QList<int> peersColumnWidths = BittorrentSettings::peersColumnWidths();
88 if (!peersColumnWidths.isEmpty())
90 int j = 0;
91 foreach(int i, peersColumnWidths)
93 peersTreeWidget->setColumnWidth(j, i);
94 j++;
97 else
99 peersTreeWidget->setColumnWidth(0 , 250);
102 QList<int> chunksColumnWidths = BittorrentSettings::chunksColumnWidths();
103 if (!chunksColumnWidths.isEmpty())
105 int j = 0;
106 foreach(int i, chunksColumnWidths)
108 chunkTreeWidget->setColumnWidth(j, i);
109 j++;
112 else
114 chunkTreeWidget->setColumnWidth(0 , 250);
117 connect(deleteTrackerButton, SIGNAL(clicked()), SLOT(deleteTracker()));
118 connect(updateTrackerButton, SIGNAL(clicked()), SLOT(updateTracker()));
119 connect(addTrackerButton, SIGNAL(clicked()), SLOT(addTracker()));
120 connect(changeTrackerButton, SIGNAL(clicked()), SLOT(changeTracker()));
121 connect(defaultTrackerButton, SIGNAL(clicked()), SLOT(setDefaultTracker()));
124 void BTAdvancedDetailsWidget::transferChangedEvent(TransferHandler * transfer)
126 kDebug(5001);
127 TransferHandler::ChangesFlags transferFlags = m_transfer->changesFlags(this);
129 if (m_transfer->status() == Job::Running)
131 updateChunkView();
132 peersTreeWidget->update();
133 updateTrackerGUI();
136 m_transfer->resetChangesFlags(this);
139 void BTAdvancedDetailsWidget::updateTracker()
141 kDebug(5001);
142 tc->updateTracker();
145 void BTAdvancedDetailsWidget::updateTrackerGUI()
147 kDebug(5001);
148 const bt::TorrentStats & s = tc->getStats();
150 if (s.running)
152 QTime t;
153 t = t.addSecs(tc->getTimeToNextTrackerUpdate());
154 trackerUpdateTime->setText(t.toString("mm:ss"));
157 //Update manual annunce button
158 updateTrackerButton->setEnabled(s.running && tc->announceAllowed());
159 // only enable change when we can actually change and the torrent is running
160 changeTrackerButton->setEnabled(s.running && tc->getTrackersList()->getTrackerURLs().size() > 1);
162 trackerStatus->setText("<b>" + s.trackerstatus + "</b>");
164 if (tc->getTrackersList())
165 trackerUrl->setText("<b>" + tc->getTrackersList()->getTrackerURL().prettyUrl() + "</b>");
166 else
167 trackerUrl->clear();
170 void BTAdvancedDetailsWidget::addTracker(const QString &url)
174 void BTAdvancedDetailsWidget::deleteTracker()
176 kDebug(5001);
177 QListWidgetItem* current = trackerList->currentItem();
178 if(!current)
179 return;
181 KUrl url(current->text());
182 if(tc->getTrackersList()->removeTracker(url))
183 delete current;
184 else
185 KMessageBox::sorry(0, i18n("Cannot remove torrent default tracker."));
188 void BTAdvancedDetailsWidget::setDefaultTracker()
190 kDebug(5001);
191 tc->getTrackersList()->restoreDefault();
192 tc->updateTracker();
194 // update the list of trackers
195 trackerList->clear();
197 const KUrl::List trackers = tc->getTrackersList()->getTrackerURLs();
198 if(trackers.empty())
199 return;
201 foreach (KUrl u,trackers)
202 trackerList->addItem(u.prettyUrl());
205 void BTAdvancedDetailsWidget::changeTracker()
207 kDebug(5001);
208 QListWidgetItem* current = trackerList->currentItem();
209 if(!current)
210 return;
212 KUrl url(current->text());
213 tc->getTrackersList()->setTracker(url);
214 tc->updateTracker();
217 void BTAdvancedDetailsWidget::peerAdded(bt::PeerInterface* peer)
219 kDebug(5001);
220 peersTreeWidget->peerAdded(peer);
223 void BTAdvancedDetailsWidget::peerRemoved(bt::PeerInterface* peer)
225 kDebug(5001);
226 peersTreeWidget->peerRemoved(peer);
229 void BTAdvancedDetailsWidget::downloadStarted(bt::ChunkDownloadInterface* chunk)
231 kDebug(5001);
232 items.insert(chunk, new ChunkDownloadViewItem(chunkTreeWidget, chunk, tc));
235 void BTAdvancedDetailsWidget::downloadRemoved(bt::ChunkDownloadInterface* chunk)
237 kDebug(5001);
238 ChunkDownloadViewItem* v = items.find(chunk);
239 if (v)
241 items.erase(chunk);
242 delete v;
246 void BTAdvancedDetailsWidget::stopped()
248 kDebug(5001);
249 if (m_transfer->status() != Job::Running)
250 { //Cleanup Chunk- and Peers-View when a transfer stops
251 /**peersTreeWidget->removeAll();
252 chunkTreeWidget->clear();
253 items.clear();**/
257 void BTAdvancedDetailsWidget::updateChunkView()
259 kDebug(5001);
260 bt::PtrMap<bt::ChunkDownloadInterface*,ChunkDownloadViewItem>::iterator i = items.begin();
262 while (i != items.end())
264 if (i->second)
265 i->second->update(false);
266 i++;
269 const bt::TorrentStats & s = tc->getStats();
270 downloadingChunksLabel->setText(QString::number(s.num_chunks_downloading));
271 downloadedChunksLabel->setText(QString::number(s.num_chunks_downloaded));
272 excludedChunksLabel->setText(QString::number(s.num_chunks_excluded));
273 leftChunksLabel->setText(QString::number(s.num_chunks_left));
276 void BTAdvancedDetailsWidget::hideEvent(QHideEvent * event)
278 kDebug(5001) << "Save config";
279 QList<int> fileColumnWidths;
280 for (int i = 0; i<1; i++)
282 fileColumnWidths.append(fileTreeView->columnWidth(i));
284 BittorrentSettings::setFileColumnWidths(fileColumnWidths);
286 QList<int> peersColumnWidths;
287 for (int i = 0; i<13; i++)
289 peersColumnWidths.append(peersTreeWidget->columnWidth(i));
291 BittorrentSettings::setPeersColumnWidths(peersColumnWidths);
293 QList<int> chunksColumnWidths;
294 for (int i = 0; i<3; i++)
296 chunksColumnWidths.append(chunkTreeWidget->columnWidth(i));
298 BittorrentSettings::setChunksColumnWidths(chunksColumnWidths);
299 BittorrentSettings::self()->writeConfig();
302 #include "btadvanceddetailswidget.moc"