diff --git a/src/PropListDelegate.h b/src/PropListDelegate.h index 2ae5151e4..2ae8efaef 100644 --- a/src/PropListDelegate.h +++ b/src/PropListDelegate.h @@ -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)); } } } diff --git a/src/properties_imp.cpp b/src/properties_imp.cpp index 17c9c182c..31cee668f 100644 --- a/src/properties_imp.cpp +++ b/src/properties_imp.cpp @@ -32,7 +32,7 @@ #include // 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:")+""); // 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; ichild(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; ichild(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; ichild(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 diff --git a/src/properties_imp.h b/src/properties_imp.h index 2633621d5..3ebb522c2 100644 --- a/src/properties_imp.h +++ b/src/properties_imp.h @@ -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: diff --git a/src/torrentAddition.h b/src/torrentAddition.h index bd6bacd97..1af4930ca 100644 --- a/src/torrentAddition.h +++ b/src/torrentAddition.h @@ -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; ichild(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; ichild(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; ichild(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;