mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-11-24 02:06:07 +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));
|
model->setData(index, QVariant(IGNORED));
|
||||||
if(filteredFilesChanged != 0)
|
if(filteredFilesChanged != 0)
|
||||||
*filteredFilesChanged = true;
|
*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;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -176,6 +180,9 @@ class PropListDelegate: public QItemDelegate {
|
||||||
model->setData(index, QVariant(NORMAL));
|
model->setData(index, QVariant(NORMAL));
|
||||||
if(filteredFilesChanged != 0)
|
if(filteredFilesChanged != 0)
|
||||||
*filteredFilesChanged = true;
|
*filteredFilesChanged = true;
|
||||||
|
} else {
|
||||||
|
model->setData(index, QVariant(HIGH));
|
||||||
|
model->setData(index, QVariant(NORMAL));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -183,6 +190,9 @@ class PropListDelegate: public QItemDelegate {
|
||||||
model->setData(index, QVariant(HIGH));
|
model->setData(index, QVariant(HIGH));
|
||||||
if(filteredFilesChanged != 0)
|
if(filteredFilesChanged != 0)
|
||||||
*filteredFilesChanged = true;
|
*filteredFilesChanged = true;
|
||||||
|
} else {
|
||||||
|
model->setData(index, QVariant(NORMAL));
|
||||||
|
model->setData(index, QVariant(HIGH));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
|
@ -190,6 +200,9 @@ class PropListDelegate: public QItemDelegate {
|
||||||
model->setData(index, QVariant(MAXIMUM));
|
model->setData(index, QVariant(MAXIMUM));
|
||||||
if(filteredFilesChanged != 0)
|
if(filteredFilesChanged != 0)
|
||||||
*filteredFilesChanged = true;
|
*filteredFilesChanged = true;
|
||||||
|
} else {
|
||||||
|
model->setData(index, QVariant(HIGH));
|
||||||
|
model->setData(index, QVariant(MAXIMUM));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -197,6 +210,9 @@ class PropListDelegate: public QItemDelegate {
|
||||||
model->setData(index, QVariant(NORMAL));
|
model->setData(index, QVariant(NORMAL));
|
||||||
if(filteredFilesChanged != 0)
|
if(filteredFilesChanged != 0)
|
||||||
*filteredFilesChanged = true;
|
*filteredFilesChanged = true;
|
||||||
|
} else {
|
||||||
|
model->setData(index, QVariant(HIGH));
|
||||||
|
model->setData(index, QVariant(NORMAL));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
#include <QStandardItemModel>
|
#include <QStandardItemModel>
|
||||||
|
|
||||||
// Constructor
|
// 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);
|
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>");
|
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
|
// set icons
|
||||||
|
@ -104,7 +104,7 @@ properties::properties(QWidget *parent, bittorrent *BTSession, QTorrentHandle &h
|
||||||
addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem());
|
addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem());
|
||||||
delete arb;
|
delete arb;
|
||||||
delete prioritiesTab;
|
delete prioritiesTab;
|
||||||
connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updateChildrenPriority(QStandardItem*)));
|
connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*)));
|
||||||
filesList->expandAll();
|
filesList->expandAll();
|
||||||
// List web seeds
|
// List web seeds
|
||||||
loadWebSeedsFromFile();
|
loadWebSeedsFromFile();
|
||||||
|
@ -155,61 +155,81 @@ void properties::addFilesToTree(file *root, QStandardItem *parent) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void properties::updateChildrenPriority(QStandardItem *item) {
|
// priority is the new priority of given item
|
||||||
qDebug("Priority changed");
|
void properties::updateParentsPriority(QStandardItem *item, int priority) {
|
||||||
QStandardItem *parent = item->parent();
|
QStandardItem *parent = item->parent();
|
||||||
int row = item->row();
|
if(!parent) return;
|
||||||
if(!parent) {
|
// Check if children have different priorities
|
||||||
parent = PropListModel->invisibleRootItem();
|
// then folder must have NORMAL priority
|
||||||
}
|
|
||||||
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();
|
unsigned int rowCount = parent->rowCount();
|
||||||
for(unsigned int i=0; i<rowCount; ++i) {
|
for(unsigned int i=0; i<rowCount; ++i) {
|
||||||
if(parent->child(i, PRIORITY)->text().toInt() != priority) {
|
if(parent->child(i, PRIORITY)->text().toInt() != priority) {
|
||||||
// Check if parent priority is NORMAL
|
|
||||||
QStandardItem *grandFather = parent->parent();
|
QStandardItem *grandFather = parent->parent();
|
||||||
if(!grandFather) {
|
if(!grandFather) {
|
||||||
grandFather = PropListModel->invisibleRootItem();
|
grandFather = PropListModel->invisibleRootItem();
|
||||||
}
|
}
|
||||||
QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY);
|
QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY);
|
||||||
editParentsOnly = true;
|
if(parentPrio->text().toInt() != NORMAL) {
|
||||||
parentPrio->setText(misc::toQString(NORMAL));
|
parentPrio->setText(misc::toQString(NORMAL));
|
||||||
editParentsOnly = false;
|
// Recursively update ancesters of this parent too
|
||||||
parentUpdate = false;
|
updateParentsPriority(grandFather->child(parent->row()), priority);
|
||||||
break;
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(parentUpdate) {
|
// All the children have the same priority
|
||||||
|
// Parent folder should have the same priority too
|
||||||
QStandardItem *grandFather = parent->parent();
|
QStandardItem *grandFather = parent->parent();
|
||||||
if(!grandFather) {
|
if(!grandFather) {
|
||||||
grandFather = PropListModel->invisibleRootItem();
|
grandFather = PropListModel->invisibleRootItem();
|
||||||
}
|
}
|
||||||
QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY);
|
QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY);
|
||||||
editParentsOnly = true;
|
if(parentPrio->text().toInt() != priority) {
|
||||||
parentPrio->setText(misc::toQString(priority));
|
parentPrio->setText(misc::toQString(priority));
|
||||||
editParentsOnly = false;
|
// Recursively update ancesters of this parent too
|
||||||
|
updateParentsPriority(grandFather->child(parent->row()), priority);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(editParentsOnly) return;
|
|
||||||
if(!is_dir) return;
|
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();
|
||||||
|
for(unsigned int i=0; i<rowCount; ++i) {
|
||||||
|
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
|
// Updating children
|
||||||
qDebug("Priority changed for a folder to %d", priority);
|
qDebug("Priority changed for a folder to %d", priority);
|
||||||
parent = parent->child(row);
|
updateChildrenPriority(item, priority);
|
||||||
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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// 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(){
|
void properties::loadTrackersErrors(){
|
||||||
|
|
|
@ -45,7 +45,6 @@ class properties : public QDialog, private Ui::properties{
|
||||||
QStandardItemModel *PropListModel;
|
QStandardItemModel *PropListModel;
|
||||||
QTimer *updateInfosTimer;
|
QTimer *updateInfosTimer;
|
||||||
bool has_filtered_files;
|
bool has_filtered_files;
|
||||||
bool editParentsOnly;
|
|
||||||
QStringList urlSeeds;
|
QStringList urlSeeds;
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
|
@ -71,7 +70,9 @@ class properties : public QDialog, private Ui::properties{
|
||||||
void deleteSelectedUrlSeeds();
|
void deleteSelectedUrlSeeds();
|
||||||
void loadTrackersErrors();
|
void loadTrackersErrors();
|
||||||
void addFilesToTree(file *root, QStandardItem *parent);
|
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);
|
void getPriorities(QStandardItem *parent, int *priorities);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
|
@ -57,10 +57,9 @@ class torrentAdditionDialog : public QDialog, private Ui_addTorrentDialog{
|
||||||
QStandardItemModel *PropListModel;
|
QStandardItemModel *PropListModel;
|
||||||
PropListDelegate *PropDelegate;
|
PropListDelegate *PropDelegate;
|
||||||
unsigned int nbFiles;
|
unsigned int nbFiles;
|
||||||
bool editParentsOnly;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
torrentAdditionDialog(QWidget *parent) : QDialog(parent), editParentsOnly(false){
|
torrentAdditionDialog(QWidget *parent) : QDialog(parent) {
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
// Set Properties list model
|
// Set Properties list model
|
||||||
|
@ -120,7 +119,7 @@ class torrentAdditionDialog : public QDialog, private Ui_addTorrentDialog{
|
||||||
arborescence *arb = new arborescence(t);
|
arborescence *arb = new arborescence(t);
|
||||||
addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem());
|
addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem());
|
||||||
delete arb;
|
delete arb;
|
||||||
connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updateChildrenPriority(QStandardItem*)));
|
connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*)));
|
||||||
torrentContentList->expandAll();
|
torrentContentList->expandAll();
|
||||||
}catch (invalid_torrent_file&){ // Raised by torrent_info constructor
|
}catch (invalid_torrent_file&){ // Raised by torrent_info constructor
|
||||||
// Display warning to tell user we can't decode the torrent file
|
// Display warning to tell user we can't decode the torrent file
|
||||||
|
@ -188,61 +187,81 @@ class torrentAdditionDialog : public QDialog, private Ui_addTorrentDialog{
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void updateChildrenPriority(QStandardItem *item) {
|
// priority is the new priority of given item
|
||||||
qDebug("Priority changed");
|
void updateParentsPriority(QStandardItem *item, int priority) {
|
||||||
QStandardItem *parent = item->parent();
|
QStandardItem *parent = item->parent();
|
||||||
int row = item->row();
|
if(!parent) return;
|
||||||
if(!parent) {
|
// Check if children have different priorities
|
||||||
parent = PropListModel->invisibleRootItem();
|
// then folder must have NORMAL priority
|
||||||
}
|
|
||||||
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();
|
unsigned int rowCount = parent->rowCount();
|
||||||
for(unsigned int i=0; i<rowCount; ++i) {
|
for(unsigned int i=0; i<rowCount; ++i) {
|
||||||
if(parent->child(i, PRIORITY)->text().toInt() != priority) {
|
if(parent->child(i, PRIORITY)->text().toInt() != priority) {
|
||||||
// Check if parent priority is NORMAL
|
|
||||||
QStandardItem *grandFather = parent->parent();
|
QStandardItem *grandFather = parent->parent();
|
||||||
if(!grandFather) {
|
if(!grandFather) {
|
||||||
grandFather = PropListModel->invisibleRootItem();
|
grandFather = PropListModel->invisibleRootItem();
|
||||||
}
|
}
|
||||||
QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY);
|
QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY);
|
||||||
editParentsOnly = true;
|
if(parentPrio->text().toInt() != NORMAL) {
|
||||||
parentPrio->setText(misc::toQString(NORMAL));
|
parentPrio->setText(misc::toQString(NORMAL));
|
||||||
editParentsOnly = false;
|
// Recursively update ancesters of this parent too
|
||||||
parentUpdate = false;
|
updateParentsPriority(grandFather->child(parent->row()), priority);
|
||||||
break;
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(parentUpdate) {
|
// All the children have the same priority
|
||||||
|
// Parent folder should have the same priority too
|
||||||
QStandardItem *grandFather = parent->parent();
|
QStandardItem *grandFather = parent->parent();
|
||||||
if(!grandFather) {
|
if(!grandFather) {
|
||||||
grandFather = PropListModel->invisibleRootItem();
|
grandFather = PropListModel->invisibleRootItem();
|
||||||
}
|
}
|
||||||
QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY);
|
QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY);
|
||||||
editParentsOnly = true;
|
if(parentPrio->text().toInt() != priority) {
|
||||||
parentPrio->setText(misc::toQString(priority));
|
parentPrio->setText(misc::toQString(priority));
|
||||||
editParentsOnly = false;
|
// Recursively update ancesters of this parent too
|
||||||
|
updateParentsPriority(grandFather->child(parent->row()), priority);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(editParentsOnly) return;
|
|
||||||
if(!is_dir) return;
|
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();
|
||||||
|
for(unsigned int i=0; i<rowCount; ++i) {
|
||||||
|
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
|
// Updating children
|
||||||
qDebug("Priority changed for a folder to %d", priority);
|
qDebug("Priority changed for a folder to %d", priority);
|
||||||
parent = parent->child(row);
|
updateChildrenPriority(item, priority);
|
||||||
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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// 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(){
|
void on_browseButton_clicked(){
|
||||||
|
|
Loading…
Reference in a new issue