mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-11-23 17:56:50 +03: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
|
@ -169,6 +169,10 @@ class PropListDelegate: public QItemDelegate {
|
|||
model->setData(index, QVariant(IGNORED));
|
||||
if(filteredFilesChanged != 0)
|
||||
*filteredFilesChanged = true;
|
||||
} else {
|
||||
// XXX: hack to force the model to send the itemChanged() signal
|
||||
model->setData(index, QVariant(NORMAL));
|
||||
model->setData(index, QVariant(IGNORED));
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
|
@ -176,6 +180,9 @@ class PropListDelegate: public QItemDelegate {
|
|||
model->setData(index, QVariant(NORMAL));
|
||||
if(filteredFilesChanged != 0)
|
||||
*filteredFilesChanged = true;
|
||||
} else {
|
||||
model->setData(index, QVariant(HIGH));
|
||||
model->setData(index, QVariant(NORMAL));
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
|
@ -183,6 +190,9 @@ class PropListDelegate: public QItemDelegate {
|
|||
model->setData(index, QVariant(HIGH));
|
||||
if(filteredFilesChanged != 0)
|
||||
*filteredFilesChanged = true;
|
||||
} else {
|
||||
model->setData(index, QVariant(NORMAL));
|
||||
model->setData(index, QVariant(HIGH));
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
|
@ -190,6 +200,9 @@ class PropListDelegate: public QItemDelegate {
|
|||
model->setData(index, QVariant(MAXIMUM));
|
||||
if(filteredFilesChanged != 0)
|
||||
*filteredFilesChanged = true;
|
||||
} else {
|
||||
model->setData(index, QVariant(HIGH));
|
||||
model->setData(index, QVariant(MAXIMUM));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -197,6 +210,9 @@ class PropListDelegate: public QItemDelegate {
|
|||
model->setData(index, QVariant(NORMAL));
|
||||
if(filteredFilesChanged != 0)
|
||||
*filteredFilesChanged = true;
|
||||
} else {
|
||||
model->setData(index, QVariant(HIGH));
|
||||
model->setData(index, QVariant(NORMAL));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -45,7 +45,6 @@ class properties : public QDialog, private Ui::properties{
|
|||
QStandardItemModel *PropListModel;
|
||||
QTimer *updateInfosTimer;
|
||||
bool has_filtered_files;
|
||||
bool editParentsOnly;
|
||||
QStringList urlSeeds;
|
||||
|
||||
protected slots:
|
||||
|
@ -71,7 +70,9 @@ class properties : public QDialog, private Ui::properties{
|
|||
void deleteSelectedUrlSeeds();
|
||||
void loadTrackersErrors();
|
||||
void addFilesToTree(file *root, QStandardItem *parent);
|
||||
void updateChildrenPriority(QStandardItem *item);
|
||||
void updateChildrenPriority(QStandardItem *item, int priority);
|
||||
void updateParentsPriority(QStandardItem *item, int priority);
|
||||
void updatePriorities(QStandardItem *item);
|
||||
void getPriorities(QStandardItem *parent, int *priorities);
|
||||
|
||||
signals:
|
||||
|
|
|
@ -57,10 +57,9 @@ class torrentAdditionDialog : public QDialog, private Ui_addTorrentDialog{
|
|||
QStandardItemModel *PropListModel;
|
||||
PropListDelegate *PropDelegate;
|
||||
unsigned int nbFiles;
|
||||
bool editParentsOnly;
|
||||
|
||||
public:
|
||||
torrentAdditionDialog(QWidget *parent) : QDialog(parent), editParentsOnly(false){
|
||||
torrentAdditionDialog(QWidget *parent) : QDialog(parent) {
|
||||
setupUi(this);
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
// Set Properties list model
|
||||
|
@ -120,7 +119,7 @@ class torrentAdditionDialog : public QDialog, private Ui_addTorrentDialog{
|
|||
arborescence *arb = new arborescence(t);
|
||||
addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem());
|
||||
delete arb;
|
||||
connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updateChildrenPriority(QStandardItem*)));
|
||||
connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*)));
|
||||
torrentContentList->expandAll();
|
||||
}catch (invalid_torrent_file&){ // Raised by torrent_info constructor
|
||||
// Display warning to tell user we can't decode the torrent file
|
||||
|
@ -188,62 +187,82 @@ class torrentAdditionDialog : public QDialog, private Ui_addTorrentDialog{
|
|||
|
||||
public slots:
|
||||
|
||||
void updateChildrenPriority(QStandardItem *item) {
|
||||
qDebug("Priority changed");
|
||||
// priority is the new priority of given item
|
||||
void 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 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 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 on_browseButton_clicked(){
|
||||
QString dir;
|
||||
|
|
Loading…
Reference in a new issue