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.
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"
21 #include <kmessagebox.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**/
31 tc
= m_transfer
->torrentControl();
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
);
57 trackerList
->addItem(tc
->getTrackersList()->getTrackerURL().prettyUrl());
61 foreach (KUrl u
,trackers
)
62 trackerList
->addItem(u
.prettyUrl());
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())
76 foreach(int i
, fileColumnWidths
)
78 fileTreeView
->setColumnWidth(j
, i
);
84 fileTreeView
->setColumnWidth(0 , 250);
87 QList
<int> peersColumnWidths
= BittorrentSettings::peersColumnWidths();
88 if (!peersColumnWidths
.isEmpty())
91 foreach(int i
, peersColumnWidths
)
93 peersTreeWidget
->setColumnWidth(j
, i
);
99 peersTreeWidget
->setColumnWidth(0 , 250);
102 QList
<int> chunksColumnWidths
= BittorrentSettings::chunksColumnWidths();
103 if (!chunksColumnWidths
.isEmpty())
106 foreach(int i
, chunksColumnWidths
)
108 chunkTreeWidget
->setColumnWidth(j
, i
);
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
)
127 TransferHandler::ChangesFlags transferFlags
= m_transfer
->changesFlags(this);
129 if (m_transfer
->status() == Job::Running
)
132 peersTreeWidget
->update();
136 m_transfer
->resetChangesFlags(this);
139 void BTAdvancedDetailsWidget::updateTracker()
145 void BTAdvancedDetailsWidget::updateTrackerGUI()
148 const bt::TorrentStats
& s
= tc
->getStats();
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>");
170 void BTAdvancedDetailsWidget::addTracker(const QString
&url
)
174 void BTAdvancedDetailsWidget::deleteTracker()
177 QListWidgetItem
* current
= trackerList
->currentItem();
181 KUrl
url(current
->text());
182 if(tc
->getTrackersList()->removeTracker(url
))
185 KMessageBox::sorry(0, i18n("Cannot remove torrent default tracker."));
188 void BTAdvancedDetailsWidget::setDefaultTracker()
191 tc
->getTrackersList()->restoreDefault();
194 // update the list of trackers
195 trackerList
->clear();
197 const KUrl::List trackers
= tc
->getTrackersList()->getTrackerURLs();
201 foreach (KUrl u
,trackers
)
202 trackerList
->addItem(u
.prettyUrl());
205 void BTAdvancedDetailsWidget::changeTracker()
208 QListWidgetItem
* current
= trackerList
->currentItem();
212 KUrl
url(current
->text());
213 tc
->getTrackersList()->setTracker(url
);
217 void BTAdvancedDetailsWidget::peerAdded(bt::PeerInterface
* peer
)
220 peersTreeWidget
->peerAdded(peer
);
223 void BTAdvancedDetailsWidget::peerRemoved(bt::PeerInterface
* peer
)
226 peersTreeWidget
->peerRemoved(peer
);
229 void BTAdvancedDetailsWidget::downloadStarted(bt::ChunkDownloadInterface
* chunk
)
232 items
.insert(chunk
, new ChunkDownloadViewItem(chunkTreeWidget
, chunk
, tc
));
235 void BTAdvancedDetailsWidget::downloadRemoved(bt::ChunkDownloadInterface
* chunk
)
238 ChunkDownloadViewItem
* v
= items
.find(chunk
);
246 void BTAdvancedDetailsWidget::stopped()
249 if (m_transfer
->status() != Job::Running
)
250 { //Cleanup Chunk- and Peers-View when a transfer stops
251 /**peersTreeWidget->removeAll();
252 chunkTreeWidget->clear();
257 void BTAdvancedDetailsWidget::updateChunkView()
260 bt::PtrMap
<bt::ChunkDownloadInterface
*,ChunkDownloadViewItem
>::iterator i
= items
.begin();
262 while (i
!= items
.end())
265 i
->second
->update(false);
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"