From 208234b934d305bdb82f6eb8e40ad7e03ebbdf56 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Tue, 18 Jan 2022 15:15:54 +0800 Subject: [PATCH] Clean up code related to show/hide columns --- src/gui/addnewtorrentdialog.h | 1 + src/gui/previewselectdialog.cpp | 2 +- src/gui/properties/peerlistwidget.cpp | 54 +++++++++++----------- src/gui/properties/peerlistwidget.h | 3 +- src/gui/properties/propertieswidget.cpp | 21 +++++---- src/gui/properties/propertieswidget.h | 2 +- src/gui/properties/trackerlistwidget.cpp | 42 ++++++++--------- src/gui/properties/trackerlistwidget.h | 8 ++-- src/gui/search/searchjobwidget.cpp | 56 +++++++++++------------ src/gui/search/searchjobwidget.h | 5 +- src/gui/transferlistwidget.cpp | 58 ++++++++++++------------ src/gui/transferlistwidget.h | 3 +- 12 files changed, 128 insertions(+), 127 deletions(-) diff --git a/src/gui/addnewtorrentdialog.h b/src/gui/addnewtorrentdialog.h index 3fc6cf4ae..570d6db69 100644 --- a/src/gui/addnewtorrentdialog.h +++ b/src/gui/addnewtorrentdialog.h @@ -79,6 +79,7 @@ public: private slots: void displayContentTreeMenu(const QPoint &); + void displayColumnHeaderMenu(); void updateDiskSpaceLabel(); void onSavePathChanged(const QString &newPath); void onDownloadPathChanged(const QString &newPath); diff --git a/src/gui/previewselectdialog.cpp b/src/gui/previewselectdialog.cpp index 2d5424005..20e9a8b53 100644 --- a/src/gui/previewselectdialog.cpp +++ b/src/gui/previewselectdialog.cpp @@ -82,11 +82,11 @@ PreviewSelectDialog::PreviewSelectDialog(QWidget *parent, const BitTorrent::Torr m_ui->previewList->header()->setParent(m_ui->previewList); unused.setVerticalHeader(new QHeaderView(Qt::Horizontal)); + m_ui->previewList->setAlternatingRowColors(pref->useAlternatingRowColors()); m_ui->previewList->setModel(m_previewListModel); m_ui->previewList->hideColumn(FILE_INDEX); m_listDelegate = new PreviewListDelegate(this); m_ui->previewList->setItemDelegate(m_listDelegate); - m_ui->previewList->setAlternatingRowColors(pref->useAlternatingRowColors()); // Fill list in const QVector fp = torrent->filesProgress(); for (int i = 0; i < torrent->filesCount(); ++i) diff --git a/src/gui/properties/peerlistwidget.cpp b/src/gui/properties/peerlistwidget.cpp index d8572bee4..54ca0276a 100644 --- a/src/gui/properties/peerlistwidget.cpp +++ b/src/gui/properties/peerlistwidget.cpp @@ -155,7 +155,7 @@ PeerListWidget::PeerListWidget(PropertiesWidget *parent) updatePeerHostNameResolutionState(); // SIGNAL/SLOT header()->setContextMenuPolicy(Qt::CustomContextMenu); - connect(header(), &QWidget::customContextMenuRequested, this, &PeerListWidget::displayToggleColumnsMenu); + connect(header(), &QWidget::customContextMenuRequested, this, &PeerListWidget::displayColumnHeaderMenu); connect(header(), &QHeaderView::sectionClicked, this, &PeerListWidget::handleSortColumnChanged); connect(header(), &QHeaderView::sectionMoved, this, &PeerListWidget::saveSettings); connect(header(), &QHeaderView::sectionResized, this, &PeerListWidget::saveSettings); @@ -177,7 +177,7 @@ PeerListWidget::~PeerListWidget() saveSettings(); } -void PeerListWidget::displayToggleColumnsMenu(const QPoint &) +void PeerListWidget::displayColumnHeaderMenu() { QMenu *menu = new QMenu(this); menu->setAttribute(Qt::WA_DeleteOnClose); @@ -188,36 +188,22 @@ void PeerListWidget::displayToggleColumnsMenu(const QPoint &) if ((i == PeerListColumns::COUNTRY) && !Preferences::instance()->resolvePeerCountries()) continue; - QAction *myAct = menu->addAction(m_listModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString()); - myAct->setCheckable(true); - myAct->setChecked(!isColumnHidden(i)); - myAct->setData(i); - } - - connect(menu, &QMenu::triggered, this, [this](const QAction *action) - { - int visibleCols = 0; - for (int i = 0; i < PeerListColumns::IP_HIDDEN; ++i) + const auto columnName = m_listModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(); + QAction *action = menu->addAction(columnName, this, [this, i](const bool checked) { - if (!isColumnHidden(i)) - ++visibleCols; - - if (visibleCols > 1) - break; - } + if (!checked && (visibleColumnsCount() <= 1)) + return; - const int col = action->data().toInt(); + setColumnHidden(i, !checked); - if (!isColumnHidden(col) && (visibleCols == 1)) - return; + if (checked && (columnWidth(i) <= 5)) + resizeColumnToContents(i); - setColumnHidden(col, !isColumnHidden(col)); - - if (!isColumnHidden(col) && (columnWidth(col) <= 5)) - resizeColumnToContents(col); - - saveSettings(); - }); + saveSettings(); + }); + action->setCheckable(true); + action->setChecked(!isColumnHidden(i)); + } menu->popup(QCursor::pos()); } @@ -492,6 +478,18 @@ void PeerListWidget::updatePeer(const BitTorrent::Torrent *torrent, const BitTor } } +int PeerListWidget::visibleColumnsCount() const +{ + int count = 0; + for (int i = 0, iMax = header()->count(); i < iMax; ++i) + { + if (!isColumnHidden(i)) + ++count; + } + + return count; +} + void PeerListWidget::handleResolved(const QHostAddress &ip, const QString &hostname) const { if (hostname.isEmpty()) diff --git a/src/gui/properties/peerlistwidget.h b/src/gui/properties/peerlistwidget.h index 28ae98b51..657daa86c 100644 --- a/src/gui/properties/peerlistwidget.h +++ b/src/gui/properties/peerlistwidget.h @@ -88,7 +88,7 @@ public: private slots: void loadSettings(); void saveSettings() const; - void displayToggleColumnsMenu(const QPoint &); + void displayColumnHeaderMenu(); void showPeerListMenu(const QPoint &); void banSelectedPeers(); void copySelectedPeers(); @@ -97,6 +97,7 @@ private slots: private: void updatePeer(const BitTorrent::Torrent *torrent, const BitTorrent::PeerInfo &peer, bool &isNewPeer); + int visibleColumnsCount() const; void wheelEvent(QWheelEvent *event) override; diff --git a/src/gui/properties/propertieswidget.cpp b/src/gui/properties/propertieswidget.cpp index 0ca722131..12657d9cc 100644 --- a/src/gui/properties/propertieswidget.cpp +++ b/src/gui/properties/propertieswidget.cpp @@ -111,7 +111,7 @@ PropertiesWidget::PropertiesWidget(QWidget *parent) , m_ui->filesList, qOverload(&QAbstractItemView::edit)); connect(m_ui->filesList, &QWidget::customContextMenuRequested, this, &PropertiesWidget::displayFilesListMenu); connect(m_ui->filesList, &QAbstractItemView::doubleClicked, this, &PropertiesWidget::openItem); - connect(m_ui->filesList->header(), &QWidget::customContextMenuRequested, this, &PropertiesWidget::displayFileListHeaderMenu); + connect(m_ui->filesList->header(), &QWidget::customContextMenuRequested, this, &PropertiesWidget::displayColumnHeaderMenu); connect(m_ui->filesList->header(), &QHeaderView::sectionMoved, this, &PropertiesWidget::saveSettings); connect(m_ui->filesList->header(), &QHeaderView::sectionResized, this, &PropertiesWidget::saveSettings); connect(m_ui->filesList->header(), &QHeaderView::sortIndicatorChanged, this, &PropertiesWidget::saveSettings); @@ -177,28 +177,29 @@ PropertiesWidget::~PropertiesWidget() delete m_ui; } -void PropertiesWidget::displayFileListHeaderMenu() +void PropertiesWidget::displayColumnHeaderMenu() { QMenu *menu = new QMenu(this); menu->setAttribute(Qt::WA_DeleteOnClose); + menu->setTitle(tr("Column visibility")); for (int i = 0; i < TorrentContentModelItem::TreeItemColumns::NB_COL; ++i) { - QAction *myAct = menu->addAction(m_propListModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString()); - myAct->setCheckable(true); - myAct->setChecked(!m_ui->filesList->isColumnHidden(i)); - if (i == TorrentContentModelItem::TreeItemColumns::COL_NAME) - myAct->setEnabled(false); - - connect(myAct, &QAction::toggled, this, [this, i](const bool checked) + const auto columnName = m_propListModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(); + QAction *action = menu->addAction(columnName, this, [this, i](const bool checked) { m_ui->filesList->setColumnHidden(i, !checked); - if (!m_ui->filesList->isColumnHidden(i) && (m_ui->filesList->columnWidth(i) <= 5)) + if (checked && (m_ui->filesList->columnWidth(i) <= 5)) m_ui->filesList->resizeColumnToContents(i); saveSettings(); }); + action->setCheckable(true); + action->setChecked(!m_ui->filesList->isColumnHidden(i)); + + if (i == TorrentContentModelItem::TreeItemColumns::COL_NAME) + action->setEnabled(false); } menu->popup(QCursor::pos()); diff --git a/src/gui/properties/propertieswidget.h b/src/gui/properties/propertieswidget.h index b66443a56..ec9ce61ce 100644 --- a/src/gui/properties/propertieswidget.h +++ b/src/gui/properties/propertieswidget.h @@ -81,7 +81,6 @@ public slots: void readSettings(); void saveSettings(); void reloadPreferences(); - void displayFileListHeaderMenu(); void openItem(const QModelIndex &index) const; void loadTrackers(BitTorrent::Torrent *const torrent); @@ -101,6 +100,7 @@ protected slots: private slots: void configure(); + void displayColumnHeaderMenu(); void filterText(const QString &filter); void updateSavePath(BitTorrent::Torrent *const torrent); diff --git a/src/gui/properties/trackerlistwidget.cpp b/src/gui/properties/trackerlistwidget.cpp index 55c55591d..4d1eb778c 100644 --- a/src/gui/properties/trackerlistwidget.cpp +++ b/src/gui/properties/trackerlistwidget.cpp @@ -86,7 +86,7 @@ TrackerListWidget::TrackerListWidget(PropertiesWidget *properties) connect(this, &QWidget::customContextMenuRequested, this, &TrackerListWidget::showTrackerListMenu); // Header header()->setContextMenuPolicy(Qt::CustomContextMenu); - connect(header(), &QWidget::customContextMenuRequested, this, &TrackerListWidget::displayToggleColumnsMenu); + connect(header(), &QWidget::customContextMenuRequested, this, &TrackerListWidget::displayColumnHeaderMenu); connect(header(), &QHeaderView::sectionMoved, this, &TrackerListWidget::saveSettings); connect(header(), &QHeaderView::sectionResized, this, &TrackerListWidget::saveSettings); connect(header(), &QHeaderView::sortIndicatorChanged, this, &TrackerListWidget::saveSettings); @@ -641,17 +641,17 @@ QStringList TrackerListWidget::headerLabels() int TrackerListWidget::visibleColumnsCount() const { - int visibleCols = 0; - for (int i = 0; i < COL_COUNT; ++i) + int count = 0; + for (int i = 0, iMax = header()->count(); i < iMax; ++i) { if (!isColumnHidden(i)) - ++visibleCols; + ++count; } - return visibleCols; + return count; } -void TrackerListWidget::displayToggleColumnsMenu(const QPoint &) +void TrackerListWidget::displayColumnHeaderMenu() { QMenu *menu = new QMenu(this); menu->setAttribute(Qt::WA_DeleteOnClose); @@ -659,27 +659,21 @@ void TrackerListWidget::displayToggleColumnsMenu(const QPoint &) for (int i = 0; i < COL_COUNT; ++i) { - QAction *myAct = menu->addAction(headerLabels().at(i)); - myAct->setCheckable(true); - myAct->setChecked(!isColumnHidden(i)); - myAct->setData(i); - } - - connect(menu, &QMenu::triggered, this, [this](const QAction *action) - { - const int col = action->data().toInt(); - Q_ASSERT(visibleColumnsCount() > 0); - - if (!isColumnHidden(col) && (visibleColumnsCount() == 1)) - return; + QAction *action = menu->addAction(headerLabels().at(i), this, [this, i](const bool checked) + { + if (!checked && (visibleColumnsCount() <= 1)) + return; - setColumnHidden(col, !isColumnHidden(col)); + setColumnHidden(i, !checked); - if (!isColumnHidden(col) && (columnWidth(col) <= 5)) - resizeColumnToContents(col); + if (checked && (columnWidth(i) <= 5)) + resizeColumnToContents(i); - saveSettings(); - }); + saveSettings(); + }); + action->setCheckable(true); + action->setChecked(!isColumnHidden(i)); + } menu->popup(QCursor::pos()); } diff --git a/src/gui/properties/trackerlistwidget.h b/src/gui/properties/trackerlistwidget.h index d93926449..2165e63f4 100644 --- a/src/gui/properties/trackerlistwidget.h +++ b/src/gui/properties/trackerlistwidget.h @@ -61,8 +61,6 @@ public: explicit TrackerListWidget(PropertiesWidget *properties); ~TrackerListWidget(); - int visibleColumnsCount() const; - public slots: void setRowColor(int row, const QColor &color); @@ -78,14 +76,18 @@ public slots: void deleteSelectedTrackers(); void editSelectedTracker(); void showTrackerListMenu(const QPoint &); - void displayToggleColumnsMenu(const QPoint &); void loadSettings(); void saveSettings() const; protected: QVector getSelectedTrackerItems() const; +private slots: + void displayColumnHeaderMenu(); + private: + int visibleColumnsCount() const; + static QStringList headerLabels(); PropertiesWidget *m_properties; diff --git a/src/gui/search/searchjobwidget.cpp b/src/gui/search/searchjobwidget.cpp index 06f0a18e0..c5755ba40 100644 --- a/src/gui/search/searchjobwidget.cpp +++ b/src/gui/search/searchjobwidget.cpp @@ -116,11 +116,13 @@ SearchJobWidget::SearchJobWidget(SearchHandler *searchHandler, QWidget *parent) // its size is 0, because explicitly 'showing' the column isn't enough // in the above scenario. for (int i = 0; i < SearchSortModel::DL_LINK; ++i) + { if ((m_ui->resultsBrowser->columnWidth(i) <= 0) && !m_ui->resultsBrowser->isColumnHidden(i)) m_ui->resultsBrowser->resizeColumnToContents(i); + } header()->setContextMenuPolicy(Qt::CustomContextMenu); - connect(header(), &QWidget::customContextMenuRequested, this, &SearchJobWidget::displayToggleColumnsMenu); + connect(header(), &QWidget::customContextMenuRequested, this, &SearchJobWidget::displayColumnHeaderMenu); connect(header(), &QHeaderView::sectionResized, this, &SearchJobWidget::saveSettings); connect(header(), &QHeaderView::sectionMoved, this, &SearchJobWidget::saveSettings); connect(header(), &QHeaderView::sortIndicatorChanged, this, &SearchJobWidget::saveSettings); @@ -450,7 +452,19 @@ void SearchJobWidget::saveSettings() const Preferences::instance()->setSearchTabHeaderState(header()->saveState()); } -void SearchJobWidget::displayToggleColumnsMenu(const QPoint &) +int SearchJobWidget::visibleColumnsCount() const +{ + int count = 0; + for (int i = 0, iMax = m_ui->resultsBrowser->header()->count(); i < iMax; ++i) + { + if (!m_ui->resultsBrowser->isColumnHidden(i)) + ++count; + } + + return count; +} + +void SearchJobWidget::displayColumnHeaderMenu() { auto menu = new QMenu(this); menu->setAttribute(Qt::WA_DeleteOnClose); @@ -458,36 +472,22 @@ void SearchJobWidget::displayToggleColumnsMenu(const QPoint &) for (int i = 0; i < SearchSortModel::DL_LINK; ++i) { - QAction *myAct = menu->addAction(m_searchListModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString()); - myAct->setCheckable(true); - myAct->setChecked(!m_ui->resultsBrowser->isColumnHidden(i)); - myAct->setData(i); - } - - connect(menu, &QMenu::triggered, this, [this](const QAction *action) - { - int visibleCols = 0; - for (int i = 0; i < SearchSortModel::DL_LINK; ++i) + const auto columnName = m_searchListModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(); + QAction *action = menu->addAction(columnName, this, [this, i](const bool checked) { - if (!m_ui->resultsBrowser->isColumnHidden(i)) - ++visibleCols; - - if (visibleCols > 1) - break; - } - - const int col = action->data().toInt(); + if (!checked && (visibleColumnsCount() <= 1)) + return; - if ((!m_ui->resultsBrowser->isColumnHidden(col)) && (visibleCols == 1)) - return; + m_ui->resultsBrowser->setColumnHidden(i, !checked); - m_ui->resultsBrowser->setColumnHidden(col, !m_ui->resultsBrowser->isColumnHidden(col)); + if (checked && (m_ui->resultsBrowser->columnWidth(i) <= 5)) + m_ui->resultsBrowser->resizeColumnToContents(i); - if ((!m_ui->resultsBrowser->isColumnHidden(col)) && (m_ui->resultsBrowser->columnWidth(col) <= 5)) - m_ui->resultsBrowser->resizeColumnToContents(col); - - saveSettings(); - }); + saveSettings(); + }); + action->setCheckable(true); + action->setChecked(!m_ui->resultsBrowser->isColumnHidden(i)); + } menu->popup(QCursor::pos()); } diff --git a/src/gui/search/searchjobwidget.h b/src/gui/search/searchjobwidget.h index ee6ce0b6c..0f3115ca9 100644 --- a/src/gui/search/searchjobwidget.h +++ b/src/gui/search/searchjobwidget.h @@ -88,6 +88,9 @@ signals: protected: void keyPressEvent(QKeyEvent *event) override; +private slots: + void displayColumnHeaderMenu(); + private: enum class AddTorrentOption { @@ -102,7 +105,6 @@ private: void filterSearchResults(const QString &name); void showFilterContextMenu(const QPoint &); void contextMenuEvent(QContextMenuEvent *event) override; - void displayToggleColumnsMenu(const QPoint &); void onItemDoubleClicked(const QModelIndex &index); void searchFinished(bool cancelled); void searchFailed(); @@ -115,6 +117,7 @@ private: NameFilteringMode filteringMode() const; QHeaderView *header() const; void setRowColor(int row, const QColor &color); + int visibleColumnsCount() const; void downloadTorrents(AddTorrentOption option = AddTorrentOption::Default); void openTorrentPages() const; diff --git a/src/gui/transferlistwidget.cpp b/src/gui/transferlistwidget.cpp index 00aac45e3..bf43e6987 100644 --- a/src/gui/transferlistwidget.cpp +++ b/src/gui/transferlistwidget.cpp @@ -195,8 +195,10 @@ TransferListWidget::TransferListWidget(QWidget *parent, MainWindow *mainWindow) //end up being size 0 when the new version is launched with //a conf file from the previous version. for (int i = 0; i < TransferListModel::NB_COLUMNS; ++i) + { if ((columnWidth(i) <= 0) && (!isColumnHidden(i))) resizeColumnToContents(i); + } setContextMenuPolicy(Qt::CustomContextMenu); @@ -204,7 +206,7 @@ TransferListWidget::TransferListWidget(QWidget *parent, MainWindow *mainWindow) connect(this, &QAbstractItemView::doubleClicked, this, &TransferListWidget::torrentDoubleClicked); connect(this, &QWidget::customContextMenuRequested, this, &TransferListWidget::displayListMenu); header()->setContextMenuPolicy(Qt::CustomContextMenu); - connect(header(), &QWidget::customContextMenuRequested, this, &TransferListWidget::displayDLHoSMenu); + connect(header(), &QWidget::customContextMenuRequested, this, &TransferListWidget::displayColumnHeaderMenu); connect(header(), &QHeaderView::sectionMoved, this, &TransferListWidget::saveSettings); connect(header(), &QHeaderView::sectionResized, this, &TransferListWidget::saveSettings); connect(header(), &QHeaderView::sortIndicatorChanged, this, &TransferListWidget::saveSettings); @@ -623,48 +625,46 @@ void TransferListWidget::reannounceSelectedTorrents() torrent->forceReannounce(); } +int TransferListWidget::visibleColumnsCount() const +{ + int count = 0; + for (int i = 0, iMax = header()->count(); i < iMax; ++i) + { + if (!isColumnHidden(i)) + ++count; + } + + return count; +} + // hide/show columns menu -void TransferListWidget::displayDLHoSMenu(const QPoint&) +void TransferListWidget::displayColumnHeaderMenu() { auto menu = new QMenu(this); menu->setAttribute(Qt::WA_DeleteOnClose); menu->setTitle(tr("Column visibility")); - for (int i = 0; i < m_listModel->columnCount(); ++i) + for (int i = 0; i < TransferListModel::NB_COLUMNS; ++i) { if (!BitTorrent::Session::instance()->isQueueingSystemEnabled() && (i == TransferListModel::TR_QUEUE_POSITION)) continue; - QAction *myAct = menu->addAction(m_listModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString()); - myAct->setCheckable(true); - myAct->setChecked(!isColumnHidden(i)); - myAct->setData(i); - } - - connect(menu, &QMenu::triggered, this, [this](const QAction *action) - { - int visibleCols = 0; - for (int i = 0; i < TransferListModel::NB_COLUMNS; ++i) + const auto columnName = m_listModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(); + QAction *action = menu->addAction(columnName, this, [this, i](const bool checked) { - if (!isColumnHidden(i)) - ++visibleCols; - - if (visibleCols > 1) - break; - } - - const int col = action->data().toInt(); + if (!checked && (visibleColumnsCount() <= 1)) + return; - if (!isColumnHidden(col) && visibleCols == 1) - return; - - setColumnHidden(col, !isColumnHidden(col)); + setColumnHidden(i, !checked); - if (!isColumnHidden(col) && columnWidth(col) <= 5) - resizeColumnToContents(col); + if (checked && (columnWidth(i) <= 5)) + resizeColumnToContents(i); - saveSettings(); - }); + saveSettings(); + }); + action->setCheckable(true); + action->setChecked(!isColumnHidden(i)); + } menu->popup(QCursor::pos()); } diff --git a/src/gui/transferlistwidget.h b/src/gui/transferlistwidget.h index 7b83fbabf..47bda71d8 100644 --- a/src/gui/transferlistwidget.h +++ b/src/gui/transferlistwidget.h @@ -91,7 +91,6 @@ public slots: void setTorrentOptions(); void previewSelectedTorrents(); void hideQueuePosColumn(bool hide); - void displayDLHoSMenu(const QPoint &); void applyNameFilter(const QString &name); void applyStatusFilter(int f); void applyCategoryFilter(const QString &category); @@ -107,6 +106,7 @@ signals: private slots: void torrentDoubleClicked(); void displayListMenu(const QPoint &); + void displayColumnHeaderMenu(); void currentChanged(const QModelIndex ¤t, const QModelIndex&) override; void setSelectedTorrentsSuperSeeding(bool enabled) const; void setSelectedTorrentsSequentialDownload(bool enabled) const; @@ -127,6 +127,7 @@ private: QStringList askTagsForSelection(const QString &dialogTitle); void applyToSelectedTorrents(const std::function &fn); QVector getVisibleTorrents() const; + int visibleColumnsCount() const; TransferListModel *m_listModel; TransferListSortModel *m_sortFilterModel;