diff --git a/src/gui/addnewtorrentdialog.cpp b/src/gui/addnewtorrentdialog.cpp index 25ed53b82..b2c53b1ec 100644 --- a/src/gui/addnewtorrentdialog.cpp +++ b/src/gui/addnewtorrentdialog.cpp @@ -502,12 +502,12 @@ void AddNewTorrentDialog::displayContentTreeMenu(const QPoint &) { const QModelIndexList selectedRows = m_ui->contentTreeView->selectionModel()->selectedRows(0); - const auto applyPriorities = [this, selectedRows](const BitTorrent::DownloadPriority prio) + const auto applyPriorities = [this](const BitTorrent::DownloadPriority prio) { + const QModelIndexList selectedRows = m_ui->contentTreeView->selectionModel()->selectedRows(0); for (const QModelIndex &index : selectedRows) { - m_contentModel->setData( - m_contentModel->index(index.row(), PRIORITY, index.parent()) + m_contentModel->setData(index.sibling(index.row(), PRIORITY) , static_cast(prio)); } }; @@ -541,6 +541,40 @@ void AddNewTorrentDialog::displayContentTreeMenu(const QPoint &) { applyPriorities(BitTorrent::DownloadPriority::Maximum); }); + subMenu->addSeparator(); + subMenu->addAction(tr("By shown file order"), subMenu, [this]() + { + // Equally distribute the selected items into groups and for each group assign + // a download priority that will apply to each item. The number of groups depends on how + // many "download priority" are available to be assigned + + const QModelIndexList selectedRows = m_ui->contentTreeView->selectionModel()->selectedRows(0); + + const int priorityGroups = 3; + const int priorityGroupSize = std::max((selectedRows.length() / priorityGroups), 1); + + for (int i = 0; i < selectedRows.length(); ++i) + { + auto priority = BitTorrent::DownloadPriority::Ignored; + switch (i / priorityGroupSize) + { + case 0: + priority = BitTorrent::DownloadPriority::Maximum; + break; + case 1: + priority = BitTorrent::DownloadPriority::High; + break; + default: + case 2: + priority = BitTorrent::DownloadPriority::Normal; + break; + } + + const QModelIndex &index = selectedRows[i]; + m_contentModel->setData(index.sibling(index.row(), PRIORITY) + , static_cast(priority)); + } + }); menu->popup(QCursor::pos()); } diff --git a/src/gui/properties/propertieswidget.cpp b/src/gui/properties/propertieswidget.cpp index f296a42b9..b9ac57d8e 100644 --- a/src/gui/properties/propertieswidget.cpp +++ b/src/gui/properties/propertieswidget.cpp @@ -600,12 +600,13 @@ void PropertiesWidget::displayFilesListMenu(const QPoint &) if (!m_torrent->isSeed()) { - const auto applyPriorities = [this, selectedRows](const BitTorrent::DownloadPriority prio) + const auto applyPriorities = [this](const BitTorrent::DownloadPriority prio) { + const QModelIndexList selectedRows = m_ui->filesList->selectionModel()->selectedRows(0); for (const QModelIndex &index : selectedRows) { - m_propListModel->setData( - m_propListModel->index(index.row(), PRIORITY, index.parent()), static_cast(prio)); + m_propListModel->setData(index.sibling(index.row(), PRIORITY) + , static_cast(prio)); } // Save changes @@ -630,6 +631,40 @@ void PropertiesWidget::displayFilesListMenu(const QPoint &) { applyPriorities(BitTorrent::DownloadPriority::Maximum); }); + subMenu->addSeparator(); + subMenu->addAction(tr("By shown file order"), subMenu, [this]() + { + // Equally distribute the selected items into groups and for each group assign + // a download priority that will apply to each item. The number of groups depends on how + // many "download priority" are available to be assigned + + const QModelIndexList selectedRows = m_ui->filesList->selectionModel()->selectedRows(0); + + const int priorityGroups = 3; + const int priorityGroupSize = std::max((selectedRows.length() / priorityGroups), 1); + + for (int i = 0; i < selectedRows.length(); ++i) + { + auto priority = BitTorrent::DownloadPriority::Ignored; + switch (i / priorityGroupSize) + { + case 0: + priority = BitTorrent::DownloadPriority::Maximum; + break; + case 1: + priority = BitTorrent::DownloadPriority::High; + break; + default: + case 2: + priority = BitTorrent::DownloadPriority::Normal; + break; + } + + const QModelIndex &index = selectedRows[i]; + m_propListModel->setData(index.sibling(index.row(), PRIORITY) + , static_cast(priority)); + } + }); } // The selected torrent might have disappeared during exec()