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 &current, 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"