mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-11-29 13:58:51 +03:00
Fix coding style for several files
trackerlist autoexpandabledialog previewselect shutdownconfirmdlg torrentcontentfiltermodel torrentcontenttreeview peerlistsortmodel.h
This commit is contained in:
parent
fd05f5dec5
commit
91f528bc96
13 changed files with 749 additions and 722 deletions
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent.
|
||||
* Copyright (C) 2013 Nick Tiskov
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2013 Nick Tiskov <daymansmail@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -24,71 +24,74 @@
|
|||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : daymansmail@gmail.com
|
||||
*/
|
||||
|
||||
#include "autoexpandabledialog.h"
|
||||
|
||||
#include <QDesktopWidget>
|
||||
|
||||
#include "mainwindow.h"
|
||||
#include "autoexpandabledialog.h"
|
||||
#include "ui_autoexpandabledialog.h"
|
||||
|
||||
AutoExpandableDialog::AutoExpandableDialog(QWidget *parent) : QDialog(parent), ui(new Ui::AutoExpandableDialog) {
|
||||
ui->setupUi(this);
|
||||
AutoExpandableDialog::AutoExpandableDialog(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_ui(new Ui::AutoExpandableDialog)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
}
|
||||
|
||||
AutoExpandableDialog::~AutoExpandableDialog() {
|
||||
delete ui;
|
||||
AutoExpandableDialog::~AutoExpandableDialog()
|
||||
{
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
QString AutoExpandableDialog::getText(QWidget *parent, const QString &title, const QString &label,
|
||||
QLineEdit::EchoMode mode, const QString &text, bool *ok,
|
||||
Qt::InputMethodHints inputMethodHints) {
|
||||
QLineEdit::EchoMode mode, const QString &text,
|
||||
bool *ok, Qt::InputMethodHints inputMethodHints)
|
||||
{
|
||||
AutoExpandableDialog d(parent);
|
||||
d.setWindowTitle(title);
|
||||
d.m_ui->textLabel->setText(label);
|
||||
d.m_ui->textEdit->setText(text);
|
||||
d.m_ui->textEdit->setEchoMode(mode);
|
||||
d.m_ui->textEdit->setInputMethodHints(inputMethodHints);
|
||||
|
||||
AutoExpandableDialog d(parent);
|
||||
d.setWindowTitle(title);
|
||||
d.ui->textLabel->setText(label);
|
||||
d.ui->textEdit->setText(text);
|
||||
d.ui->textEdit->setEchoMode(mode);
|
||||
d.ui->textEdit->setInputMethodHints(inputMethodHints);
|
||||
bool res = d.exec();
|
||||
if (ok)
|
||||
*ok = res;
|
||||
|
||||
bool res = d.exec();
|
||||
if (ok)
|
||||
*ok = res;
|
||||
if (!res) return QString();
|
||||
|
||||
if (!res)
|
||||
return QString();
|
||||
|
||||
return d.ui->textEdit->text();
|
||||
return d.m_ui->textEdit->text();
|
||||
}
|
||||
|
||||
void AutoExpandableDialog::showEvent(QShowEvent *e) {
|
||||
// Overriding showEvent is required for consistent UI with fixed size under custom DPI
|
||||
// Show dialog
|
||||
QDialog::showEvent(e);
|
||||
// and resize textbox to fit the text
|
||||
void AutoExpandableDialog::showEvent(QShowEvent *e)
|
||||
{
|
||||
// Overriding showEvent is required for consistent UI with fixed size under custom DPI
|
||||
// Show dialog
|
||||
QDialog::showEvent(e);
|
||||
// and resize textbox to fit the text
|
||||
|
||||
// NOTE: For some strange reason QFontMetrics gets more accurate
|
||||
// when called from showEvent. Only 6 symbols off instead of 11 symbols off.
|
||||
int textW = ui->textEdit->fontMetrics().width(ui->textEdit->text()) + 4;
|
||||
int wd = textW;
|
||||
// NOTE: For some strange reason QFontMetrics gets more accurate
|
||||
// when called from showEvent. Only 6 symbols off instead of 11 symbols off.
|
||||
int textW = m_ui->textEdit->fontMetrics().width(m_ui->textEdit->text()) + 4;
|
||||
int wd = textW;
|
||||
|
||||
if (!windowTitle().isEmpty()) {
|
||||
int _w = fontMetrics().width(windowTitle());
|
||||
if (_w > wd)
|
||||
wd = _w;
|
||||
}
|
||||
if (!windowTitle().isEmpty()) {
|
||||
int w = fontMetrics().width(windowTitle());
|
||||
if (w > wd)
|
||||
wd = w;
|
||||
}
|
||||
|
||||
if (!ui->textLabel->text().isEmpty()) {
|
||||
int _w = ui->textLabel->fontMetrics().width(ui->textLabel->text());
|
||||
if (_w > wd)
|
||||
wd = _w;
|
||||
}
|
||||
if (!m_ui->textLabel->text().isEmpty()) {
|
||||
int w = m_ui->textLabel->fontMetrics().width(m_ui->textLabel->text());
|
||||
if (w > wd)
|
||||
wd = w;
|
||||
}
|
||||
|
||||
// Now resize the dialog to fit the contents
|
||||
// max width of text from either of: label, title, textedit
|
||||
// If the value is less than dialog default size default size is used
|
||||
if (wd > width())
|
||||
resize(width() - ui->verticalLayout->sizeHint().width() + wd, height());
|
||||
// Now resize the dialog to fit the contents
|
||||
// max width of text from either of: label, title, textedit
|
||||
// If the value is less than dialog default size, default size is used
|
||||
if (wd > width())
|
||||
resize(width() - m_ui->verticalLayout->sizeHint().width() + wd, height());
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent.
|
||||
* Copyright (C) 2013 Nick Tiskov
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2013 Nick Tiskov <daymansmail@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -24,37 +24,37 @@
|
|||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : daymansmail@gmail.com
|
||||
*/
|
||||
|
||||
#ifndef AUTOEXPANDABLEDIALOG_H
|
||||
#define AUTOEXPANDABLEDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QString>
|
||||
#include <QLineEdit>
|
||||
#include <QString>
|
||||
|
||||
namespace Ui {
|
||||
class AutoExpandableDialog;
|
||||
namespace Ui
|
||||
{
|
||||
class AutoExpandableDialog;
|
||||
}
|
||||
|
||||
class AutoExpandableDialog : public QDialog {
|
||||
Q_OBJECT
|
||||
class AutoExpandableDialog: public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit AutoExpandableDialog(QWidget *parent);
|
||||
~AutoExpandableDialog();
|
||||
explicit AutoExpandableDialog(QWidget *parent);
|
||||
~AutoExpandableDialog();
|
||||
|
||||
static QString getText(QWidget *parent, const QString& title, const QString& label,
|
||||
QLineEdit::EchoMode mode = QLineEdit::Normal, const QString & text = QString(),
|
||||
bool * ok = 0, Qt::InputMethodHints inputMethodHints = Qt::ImhNone);
|
||||
static QString getText(QWidget *parent, const QString &title, const QString &label,
|
||||
QLineEdit::EchoMode mode = QLineEdit::Normal, const QString &text = QString(),
|
||||
bool *ok = 0, Qt::InputMethodHints inputMethodHints = Qt::ImhNone);
|
||||
|
||||
protected:
|
||||
void showEvent(QShowEvent *e);
|
||||
void showEvent(QShowEvent *e);
|
||||
|
||||
private:
|
||||
Ui::AutoExpandableDialog *ui;
|
||||
Ui::AutoExpandableDialog *m_ui;
|
||||
};
|
||||
|
||||
#endif // AUTOEXPANDABLEDIALOG_H
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent.
|
||||
* Copyright (C) 2011 Christophe Dumez
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2011 Christophe Dumez <chris@qbittorrent.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -24,106 +24,113 @@
|
|||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : chris@qbittorrent.org
|
||||
*/
|
||||
|
||||
#include <QStandardItemModel>
|
||||
#include "previewselect.h"
|
||||
|
||||
#include <QFile>
|
||||
#include <QHeaderView>
|
||||
#include <QMessageBox>
|
||||
#include <QFile>
|
||||
#include <QStandardItemModel>
|
||||
#include <QTableView>
|
||||
|
||||
#include "base/preferences.h"
|
||||
#include "base/utils/fs.h"
|
||||
#include "base/utils/misc.h"
|
||||
#include "previewlistdelegate.h"
|
||||
#include "previewselect.h"
|
||||
#include "base/utils/fs.h"
|
||||
#include "base/preferences.h"
|
||||
|
||||
PreviewSelect::PreviewSelect(QWidget* parent, BitTorrent::TorrentHandle *const torrent)
|
||||
: QDialog(parent)
|
||||
, m_torrent(torrent)
|
||||
{
|
||||
setupUi(this);
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
Preferences* const pref = Preferences::instance();
|
||||
// Preview list
|
||||
previewListModel = new QStandardItemModel(0, NB_COLUMNS);
|
||||
previewListModel->setHeaderData(NAME, Qt::Horizontal, tr("Name"));
|
||||
previewListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size"));
|
||||
previewListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress"));
|
||||
setupUi(this);
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
Preferences *const pref = Preferences::instance();
|
||||
// Preview list
|
||||
m_previewListModel = new QStandardItemModel(0, NB_COLUMNS);
|
||||
m_previewListModel->setHeaderData(NAME, Qt::Horizontal, tr("Name"));
|
||||
m_previewListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size"));
|
||||
m_previewListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress"));
|
||||
|
||||
// This hack fixes reordering of first column with Qt5.
|
||||
// https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777
|
||||
QTableView unused;
|
||||
unused.setVerticalHeader(previewList->header());
|
||||
previewList->header()->setParent(previewList);
|
||||
unused.setVerticalHeader(new QHeaderView(Qt::Horizontal));
|
||||
previewList->setModel(previewListModel);
|
||||
previewList->hideColumn(FILE_INDEX);
|
||||
listDelegate = new PreviewListDelegate(this);
|
||||
previewList->setItemDelegate(listDelegate);
|
||||
previewList->header()->resizeSection(0, 200);
|
||||
previewList->setAlternatingRowColors(pref->useAlternatingRowColors());
|
||||
// Fill list in
|
||||
QVector<qreal> fp = torrent->filesProgress();
|
||||
int nbFiles = torrent->filesCount();
|
||||
for (int i = 0; i < nbFiles; ++i) {
|
||||
QString fileName = torrent->fileName(i);
|
||||
if (fileName.endsWith(QB_EXT))
|
||||
fileName.chop(4);
|
||||
QString extension = Utils::Fs::fileExtension(fileName).toUpper();
|
||||
if (Utils::Misc::isPreviewable(extension)) {
|
||||
int row = previewListModel->rowCount();
|
||||
previewListModel->insertRow(row);
|
||||
previewListModel->setData(previewListModel->index(row, NAME), QVariant(fileName));
|
||||
previewListModel->setData(previewListModel->index(row, SIZE), QVariant(torrent->fileSize(i)));
|
||||
previewListModel->setData(previewListModel->index(row, PROGRESS), QVariant(fp[i]));
|
||||
previewListModel->setData(previewListModel->index(row, FILE_INDEX), QVariant(i));
|
||||
|
||||
previewList->setModel(m_previewListModel);
|
||||
previewList->hideColumn(FILE_INDEX);
|
||||
m_listDelegate = new PreviewListDelegate(this);
|
||||
previewList->setItemDelegate(m_listDelegate);
|
||||
previewList->header()->resizeSection(0, 200);
|
||||
previewList->setAlternatingRowColors(pref->useAlternatingRowColors());
|
||||
// Fill list in
|
||||
QVector<qreal> fp = torrent->filesProgress();
|
||||
int nbFiles = torrent->filesCount();
|
||||
for (int i = 0; i < nbFiles; ++i) {
|
||||
QString fileName = torrent->fileName(i);
|
||||
if (fileName.endsWith(QB_EXT))
|
||||
fileName.chop(4);
|
||||
QString extension = Utils::Fs::fileExtension(fileName).toUpper();
|
||||
if (Utils::Misc::isPreviewable(extension)) {
|
||||
int row = m_previewListModel->rowCount();
|
||||
m_previewListModel->insertRow(row);
|
||||
m_previewListModel->setData(m_previewListModel->index(row, NAME), QVariant(fileName));
|
||||
m_previewListModel->setData(m_previewListModel->index(row, SIZE), QVariant(torrent->fileSize(i)));
|
||||
m_previewListModel->setData(m_previewListModel->index(row, PROGRESS), QVariant(fp[i]));
|
||||
m_previewListModel->setData(m_previewListModel->index(row, FILE_INDEX), QVariant(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!previewListModel->rowCount()) {
|
||||
QMessageBox::critical(this->parentWidget(), tr("Preview impossible"), tr("Sorry, we can't preview this file"));
|
||||
if (m_previewListModel->rowCount() == 0) {
|
||||
QMessageBox::critical(this->parentWidget(), tr("Preview impossible"), tr("Sorry, we can't preview this file"));
|
||||
close();
|
||||
}
|
||||
connect(this, SIGNAL(readyToPreviewFile(QString)), parent, SLOT(previewFile(QString)));
|
||||
m_previewListModel->sort(NAME);
|
||||
previewList->header()->setSortIndicator(0, Qt::AscendingOrder);
|
||||
previewList->selectionModel()->select(m_previewListModel->index(0, NAME), QItemSelectionModel::Select | QItemSelectionModel::Rows);
|
||||
|
||||
if (m_previewListModel->rowCount() == 1) {
|
||||
qDebug("Torrent file only contains one file, no need to display selection dialog before preview");
|
||||
// Only one file : no choice
|
||||
on_previewButton_clicked();
|
||||
}
|
||||
else {
|
||||
qDebug("Displaying media file selection dialog for preview");
|
||||
show();
|
||||
}
|
||||
}
|
||||
|
||||
PreviewSelect::~PreviewSelect()
|
||||
{
|
||||
delete m_previewListModel;
|
||||
delete m_listDelegate;
|
||||
}
|
||||
|
||||
|
||||
void PreviewSelect::on_previewButton_clicked()
|
||||
{
|
||||
QModelIndexList selectedIndexes = previewList->selectionModel()->selectedRows(FILE_INDEX);
|
||||
if (selectedIndexes.size() == 0) return;
|
||||
|
||||
// Flush data
|
||||
m_torrent->flushCache();
|
||||
|
||||
QStringList absolutePaths(m_torrent->absoluteFilePaths());
|
||||
// Only one file should be selected
|
||||
QString path = absolutePaths.at(selectedIndexes.at(0).data().toInt());
|
||||
// File
|
||||
if (QFile::exists(path))
|
||||
emit readyToPreviewFile(path);
|
||||
else
|
||||
QMessageBox::critical(this->parentWidget(), tr("Preview impossible"), tr("Sorry, we can't preview this file"));
|
||||
|
||||
close();
|
||||
}
|
||||
connect(this, SIGNAL(readyToPreviewFile(QString)), parent, SLOT(previewFile(QString)));
|
||||
previewListModel->sort(NAME);
|
||||
previewList->header()->setSortIndicator(0, Qt::AscendingOrder);
|
||||
previewList->selectionModel()->select(previewListModel->index(0, NAME), QItemSelectionModel::Select | QItemSelectionModel::Rows);
|
||||
|
||||
if (previewListModel->rowCount() == 1) {
|
||||
qDebug("Torrent file only contains one file, no need to display selection dialog before preview");
|
||||
// Only one file : no choice
|
||||
on_previewButton_clicked();
|
||||
}else{
|
||||
qDebug("Displaying media file selection dialog for preview");
|
||||
show();
|
||||
}
|
||||
}
|
||||
|
||||
PreviewSelect::~PreviewSelect() {
|
||||
delete previewListModel;
|
||||
delete listDelegate;
|
||||
}
|
||||
|
||||
|
||||
void PreviewSelect::on_previewButton_clicked() {
|
||||
QModelIndexList selectedIndexes = previewList->selectionModel()->selectedRows(FILE_INDEX);
|
||||
if (selectedIndexes.size() == 0) return;
|
||||
// Flush data
|
||||
m_torrent->flushCache();
|
||||
|
||||
QStringList absolute_paths(m_torrent->absoluteFilePaths());
|
||||
//only one file should be selected
|
||||
QString path = absolute_paths.at(selectedIndexes.at(0).data().toInt());
|
||||
// File
|
||||
if (QFile::exists(path))
|
||||
emit readyToPreviewFile(path);
|
||||
else
|
||||
QMessageBox::critical(this->parentWidget(), tr("Preview impossible"), tr("Sorry, we can't preview this file"));
|
||||
close();
|
||||
}
|
||||
|
||||
void PreviewSelect::on_cancelButton_clicked() {
|
||||
close();
|
||||
void PreviewSelect::on_cancelButton_clicked()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent.
|
||||
* Copyright (C) 2006 Christophe Dumez
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2011 Christophe Dumez <chris@qbittorrent.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -24,8 +24,6 @@
|
|||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : chris@qbittorrent.org
|
||||
*/
|
||||
|
||||
#ifndef PREVIEWSELECT_H
|
||||
|
@ -33,36 +31,43 @@
|
|||
|
||||
#include <QDialog>
|
||||
#include <QList>
|
||||
#include "ui_preview.h"
|
||||
|
||||
#include "base/bittorrent/torrenthandle.h"
|
||||
#include "ui_preview.h"
|
||||
|
||||
class QStandardItemModel;
|
||||
|
||||
class PreviewListDelegate;
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QStandardItemModel;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class PreviewSelect: public QDialog, private Ui::preview {
|
||||
Q_OBJECT
|
||||
class PreviewSelect: public QDialog, private Ui::preview
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
enum PreviewColumn { NAME, SIZE, PROGRESS, FILE_INDEX, NB_COLUMNS };
|
||||
enum PreviewColumn
|
||||
{
|
||||
NAME,
|
||||
SIZE,
|
||||
PROGRESS,
|
||||
FILE_INDEX,
|
||||
|
||||
public:
|
||||
PreviewSelect(QWidget* parent, BitTorrent::TorrentHandle *const torrent);
|
||||
~PreviewSelect();
|
||||
NB_COLUMNS
|
||||
};
|
||||
|
||||
PreviewSelect(QWidget* parent, BitTorrent::TorrentHandle *const torrent);
|
||||
~PreviewSelect();
|
||||
|
||||
signals:
|
||||
void readyToPreviewFile(QString) const;
|
||||
void readyToPreviewFile(QString) const;
|
||||
|
||||
protected slots:
|
||||
void on_previewButton_clicked();
|
||||
void on_cancelButton_clicked();
|
||||
void on_previewButton_clicked();
|
||||
void on_cancelButton_clicked();
|
||||
|
||||
private:
|
||||
QStandardItemModel *previewListModel;
|
||||
PreviewListDelegate *listDelegate;
|
||||
BitTorrent::TorrentHandle *const m_torrent;
|
||||
QStandardItemModel *m_previewListModel;
|
||||
PreviewListDelegate *m_listDelegate;
|
||||
BitTorrent::TorrentHandle *const m_torrent;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // PREVIEWSELECT_H
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent.
|
||||
* Copyright (C) 2013 Nick Tiskov
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2013 Nick Tiskov <daymansmail@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -24,36 +24,40 @@
|
|||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : daymansmail@gmail.com
|
||||
*/
|
||||
|
||||
#ifndef PEERLISTSORTMODEL_H
|
||||
#define PEERLISTSORTMODEL_H
|
||||
|
||||
#include <QStringList>
|
||||
#include <QSortFilterProxyModel>
|
||||
#include <QStringList>
|
||||
|
||||
#include "peerlistdelegate.h"
|
||||
|
||||
class PeerListSortModel : public QSortFilterProxyModel {
|
||||
Q_OBJECT
|
||||
class PeerListSortModel: public QSortFilterProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
PeerListSortModel(QObject *parent = 0) : QSortFilterProxyModel(parent) {}
|
||||
PeerListSortModel(QObject *parent = 0)
|
||||
: QSortFilterProxyModel(parent)
|
||||
{
|
||||
}
|
||||
|
||||
protected:
|
||||
bool lessThan(const QModelIndex &left, const QModelIndex &right) const {
|
||||
switch (sortColumn()) {
|
||||
case PeerListDelegate::IP:
|
||||
case PeerListDelegate::CLIENT: {
|
||||
QString vL = left.data().toString();
|
||||
QString vR = right.data().toString();
|
||||
return Utils::String::naturalCompareCaseInsensitive(vL, vR);
|
||||
}
|
||||
};
|
||||
bool lessThan(const QModelIndex &left, const QModelIndex &right) const
|
||||
{
|
||||
switch (sortColumn()) {
|
||||
case PeerListDelegate::IP:
|
||||
case PeerListDelegate::CLIENT: {
|
||||
QString vL = left.data().toString();
|
||||
QString vR = right.data().toString();
|
||||
return Utils::String::naturalCompareCaseInsensitive(vL, vR);
|
||||
}
|
||||
};
|
||||
|
||||
return QSortFilterProxyModel::lessThan(left, right);
|
||||
}
|
||||
return QSortFilterProxyModel::lessThan(left, right);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // PEERLISTSORTMODEL_H
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent.
|
||||
* Copyright (C) 2006 Christophe Dumez
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -24,8 +24,6 @@
|
|||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : chris@qbittorrent.org
|
||||
*/
|
||||
|
||||
#include "trackerlist.h"
|
||||
|
@ -58,66 +56,66 @@ TrackerList::TrackerList(PropertiesWidget *properties)
|
|||
: QTreeWidget()
|
||||
, m_properties(properties)
|
||||
{
|
||||
// Set header
|
||||
// Must be set before calling loadSettings() otherwise the header is reset on restart
|
||||
setHeaderLabels(headerLabels());
|
||||
// Load settings
|
||||
loadSettings();
|
||||
// Graphical settings
|
||||
setRootIsDecorated(false);
|
||||
setAllColumnsShowFocus(true);
|
||||
setItemsExpandable(false);
|
||||
setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
header()->setStretchLastSection(false); // Must be set after loadSettings() in order to work
|
||||
// Ensure that at least one column is visible at all times
|
||||
if (visibleColumnsCount() == 0)
|
||||
setColumnHidden(COL_URL, false);
|
||||
// To also mitigate the above issue, we have to resize each column when
|
||||
// its size is 0, because explicitly 'showing' the column isn't enough
|
||||
// in the above scenario.
|
||||
for (unsigned int i = 0; i < COL_COUNT; ++i)
|
||||
if ((columnWidth(i) <= 0) && !isColumnHidden(i))
|
||||
resizeColumnToContents(i);
|
||||
// Context menu
|
||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showTrackerListMenu(QPoint)));
|
||||
// Header context menu
|
||||
header()->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayToggleColumnsMenu(const QPoint&)));
|
||||
// Set DHT, PeX, LSD items
|
||||
m_DHTItem = new QTreeWidgetItem({ "", "** [DHT] **", "", "0", "", "", "0" });
|
||||
insertTopLevelItem(0, m_DHTItem);
|
||||
setRowColor(0, QColor("grey"));
|
||||
m_PEXItem = new QTreeWidgetItem({ "", "** [PeX] **", "", "0", "", "", "0" });
|
||||
insertTopLevelItem(1, m_PEXItem);
|
||||
setRowColor(1, QColor("grey"));
|
||||
m_LSDItem = new QTreeWidgetItem({ "", "** [LSD] **", "", "0", "", "", "0" });
|
||||
insertTopLevelItem(2, m_LSDItem);
|
||||
setRowColor(2, QColor("grey"));
|
||||
// Set static items alignment
|
||||
m_DHTItem->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_PEXItem->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_LSDItem->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_DHTItem->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_PEXItem->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_LSDItem->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_DHTItem->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_PEXItem->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_LSDItem->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_DHTItem->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_PEXItem->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_LSDItem->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
// Set header alignment
|
||||
headerItem()->setTextAlignment(COL_TIER, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
headerItem()->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
headerItem()->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
headerItem()->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
headerItem()->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
// Set hotkeys
|
||||
m_editHotkey = new QShortcut(Qt::Key_F2, this, SLOT(editSelectedTracker()), 0, Qt::WidgetShortcut);
|
||||
connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(editSelectedTracker()));
|
||||
m_deleteHotkey = new QShortcut(QKeySequence::Delete, this, SLOT(deleteSelectedTrackers()), 0, Qt::WidgetShortcut);
|
||||
m_copyHotkey = new QShortcut(QKeySequence::Copy, this, SLOT(copyTrackerUrl()), 0, Qt::WidgetShortcut);
|
||||
// Set header
|
||||
// Must be set before calling loadSettings() otherwise the header is reset on restart
|
||||
setHeaderLabels(headerLabels());
|
||||
// Load settings
|
||||
loadSettings();
|
||||
// Graphical settings
|
||||
setRootIsDecorated(false);
|
||||
setAllColumnsShowFocus(true);
|
||||
setItemsExpandable(false);
|
||||
setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
header()->setStretchLastSection(false); // Must be set after loadSettings() in order to work
|
||||
// Ensure that at least one column is visible at all times
|
||||
if (visibleColumnsCount() == 0)
|
||||
setColumnHidden(COL_URL, false);
|
||||
// To also mitigate the above issue, we have to resize each column when
|
||||
// its size is 0, because explicitly 'showing' the column isn't enough
|
||||
// in the above scenario.
|
||||
for (unsigned int i = 0; i < COL_COUNT; ++i)
|
||||
if ((columnWidth(i) <= 0) && !isColumnHidden(i))
|
||||
resizeColumnToContents(i);
|
||||
// Context menu
|
||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showTrackerListMenu(QPoint)));
|
||||
// Header context menu
|
||||
header()->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayToggleColumnsMenu(const QPoint&)));
|
||||
// Set DHT, PeX, LSD items
|
||||
m_DHTItem = new QTreeWidgetItem({ "", "** [DHT] **", "", "0", "", "", "0" });
|
||||
insertTopLevelItem(0, m_DHTItem);
|
||||
setRowColor(0, QColor("grey"));
|
||||
m_PEXItem = new QTreeWidgetItem({ "", "** [PeX] **", "", "0", "", "", "0" });
|
||||
insertTopLevelItem(1, m_PEXItem);
|
||||
setRowColor(1, QColor("grey"));
|
||||
m_LSDItem = new QTreeWidgetItem({ "", "** [LSD] **", "", "0", "", "", "0" });
|
||||
insertTopLevelItem(2, m_LSDItem);
|
||||
setRowColor(2, QColor("grey"));
|
||||
// Set static items alignment
|
||||
m_DHTItem->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_PEXItem->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_LSDItem->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_DHTItem->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_PEXItem->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_LSDItem->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_DHTItem->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_PEXItem->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_LSDItem->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_DHTItem->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_PEXItem->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
m_LSDItem->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
// Set header alignment
|
||||
headerItem()->setTextAlignment(COL_TIER, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
headerItem()->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
headerItem()->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
headerItem()->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
headerItem()->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
// Set hotkeys
|
||||
m_editHotkey = new QShortcut(Qt::Key_F2, this, SLOT(editSelectedTracker()), 0, Qt::WidgetShortcut);
|
||||
connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(editSelectedTracker()));
|
||||
m_deleteHotkey = new QShortcut(QKeySequence::Delete, this, SLOT(deleteSelectedTrackers()), 0, Qt::WidgetShortcut);
|
||||
m_copyHotkey = new QShortcut(QKeySequence::Copy, this, SLOT(copyTrackerUrl()), 0, Qt::WidgetShortcut);
|
||||
|
||||
// This hack fixes reordering of first column with Qt5.
|
||||
// https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777
|
||||
|
@ -132,99 +130,106 @@ TrackerList::~TrackerList()
|
|||
saveSettings();
|
||||
}
|
||||
|
||||
QList<QTreeWidgetItem*> TrackerList::getSelectedTrackerItems() const {
|
||||
const QList<QTreeWidgetItem*> selected_items = selectedItems();
|
||||
QList<QTreeWidgetItem*> selected_trackers;
|
||||
foreach (QTreeWidgetItem *item, selected_items) {
|
||||
if (indexOfTopLevelItem(item) >= NB_STICKY_ITEM) { // Ignore STICKY ITEMS
|
||||
selected_trackers << item;
|
||||
QList<QTreeWidgetItem*> TrackerList::getSelectedTrackerItems() const
|
||||
{
|
||||
const QList<QTreeWidgetItem *> selectedTrackerItems = selectedItems();
|
||||
QList<QTreeWidgetItem *> selectedTrackers;
|
||||
foreach (QTreeWidgetItem *item, selectedTrackerItems) {
|
||||
if (indexOfTopLevelItem(item) >= NB_STICKY_ITEM) // Ignore STICKY ITEMS
|
||||
selectedTrackers << item;
|
||||
}
|
||||
}
|
||||
return selected_trackers;
|
||||
|
||||
return selectedTrackers;
|
||||
}
|
||||
|
||||
void TrackerList::setRowColor(int row, QColor color) {
|
||||
unsigned int nbColumns = columnCount();
|
||||
QTreeWidgetItem *item = topLevelItem(row);
|
||||
for (unsigned int i=0; i<nbColumns; ++i) {
|
||||
item->setData(i, Qt::ForegroundRole, color);
|
||||
}
|
||||
void TrackerList::setRowColor(int row, QColor color)
|
||||
{
|
||||
unsigned int nbColumns = columnCount();
|
||||
QTreeWidgetItem *item = topLevelItem(row);
|
||||
for (unsigned int i = 0; i < nbColumns; ++i)
|
||||
item->setData(i, Qt::ForegroundRole, color);
|
||||
}
|
||||
|
||||
void TrackerList::moveSelectionUp() {
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) {
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
QList<QTreeWidgetItem *> selected_items = getSelectedTrackerItems();
|
||||
if (selected_items.isEmpty()) return;
|
||||
bool change = false;
|
||||
foreach (QTreeWidgetItem *item, selected_items) {
|
||||
int index = indexOfTopLevelItem(item);
|
||||
if (index > NB_STICKY_ITEM) {
|
||||
insertTopLevelItem(index-1, takeTopLevelItem(index));
|
||||
change = true;
|
||||
void TrackerList::moveSelectionUp()
|
||||
{
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) {
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!change) return;
|
||||
// Restore selection
|
||||
QItemSelectionModel *selection = selectionModel();
|
||||
foreach (QTreeWidgetItem *item, selected_items) {
|
||||
selection->select(indexFromItem(item), QItemSelectionModel::Rows|QItemSelectionModel::Select);
|
||||
}
|
||||
setSelectionModel(selection);
|
||||
// Update torrent trackers
|
||||
QList<BitTorrent::TrackerEntry> trackers;
|
||||
for (int i = NB_STICKY_ITEM; i < topLevelItemCount(); ++i) {
|
||||
QString tracker_url = topLevelItem(i)->data(COL_URL, Qt::DisplayRole).toString();
|
||||
BitTorrent::TrackerEntry e(tracker_url);
|
||||
e.setTier(i - NB_STICKY_ITEM);
|
||||
trackers.append(e);
|
||||
}
|
||||
QList<QTreeWidgetItem *> selectedTrackerItems = getSelectedTrackerItems();
|
||||
if (selectedTrackerItems.isEmpty()) return;
|
||||
|
||||
torrent->replaceTrackers(trackers);
|
||||
// Reannounce
|
||||
if (!torrent->isPaused())
|
||||
torrent->forceReannounce();
|
||||
bool change = false;
|
||||
foreach (QTreeWidgetItem *item, selectedTrackerItems) {
|
||||
int index = indexOfTopLevelItem(item);
|
||||
if (index > NB_STICKY_ITEM) {
|
||||
insertTopLevelItem(index - 1, takeTopLevelItem(index));
|
||||
change = true;
|
||||
}
|
||||
}
|
||||
if (!change) return;
|
||||
|
||||
// Restore selection
|
||||
QItemSelectionModel *selection = selectionModel();
|
||||
foreach (QTreeWidgetItem *item, selectedTrackerItems)
|
||||
selection->select(indexFromItem(item), (QItemSelectionModel::Rows | QItemSelectionModel::Select));
|
||||
|
||||
setSelectionModel(selection);
|
||||
// Update torrent trackers
|
||||
QList<BitTorrent::TrackerEntry> trackers;
|
||||
for (int i = NB_STICKY_ITEM; i < topLevelItemCount(); ++i) {
|
||||
QString trackerURL = topLevelItem(i)->data(COL_URL, Qt::DisplayRole).toString();
|
||||
BitTorrent::TrackerEntry e(trackerURL);
|
||||
e.setTier(i - NB_STICKY_ITEM);
|
||||
trackers.append(e);
|
||||
}
|
||||
|
||||
torrent->replaceTrackers(trackers);
|
||||
// Reannounce
|
||||
if (!torrent->isPaused())
|
||||
torrent->forceReannounce();
|
||||
}
|
||||
|
||||
void TrackerList::moveSelectionDown() {
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) {
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
QList<QTreeWidgetItem *> selected_items = getSelectedTrackerItems();
|
||||
if (selected_items.isEmpty()) return;
|
||||
bool change = false;
|
||||
for (int i=selectedItems().size()-1; i>= 0; --i) {
|
||||
int index = indexOfTopLevelItem(selected_items.at(i));
|
||||
if (index < topLevelItemCount()-1) {
|
||||
insertTopLevelItem(index+1, takeTopLevelItem(index));
|
||||
change = true;
|
||||
void TrackerList::moveSelectionDown()
|
||||
{
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) {
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!change) return;
|
||||
// Restore selection
|
||||
QItemSelectionModel *selection = selectionModel();
|
||||
foreach (QTreeWidgetItem *item, selected_items) {
|
||||
selection->select(indexFromItem(item), QItemSelectionModel::Rows|QItemSelectionModel::Select);
|
||||
}
|
||||
setSelectionModel(selection);
|
||||
// Update torrent trackers
|
||||
QList<BitTorrent::TrackerEntry> trackers;
|
||||
for (int i = NB_STICKY_ITEM; i < topLevelItemCount(); ++i) {
|
||||
QString tracker_url = topLevelItem(i)->data(COL_URL, Qt::DisplayRole).toString();
|
||||
BitTorrent::TrackerEntry e(tracker_url);
|
||||
e.setTier(i - NB_STICKY_ITEM);
|
||||
trackers.append(e);
|
||||
}
|
||||
QList<QTreeWidgetItem *> selectedTrackerItems = getSelectedTrackerItems();
|
||||
if (selectedTrackerItems.isEmpty()) return;
|
||||
|
||||
torrent->replaceTrackers(trackers);
|
||||
// Reannounce
|
||||
if (!torrent->isPaused())
|
||||
torrent->forceReannounce();
|
||||
bool change = false;
|
||||
for (int i = selectedItems().size() - 1; i >= 0; --i) {
|
||||
int index = indexOfTopLevelItem(selectedTrackerItems.at(i));
|
||||
if (index < (topLevelItemCount() - 1)) {
|
||||
insertTopLevelItem(index + 1, takeTopLevelItem(index));
|
||||
change = true;
|
||||
}
|
||||
}
|
||||
if (!change) return;
|
||||
|
||||
// Restore selection
|
||||
QItemSelectionModel *selection = selectionModel();
|
||||
foreach (QTreeWidgetItem *item, selectedTrackerItems)
|
||||
selection->select(indexFromItem(item), (QItemSelectionModel::Rows | QItemSelectionModel::Select));
|
||||
|
||||
setSelectionModel(selection);
|
||||
// Update torrent trackers
|
||||
QList<BitTorrent::TrackerEntry> trackers;
|
||||
for (int i = NB_STICKY_ITEM; i < topLevelItemCount(); ++i) {
|
||||
QString trackerURL = topLevelItem(i)->data(COL_URL, Qt::DisplayRole).toString();
|
||||
BitTorrent::TrackerEntry e(trackerURL);
|
||||
e.setTier(i - NB_STICKY_ITEM);
|
||||
trackers.append(e);
|
||||
}
|
||||
|
||||
torrent->replaceTrackers(trackers);
|
||||
// Reannounce
|
||||
if (!torrent->isPaused())
|
||||
torrent->forceReannounce();
|
||||
}
|
||||
|
||||
void TrackerList::clear()
|
||||
|
@ -245,34 +250,35 @@ void TrackerList::clear()
|
|||
m_LSDItem->setText(COL_MSG, "");
|
||||
}
|
||||
|
||||
void TrackerList::loadStickyItems(BitTorrent::TorrentHandle *const torrent) {
|
||||
QString working = tr("Working");
|
||||
QString disabled = tr("Disabled");
|
||||
void TrackerList::loadStickyItems(BitTorrent::TorrentHandle *const torrent)
|
||||
{
|
||||
QString working = tr("Working");
|
||||
QString disabled = tr("Disabled");
|
||||
|
||||
// load DHT information
|
||||
if (BitTorrent::Session::instance()->isDHTEnabled() && !torrent->isPrivate())
|
||||
m_DHTItem->setText(COL_STATUS, working);
|
||||
else
|
||||
m_DHTItem->setText(COL_STATUS, disabled);
|
||||
// load DHT information
|
||||
if (BitTorrent::Session::instance()->isDHTEnabled() && !torrent->isPrivate())
|
||||
m_DHTItem->setText(COL_STATUS, working);
|
||||
else
|
||||
m_DHTItem->setText(COL_STATUS, disabled);
|
||||
|
||||
// Load PeX Information
|
||||
if (BitTorrent::Session::instance()->isPeXEnabled() && !torrent->isPrivate())
|
||||
m_PEXItem->setText(COL_STATUS, working);
|
||||
else
|
||||
m_PEXItem->setText(COL_STATUS, disabled);
|
||||
// Load PeX Information
|
||||
if (BitTorrent::Session::instance()->isPeXEnabled() && !torrent->isPrivate())
|
||||
m_PEXItem->setText(COL_STATUS, working);
|
||||
else
|
||||
m_PEXItem->setText(COL_STATUS, disabled);
|
||||
|
||||
// Load LSD Information
|
||||
if (BitTorrent::Session::instance()->isLSDEnabled() && !torrent->isPrivate())
|
||||
m_LSDItem->setText(COL_STATUS, working);
|
||||
else
|
||||
m_LSDItem->setText(COL_STATUS, disabled);
|
||||
// Load LSD Information
|
||||
if (BitTorrent::Session::instance()->isLSDEnabled() && !torrent->isPrivate())
|
||||
m_LSDItem->setText(COL_STATUS, working);
|
||||
else
|
||||
m_LSDItem->setText(COL_STATUS, disabled);
|
||||
|
||||
if (torrent->isPrivate()) {
|
||||
QString privateMsg = tr("This torrent is private");
|
||||
m_DHTItem->setText(COL_MSG, privateMsg);
|
||||
m_PEXItem->setText(COL_MSG, privateMsg);
|
||||
m_LSDItem->setText(COL_MSG, privateMsg);
|
||||
}
|
||||
if (torrent->isPrivate()) {
|
||||
QString privateMsg = tr("This torrent is private");
|
||||
m_DHTItem->setText(COL_MSG, privateMsg);
|
||||
m_PEXItem->setText(COL_MSG, privateMsg);
|
||||
m_LSDItem->setText(COL_MSG, privateMsg);
|
||||
}
|
||||
|
||||
// XXX: libtorrent should provide this info...
|
||||
// Count peers from DHT, PeX, LSD
|
||||
|
@ -308,252 +314,261 @@ void TrackerList::loadStickyItems(BitTorrent::TorrentHandle *const torrent) {
|
|||
m_LSDItem->setText(COL_PEERS, QString::number(peersLSD));
|
||||
}
|
||||
|
||||
void TrackerList::loadTrackers() {
|
||||
// Load trackers from torrent handle
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) return;
|
||||
void TrackerList::loadTrackers()
|
||||
{
|
||||
// Load trackers from torrent handle
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) return;
|
||||
|
||||
loadStickyItems(torrent);
|
||||
// Load actual trackers information
|
||||
QHash<QString, BitTorrent::TrackerInfo> trackers_data = torrent->trackerInfos();
|
||||
QStringList old_trackers_urls = m_trackerItems.keys();
|
||||
foreach (const BitTorrent::TrackerEntry &entry, torrent->trackers()) {
|
||||
QString trackerUrl = entry.url();
|
||||
QTreeWidgetItem *item = m_trackerItems.value(trackerUrl, 0);
|
||||
if (!item) {
|
||||
item = new QTreeWidgetItem();
|
||||
item->setText(COL_URL, trackerUrl);
|
||||
addTopLevelItem(item);
|
||||
m_trackerItems[trackerUrl] = item;
|
||||
} else {
|
||||
old_trackers_urls.removeOne(trackerUrl);
|
||||
}
|
||||
item->setText(COL_TIER, QString::number(entry.tier()));
|
||||
BitTorrent::TrackerInfo data = trackers_data.value(trackerUrl);
|
||||
QString error_message = data.lastMessage.trimmed();
|
||||
switch (entry.status()) {
|
||||
case BitTorrent::TrackerEntry::Working:
|
||||
item->setText(COL_STATUS, tr("Working"));
|
||||
item->setText(COL_MSG, "");
|
||||
break;
|
||||
case BitTorrent::TrackerEntry::Updating:
|
||||
item->setText(COL_STATUS, tr("Updating..."));
|
||||
item->setText(COL_MSG, "");
|
||||
break;
|
||||
case BitTorrent::TrackerEntry::NotWorking:
|
||||
item->setText(COL_STATUS, tr("Not working"));
|
||||
item->setText(COL_MSG, error_message);
|
||||
break;
|
||||
case BitTorrent::TrackerEntry::NotContacted:
|
||||
item->setText(COL_STATUS, tr("Not contacted yet"));
|
||||
item->setText(COL_MSG, "");
|
||||
break;
|
||||
}
|
||||
item->setText(COL_RECEIVED, QString::number(data.numPeers));
|
||||
loadStickyItems(torrent);
|
||||
|
||||
// Load actual trackers information
|
||||
QHash<QString, BitTorrent::TrackerInfo> trackerData = torrent->trackerInfos();
|
||||
QStringList oldTrackerURLs = m_trackerItems.keys();
|
||||
foreach (const BitTorrent::TrackerEntry &entry, torrent->trackers()) {
|
||||
QString trackerURL = entry.url();
|
||||
QTreeWidgetItem *item = m_trackerItems.value(trackerURL, 0);
|
||||
if (!item) {
|
||||
item = new QTreeWidgetItem();
|
||||
item->setText(COL_URL, trackerURL);
|
||||
addTopLevelItem(item);
|
||||
m_trackerItems[trackerURL] = item;
|
||||
}
|
||||
else {
|
||||
oldTrackerURLs.removeOne(trackerURL);
|
||||
}
|
||||
item->setText(COL_TIER, QString::number(entry.tier()));
|
||||
BitTorrent::TrackerInfo data = trackerData.value(trackerURL);
|
||||
QString errorMessage = data.lastMessage.trimmed();
|
||||
switch (entry.status()) {
|
||||
case BitTorrent::TrackerEntry::Working:
|
||||
item->setText(COL_STATUS, tr("Working"));
|
||||
item->setText(COL_MSG, "");
|
||||
break;
|
||||
case BitTorrent::TrackerEntry::Updating:
|
||||
item->setText(COL_STATUS, tr("Updating..."));
|
||||
item->setText(COL_MSG, "");
|
||||
break;
|
||||
case BitTorrent::TrackerEntry::NotWorking:
|
||||
item->setText(COL_STATUS, tr("Not working"));
|
||||
item->setText(COL_MSG, errorMessage);
|
||||
break;
|
||||
case BitTorrent::TrackerEntry::NotContacted:
|
||||
item->setText(COL_STATUS, tr("Not contacted yet"));
|
||||
item->setText(COL_MSG, "");
|
||||
break;
|
||||
}
|
||||
|
||||
item->setText(COL_RECEIVED, QString::number(data.numPeers));
|
||||
#if LIBTORRENT_VERSION_NUM >= 10000
|
||||
item->setText(COL_SEEDS, QString::number(entry.nativeEntry().scrape_complete > 0 ? entry.nativeEntry().scrape_complete : 0));
|
||||
item->setText(COL_PEERS, QString::number(entry.nativeEntry().scrape_incomplete > 0 ? entry.nativeEntry().scrape_incomplete : 0));
|
||||
item->setText(COL_DOWNLOADED, QString::number(entry.nativeEntry().scrape_downloaded > 0 ? entry.nativeEntry().scrape_downloaded : 0));
|
||||
item->setText(COL_SEEDS, QString::number(entry.nativeEntry().scrape_complete > 0 ? entry.nativeEntry().scrape_complete : 0));
|
||||
item->setText(COL_PEERS, QString::number(entry.nativeEntry().scrape_incomplete > 0 ? entry.nativeEntry().scrape_incomplete : 0));
|
||||
item->setText(COL_DOWNLOADED, QString::number(entry.nativeEntry().scrape_downloaded > 0 ? entry.nativeEntry().scrape_downloaded : 0));
|
||||
#else
|
||||
item->setText(COL_SEEDS, "0");
|
||||
item->setText(COL_PEERS, "0");
|
||||
item->setText(COL_DOWNLOADED, "0");
|
||||
item->setText(COL_SEEDS, "0");
|
||||
item->setText(COL_PEERS, "0");
|
||||
item->setText(COL_DOWNLOADED, "0");
|
||||
#endif
|
||||
|
||||
item->setTextAlignment(COL_TIER, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
item->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
item->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
item->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
item->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
}
|
||||
// Remove old trackers
|
||||
foreach (const QString &tracker, old_trackers_urls) {
|
||||
delete m_trackerItems.take(tracker);
|
||||
}
|
||||
item->setTextAlignment(COL_TIER, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
item->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
item->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
item->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
item->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter));
|
||||
}
|
||||
// Remove old trackers
|
||||
foreach (const QString &tracker, oldTrackerURLs)
|
||||
delete m_trackerItems.take(tracker);
|
||||
}
|
||||
|
||||
// Ask the user for new trackers and add them to the torrent
|
||||
void TrackerList::askForTrackers() {
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) return;
|
||||
void TrackerList::askForTrackers()
|
||||
{
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) return;
|
||||
|
||||
QList<BitTorrent::TrackerEntry> trackers;
|
||||
foreach (const QString &tracker, TrackersAdditionDlg::askForTrackers(this, torrent))
|
||||
trackers << tracker;
|
||||
torrent->addTrackers(trackers);
|
||||
QList<BitTorrent::TrackerEntry> trackers;
|
||||
foreach (const QString &tracker, TrackersAdditionDlg::askForTrackers(this, torrent))
|
||||
trackers << tracker;
|
||||
|
||||
torrent->addTrackers(trackers);
|
||||
}
|
||||
|
||||
void TrackerList::copyTrackerUrl() {
|
||||
QList<QTreeWidgetItem *> selected_items = getSelectedTrackerItems();
|
||||
if (selected_items.isEmpty()) return;
|
||||
QStringList urls_to_copy;
|
||||
foreach (QTreeWidgetItem *item, selected_items) {
|
||||
QString tracker_url = item->data(COL_URL, Qt::DisplayRole).toString();
|
||||
qDebug() << QString("Copy: ") + tracker_url;
|
||||
urls_to_copy << tracker_url;
|
||||
void TrackerList::copyTrackerUrl()
|
||||
{
|
||||
QList<QTreeWidgetItem *> selectedTrackerItems = getSelectedTrackerItems();
|
||||
if (selectedTrackerItems.isEmpty()) return;
|
||||
|
||||
QStringList URLsToCopy;
|
||||
foreach (QTreeWidgetItem *item, selectedTrackerItems) {
|
||||
QString trackerURL = item->data(COL_URL, Qt::DisplayRole).toString();
|
||||
qDebug() << QString("Copy: ") + trackerURL;
|
||||
URLsToCopy << trackerURL;
|
||||
}
|
||||
QApplication::clipboard()->setText(urls_to_copy.join("\n"));
|
||||
QApplication::clipboard()->setText(URLsToCopy.join("\n"));
|
||||
}
|
||||
|
||||
|
||||
void TrackerList::deleteSelectedTrackers() {
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) {
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
|
||||
QList<QTreeWidgetItem *> selected_items = getSelectedTrackerItems();
|
||||
if (selected_items.isEmpty()) return;
|
||||
|
||||
QStringList urls_to_remove;
|
||||
foreach (QTreeWidgetItem *item, selected_items) {
|
||||
QString tracker_url = item->data(COL_URL, Qt::DisplayRole).toString();
|
||||
urls_to_remove << tracker_url;
|
||||
m_trackerItems.remove(tracker_url);
|
||||
delete item;
|
||||
}
|
||||
|
||||
// Iterate of trackers and remove selected ones
|
||||
QList<BitTorrent::TrackerEntry> remaining_trackers;
|
||||
QList<BitTorrent::TrackerEntry> trackers = torrent->trackers();
|
||||
foreach (const BitTorrent::TrackerEntry &entry, trackers) {
|
||||
if (!urls_to_remove.contains(entry.url())) {
|
||||
remaining_trackers.push_back(entry);
|
||||
void TrackerList::deleteSelectedTrackers()
|
||||
{
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) {
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
torrent->replaceTrackers(remaining_trackers);
|
||||
if (!torrent->isPaused())
|
||||
torrent->forceReannounce();
|
||||
QList<QTreeWidgetItem *> selectedTrackerItems = getSelectedTrackerItems();
|
||||
if (selectedTrackerItems.isEmpty()) return;
|
||||
|
||||
QStringList URLsToRemove;
|
||||
foreach (QTreeWidgetItem *item, selectedTrackerItems) {
|
||||
QString trackerURL = item->data(COL_URL, Qt::DisplayRole).toString();
|
||||
URLsToRemove << trackerURL;
|
||||
m_trackerItems.remove(trackerURL);
|
||||
delete item;
|
||||
}
|
||||
|
||||
// Iterate over the trackers and remove the selected ones
|
||||
QList<BitTorrent::TrackerEntry> remainingTrackers;
|
||||
QList<BitTorrent::TrackerEntry> trackers = torrent->trackers();
|
||||
foreach (const BitTorrent::TrackerEntry &entry, trackers) {
|
||||
if (!URLsToRemove.contains(entry.url()))
|
||||
remainingTrackers.push_back(entry);
|
||||
}
|
||||
|
||||
torrent->replaceTrackers(remainingTrackers);
|
||||
if (!torrent->isPaused())
|
||||
torrent->forceReannounce();
|
||||
}
|
||||
|
||||
void TrackerList::editSelectedTracker() {
|
||||
void TrackerList::editSelectedTracker()
|
||||
{
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) return;
|
||||
|
||||
QString hash = torrent->hash();
|
||||
|
||||
QList<QTreeWidgetItem *> selected_items = getSelectedTrackerItems();
|
||||
if (selected_items.isEmpty())
|
||||
return;
|
||||
QList<QTreeWidgetItem *> selectedTrackerItems = getSelectedTrackerItems();
|
||||
if (selectedTrackerItems.isEmpty()) return;
|
||||
|
||||
// During multi-select only process item selected last
|
||||
QUrl tracker_url = selected_items.last()->text(COL_URL);
|
||||
QUrl trackerURL = selectedTrackerItems.last()->text(COL_URL);
|
||||
|
||||
bool ok;
|
||||
QUrl new_tracker_url = AutoExpandableDialog::getText(this, tr("Tracker editing"), tr("Tracker URL:"),
|
||||
QLineEdit::Normal, tracker_url.toString(), &ok).trimmed();
|
||||
if (!ok)
|
||||
return;
|
||||
QUrl newTrackerURL = AutoExpandableDialog::getText(this, tr("Tracker editing"), tr("Tracker URL:"),
|
||||
QLineEdit::Normal, trackerURL.toString(), &ok).trimmed();
|
||||
if (!ok) return;
|
||||
|
||||
if (!new_tracker_url.isValid()) {
|
||||
QMessageBox::warning(this, tr("Tracker editing failed"), tr("The tracker URL entered is invalid."));
|
||||
return;
|
||||
if (!newTrackerURL.isValid()) {
|
||||
QMessageBox::warning(this, tr("Tracker editing failed"), tr("The tracker URL entered is invalid."));
|
||||
return;
|
||||
}
|
||||
if (new_tracker_url == tracker_url)
|
||||
return;
|
||||
if (newTrackerURL == trackerURL) return;
|
||||
|
||||
QList<BitTorrent::TrackerEntry> trackers = torrent->trackers();
|
||||
bool match = false;
|
||||
for (int i = 0; i < trackers.size(); ++i) {
|
||||
BitTorrent::TrackerEntry &entry = trackers[i];
|
||||
if (new_tracker_url == QUrl(entry.url())) {
|
||||
QMessageBox::warning(this, tr("Tracker editing failed"), tr("The tracker URL already exists."));
|
||||
return;
|
||||
}
|
||||
BitTorrent::TrackerEntry &entry = trackers[i];
|
||||
if (newTrackerURL == QUrl(entry.url())) {
|
||||
QMessageBox::warning(this, tr("Tracker editing failed"), tr("The tracker URL already exists."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (tracker_url == QUrl(entry.url()) && !match) {
|
||||
BitTorrent::TrackerEntry new_entry(new_tracker_url.toString());
|
||||
new_entry.setTier(entry.tier());
|
||||
match = true;
|
||||
entry = new_entry;
|
||||
}
|
||||
if (trackerURL == QUrl(entry.url()) && !match) {
|
||||
BitTorrent::TrackerEntry newEntry(newTrackerURL.toString());
|
||||
newEntry.setTier(entry.tier());
|
||||
match = true;
|
||||
entry = newEntry;
|
||||
}
|
||||
}
|
||||
|
||||
torrent->replaceTrackers(trackers);
|
||||
if (!torrent->isPaused()) {
|
||||
torrent->forceReannounce();
|
||||
}
|
||||
if (!torrent->isPaused())
|
||||
torrent->forceReannounce();
|
||||
}
|
||||
|
||||
void TrackerList::reannounceSelected() {
|
||||
QList<QTreeWidgetItem *> selected_items = selectedItems();
|
||||
if (selected_items.isEmpty()) return;
|
||||
void TrackerList::reannounceSelected()
|
||||
{
|
||||
QList<QTreeWidgetItem *> selItems = selectedItems();
|
||||
if (selItems.isEmpty()) return;
|
||||
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) return;
|
||||
|
||||
QList<BitTorrent::TrackerEntry> trackers = torrent->trackers();
|
||||
|
||||
foreach (QTreeWidgetItem* item, selected_items) {
|
||||
// DHT case
|
||||
if (item == m_DHTItem) {
|
||||
torrent->forceDHTAnnounce();
|
||||
continue;
|
||||
}
|
||||
|
||||
// Trackers case
|
||||
for (int i = 0; i < trackers.size(); ++i) {
|
||||
if (item->text(COL_URL) == trackers[i].url()) {
|
||||
torrent->forceReannounce(i);
|
||||
break;
|
||||
foreach (QTreeWidgetItem* item, selItems) {
|
||||
// DHT case
|
||||
if (item == m_DHTItem) {
|
||||
torrent->forceDHTAnnounce();
|
||||
continue;
|
||||
}
|
||||
|
||||
// Trackers case
|
||||
for (int i = 0; i < trackers.size(); ++i) {
|
||||
if (item->text(COL_URL) == trackers[i].url()) {
|
||||
torrent->forceReannounce(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
loadTrackers();
|
||||
}
|
||||
|
||||
void TrackerList::showTrackerListMenu(QPoint) {
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) return;
|
||||
//QList<QTreeWidgetItem*> selected_items = getSelectedTrackerItems();
|
||||
QMenu menu;
|
||||
// Add actions
|
||||
QAction *addAct = menu.addAction(GuiIconProvider::instance()->getIcon("list-add"), tr("Add a new tracker..."));
|
||||
QAction *copyAct = nullptr;
|
||||
QAction *delAct = nullptr;
|
||||
QAction *editAct = nullptr;
|
||||
if (!getSelectedTrackerItems().isEmpty()) {
|
||||
delAct = menu.addAction(GuiIconProvider::instance()->getIcon("list-remove"), tr("Remove tracker"));
|
||||
copyAct = menu.addAction(GuiIconProvider::instance()->getIcon("edit-copy"), tr("Copy tracker URL"));
|
||||
editAct = menu.addAction(GuiIconProvider::instance()->getIcon("edit-rename"),tr("Edit selected tracker URL"));
|
||||
}
|
||||
QAction *reannounceSelAct = nullptr;
|
||||
QAction *reannounceAct = nullptr;
|
||||
if (!torrent->isPaused()) {
|
||||
reannounceSelAct = menu.addAction(GuiIconProvider::instance()->getIcon("view-refresh"), tr("Force reannounce to selected trackers"));
|
||||
menu.addSeparator();
|
||||
reannounceAct = menu.addAction(GuiIconProvider::instance()->getIcon("view-refresh"), tr("Force reannounce to all trackers"));
|
||||
}
|
||||
QAction *act = menu.exec(QCursor::pos());
|
||||
if (act == nullptr) return;
|
||||
if (act == addAct) {
|
||||
askForTrackers();
|
||||
return;
|
||||
}
|
||||
if (act == copyAct) {
|
||||
copyTrackerUrl();
|
||||
return;
|
||||
}
|
||||
if (act == delAct) {
|
||||
deleteSelectedTrackers();
|
||||
return;
|
||||
}
|
||||
if (act == reannounceSelAct) {
|
||||
reannounceSelected();
|
||||
return;
|
||||
}
|
||||
if (act == reannounceAct) {
|
||||
BitTorrent::TorrentHandle *h = m_properties->getCurrentTorrent();
|
||||
h->forceReannounce();
|
||||
h->forceDHTAnnounce();
|
||||
return;
|
||||
}
|
||||
if (act == editAct) {
|
||||
editSelectedTracker();
|
||||
return;
|
||||
}
|
||||
void TrackerList::showTrackerListMenu(QPoint)
|
||||
{
|
||||
BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent();
|
||||
if (!torrent) return;
|
||||
|
||||
//QList<QTreeWidgetItem*> selected_items = getSelectedTrackerItems();
|
||||
QMenu menu;
|
||||
// Add actions
|
||||
QAction *addAct = menu.addAction(GuiIconProvider::instance()->getIcon("list-add"), tr("Add a new tracker..."));
|
||||
QAction *copyAct = nullptr;
|
||||
QAction *delAct = nullptr;
|
||||
QAction *editAct = nullptr;
|
||||
if (!getSelectedTrackerItems().isEmpty()) {
|
||||
delAct = menu.addAction(GuiIconProvider::instance()->getIcon("list-remove"), tr("Remove tracker"));
|
||||
copyAct = menu.addAction(GuiIconProvider::instance()->getIcon("edit-copy"), tr("Copy tracker URL"));
|
||||
editAct = menu.addAction(GuiIconProvider::instance()->getIcon("edit-rename"),tr("Edit selected tracker URL"));
|
||||
}
|
||||
QAction *reannounceSelAct = nullptr;
|
||||
QAction *reannounceAllAct = nullptr;
|
||||
if (!torrent->isPaused()) {
|
||||
reannounceSelAct = menu.addAction(GuiIconProvider::instance()->getIcon("view-refresh"), tr("Force reannounce to selected trackers"));
|
||||
menu.addSeparator();
|
||||
reannounceAllAct = menu.addAction(GuiIconProvider::instance()->getIcon("view-refresh"), tr("Force reannounce to all trackers"));
|
||||
}
|
||||
QAction *act = menu.exec(QCursor::pos());
|
||||
if (act == nullptr) return;
|
||||
|
||||
if (act == addAct) {
|
||||
askForTrackers();
|
||||
return;
|
||||
}
|
||||
if (act == copyAct) {
|
||||
copyTrackerUrl();
|
||||
return;
|
||||
}
|
||||
if (act == delAct) {
|
||||
deleteSelectedTrackers();
|
||||
return;
|
||||
}
|
||||
if (act == reannounceSelAct) {
|
||||
reannounceSelected();
|
||||
return;
|
||||
}
|
||||
if (act == reannounceAllAct) {
|
||||
BitTorrent::TorrentHandle *h = m_properties->getCurrentTorrent();
|
||||
h->forceReannounce();
|
||||
h->forceDHTAnnounce();
|
||||
return;
|
||||
}
|
||||
if (act == editAct) {
|
||||
editSelectedTracker();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void TrackerList::loadSettings()
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent.
|
||||
* Copyright (C) 2006 Christophe Dumez
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -24,8 +24,6 @@
|
|||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : chris@qbittorrent.org
|
||||
*/
|
||||
|
||||
#ifndef TRACKERLIST_H
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2011 Christophe Dumez
|
||||
* Copyright (C) 2014 sledgehammer999
|
||||
* Copyright (C) 2014 sledgehammer999 <hammered999@gmail.com>
|
||||
* Copyright (C) 2011 Christophe Dumez <chris@qbittorrent.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -25,42 +25,38 @@
|
|||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : chris@qbittorrent.org
|
||||
* Contact : hammered999@gmail.com
|
||||
*/
|
||||
|
||||
#include "shutdownconfirmdlg.h"
|
||||
#include "ui_shutdownconfirmdlg.h"
|
||||
|
||||
#include <QStyle>
|
||||
#include <QIcon>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QIcon>
|
||||
#include <QPushButton>
|
||||
#include <QStyle>
|
||||
|
||||
#include "base/preferences.h"
|
||||
#include "base/utils/misc.h"
|
||||
|
||||
#include "ui_shutdownconfirmdlg.h"
|
||||
|
||||
ShutdownConfirmDlg::ShutdownConfirmDlg(QWidget *parent, const ShutdownDialogAction &action)
|
||||
: QDialog(parent)
|
||||
, ui(new Ui::confirmShutdownDlg)
|
||||
, m_ui(new Ui::confirmShutdownDlg)
|
||||
, m_timeout(15)
|
||||
, m_action(action)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
m_ui->setupUi(this);
|
||||
|
||||
initText();
|
||||
QIcon warningIcon(style()->standardIcon(QStyle::SP_MessageBoxWarning));
|
||||
ui->warningLabel->setPixmap(warningIcon.pixmap(32));
|
||||
m_ui->warningLabel->setPixmap(warningIcon.pixmap(32));
|
||||
|
||||
if (m_action == ShutdownDialogAction::Exit)
|
||||
ui->neverShowAgainCheckbox->setVisible(true);
|
||||
m_ui->neverShowAgainCheckbox->setVisible(true);
|
||||
else
|
||||
ui->neverShowAgainCheckbox->setVisible(false);
|
||||
m_ui->neverShowAgainCheckbox->setVisible(false);
|
||||
|
||||
// Cancel Button
|
||||
QPushButton *cancelButton = ui->buttonBox->button(QDialogButtonBox::Cancel);
|
||||
QPushButton *cancelButton = m_ui->buttonBox->button(QDialogButtonBox::Cancel);
|
||||
cancelButton->setFocus();
|
||||
cancelButton->setDefault(true);
|
||||
|
||||
|
@ -74,7 +70,7 @@ ShutdownConfirmDlg::ShutdownConfirmDlg(QWidget *parent, const ShutdownDialogActi
|
|||
|
||||
ShutdownConfirmDlg::~ShutdownConfirmDlg()
|
||||
{
|
||||
delete ui;
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
void ShutdownConfirmDlg::showEvent(QShowEvent *event)
|
||||
|
@ -101,36 +97,32 @@ void ShutdownConfirmDlg::updateSeconds()
|
|||
|
||||
void ShutdownConfirmDlg::accept()
|
||||
{
|
||||
Preferences::instance()->setDontConfirmAutoExit(ui->neverShowAgainCheckbox->isChecked());
|
||||
Preferences::instance()->setDontConfirmAutoExit(m_ui->neverShowAgainCheckbox->isChecked());
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void ShutdownConfirmDlg::initText()
|
||||
{
|
||||
QPushButton *okButton = ui->buttonBox->button(QDialogButtonBox::Ok);
|
||||
QPushButton *okButton = m_ui->buttonBox->button(QDialogButtonBox::Ok);
|
||||
|
||||
switch (m_action) {
|
||||
case ShutdownDialogAction::Exit:
|
||||
m_msg = tr("qBittorrent will now exit.");
|
||||
|
||||
okButton->setText(tr("E&xit Now"));
|
||||
setWindowTitle(tr("Exit confirmation"));
|
||||
break;
|
||||
case ShutdownDialogAction::Shutdown:
|
||||
m_msg = tr("The computer is going to shutdown.");
|
||||
|
||||
okButton->setText(tr("&Shutdown Now"));
|
||||
setWindowTitle(tr("Shutdown confirmation"));
|
||||
break;
|
||||
case ShutdownDialogAction::Suspend:
|
||||
m_msg = tr("The computer is going to enter suspend mode.");
|
||||
|
||||
okButton->setText(tr("&Suspend Now"));
|
||||
setWindowTitle(tr("Suspend confirmation"));
|
||||
break;
|
||||
case ShutdownDialogAction::Hibernate:
|
||||
m_msg = tr("The computer is going to enter hibernation mode.");
|
||||
|
||||
okButton->setText(tr("&Hibernate Now"));
|
||||
setWindowTitle(tr("Hibernate confirmation"));
|
||||
break;
|
||||
|
@ -143,5 +135,5 @@ void ShutdownConfirmDlg::initText()
|
|||
void ShutdownConfirmDlg::updateText()
|
||||
{
|
||||
QString t = tr("You can cancel the action within %1 seconds.").arg(QString::number(m_timeout)) + "\n";
|
||||
ui->shutdownText->setText(m_msg + t);
|
||||
m_ui->shutdownText->setText(m_msg + t);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2011 Christophe Dumez
|
||||
* Copyright (C) 2011 Christophe Dumez <chris@qbittorrent.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -24,8 +24,6 @@
|
|||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : chris@qbittorrent.org
|
||||
*/
|
||||
|
||||
#ifndef SHUTDOWNCONFIRMDLG_H
|
||||
|
@ -33,6 +31,7 @@
|
|||
|
||||
#include <QDialog>
|
||||
#include <QTimer>
|
||||
|
||||
#include "base/types.h"
|
||||
|
||||
namespace Ui
|
||||
|
@ -63,7 +62,7 @@ private:
|
|||
void updateText();
|
||||
|
||||
// Vars
|
||||
Ui::confirmShutdownDlg *ui;
|
||||
Ui::confirmShutdownDlg *m_ui;
|
||||
QTimer m_timer;
|
||||
int m_timeout;
|
||||
ShutdownDialogAction m_action;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent.
|
||||
* Copyright (C) 2006-2012 Christophe Dumez
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2006-2012 Christophe Dumez <chris@qbittorrent.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -24,117 +24,122 @@
|
|||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : chris@qbittorrent.org
|
||||
*/
|
||||
|
||||
#include "base/utils/string.h"
|
||||
#include "torrentcontentfiltermodel.h"
|
||||
|
||||
#include "base/utils/string.h"
|
||||
#include "torrentcontentmodel.h"
|
||||
|
||||
TorrentContentFilterModel::TorrentContentFilterModel(QObject *parent):
|
||||
QSortFilterProxyModel(parent), m_model(new TorrentContentModel(this))
|
||||
TorrentContentFilterModel::TorrentContentFilterModel(QObject *parent)
|
||||
: QSortFilterProxyModel(parent)
|
||||
, m_model(new TorrentContentModel(this))
|
||||
{
|
||||
connect(m_model, SIGNAL(filteredFilesChanged()), this, SIGNAL(filteredFilesChanged()));
|
||||
setSourceModel(m_model);
|
||||
// Filter settings
|
||||
setFilterKeyColumn(TorrentContentModelItem::COL_NAME);
|
||||
setFilterRole(Qt::DisplayRole);
|
||||
setDynamicSortFilter(true);
|
||||
setSortCaseSensitivity(Qt::CaseInsensitive);
|
||||
connect(m_model, SIGNAL(filteredFilesChanged()), this, SIGNAL(filteredFilesChanged()));
|
||||
setSourceModel(m_model);
|
||||
// Filter settings
|
||||
setFilterKeyColumn(TorrentContentModelItem::COL_NAME);
|
||||
setFilterRole(Qt::DisplayRole);
|
||||
setDynamicSortFilter(true);
|
||||
setSortCaseSensitivity(Qt::CaseInsensitive);
|
||||
}
|
||||
|
||||
TorrentContentFilterModel::~TorrentContentFilterModel()
|
||||
{
|
||||
delete m_model;
|
||||
delete m_model;
|
||||
}
|
||||
|
||||
TorrentContentModel* TorrentContentFilterModel::model() const
|
||||
TorrentContentModel *TorrentContentFilterModel::model() const
|
||||
{
|
||||
return m_model;
|
||||
return m_model;
|
||||
}
|
||||
|
||||
TorrentContentModelItem::ItemType TorrentContentFilterModel::itemType(const QModelIndex& index) const
|
||||
TorrentContentModelItem::ItemType TorrentContentFilterModel::itemType(const QModelIndex &index) const
|
||||
{
|
||||
return m_model->itemType(mapToSource(index));
|
||||
return m_model->itemType(mapToSource(index));
|
||||
}
|
||||
|
||||
int TorrentContentFilterModel::getFileIndex(const QModelIndex& index) const
|
||||
int TorrentContentFilterModel::getFileIndex(const QModelIndex &index) const
|
||||
{
|
||||
return m_model->getFileIndex(mapToSource(index));
|
||||
return m_model->getFileIndex(mapToSource(index));
|
||||
}
|
||||
|
||||
QModelIndex TorrentContentFilterModel::parent(const QModelIndex& child) const
|
||||
QModelIndex TorrentContentFilterModel::parent(const QModelIndex &child) const
|
||||
{
|
||||
if (!child.isValid()) return QModelIndex();
|
||||
QModelIndex sourceParent = m_model->parent(mapToSource(child));
|
||||
if (!sourceParent.isValid()) return QModelIndex();
|
||||
return mapFromSource(sourceParent);
|
||||
if (!child.isValid()) return QModelIndex();
|
||||
|
||||
QModelIndex sourceParent = m_model->parent(mapToSource(child));
|
||||
if (!sourceParent.isValid()) return QModelIndex();
|
||||
|
||||
return mapFromSource(sourceParent);
|
||||
}
|
||||
|
||||
bool TorrentContentFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
|
||||
bool TorrentContentFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
|
||||
{
|
||||
if (m_model->itemType(m_model->index(source_row, 0, source_parent)) == TorrentContentModelItem::FolderType) {
|
||||
// accept folders if they have at least one filtered item
|
||||
return hasFiltered(m_model->index(source_row, 0, source_parent));
|
||||
}
|
||||
return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
|
||||
if (m_model->itemType(m_model->index(sourceRow, 0, sourceParent)) == TorrentContentModelItem::FolderType) {
|
||||
// accept folders if they have at least one filtered item
|
||||
return hasFiltered(m_model->index(sourceRow, 0, sourceParent));
|
||||
}
|
||||
|
||||
return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent);
|
||||
}
|
||||
|
||||
bool TorrentContentFilterModel::lessThan(const QModelIndex &left, const QModelIndex &right) const {
|
||||
switch (sortColumn()) {
|
||||
case TorrentContentModelItem::COL_NAME: {
|
||||
QString vL = left.data().toString();
|
||||
QString vR = right.data().toString();
|
||||
TorrentContentModelItem::ItemType leftType = m_model->itemType(m_model->index(left.row(), 0, left.parent()));
|
||||
TorrentContentModelItem::ItemType rightType = m_model->itemType(m_model->index(right.row(), 0, right.parent()));
|
||||
bool TorrentContentFilterModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
|
||||
{
|
||||
switch (sortColumn()) {
|
||||
case TorrentContentModelItem::COL_NAME: {
|
||||
QString vL = left.data().toString();
|
||||
QString vR = right.data().toString();
|
||||
TorrentContentModelItem::ItemType leftType = m_model->itemType(m_model->index(left.row(), 0, left.parent()));
|
||||
TorrentContentModelItem::ItemType rightType = m_model->itemType(m_model->index(right.row(), 0, right.parent()));
|
||||
|
||||
if (leftType == rightType)
|
||||
return Utils::String::naturalCompareCaseInsensitive(vL, vR);
|
||||
else if (leftType == TorrentContentModelItem::FolderType && sortOrder() == Qt::AscendingOrder)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
};
|
||||
if (leftType == rightType)
|
||||
return Utils::String::naturalCompareCaseInsensitive(vL, vR);
|
||||
else if ((leftType == TorrentContentModelItem::FolderType) && (sortOrder() == Qt::AscendingOrder))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
return QSortFilterProxyModel::lessThan(left, right);
|
||||
return QSortFilterProxyModel::lessThan(left, right);
|
||||
}
|
||||
|
||||
void TorrentContentFilterModel::selectAll()
|
||||
{
|
||||
for (int i=0; i<rowCount(); ++i) {
|
||||
setData(index(i, 0), Qt::Checked, Qt::CheckStateRole);
|
||||
}
|
||||
emit dataChanged(index(0,0), index(rowCount(), columnCount()));
|
||||
for (int i = 0; i < rowCount(); ++i)
|
||||
setData(index(i, 0), Qt::Checked, Qt::CheckStateRole);
|
||||
|
||||
emit dataChanged(index(0,0), index(rowCount(), columnCount()));
|
||||
}
|
||||
|
||||
void TorrentContentFilterModel::selectNone()
|
||||
{
|
||||
for (int i=0; i<rowCount(); ++i) {
|
||||
setData(index(i, 0), Qt::Unchecked, Qt::CheckStateRole);
|
||||
}
|
||||
emit dataChanged(index(0,0), index(rowCount(), columnCount()));
|
||||
for (int i = 0; i < rowCount(); ++i)
|
||||
setData(index(i, 0), Qt::Unchecked, Qt::CheckStateRole);
|
||||
|
||||
emit dataChanged(index(0,0), index(rowCount(), columnCount()));
|
||||
}
|
||||
|
||||
bool TorrentContentFilterModel::hasFiltered(const QModelIndex& folder) const {
|
||||
// this should be called only with folders
|
||||
// check if the folder name itself matches the filter string
|
||||
QString name = folder.data().toString();
|
||||
if (name.contains(filterRegExp()))
|
||||
return true;
|
||||
for (int child = 0; child < m_model->rowCount(folder); child++) {
|
||||
QModelIndex childIndex = m_model->index(child, 0, folder);
|
||||
if (m_model->hasChildren(childIndex)) {
|
||||
if (hasFiltered(childIndex))
|
||||
return true;
|
||||
else
|
||||
continue;
|
||||
}
|
||||
name = childIndex.data().toString();
|
||||
bool TorrentContentFilterModel::hasFiltered(const QModelIndex &folder) const
|
||||
{
|
||||
// this should be called only with folders
|
||||
// check if the folder name itself matches the filter string
|
||||
QString name = folder.data().toString();
|
||||
if (name.contains(filterRegExp()))
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
for (int child = 0; child < m_model->rowCount(folder); child++) {
|
||||
QModelIndex childIndex = m_model->index(child, 0, folder);
|
||||
if (m_model->hasChildren(childIndex)) {
|
||||
if (hasFiltered(childIndex))
|
||||
return true;
|
||||
else
|
||||
continue;
|
||||
}
|
||||
name = childIndex.data().toString();
|
||||
if (name.contains(filterRegExp()))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent.
|
||||
* Copyright (C) 2006-2012 Christophe Dumez
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2006-2012 Christophe Dumez <chris@qbittorrent.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -24,44 +24,44 @@
|
|||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : chris@qbittorrent.org
|
||||
*/
|
||||
|
||||
#ifndef TORRENTCONTENTFILTERMODEL_H
|
||||
#define TORRENTCONTENTFILTERMODEL_H
|
||||
|
||||
#include <QSortFilterProxyModel>
|
||||
|
||||
#include "torrentcontentmodelitem.h"
|
||||
|
||||
class TorrentContentModel;
|
||||
|
||||
class TorrentContentFilterModel: public QSortFilterProxyModel {
|
||||
Q_OBJECT
|
||||
class TorrentContentFilterModel: public QSortFilterProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
TorrentContentFilterModel(QObject *parent = 0);
|
||||
virtual ~TorrentContentFilterModel();
|
||||
TorrentContentFilterModel(QObject *parent = 0);
|
||||
virtual ~TorrentContentFilterModel();
|
||||
|
||||
TorrentContentModel* model() const;
|
||||
TorrentContentModelItem::ItemType itemType(const QModelIndex& index) const;
|
||||
int getFileIndex(const QModelIndex& index) const;
|
||||
virtual QModelIndex parent(const QModelIndex& child) const;
|
||||
|
||||
signals:
|
||||
void filteredFilesChanged();
|
||||
|
||||
protected:
|
||||
virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
|
||||
virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
|
||||
TorrentContentModel *model() const;
|
||||
TorrentContentModelItem::ItemType itemType(const QModelIndex &index) const;
|
||||
int getFileIndex(const QModelIndex &index) const;
|
||||
virtual QModelIndex parent(const QModelIndex &child) const;
|
||||
|
||||
public slots:
|
||||
void selectAll();
|
||||
void selectNone();
|
||||
void selectAll();
|
||||
void selectNone();
|
||||
|
||||
signals:
|
||||
void filteredFilesChanged();
|
||||
|
||||
protected:
|
||||
virtual bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
|
||||
virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
|
||||
|
||||
private:
|
||||
TorrentContentModel* m_model;
|
||||
bool hasFiltered(const QModelIndex& folder) const;
|
||||
TorrentContentModel *m_model;
|
||||
bool hasFiltered(const QModelIndex &folder) const;
|
||||
};
|
||||
|
||||
#endif // TORRENTCONTENTFILTERMODEL_H
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent.
|
||||
* Copyright (C) 2014 Ivan Sorokin
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2014 Ivan Sorokin <vanyacpp@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -24,21 +24,19 @@
|
|||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : vanyacpp@gmail.com
|
||||
*/
|
||||
|
||||
#include "torrentcontenttreeview.h"
|
||||
|
||||
#include <QHeaderView>
|
||||
#include <QKeyEvent>
|
||||
#include <QModelIndexList>
|
||||
#include <QTableView>
|
||||
#include <QHeaderView>
|
||||
|
||||
#include "torrentcontentmodelitem.h"
|
||||
|
||||
TorrentContentTreeView::TorrentContentTreeView(QWidget* parent)
|
||||
: QTreeView(parent)
|
||||
TorrentContentTreeView::TorrentContentTreeView(QWidget *parent)
|
||||
: QTreeView(parent)
|
||||
{
|
||||
// This hack fixes reordering of first column with Qt5.
|
||||
// https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777
|
||||
|
@ -48,40 +46,42 @@ TorrentContentTreeView::TorrentContentTreeView(QWidget* parent)
|
|||
unused.setVerticalHeader(new QHeaderView(Qt::Horizontal));
|
||||
}
|
||||
|
||||
void TorrentContentTreeView::keyPressEvent(QKeyEvent *event) {
|
||||
if (event->key() != Qt::Key_Space && event->key() != Qt::Key_Select) {
|
||||
QTreeView::keyPressEvent(event);
|
||||
return;
|
||||
}
|
||||
void TorrentContentTreeView::keyPressEvent(QKeyEvent *event)
|
||||
{
|
||||
if ((event->key() != Qt::Key_Space) && (event->key() != Qt::Key_Select)) {
|
||||
QTreeView::keyPressEvent(event);
|
||||
return;
|
||||
}
|
||||
|
||||
event->accept();
|
||||
event->accept();
|
||||
|
||||
QModelIndex current = currentNameCell();
|
||||
QModelIndex current = currentNameCell();
|
||||
|
||||
QVariant value = current.data(Qt::CheckStateRole);
|
||||
if (!value.isValid()) {
|
||||
Q_ASSERT(false);
|
||||
return;
|
||||
}
|
||||
QVariant value = current.data(Qt::CheckStateRole);
|
||||
if (!value.isValid()) {
|
||||
Q_ASSERT(false);
|
||||
return;
|
||||
}
|
||||
|
||||
Qt::CheckState state = (static_cast<Qt::CheckState>(value.toInt()) == Qt::Checked
|
||||
? Qt::Unchecked : Qt::Checked);
|
||||
Qt::CheckState state = (static_cast<Qt::CheckState>(value.toInt()) == Qt::Checked
|
||||
? Qt::Unchecked : Qt::Checked);
|
||||
|
||||
QModelIndexList selection = selectionModel()->selectedRows(TorrentContentModelItem::COL_NAME);
|
||||
QModelIndexList selection = selectionModel()->selectedRows(TorrentContentModelItem::COL_NAME);
|
||||
|
||||
for (QModelIndexList::const_iterator i = selection.begin(); i != selection.end(); ++i) {
|
||||
QModelIndex index = *i;
|
||||
Q_ASSERT(i->column() == TorrentContentModelItem::COL_NAME);
|
||||
model()->setData(index, state, Qt::CheckStateRole);
|
||||
}
|
||||
for (QModelIndexList::const_iterator i = selection.begin(); i != selection.end(); ++i) {
|
||||
QModelIndex index = *i;
|
||||
Q_ASSERT(i->column() == TorrentContentModelItem::COL_NAME);
|
||||
model()->setData(index, state, Qt::CheckStateRole);
|
||||
}
|
||||
}
|
||||
|
||||
QModelIndex TorrentContentTreeView::currentNameCell() {
|
||||
QModelIndex current = currentIndex();
|
||||
if (!current.isValid()) {
|
||||
Q_ASSERT(false);
|
||||
return QModelIndex();
|
||||
}
|
||||
QModelIndex TorrentContentTreeView::currentNameCell()
|
||||
{
|
||||
QModelIndex current = currentIndex();
|
||||
if (!current.isValid()) {
|
||||
Q_ASSERT(false);
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
return model()->index(current.row(), TorrentContentModelItem::COL_NAME, current.parent());
|
||||
return model()->index(current.row(), TorrentContentModelItem::COL_NAME, current.parent());
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent.
|
||||
* Copyright (C) 2014 Ivan Sorokin
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2014 Ivan Sorokin <vanyacpp@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -24,8 +24,6 @@
|
|||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*
|
||||
* Contact : vanyacpp@gmail.com
|
||||
*/
|
||||
|
||||
#ifndef TORRENTCONTENTTREEVIEW_H
|
||||
|
@ -33,15 +31,16 @@
|
|||
|
||||
#include <QTreeView>
|
||||
|
||||
class TorrentContentTreeView : public QTreeView {
|
||||
Q_OBJECT
|
||||
class TorrentContentTreeView: public QTreeView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit TorrentContentTreeView(QWidget *parent = 0);
|
||||
void keyPressEvent(QKeyEvent *event);
|
||||
explicit TorrentContentTreeView(QWidget *parent = 0);
|
||||
void keyPressEvent(QKeyEvent *event);
|
||||
|
||||
private:
|
||||
QModelIndex currentNameCell();
|
||||
QModelIndex currentNameCell();
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // TORRENTCONTENTTREEVIEW_H
|
||||
|
|
Loading…
Reference in a new issue