From 6fcf25af52452f4949868783cc7fa5c2177cea94 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Mon, 17 Aug 2009 13:17:52 +0000 Subject: [PATCH] - FEATURE: Display free disk space in torrent addition dialog - Added some disambiguation for translators --- Changelog | 1 + src/addTorrentDialog.ui | 206 ++++++++----- src/misc.h | 22 ++ src/options.ui | 2 +- src/torrentAddition.h | 662 +++++++++++++++++++++------------------- 5 files changed, 502 insertions(+), 391 deletions(-) diff --git a/Changelog b/Changelog index 5ae59cebd..09140703b 100644 --- a/Changelog +++ b/Changelog @@ -1,5 +1,6 @@ * Unknown - Christophe Dumez - v1.5.0 - FEATURE: Added Magnet URI support + - FEATURE: Display free disk space in torrent addition dialog - BUGFIX: torrent resume code rewrited * Thu Aug 13 2009 - Christophe Dumez - v1.4.0 diff --git a/src/addTorrentDialog.ui b/src/addTorrentDialog.ui index 04f625caf..7f0004d21 100644 --- a/src/addTorrentDialog.ui +++ b/src/addTorrentDialog.ui @@ -1,68 +1,60 @@ - + + addTorrentDialog - - + + 0 0 511 - 441 + 461 - + Torrent addition dialog - + - - + + - - + + Qt::Horizontal - - + + 75 true - + Save path: - - + + 6 - - 0 - - - 0 - - - 0 - - + 0 - + - - + + ... @@ -70,39 +62,108 @@ - - + + + + + Torrent size: + + + + + + + Unknown + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Free disk space: + + + + + + + Unknown + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 75 true - + Torrent content: - - + + Qt::CustomContextMenu - + QAbstractItemView::AllEditTriggers - + QAbstractItemView::ExtendedSelection - + - + Qt::Horizontal - + 40 20 @@ -111,25 +172,25 @@ - - + + Collapse all - - + + Expand all - + Qt::Horizontal - + 40 20 @@ -140,42 +201,33 @@ - - - Download in correct order (slower but good for previewing) + + + Download in sequential order (slower but good for previewing) - - + + Add to download list in paused state - - + + 6 - - 0 - - - 0 - - - 0 - - + 0 - + Qt::Horizontal - + 40 20 @@ -184,25 +236,25 @@ - - + + Add - - + + Cancel - + Qt::Horizontal - + 40 20 @@ -213,23 +265,23 @@ - - + + Ignored - - + + Normal - - + + High - - + + Maximum diff --git a/src/misc.h b/src/misc.h index b9a1cdc0b..058bee814 100644 --- a/src/misc.h +++ b/src/misc.h @@ -42,6 +42,10 @@ #include #include +#ifndef Q_WS_WIN +#include +#endif + #include using namespace libtorrent; @@ -92,6 +96,24 @@ public: return x; } + + static unsigned long long freeDiskSpaceOnPath(QString path) { +#ifndef Q_WS_WIN + unsigned long long available; + struct statfs stats; + int ret = statfs ((path+"/.").toUtf8().data(), &stats) ; + if(ret == 0) { + available = ((unsigned long long)stats.f_bavail) * + ((unsigned long long)stats.f_bsize) ; + return available; + } else { + return -1; + } +#else + return -1; +#endif + } + // return best userfriendly storage unit (B, KiB, MiB, GiB, TiB) // use Binary prefix standards from IEC 60027-2 // see http://en.wikipedia.org/wiki/Kilobyte diff --git a/src/options.ui b/src/options.ui index f32610583..ae3abbf39 100644 --- a/src/options.ui +++ b/src/options.ui @@ -465,7 +465,7 @@ - Transfer lists double-click + Transfer lists double-click action diff --git a/src/torrentAddition.h b/src/torrentAddition.h index d98fbaad2..d7fb607e9 100644 --- a/src/torrentAddition.h +++ b/src/torrentAddition.h @@ -55,366 +55,402 @@ using namespace libtorrent; class torrentAdditionDialog : public QDialog, private Ui_addTorrentDialog{ Q_OBJECT - private: - bittorrent *BTSession; - QString fileName; - QString hash; - QString filePath; - QString from_url; - QStandardItemModel *PropListModel; - PropListDelegate *PropDelegate; - unsigned int nbFiles; +private: + bittorrent *BTSession; + QString fileName; + QString hash; + QString filePath; + QString from_url; + QStandardItemModel *PropListModel; + PropListDelegate *PropDelegate; + unsigned int nbFiles; + boost::intrusive_ptr t; - public: - torrentAdditionDialog(QWidget *parent, bittorrent* _BTSession) : QDialog(parent) { - setupUi(this); - setAttribute(Qt::WA_DeleteOnClose); - BTSession = _BTSession; - // Set Properties list model - PropListModel = new QStandardItemModel(0,5); - PropListModel->setHeaderData(NAME, Qt::Horizontal, tr("File name")); - PropListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size")); - PropListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress")); - PropListModel->setHeaderData(PRIORITY, Qt::Horizontal, tr("Priority")); - torrentContentList->setModel(PropListModel); - torrentContentList->hideColumn(PROGRESS); - torrentContentList->hideColumn(INDEX); - PropDelegate = new PropListDelegate(); - torrentContentList->setItemDelegate(PropDelegate); - connect(torrentContentList, SIGNAL(clicked(const QModelIndex&)), torrentContentList, SLOT(edit(const QModelIndex&))); - connect(torrentContentList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFilesListMenu(const QPoint&))); - connect(actionIgnored, SIGNAL(triggered()), this, SLOT(ignoreSelection())); - connect(actionNormal, SIGNAL(triggered()), this, SLOT(normalSelection())); - connect(actionHigh, SIGNAL(triggered()), this, SLOT(highSelection())); - connect(actionMaximum, SIGNAL(triggered()), this, SLOT(maximumSelection())); - connect(collapseAllButton, SIGNAL(clicked()), torrentContentList, SLOT(collapseAll())); - connect(expandAllButton, SIGNAL(clicked()), torrentContentList, SLOT(expandAll())); - torrentContentList->header()->resizeSection(0, 200); - //torrentContentList->header()->setResizeMode(0, QHeaderView::Stretch); - QString home = QDir::homePath(); - if(home[home.length()-1] != QDir::separator()){ - home += QDir::separator(); - } - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - savePathTxt->setText(settings.value(QString::fromUtf8("LastDirTorrentAdd"), home+QString::fromUtf8("qBT_dir")).toString()); - if(settings.value("Preferences/Downloads/StartInPause", false).toBool()) { - addInPause->setChecked(true); - addInPause->setEnabled(false); - } +public: + torrentAdditionDialog(QWidget *parent, bittorrent* _BTSession) : QDialog(parent) { + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + BTSession = _BTSession; + // Set Properties list model + PropListModel = new QStandardItemModel(0,5); + PropListModel->setHeaderData(NAME, Qt::Horizontal, tr("File name")); + PropListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size")); + PropListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress")); + PropListModel->setHeaderData(PRIORITY, Qt::Horizontal, tr("Priority")); + torrentContentList->setModel(PropListModel); + torrentContentList->hideColumn(PROGRESS); + torrentContentList->hideColumn(INDEX); + PropDelegate = new PropListDelegate(); + torrentContentList->setItemDelegate(PropDelegate); + connect(torrentContentList, SIGNAL(clicked(const QModelIndex&)), torrentContentList, SLOT(edit(const QModelIndex&))); + connect(torrentContentList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFilesListMenu(const QPoint&))); + connect(actionIgnored, SIGNAL(triggered()), this, SLOT(ignoreSelection())); + connect(actionNormal, SIGNAL(triggered()), this, SLOT(normalSelection())); + connect(actionHigh, SIGNAL(triggered()), this, SLOT(highSelection())); + connect(actionMaximum, SIGNAL(triggered()), this, SLOT(maximumSelection())); + connect(collapseAllButton, SIGNAL(clicked()), torrentContentList, SLOT(collapseAll())); + connect(expandAllButton, SIGNAL(clicked()), torrentContentList, SLOT(expandAll())); + torrentContentList->header()->resizeSection(0, 200); + //torrentContentList->header()->setResizeMode(0, QHeaderView::Stretch); + QString home = QDir::homePath(); + if(home[home.length()-1] != QDir::separator()){ + home += QDir::separator(); } - - ~torrentAdditionDialog() { - delete PropDelegate; - delete PropListModel; + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + savePathTxt->setText(settings.value(QString::fromUtf8("LastDirTorrentAdd"), home+QString::fromUtf8("qBT_dir")).toString()); + if(settings.value("Preferences/Downloads/StartInPause", false).toBool()) { + addInPause->setChecked(true); + addInPause->setEnabled(false); } + } - void showLoad(QString filePath, QString from_url=QString::null){ - if(!QFile::exists(filePath)) { - close(); - return; - } - this->filePath = filePath; - this->from_url = from_url; - // Getting torrent file informations - boost::intrusive_ptr t; - try { - t = new torrent_info(filePath.toLocal8Bit().data()); - } catch(std::exception&) { - qDebug("Caught error loading torrent"); - if(!from_url.isNull()){ - BTSession->addConsoleMessage(tr("Unable to decode torrent file:")+QString::fromUtf8(" '")+from_url+QString::fromUtf8("'"), QString::fromUtf8("red")); - QFile::remove(filePath); - }else{ - BTSession->addConsoleMessage(tr("Unable to decode torrent file:")+QString::fromUtf8(" '")+filePath+QString::fromUtf8("'"), QString::fromUtf8("red")); - } - close(); - return; - } - nbFiles = t->num_files(); - // Setting file name - fileName = misc::toQString(t->name()); - hash = misc::toQString(t->info_hash()); - // Use left() to remove .old extension - QString newFileName; - if(fileName.endsWith(QString::fromUtf8(".old"))){ - newFileName = fileName.left(fileName.size()-4); - }else{ - newFileName = fileName; - } - fileNameLbl->setText(QString::fromUtf8("
")+newFileName+QString::fromUtf8("
")); - // List files in torrent - arborescence *arb = new arborescence(t); - addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem()); - delete arb; - connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); - torrentContentList->expandAll(); - show(); - } + ~torrentAdditionDialog() { + delete PropDelegate; + delete PropListModel; + } - void addFilesToTree(const torrent_file *root, QStandardItem *parent) { - QList child; - // Name - QStandardItem *first; - if(root->isDir()) { - first = new QStandardItem(QIcon(":/Icons/oxygen/folder.png"), root->name()); - } else { - first = new QStandardItem(QIcon(":/Icons/oxygen/file.png"), root->name()); - } - child << first; - // Size - child << new QStandardItem(misc::toQString(root->getSize())); - // Hidden progress - child << new QStandardItem(""); - // Prio - child << new QStandardItem(misc::toQString(NORMAL)); - // INDEX - child << new QStandardItem(misc::toQString(root->getIndex())); - // TODO: row Color? - // Add the child to the tree - parent->appendRow(child); - // Add children - QList children = root->getChildren(); - foreach(const torrent_file *child, children) { - addFilesToTree(child, first); + void showLoad(QString filePath, QString from_url=QString::null){ + if(!QFile::exists(filePath)) { + close(); + return; + } + this->filePath = filePath; + this->from_url = from_url; + // Getting torrent file informations + try { + t = new torrent_info(filePath.toLocal8Bit().data()); + } catch(std::exception&) { + qDebug("Caught error loading torrent"); + if(!from_url.isNull()){ + BTSession->addConsoleMessage(tr("Unable to decode torrent file:")+QString::fromUtf8(" '")+from_url+QString::fromUtf8("'"), QString::fromUtf8("red")); + QFile::remove(filePath); + }else{ + BTSession->addConsoleMessage(tr("Unable to decode torrent file:")+QString::fromUtf8(" '")+filePath+QString::fromUtf8("'"), QString::fromUtf8("red")); } + close(); + return; } + nbFiles = t->num_files(); + // Setting file name + fileName = misc::toQString(t->name()); + hash = misc::toQString(t->info_hash()); + // Use left() to remove .old extension + QString newFileName; + if(fileName.endsWith(QString::fromUtf8(".old"))){ + newFileName = fileName.left(fileName.size()-4); + }else{ + newFileName = fileName; + } + fileNameLbl->setText(QString::fromUtf8("
")+newFileName+QString::fromUtf8("
")); + // List files in torrent + arborescence *arb = new arborescence(t); + addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem()); + delete arb; + connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); + //torrentContentList->expandAll(); + updateDiskSpaceLabels(); + show(); + } - public slots: - - // priority is the new priority of given item - void updateParentsPriority(QStandardItem *item, int priority) { - QStandardItem *parent = item->parent(); - 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); - if(parentPrio->text().toInt() != NORMAL) { - parentPrio->setText(misc::toQString(NORMAL)); - // Recursively update ancesters of this parent too - updateParentsPriority(grandFather->child(parent->row()), priority); - } - return; - } - } - // 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 addFilesToTree(const torrent_file *root, QStandardItem *parent) { + QList child; + // Name + QStandardItem *first; + if(root->isDir()) { + first = new QStandardItem(QIcon(":/Icons/oxygen/folder.png"), root->name()); + } else { + first = new QStandardItem(QIcon(":/Icons/oxygen/file.png"), root->name()); + } + child << first; + // Size + child << new QStandardItem(misc::toQString(root->getSize())); + // Hidden progress + child << new QStandardItem(""); + // Prio + child << new QStandardItem(misc::toQString(NORMAL)); + // INDEX + child << new QStandardItem(misc::toQString(root->getIndex())); + // TODO: row Color? + // Add the child to the tree + parent->appendRow(child); + // Add children + QList children = root->getChildren(); + foreach(const torrent_file *child, children) { + addFilesToTree(child, first); } + } - 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; ichild(i, PRIORITY); - if(childPrio->text().toInt() != priority) { - childPrio->setText(misc::toQString(priority)); - // recursively update children of this child too - updateChildrenPriority(parent->child(i), priority); +public slots: + + // priority is the new priority of given item + void updateParentsPriority(QStandardItem *item, int priority) { + QStandardItem *parent = item->parent(); + 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); + if(parentPrio->text().toInt() != NORMAL) { + parentPrio->setText(misc::toQString(NORMAL)); + // Recursively update ancesters of this parent too + updateParentsPriority(grandFather->child(parent->row()), priority); + } + return; } } + // 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 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 updateChildrenPriority(QStandardItem *item, int priority) { + QStandardItem *parent = item->parent(); + if(!parent) { + parent = PropListModel->invisibleRootItem(); } - - void on_browseButton_clicked(){ - QString dir; - QDir saveDir(savePathTxt->text()); - if(saveDir.exists()){ - dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), savePathTxt->text()); - }else{ - dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), QDir::homePath()); - } - if(!dir.isNull()){ - savePathTxt->setText(dir); + parent = parent->child(item->row()); + unsigned int rowCount = parent->rowCount(); + for(unsigned int i=0; ichild(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 on_CancelButton_clicked(){ - close(); + 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*))); + // Update disk space labels + updateDiskSpaceLabels(); + } - // Set the color of a row in data model - void setRowColor(int row, QString color){ - for(int i=0; icolumnCount(); ++i){ - PropListModel->setData(PropListModel->index(row, i), QVariant(QColor(color)), Qt::ForegroundRole); + void updateDiskSpaceLabels() { + unsigned long long available = misc::freeDiskSpaceOnPath(savePathTxt->text()); + if (available > 0) { + lbl_disk_space->setText(misc::friendlyUnit(available)); + } else { + lbl_disk_space->setText(tr("Unknown")); + } + // Determine torrent size + unsigned long long torrent_size = 0; + int nbFiles = t->num_files(); + int *priorities = new int[nbFiles]; + getPriorities(PropListModel->invisibleRootItem(), priorities); + for(int i=0; i 0) + torrent_size += t->file_at(i).size; + } + lbl_torrent_size->setText(misc::friendlyUnit(torrent_size)); + // Check if free space is sufficient + if(available > 0) { + if(available > torrent_size) { + // Space is sufficient + label_space_msg->setText(tr("(%1 left after torrent download)", "e.g. (100MiB left after torrent download)").arg(misc::friendlyUnit(available-torrent_size))); + } else { + // Space is unsufficient + label_space_msg->setText(""+tr("(%1 more are required to download)", "e.g. (100MiB more are required to download)").arg(misc::friendlyUnit(torrent_size-available))+""); } + } else { + // Available disk space is unknown + label_space_msg->setText(""); } + } - bool allFiltered() const { - unsigned int nbRows = PropListModel->rowCount(); - for(unsigned int i=0; idata(PropListModel->index(i, PRIORITY)).toInt() != IGNORED) - return false; - } - return true; + void on_browseButton_clicked(){ + QString dir; + QDir saveDir(savePathTxt->text()); + if(saveDir.exists()){ + dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), savePathTxt->text()); + }else{ + dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), QDir::homePath()); } + if(!dir.isNull()){ + savePathTxt->setText(dir); + updateDiskSpaceLabels(); + } + } + + void on_CancelButton_clicked(){ + close(); + } - void displayFilesListMenu(const QPoint&){ - if(nbFiles == 1) return; - QMenu myFilesLlistMenu(this); - QModelIndex index; - // Enable/disable pause/start action given the DL state - QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); - myFilesLlistMenu.setTitle(tr("Priority")); - myFilesLlistMenu.addAction(actionIgnored); - myFilesLlistMenu.addAction(actionNormal); - myFilesLlistMenu.addAction(actionHigh); - myFilesLlistMenu.addAction(actionMaximum); - // Call menu - myFilesLlistMenu.exec(QCursor::pos()); + // Set the color of a row in data model + void setRowColor(int row, QString color){ + for(int i=0; icolumnCount(); ++i){ + PropListModel->setData(PropListModel->index(row, i), QVariant(QColor(color)), Qt::ForegroundRole); } + } - void ignoreSelection(){ - QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes){ - if(index.column() == PRIORITY){ - PropListModel->setData(index, QVariant(IGNORED)); - } - for(int i=0; icolumnCount(); ++i){ - PropListModel->setData(PropListModel->index(index.row(), i), QVariant(QColor(QString::fromUtf8("red"))), Qt::ForegroundRole); - } - } + bool allFiltered() const { + unsigned int nbRows = PropListModel->rowCount(); + for(unsigned int i=0; idata(PropListModel->index(i, PRIORITY)).toInt() != IGNORED) + return false; } + return true; + } - void normalSelection(){ - QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes){ - if(index.column() == PRIORITY){ - PropListModel->setData(index, QVariant(NORMAL)); - } - for(int i=0; icolumnCount(); ++i){ - PropListModel->setData(PropListModel->index(index.row(), i), QVariant(QColor(QString::fromUtf8("green"))), Qt::ForegroundRole); - } + void displayFilesListMenu(const QPoint&){ + if(nbFiles == 1) return; + QMenu myFilesLlistMenu(this); + QModelIndex index; + // Enable/disable pause/start action given the DL state + QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); + myFilesLlistMenu.setTitle(tr("Priority")); + myFilesLlistMenu.addAction(actionIgnored); + myFilesLlistMenu.addAction(actionNormal); + myFilesLlistMenu.addAction(actionHigh); + myFilesLlistMenu.addAction(actionMaximum); + // Call menu + myFilesLlistMenu.exec(QCursor::pos()); + } + + void ignoreSelection(){ + QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + PropListModel->setData(index, QVariant(IGNORED)); + } + for(int i=0; icolumnCount(); ++i){ + PropListModel->setData(PropListModel->index(index.row(), i), QVariant(QColor(QString::fromUtf8("red"))), Qt::ForegroundRole); } } + } - void highSelection(){ - QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes){ - if(index.column() == PRIORITY){ - PropListModel->setData(index, QVariant(HIGH)); - } - for(int i=0; icolumnCount(); ++i){ - PropListModel->setData(PropListModel->index(index.row(), i), QVariant(QColor("green")), Qt::ForegroundRole); - } + void normalSelection(){ + QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + PropListModel->setData(index, QVariant(NORMAL)); + } + for(int i=0; icolumnCount(); ++i){ + PropListModel->setData(PropListModel->index(index.row(), i), QVariant(QColor(QString::fromUtf8("green"))), Qt::ForegroundRole); } } + } - void maximumSelection(){ - QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes){ - if(index.column() == PRIORITY){ - PropListModel->setData(index, QVariant(MAXIMUM)); - } - for(int i=0; icolumnCount(); ++i){ - PropListModel->setData(PropListModel->index(index.row(), i), QVariant(QColor(QString::fromUtf8("green"))), Qt::ForegroundRole); - } + void highSelection(){ + QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + PropListModel->setData(index, QVariant(HIGH)); + } + for(int i=0; icolumnCount(); ++i){ + PropListModel->setData(PropListModel->index(index.row(), i), QVariant(QColor("green")), Qt::ForegroundRole); } } + } - void getPriorities(QStandardItem *parent, int *priorities) { - unsigned int nbRows = parent->rowCount(); - for(unsigned int i=0; ichild(i, INDEX); - int index = item->text().toInt(); - if(index < 0) { - qDebug("getPriorities(), found a folder, checking its children"); - getPriorities(parent->child(i), priorities); - } else { - item = parent->child(i, PRIORITY); - qDebug("getPriorities(), found priority %d for file at index %d", item->text().toInt(), index); - priorities[index] = item->text().toInt(); - } + void maximumSelection(){ + QModelIndexList selectedIndexes = torrentContentList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + PropListModel->setData(index, QVariant(MAXIMUM)); + } + for(int i=0; icolumnCount(); ++i){ + PropListModel->setData(PropListModel->index(index.row(), i), QVariant(QColor(QString::fromUtf8("green"))), Qt::ForegroundRole); } } + } - void savePiecesPriorities(){ - qDebug("Saving pieces priorities"); - int *priorities = new int[nbFiles]; - getPriorities(PropListModel->invisibleRootItem(), priorities); - std::vector vect_prio; - for(unsigned int i=0; irowCount(); + for(unsigned int i=0; ichild(i, INDEX); + int index = item->text().toInt(); + if(index < 0) { + qDebug("getPriorities(), found a folder, checking its children"); + getPriorities(parent->child(i), priorities); + } else { + item = parent->child(i, PRIORITY); + qDebug("getPriorities(), found priority %d for file at index %d", item->text().toInt(), index); + priorities[index] = item->text().toInt(); } - delete[] priorities; - TorrentTempData::setFilesPriority(hash, vect_prio); } + } - void on_OkButton_clicked(){ - QDir savePath(savePathTxt->text()); - if(savePathTxt->text().trimmed().isEmpty()){ - QMessageBox::critical(0, tr("Empty save path"), tr("Please enter a save path")); + void savePiecesPriorities(){ + qDebug("Saving pieces priorities"); + int *priorities = new int[nbFiles]; + getPriorities(PropListModel->invisibleRootItem(), priorities); + std::vector vect_prio; + for(unsigned int i=0; itext()); + if(savePathTxt->text().trimmed().isEmpty()){ + QMessageBox::critical(0, tr("Empty save path"), tr("Please enter a save path")); + return; + } + // Check if savePath exists + if(!savePath.exists()){ + if(!savePath.mkpath(savePath.path())){ + QMessageBox::critical(0, tr("Save path creation error"), tr("Could not create the save path")); return; } - // Check if savePath exists - if(!savePath.exists()){ - if(!savePath.mkpath(savePath.path())){ - QMessageBox::critical(0, tr("Save path creation error"), tr("Could not create the save path")); - return; - } - } - // Save savepath - TorrentTempData::setSavePath(hash, savePath.path()); - // Save last dir to remember it - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - settings.setValue(QString::fromUtf8("LastDirTorrentAdd"), savePathTxt->text()); - // Create .incremental file if necessary - TorrentTempData::setSequential(hash, checkIncrementalDL->isChecked()); - // Check if there is at least one selected file - if(allFiltered()){ - QMessageBox::warning(0, tr("Invalid file selection"), tr("You must select at least one file in the torrent")); - return; - } - // save filtered files - savePiecesPriorities(); - // Add to download list - QTorrentHandle h = BTSession->addTorrent(filePath, false, from_url); - if(addInPause->isChecked() && h.is_valid()) - h.pause(); - close(); } + // Save savepath + TorrentTempData::setSavePath(hash, savePath.path()); + // Save last dir to remember it + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + settings.setValue(QString::fromUtf8("LastDirTorrentAdd"), savePathTxt->text()); + // Create .incremental file if necessary + TorrentTempData::setSequential(hash, checkIncrementalDL->isChecked()); + // Check if there is at least one selected file + if(allFiltered()){ + QMessageBox::warning(0, tr("Invalid file selection"), tr("You must select at least one file in the torrent")); + return; + } + // save filtered files + savePiecesPriorities(); + // Add to download list + QTorrentHandle h = BTSession->addTorrent(filePath, false, from_url); + if(addInPause->isChecked() && h.is_valid()) + h.pause(); + close(); + } }; #endif