Extensive proof-reading.
[kdenetwork.git] / kget / transfer-plugins / bittorrent / advanceddetails / trackerview.cpp
blob895dd915906b22c0460255bc33cf8719b94b2faf
1 /***************************************************************************
2 * Copyright (C) 2006-2007 by Joris Guisson, Ivan Vasic *
3 * joris.guisson@gmail.com *
4 * ivasic@gmail.com *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the *
18 * Free Software Foundation, Inc., *
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
20 ***************************************************************************/
21 #include "trackerview.h"
22 #include <interfaces/torrentinterface.h>
23 #include <interfaces/trackerslist.h>
25 #include <qdatetime.h>
26 #include <qstring.h>
28 #include <klocale.h>
29 #include <kurl.h>
30 #include <kmessagebox.h>
31 #include <kglobal.h>
33 #include <torrent/globals.h>
34 #include <util/log.h>
36 #include "trackermodel.h"
38 using namespace bt;
40 namespace kt
44 TrackerView::TrackerView(QWidget *parent)
45 : QWidget(parent), tc(0)
47 setupUi(this);
48 model = new TrackerModel(this);
49 m_tracker_list->setModel(model);
50 connect(m_add_tracker,SIGNAL(clicked()),this,SLOT(addClicked()));
51 connect(m_remove_tracker,SIGNAL(clicked()),this,SLOT(removeClicked()));
52 connect(m_announce,SIGNAL(clicked()),this,SLOT(updateClicked()));
53 connect(m_scrape,SIGNAL(clicked()),this,SLOT(scrapeClicked()));
54 connect(m_change_tracker,SIGNAL(clicked()),this,SLOT(changeClicked()));
55 connect(m_restore_defaults,SIGNAL(clicked()),this,SLOT(restoreClicked()));
56 connect(m_tracker_list->selectionModel(),SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)),
57 this,SLOT(currentChanged(const QModelIndex&, const QModelIndex&)));
59 m_url->setTextFormat(Qt::RichText);
60 m_url->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard);
61 m_url->clear();
62 m_status->setTextFormat(Qt::RichText);
63 m_status->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard);
64 m_status->clear();
65 m_next_update->setTextFormat(Qt::RichText);
67 m_add_tracker->setIcon(KIcon("list-add"));
68 m_remove_tracker->setIcon(KIcon("list-remove"));
69 m_restore_defaults->setIcon(KIcon("kt-restore-defaults"));
70 m_change_tracker->setIcon(KIcon("kt-change-tracker"));
72 setEnabled(false);
73 torrentChanged(0);
76 TrackerView::~TrackerView()
80 void TrackerView::addClicked()
82 if (!tc || m_tracker_to_add->text().trimmed().isEmpty())
83 return;
85 if (tc->getStats().priv_torrent)
87 KMessageBox::sorry(0, i18n("Cannot add a tracker to a private torrent."));
88 return;
91 KUrl url(m_tracker_to_add->text());
92 if (!url.isValid())
94 KMessageBox::error(0, i18n("Malformed URL."));
95 return;
98 // check for dupes
99 if (model->hasTracker(url))
101 KMessageBox::sorry(0,i18n("There already is a tracker named <b>%1</b>.",m_tracker_to_add->text()));
102 return;
105 tc->getTrackersList()->addTracker(url,true);
106 model->insertRow(model->rowCount(QModelIndex()));
107 m_tracker_to_add->clear();
110 void TrackerView::removeClicked()
112 QModelIndex current = m_tracker_list->selectionModel()->currentIndex();
113 if (!current.isValid())
114 return;
116 if (tc->getTrackersList()->removeTracker(model->trackerUrl(current)))
117 model->removeRow(current.row());
118 else
119 KMessageBox::sorry(0, i18n("Cannot remove torrent default tracker."));
122 void TrackerView::changeClicked()
124 QModelIndex current = m_tracker_list->selectionModel()->currentIndex();
125 if (!current.isValid())
126 return;
128 KUrl url = model->trackerUrl(current);
129 if (tc->getTrackersList()->isTrackerEnabled(url))
131 tc->getTrackersList()->setTracker(url);
132 tc->updateTracker();
136 void TrackerView::restoreClicked()
138 tc->getTrackersList()->restoreDefault();
139 tc->updateTracker();
140 model->changeTC(tc); // trigger reset
143 void TrackerView::updateClicked()
145 if(!tc)
146 return;
148 tc->updateTracker();
151 void TrackerView::scrapeClicked()
153 if(!tc)
154 return;
156 tc->scrapeTracker();
159 void TrackerView::changeTC(TorrentInterface* ti)
161 if (tc == ti)
162 return;
164 setEnabled(ti != 0);
165 torrentChanged(ti);
166 update();
169 void TrackerView::update()
171 if(!tc)
172 return;
174 const TorrentStats & s = tc->getStats();
175 if (s.running)
177 QTime t;
178 t = t.addSecs(tc->getTimeToNextTrackerUpdate());
179 m_next_update->setText("<b>" + t.toString("mm:ss") + "</b>");
181 else
183 m_next_update->clear();
186 m_leechers->setText(QString("<b>%1</b>").arg(s.leechers_total));
187 m_seeders->setText(QString("<b>%1</b>").arg(s.seeders_total));
188 m_times_downloaded->setText(QString("<b>%1</b>").arg(s.total_times_downloaded));
190 //Update manual annunce button
191 m_announce->setEnabled(s.running && tc->announceAllowed());
193 m_status->setText("<b>" + s.tracker_status_string + "</b>");
194 if (tc->getTrackersList())
195 m_url->setText("<b>" + tc->getTrackersList()->getTrackerURL().prettyUrl() + "</b>");
196 else
197 m_url->clear();
199 m_add_tracker->setEnabled(!m_tracker_to_add->text().isEmpty() && !tc->getStats().priv_torrent);
202 void TrackerView::torrentChanged(TorrentInterface* ti)
204 tc = ti;
205 if(!tc)
207 m_status->clear();
208 m_url->clear();
209 m_next_update->clear();
210 m_tracker_to_add->clear();
211 m_leechers->clear();
212 m_seeders->clear();
213 m_times_downloaded->clear();
215 m_add_tracker->setEnabled(false);
216 m_remove_tracker->setEnabled(false);
217 m_restore_defaults->setEnabled(false);
218 m_change_tracker->setEnabled(false);
219 m_announce->setEnabled(false);
220 model->changeTC(0);
221 return;
224 const TorrentStats & s = tc->getStats();
226 if (s.priv_torrent)
228 m_add_tracker->setEnabled(false);
229 m_remove_tracker->setEnabled(false);
230 m_restore_defaults->setEnabled(false);
231 m_tracker_to_add->setText(i18n("You cannot add trackers to a private torrent"));
232 m_tracker_to_add->setEnabled(false);
234 else
236 m_add_tracker->setEnabled(true);
237 m_remove_tracker->setEnabled(true);
238 m_restore_defaults->setEnabled(true);
239 m_tracker_to_add->clear();
240 m_tracker_to_add->setEnabled(true);
243 model->changeTC(tc);
244 m_announce->setEnabled(s.running && tc->announceAllowed());
245 currentChanged(m_tracker_list->selectionModel()->currentIndex(),QModelIndex());
248 void TrackerView::currentChanged(const QModelIndex & current,const QModelIndex & previous)
250 Q_UNUSED(previous);
251 if (!tc)
253 m_change_tracker->setEnabled(false);
254 return;
257 const TorrentStats & s = tc->getStats();
259 KUrl url = model->trackerUrl(current);
260 m_change_tracker->setEnabled(s.running && model->rowCount(QModelIndex()) > 1 && tc->getTrackersList()->isTrackerEnabled(url));
265 #include "trackerview.moc"