mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-07-16 02:03:07 -07:00
- A lot of improvement and bug fixes in new torrent content selection
This commit is contained in:
parent
3cb34ed7ee
commit
419b94f042
4 changed files with 149 additions and 93 deletions
|
@ -32,7 +32,7 @@
|
|||
#include <QStandardItemModel>
|
||||
|
||||
// Constructor
|
||||
properties::properties(QWidget *parent, bittorrent *BTSession, QTorrentHandle &h): QDialog(parent), h(h), BTSession(BTSession), changedFilteredfiles(false), hash(h.hash()), editParentsOnly(false) {
|
||||
properties::properties(QWidget *parent, bittorrent *BTSession, QTorrentHandle &h): QDialog(parent), h(h), BTSession(BTSession), changedFilteredfiles(false), hash(h.hash()) {
|
||||
setupUi(this);
|
||||
lbl_priorities->setText(tr("Priorities:")+"<ul><li>"+tr("Ignored: file is not downloaded at all")+"</li><li>"+tr("Normal: normal priority. Download order is dependent on availability")+"</li><li>"+tr("High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability")+"</li><li>"+tr("Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority")+"</li></ul>");
|
||||
// set icons
|
||||
|
@ -104,7 +104,7 @@ properties::properties(QWidget *parent, bittorrent *BTSession, QTorrentHandle &h
|
|||
addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem());
|
||||
delete arb;
|
||||
delete prioritiesTab;
|
||||
connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updateChildrenPriority(QStandardItem*)));
|
||||
connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*)));
|
||||
filesList->expandAll();
|
||||
// List web seeds
|
||||
loadWebSeedsFromFile();
|
||||
|
@ -155,62 +155,82 @@ void properties::addFilesToTree(file *root, QStandardItem *parent) {
|
|||
}
|
||||
}
|
||||
|
||||
void properties::updateChildrenPriority(QStandardItem *item) {
|
||||
qDebug("Priority changed");
|
||||
// priority is the new priority of given item
|
||||
void properties::updateParentsPriority(QStandardItem *item, int priority) {
|
||||
QStandardItem *parent = item->parent();
|
||||
int row = item->row();
|
||||
if(!parent) {
|
||||
parent = PropListModel->invisibleRootItem();
|
||||
}
|
||||
bool is_dir = (parent->child(row, INDEX)->text().toInt() == -1);
|
||||
int priority = parent->child(row, PRIORITY)->text().toInt();
|
||||
// Update parent priority
|
||||
if(item->parent()) {
|
||||
bool parentUpdate = true;
|
||||
unsigned int rowCount = parent->rowCount();
|
||||
for(unsigned int i=0; i<rowCount; ++i) {
|
||||
if(parent->child(i, PRIORITY)->text().toInt() != priority) {
|
||||
// Check if parent priority is NORMAL
|
||||
QStandardItem *grandFather = parent->parent();
|
||||
if(!grandFather) {
|
||||
grandFather = PropListModel->invisibleRootItem();
|
||||
}
|
||||
QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY);
|
||||
editParentsOnly = true;
|
||||
parentPrio->setText(misc::toQString(NORMAL));
|
||||
editParentsOnly = false;
|
||||
parentUpdate = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(parentUpdate) {
|
||||
if(!parent) return;
|
||||
// Check if children have different priorities
|
||||
// then folder must have NORMAL priority
|
||||
unsigned int rowCount = parent->rowCount();
|
||||
for(unsigned int i=0; i<rowCount; ++i) {
|
||||
if(parent->child(i, PRIORITY)->text().toInt() != priority) {
|
||||
QStandardItem *grandFather = parent->parent();
|
||||
if(!grandFather) {
|
||||
grandFather = PropListModel->invisibleRootItem();
|
||||
}
|
||||
QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY);
|
||||
editParentsOnly = true;
|
||||
parentPrio->setText(misc::toQString(priority));
|
||||
editParentsOnly = false;
|
||||
if(parentPrio->text().toInt() != NORMAL) {
|
||||
parentPrio->setText(misc::toQString(NORMAL));
|
||||
// Recursively update ancesters of this parent too
|
||||
updateParentsPriority(grandFather->child(parent->row()), priority);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(editParentsOnly) return;
|
||||
if(!is_dir) return;
|
||||
// Updating children
|
||||
qDebug("Priority changed for a folder to %d", priority);
|
||||
parent = parent->child(row);
|
||||
// All the children have the same priority
|
||||
// Parent folder should have the same priority too
|
||||
QStandardItem *grandFather = parent->parent();
|
||||
if(!grandFather) {
|
||||
grandFather = PropListModel->invisibleRootItem();
|
||||
}
|
||||
QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY);
|
||||
if(parentPrio->text().toInt() != priority) {
|
||||
parentPrio->setText(misc::toQString(priority));
|
||||
// Recursively update ancesters of this parent too
|
||||
updateParentsPriority(grandFather->child(parent->row()), priority);
|
||||
}
|
||||
}
|
||||
|
||||
void properties::updateChildrenPriority(QStandardItem *item, int priority) {
|
||||
QStandardItem *parent = item->parent();
|
||||
if(!parent) {
|
||||
parent = PropListModel->invisibleRootItem();
|
||||
}
|
||||
parent = parent->child(item->row());
|
||||
unsigned int rowCount = parent->rowCount();
|
||||
qDebug("The folder has %d children", rowCount);
|
||||
for(unsigned int i=0; i<rowCount; ++i) {
|
||||
// get child priority
|
||||
QStandardItem *child = parent->child(i, PRIORITY);
|
||||
int child_prio = child->text().toInt();
|
||||
qDebug("Child priority is %d", child_prio);
|
||||
if(child_prio != priority) {
|
||||
child->setText(misc::toQString(priority));
|
||||
QStandardItem * childPrio = parent->child(i, PRIORITY);
|
||||
if(childPrio->text().toInt() != priority) {
|
||||
childPrio->setText(misc::toQString(priority));
|
||||
// recursively update children of this child too
|
||||
updateChildrenPriority(parent->child(i), priority);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void properties::updatePriorities(QStandardItem *item) {
|
||||
qDebug("Priority changed");
|
||||
// First we disable the signal/slot on item edition
|
||||
// temporarily so that it doesn't mess with our manual updates
|
||||
disconnect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*)));
|
||||
QStandardItem *parent = item->parent();
|
||||
if(!parent) {
|
||||
parent = PropListModel->invisibleRootItem();
|
||||
}
|
||||
int priority = parent->child(item->row(), PRIORITY)->text().toInt();
|
||||
// Update parents priorities
|
||||
updateParentsPriority(item, priority);
|
||||
// If this is not a directory, then there are
|
||||
// no children to update
|
||||
if(parent->child(item->row(), INDEX)->text().toInt() == -1) {
|
||||
// Updating children
|
||||
qDebug("Priority changed for a folder to %d", priority);
|
||||
updateChildrenPriority(item, priority);
|
||||
}
|
||||
// Reconnect the signal/slot on item edition so that we
|
||||
// get future updates
|
||||
connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*)));
|
||||
}
|
||||
|
||||
void properties::loadTrackersErrors(){
|
||||
// Tracker Errors
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue