File indexing completed on 2024-05-05 04:59:14
0001 /*************************************************************************** 0002 * Copyright (C) 2006-2007 by Joris Guisson, Ivan Vasic * 0003 * joris.guisson@gmail.com * 0004 * ivasic@gmail.com * 0005 * * 0006 * This program is free software; you can redistribute it and/or modify * 0007 * it under the terms of the GNU General Public License as published by * 0008 * the Free Software Foundation; either version 2 of the License, or * 0009 * (at your option) any later version. * 0010 * * 0011 * This program is distributed in the hope that it will be useful, * 0012 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 0013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 0014 * GNU General Public License for more details. * 0015 * * 0016 * You should have received a copy of the GNU General Public License * 0017 * along with this program; if not, write to the * 0018 * Free Software Foundation, Inc., * 0019 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 0020 ***************************************************************************/ 0021 #include "trackerview.h" 0022 0023 #include <QClipboard> 0024 #include <QHeaderView> 0025 #include <QInputDialog> 0026 0027 #include <KConfigGroup> 0028 #include <KLocalizedString> 0029 #include <KMessageBox> 0030 0031 #include "trackermodel.h" 0032 #include <interfaces/torrentinterface.h> 0033 #include <interfaces/trackerinterface.h> 0034 #include <interfaces/trackerslist.h> 0035 #include <torrent/globals.h> 0036 #include <util/log.h> 0037 0038 using namespace bt; 0039 0040 namespace kt 0041 { 0042 0043 TrackerView::TrackerView(QWidget *parent) 0044 : QWidget(parent) 0045 , tc(nullptr) 0046 { 0047 setupUi(this); 0048 model = new TrackerModel(this); 0049 proxy_model = new QSortFilterProxyModel(this); 0050 proxy_model->setSortRole(Qt::UserRole); 0051 proxy_model->setSourceModel(model); 0052 m_tracker_list->setModel(proxy_model); 0053 m_tracker_list->setAllColumnsShowFocus(true); 0054 m_tracker_list->setRootIsDecorated(false); 0055 m_tracker_list->setAlternatingRowColors(true); 0056 m_tracker_list->setSortingEnabled(true); 0057 connect(m_add_tracker, &QAbstractButton::clicked, this, &TrackerView::addClicked); 0058 connect(m_remove_tracker, &QAbstractButton::clicked, this, &TrackerView::removeClicked); 0059 connect(m_change_tracker, &QAbstractButton::clicked, this, &TrackerView::changeClicked); 0060 connect(m_restore_defaults, &QAbstractButton::clicked, this, &TrackerView::restoreClicked); 0061 connect(m_tracker_list->selectionModel(), &QItemSelectionModel::currentChanged, this, &TrackerView::currentChanged); 0062 connect(m_scrape, &QAbstractButton::clicked, this, &TrackerView::scrapeClicked); 0063 0064 m_add_tracker->setIcon(QIcon::fromTheme("list-add")); 0065 m_remove_tracker->setIcon(QIcon::fromTheme("list-remove")); 0066 m_restore_defaults->setIcon(QIcon::fromTheme("kt-restore-defaults")); 0067 m_change_tracker->setIcon(QIcon::fromTheme("kt-change-tracker")); 0068 0069 setEnabled(false); 0070 torrentChanged(nullptr); 0071 } 0072 0073 TrackerView::~TrackerView() 0074 { 0075 } 0076 0077 void TrackerView::addClicked() 0078 { 0079 if (!tc) 0080 return; 0081 0082 bool ok = false; 0083 QClipboard *clipboard = QApplication::clipboard(); 0084 QString text = QInputDialog::getText(this, i18n("Add Tracker"), i18n("Enter the URL of the tracker:"), QLineEdit::Normal, clipboard->text(), &ok); 0085 0086 if (!ok) 0087 return; 0088 0089 QUrl url(text); 0090 if (!url.isValid()) { 0091 KMessageBox::error(nullptr, i18n("Malformed URL.")); 0092 return; 0093 } 0094 0095 // check for dupes 0096 if (!tc->getTrackersList()->addTracker(url, true)) { 0097 KMessageBox::error(nullptr, i18n("There already is a tracker named <b>%1</b>.", text)); 0098 } else { 0099 model->insertRow(model->rowCount(QModelIndex())); 0100 } 0101 } 0102 0103 void TrackerView::removeClicked() 0104 { 0105 QModelIndex current = proxy_model->mapToSource(m_tracker_list->selectionModel()->currentIndex()); 0106 if (!current.isValid()) 0107 return; 0108 0109 model->removeRow(current.row()); 0110 } 0111 0112 void TrackerView::changeClicked() 0113 { 0114 QModelIndex current = m_tracker_list->selectionModel()->currentIndex(); 0115 if (!current.isValid()) 0116 return; 0117 0118 bt::TrackersList *tlist = tc->getTrackersList(); 0119 bt::TrackerInterface *trk = model->tracker(proxy_model->mapToSource(current)); 0120 if (trk && trk->isEnabled()) 0121 tlist->setCurrentTracker(trk); 0122 } 0123 0124 void TrackerView::restoreClicked() 0125 { 0126 tc->getTrackersList()->restoreDefault(); 0127 tc->updateTracker(); 0128 model->changeTC(tc); // trigger reset 0129 } 0130 0131 void TrackerView::updateClicked() 0132 { 0133 if (!tc) 0134 return; 0135 0136 tc->updateTracker(); 0137 } 0138 0139 void TrackerView::scrapeClicked() 0140 { 0141 if (!tc) 0142 return; 0143 0144 tc->scrapeTracker(); 0145 } 0146 0147 void TrackerView::changeTC(TorrentInterface *ti) 0148 { 0149 if (tc == ti) 0150 return; 0151 0152 setEnabled(ti != nullptr); 0153 torrentChanged(ti); 0154 update(); 0155 } 0156 0157 void TrackerView::update() 0158 { 0159 if (tc) 0160 model->update(); 0161 } 0162 0163 void TrackerView::torrentChanged(TorrentInterface *ti) 0164 { 0165 tc = ti; 0166 if (!tc) { 0167 m_add_tracker->setEnabled(false); 0168 m_remove_tracker->setEnabled(false); 0169 m_restore_defaults->setEnabled(false); 0170 m_change_tracker->setEnabled(false); 0171 m_scrape->setEnabled(false); 0172 model->changeTC(nullptr); 0173 } else { 0174 m_add_tracker->setEnabled(true); 0175 m_remove_tracker->setEnabled(true); 0176 m_restore_defaults->setEnabled(true); 0177 m_scrape->setEnabled(true); 0178 model->changeTC(tc); 0179 currentChanged(m_tracker_list->selectionModel()->currentIndex(), QModelIndex()); 0180 } 0181 } 0182 0183 void TrackerView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous) 0184 { 0185 Q_UNUSED(previous) 0186 if (!tc) { 0187 m_change_tracker->setEnabled(false); 0188 m_remove_tracker->setEnabled(false); 0189 return; 0190 } 0191 0192 const TorrentStats &s = tc->getStats(); 0193 0194 bt::TrackerInterface *trk = model->tracker(proxy_model->mapToSource(current)); 0195 bool enabled = trk ? trk->isEnabled() : false; 0196 m_change_tracker->setEnabled(s.running && model->rowCount(QModelIndex()) > 1 && enabled); 0197 m_remove_tracker->setEnabled(trk && tc->getTrackersList()->canRemoveTracker(trk)); 0198 } 0199 0200 void TrackerView::saveState(KSharedConfigPtr cfg) 0201 { 0202 KConfigGroup g = cfg->group("TrackerView"); 0203 QByteArray s = m_tracker_list->header()->saveState(); 0204 g.writeEntry("state", s.toBase64()); 0205 } 0206 0207 void TrackerView::loadState(KSharedConfigPtr cfg) 0208 { 0209 KConfigGroup g = cfg->group("TrackerView"); 0210 QByteArray s = QByteArray::fromBase64(g.readEntry("state", QByteArray())); 0211 if (!s.isNull()) { 0212 QHeaderView *v = m_tracker_list->header(); 0213 v->restoreState(s); 0214 } 0215 } 0216 } 0217 0218 #include "moc_trackerview.cpp"