diff --git a/src/gui/autoexpandabledialog.cpp b/src/gui/autoexpandabledialog.cpp index 1194e1ab7..590989326 100644 --- a/src/gui/autoexpandabledialog.cpp +++ b/src/gui/autoexpandabledialog.cpp @@ -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 * * 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 #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) { - - 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); + 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); - 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()); } diff --git a/src/gui/autoexpandabledialog.h b/src/gui/autoexpandabledialog.h index 39950e45c..f3e5d0666 100644 --- a/src/gui/autoexpandabledialog.h +++ b/src/gui/autoexpandabledialog.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 * * 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 -#include #include +#include -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 diff --git a/src/gui/previewselect.cpp b/src/gui/previewselect.cpp index 573f0af85..e9cf03be4 100644 --- a/src/gui/previewselect.cpp +++ b/src/gui/previewselect.cpp @@ -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 * * 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 +#include "previewselect.h" + +#include #include #include -#include +#include #include +#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 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 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")); - 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 (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 (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(); - } + 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 previewListModel; - delete listDelegate; +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(); +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")); - 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(); + close(); } -void PreviewSelect::on_cancelButton_clicked() { - close(); +void PreviewSelect::on_cancelButton_clicked() +{ + close(); } diff --git a/src/gui/previewselect.h b/src/gui/previewselect.h index 16f509bcb..0f1db209c 100644 --- a/src/gui/previewselect.h +++ b/src/gui/previewselect.h @@ -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 * * 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 #include -#include "ui_preview.h" -#include "base/bittorrent/torrenthandle.h" -class PreviewListDelegate; +#include "base/bittorrent/torrenthandle.h" +#include "ui_preview.h" -QT_BEGIN_NAMESPACE class QStandardItemModel; -QT_END_NAMESPACE -class PreviewSelect: public QDialog, private Ui::preview { - Q_OBJECT +class PreviewListDelegate; -public: - enum PreviewColumn { NAME, SIZE, PROGRESS, FILE_INDEX, NB_COLUMNS }; +class PreviewSelect: public QDialog, private Ui::preview +{ + Q_OBJECT public: - PreviewSelect(QWidget* parent, BitTorrent::TorrentHandle *const torrent); - ~PreviewSelect(); + enum PreviewColumn + { + NAME, + SIZE, + PROGRESS, + FILE_INDEX, + + 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 diff --git a/src/gui/properties/peerlistsortmodel.h b/src/gui/properties/peerlistsortmodel.h index 15ef5cdc0..a19d9f958 100644 --- a/src/gui/properties/peerlistsortmodel.h +++ b/src/gui/properties/peerlistsortmodel.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 * * 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 #include +#include + #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); - } - }; - - return QSortFilterProxyModel::lessThan(left, right); - } + 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); + } }; #endif // PEERLISTSORTMODEL_H diff --git a/src/gui/properties/trackerlist.cpp b/src/gui/properties/trackerlist.cpp index efd64a8eb..3110a103e 100644 --- a/src/gui/properties/trackerlist.cpp +++ b/src/gui/properties/trackerlist.cpp @@ -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 * * 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 TrackerList::getSelectedTrackerItems() const { - const QList selected_items = selectedItems(); - QList selected_trackers; - foreach (QTreeWidgetItem *item, selected_items) { - if (indexOfTopLevelItem(item) >= NB_STICKY_ITEM) { // Ignore STICKY ITEMS - selected_trackers << item; +QList TrackerList::getSelectedTrackerItems() const +{ + const QList selectedTrackerItems = selectedItems(); + QList 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; isetData(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 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; + } + QList selectedTrackerItems = getSelectedTrackerItems(); + if (selectedTrackerItems.isEmpty()) return; + + 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, selected_items) { - selection->select(indexFromItem(item), QItemSelectionModel::Rows|QItemSelectionModel::Select); - } - setSelectionModel(selection); - // Update torrent trackers - QList 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); - } - - torrent->replaceTrackers(trackers); - // Reannounce - if (!torrent->isPaused()) - torrent->forceReannounce(); + 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 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 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; + } + QList selectedTrackerItems = getSelectedTrackerItems(); + if (selectedTrackerItems.isEmpty()) return; + + 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 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); } - } - 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 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); - } - - torrent->replaceTrackers(trackers); - // Reannounce - if (!torrent->isPaused()) - torrent->forceReannounce(); + + 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"); - - // 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 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); - } +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 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); + + 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; - - loadStickyItems(torrent); - // Load actual trackers information - QHash 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)); +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 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; - - QList trackers; - foreach (const QString &tracker, TrackersAdditionDlg::askForTrackers(this, torrent)) - trackers << tracker; - torrent->addTrackers(trackers); +void TrackerList::askForTrackers() +{ + BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent(); + if (!torrent) return; + + QList trackers; + foreach (const QString &tracker, TrackersAdditionDlg::askForTrackers(this, torrent)) + trackers << tracker; + + torrent->addTrackers(trackers); } -void TrackerList::copyTrackerUrl() { - QList 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 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 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 remaining_trackers; - QList 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 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 remainingTrackers; + QList 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 selected_items = getSelectedTrackerItems(); - if (selected_items.isEmpty()) - return; + QList 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; - - if (!new_tracker_url.isValid()) { - QMessageBox::warning(this, tr("Tracker editing failed"), tr("The tracker URL entered is invalid.")); - return; + QUrl newTrackerURL = AutoExpandableDialog::getText(this, tr("Tracker editing"), tr("Tracker URL:"), + QLineEdit::Normal, trackerURL.toString(), &ok).trimmed(); + if (!ok) 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 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; - } - - 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; - } + 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 (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 selected_items = selectedItems(); - if (selected_items.isEmpty()) return; +void TrackerList::reannounceSelected() +{ + QList selItems = selectedItems(); + if (selItems.isEmpty()) return; BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent(); if (!torrent) return; + QList 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 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 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() diff --git a/src/gui/properties/trackerlist.h b/src/gui/properties/trackerlist.h index b8ba05eec..5271918d8 100644 --- a/src/gui/properties/trackerlist.h +++ b/src/gui/properties/trackerlist.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 * * 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 diff --git a/src/gui/shutdownconfirmdlg.cpp b/src/gui/shutdownconfirmdlg.cpp index 116c64776..63446e752 100644 --- a/src/gui/shutdownconfirmdlg.cpp +++ b/src/gui/shutdownconfirmdlg.cpp @@ -1,7 +1,7 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christophe Dumez - * Copyright (C) 2014 sledgehammer999 + * Copyright (C) 2014 sledgehammer999 + * Copyright (C) 2011 Christophe Dumez * * 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 -#include #include +#include #include +#include #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); } diff --git a/src/gui/shutdownconfirmdlg.h b/src/gui/shutdownconfirmdlg.h index dafa1da86..1c9b70fe1 100644 --- a/src/gui/shutdownconfirmdlg.h +++ b/src/gui/shutdownconfirmdlg.h @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christophe Dumez + * Copyright (C) 2011 Christophe Dumez * * 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 #include + #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; diff --git a/src/gui/torrentcontentfiltermodel.cpp b/src/gui/torrentcontentfiltermodel.cpp index 2583760e7..c765f2bd6 100644 --- a/src/gui/torrentcontentfiltermodel.cpp +++ b/src/gui/torrentcontentfiltermodel.cpp @@ -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 * * 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())); - - 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); +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; + } + }; + + return QSortFilterProxyModel::lessThan(left, right); } void TorrentContentFilterModel::selectAll() { - for (int i=0; irowCount(folder); child++) { - QModelIndex childIndex = m_model->index(child, 0, folder); - if (m_model->hasChildren(childIndex)) { - if (hasFiltered(childIndex)) +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; - else - continue; + 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; } - name = childIndex.data().toString(); - if (name.contains(filterRegExp())) - return true; - } - return false; + return false; } diff --git a/src/gui/torrentcontentfiltermodel.h b/src/gui/torrentcontentfiltermodel.h index cea551f00..ab9bd10d0 100644 --- a/src/gui/torrentcontentfiltermodel.h +++ b/src/gui/torrentcontentfiltermodel.h @@ -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 * * 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 + #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; - 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(); signals: - void filteredFilesChanged(); + void filteredFilesChanged(); protected: - virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; - virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const; - -public slots: - void selectAll(); - void selectNone(); + 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 diff --git a/src/gui/torrentcontenttreeview.cpp b/src/gui/torrentcontenttreeview.cpp index 3d18a8136..574ab7bf7 100644 --- a/src/gui/torrentcontenttreeview.cpp +++ b/src/gui/torrentcontenttreeview.cpp @@ -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 * * 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 #include #include #include -#include #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(value.toInt()) == Qt::Checked - ? Qt::Unchecked : Qt::Checked); + Qt::CheckState state = (static_cast(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()); } diff --git a/src/gui/torrentcontenttreeview.h b/src/gui/torrentcontenttreeview.h index db233b2f4..0da6614fc 100644 --- a/src/gui/torrentcontenttreeview.h +++ b/src/gui/torrentcontenttreeview.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 * * 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 -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