- A lot of improvement and bug fixes in new torrent content selection

This commit is contained in:
Christophe Dumez 2007-09-16 13:33:41 +00:00
parent 3cb34ed7ee
commit 419b94f042
4 changed files with 149 additions and 93 deletions

View file

@ -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));
}
}
}

View file

@ -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

View file

@ -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:

View file

@ -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;