diff --git a/src/gui/torrentcontentmodel.cpp b/src/gui/torrentcontentmodel.cpp index 2a351fbc9..ac4269048 100644 --- a/src/gui/torrentcontentmodel.cpp +++ b/src/gui/torrentcontentmodel.cpp @@ -39,299 +39,296 @@ #include "torrentcontentmodelfolder.h" #include "torrentcontentmodelfile.h" -namespace { -QIcon get_directory_icon() { - static QIcon cached = GuiIconProvider::instance()->getIcon("inode-directory"); - return cached; -} +namespace +{ + QIcon getDirectoryIcon() + { + static QIcon cached = GuiIconProvider::instance()->getIcon("inode-directory"); + return cached; + } -QIcon get_file_icon() { - static QIcon cached = GuiIconProvider::instance()->getIcon("text-plain"); - return cached; -} + QIcon getFileIcon() + { + static QIcon cached = GuiIconProvider::instance()->getIcon("text-plain"); + return cached; + } } -TorrentContentModel::TorrentContentModel(QObject *parent): - QAbstractItemModel(parent), - m_rootItem(new TorrentContentModelFolder(QList() << tr("Name") << tr("Size") - << tr("Progress") << tr("Priority"))) +TorrentContentModel::TorrentContentModel(QObject *parent) + : QAbstractItemModel(parent) + , m_rootItem(new TorrentContentModelFolder(QList({ tr("Name"), tr("Size"), tr("Progress"), tr("Download Priority") }))) { } TorrentContentModel::~TorrentContentModel() { - delete m_rootItem; + delete m_rootItem; } void TorrentContentModel::updateFilesProgress(const QVector &fp) { - Q_ASSERT(m_filesIndex.size() == fp.size()); - // XXX: Why is this necessary? - if (m_filesIndex.size() != fp.size()) return; - - emit layoutAboutToBeChanged(); - for (int i = 0; i < fp.size(); ++i) { - m_filesIndex[i]->setProgress(fp[i]); - } - // Update folders progress in the tree - m_rootItem->recalculateProgress(); - emit dataChanged(index(0,0), index(rowCount(), columnCount())); + Q_ASSERT(m_filesIndex.size() == fp.size()); + // XXX: Why is this necessary? + if (m_filesIndex.size() != fp.size()) return; + + emit layoutAboutToBeChanged(); + for (int i = 0; i < fp.size(); ++i) + m_filesIndex[i]->setProgress(fp[i]); + // Update folders progress in the tree + m_rootItem->recalculateProgress(); + emit dataChanged(index(0, 0), index(rowCount(), columnCount())); } void TorrentContentModel::updateFilesPriorities(const QVector &fprio) { - Q_ASSERT(m_filesIndex.size() == (int)fprio.size()); - // XXX: Why is this necessary? - if (m_filesIndex.size() != (int)fprio.size()) - return; - - emit layoutAboutToBeChanged(); - for (int i = 0; i < fprio.size(); ++i) { - m_filesIndex[i]->setPriority(fprio[i]); - } - emit dataChanged(index(0, 0), index(rowCount(), columnCount())); + Q_ASSERT(m_filesIndex.size() == (int)fprio.size()); + // XXX: Why is this necessary? + if (m_filesIndex.size() != (int)fprio.size()) + return; + + emit layoutAboutToBeChanged(); + for (int i = 0; i < fprio.size(); ++i) + m_filesIndex[i]->setPriority(fprio[i]); + emit dataChanged(index(0, 0), index(rowCount(), columnCount())); } QVector TorrentContentModel::getFilePriorities() const { - QVector prio; - prio.reserve(m_filesIndex.size()); - foreach (const TorrentContentModelFile* file, m_filesIndex) { - prio.push_back(file->priority()); - } - return prio; + QVector prio; + prio.reserve(m_filesIndex.size()); + foreach (const TorrentContentModelFile* file, m_filesIndex) + prio.push_back(file->priority()); + return prio; } bool TorrentContentModel::allFiltered() const { - foreach (const TorrentContentModelFile* fileItem, m_filesIndex) { - if (fileItem->priority() != prio::IGNORED) - return false; - } - return true; + foreach (const TorrentContentModelFile* fileItem, m_filesIndex) + if (fileItem->priority() != prio::IGNORED) + return false; + return true; } int TorrentContentModel::columnCount(const QModelIndex& parent) const { - if (parent.isValid()) - return static_cast(parent.internalPointer())->columnCount(); - else - return m_rootItem->columnCount(); + if (parent.isValid()) + return static_cast(parent.internalPointer())->columnCount(); + else + return m_rootItem->columnCount(); } bool TorrentContentModel::setData(const QModelIndex& index, const QVariant& value, int role) { - if (!index.isValid()) - return false; - - if (index.column() == 0 && role == Qt::CheckStateRole) { - TorrentContentModelItem *item = static_cast(index.internalPointer()); - qDebug("setData(%s, %d", qPrintable(item->name()), value.toInt()); - if (item->priority() != value.toInt()) { - if (value.toInt() == Qt::PartiallyChecked) - item->setPriority(prio::MIXED); - else if (value.toInt() == Qt::Unchecked) - item->setPriority(prio::IGNORED); - else - item->setPriority(prio::NORMAL); - // Update folders progress in the tree - m_rootItem->recalculateProgress(); - emit dataChanged(this->index(0,0), this->index(rowCount()-1, columnCount()-1)); - emit filteredFilesChanged(); + if (!index.isValid()) + return false; + + if ((index.column() == 0) && (role == Qt::CheckStateRole)) { + TorrentContentModelItem *item = static_cast(index.internalPointer()); + qDebug("setData(%s, %d", qPrintable(item->name()), value.toInt()); + if (item->priority() != value.toInt()) { + if (value.toInt() == Qt::PartiallyChecked) + item->setPriority(prio::MIXED); + else if (value.toInt() == Qt::Unchecked) + item->setPriority(prio::IGNORED); + else + item->setPriority(prio::NORMAL); + // Update folders progress in the tree + m_rootItem->recalculateProgress(); + emit dataChanged(this->index(0, 0), this->index(rowCount() - 1, columnCount() - 1)); + emit filteredFilesChanged(); + } + return true; } - return true; - } - if (role == Qt::EditRole) { - Q_ASSERT(index.isValid()); - TorrentContentModelItem* item = static_cast(index.internalPointer()); - switch(index.column()) { - case TorrentContentModelItem::COL_NAME: - item->setName(value.toString()); - break; - case TorrentContentModelItem::COL_PRIO: - item->setPriority(value.toInt()); - break; - default: - return false; + if (role == Qt::EditRole) { + Q_ASSERT(index.isValid()); + TorrentContentModelItem* item = static_cast(index.internalPointer()); + switch (index.column()) { + case TorrentContentModelItem::COL_NAME: + item->setName(value.toString()); + break; + case TorrentContentModelItem::COL_PRIO: + item->setPriority(value.toInt()); + break; + default: + return false; + } + emit dataChanged(index, index); + return true; } - emit dataChanged(index, index); - return true; - } - return false; + return false; } TorrentContentModelItem::ItemType TorrentContentModel::itemType(const QModelIndex& index) const { - return static_cast(index.internalPointer())->itemType(); + return static_cast(index.internalPointer())->itemType(); } int TorrentContentModel::getFileIndex(const QModelIndex& index) { - TorrentContentModelFile* item = dynamic_cast(static_cast(index.internalPointer())); - Q_ASSERT(item); - return item->fileIndex(); + TorrentContentModelFile* item = dynamic_cast(static_cast(index.internalPointer())); + Q_ASSERT(item); + return item->fileIndex(); } QVariant TorrentContentModel::data(const QModelIndex& index, int role) const { - if (!index.isValid()) - return QVariant(); + if (!index.isValid()) + return QVariant(); - TorrentContentModelItem* item = static_cast(index.internalPointer()); - if (index.column() == 0 && role == Qt::DecorationRole) { - if (item->itemType() == TorrentContentModelItem::FolderType) - return get_directory_icon(); - else - return get_file_icon(); - } - if (index.column() == 0 && role == Qt::CheckStateRole) { - if (item->data(TorrentContentModelItem::COL_PRIO).toInt() == prio::IGNORED) - return Qt::Unchecked; - if (item->data(TorrentContentModelItem::COL_PRIO).toInt() == prio::MIXED) - return Qt::PartiallyChecked; - return Qt::Checked; - } - if (role != Qt::DisplayRole) - return QVariant(); + TorrentContentModelItem* item = static_cast(index.internalPointer()); + if ((index.column() == 0) && (role == Qt::DecorationRole)) { + if (item->itemType() == TorrentContentModelItem::FolderType) + return getDirectoryIcon(); + else + return getFileIcon(); + } + if ((index.column() == 0) && (role == Qt::CheckStateRole)) { + if (item->data(TorrentContentModelItem::COL_PRIO).toInt() == prio::IGNORED) + return Qt::Unchecked; + if (item->data(TorrentContentModelItem::COL_PRIO).toInt() == prio::MIXED) + return Qt::PartiallyChecked; + return Qt::Checked; + } + if (role != Qt::DisplayRole) + return QVariant(); - return item->data(index.column()); + return item->data(index.column()); } Qt::ItemFlags TorrentContentModel::flags(const QModelIndex& index) const { - if (!index.isValid()) - return 0; + if (!index.isValid()) + return 0; - if (itemType(index) == TorrentContentModelItem::FolderType) - return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsTristate; + if (itemType(index) == TorrentContentModelItem::FolderType) + return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsTristate; - return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable; + return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable; } QVariant TorrentContentModel::headerData(int section, Qt::Orientation orientation, int role) const { - if (orientation == Qt::Horizontal && role == Qt::DisplayRole) - return m_rootItem->data(section); + if ((orientation == Qt::Horizontal) && (role == Qt::DisplayRole)) + return m_rootItem->data(section); - return QVariant(); + return QVariant(); } QModelIndex TorrentContentModel::index(int row, int column, const QModelIndex& parent) const { - if (parent.isValid() && parent.column() != 0) - return QModelIndex(); + if (parent.isValid() && (parent.column() != 0)) + return QModelIndex(); - if (column >= TorrentContentModelItem::NB_COL) - return QModelIndex(); + if (column >= TorrentContentModelItem::NB_COL) + return QModelIndex(); - TorrentContentModelFolder* parentItem; - if (!parent.isValid()) - parentItem = m_rootItem; - else - parentItem = static_cast(parent.internalPointer()); - Q_ASSERT(parentItem); + TorrentContentModelFolder* parentItem; + if (!parent.isValid()) + parentItem = m_rootItem; + else + parentItem = static_cast(parent.internalPointer()); + Q_ASSERT(parentItem); - if (row >= parentItem->childCount()) - return QModelIndex(); + if (row >= parentItem->childCount()) + return QModelIndex(); - TorrentContentModelItem* childItem = parentItem->child(row); - if (childItem) - return createIndex(row, column, childItem); - return QModelIndex(); + TorrentContentModelItem* childItem = parentItem->child(row); + if (childItem) + return createIndex(row, column, childItem); + return QModelIndex(); } QModelIndex TorrentContentModel::parent(const QModelIndex& index) const { - if (!index.isValid()) - return QModelIndex(); + if (!index.isValid()) + return QModelIndex(); - TorrentContentModelItem* childItem = static_cast(index.internalPointer()); - if (!childItem) - return QModelIndex(); + TorrentContentModelItem* childItem = static_cast(index.internalPointer()); + if (!childItem) + return QModelIndex(); - TorrentContentModelItem *parentItem = childItem->parent(); - if (parentItem == m_rootItem) - return QModelIndex(); + TorrentContentModelItem *parentItem = childItem->parent(); + if (parentItem == m_rootItem) + return QModelIndex(); - return createIndex(parentItem->row(), 0, parentItem); + return createIndex(parentItem->row(), 0, parentItem); } int TorrentContentModel::rowCount(const QModelIndex& parent) const { - if (parent.column() > 0) - return 0; + if (parent.column() > 0) + return 0; - TorrentContentModelFolder* parentItem; - if (!parent.isValid()) - parentItem = m_rootItem; - else - parentItem = dynamic_cast(static_cast(parent.internalPointer())); + TorrentContentModelFolder* parentItem; + if (!parent.isValid()) + parentItem = m_rootItem; + else + parentItem = dynamic_cast(static_cast(parent.internalPointer())); - return parentItem ? parentItem->childCount() : 0; + return parentItem ? parentItem->childCount() : 0; } void TorrentContentModel::clear() { - qDebug("clear called"); - beginResetModel(); - m_filesIndex.clear(); - m_rootItem->deleteAllChildren(); - endResetModel(); + qDebug("clear called"); + beginResetModel(); + m_filesIndex.clear(); + m_rootItem->deleteAllChildren(); + endResetModel(); } void TorrentContentModel::setupModelData(const BitTorrent::TorrentInfo &info) { - qDebug("setup model data called"); - if (info.filesCount() == 0) - return; - - emit layoutAboutToBeChanged(); - // Initialize files_index array - qDebug("Torrent contains %d files", info.filesCount()); - m_filesIndex.reserve(info.filesCount()); - - TorrentContentModelFolder* current_parent; - // Iterate over files - for (int i = 0; i < info.filesCount(); ++i) { - current_parent = m_rootItem; - QString path = Utils::Fs::fromNativePath(info.filePath(i)); - // Iterate of parts of the path to create necessary folders - QStringList pathFolders = path.split("/", QString::SkipEmptyParts); - pathFolders.removeLast(); - foreach (const QString& pathPart, pathFolders) { - if (pathPart == ".unwanted") - continue; - TorrentContentModelFolder* new_parent = current_parent->childFolderWithName(pathPart); - if (!new_parent) { - new_parent = new TorrentContentModelFolder(pathPart, current_parent); - current_parent->appendChild(new_parent); - } - current_parent = new_parent; + qDebug("setup model data called"); + if (info.filesCount() == 0) + return; + + emit layoutAboutToBeChanged(); + // Initialize files_index array + qDebug("Torrent contains %d files", info.filesCount()); + m_filesIndex.reserve(info.filesCount()); + + TorrentContentModelFolder* currentParent; + // Iterate over files + for (int i = 0; i < info.filesCount(); ++i) { + currentParent = m_rootItem; + QString path = Utils::Fs::fromNativePath(info.filePath(i)); + // Iterate of parts of the path to create necessary folders + QStringList pathFolders = path.split("/", QString::SkipEmptyParts); + pathFolders.removeLast(); + foreach (const QString& pathPart, pathFolders) { + if (pathPart == ".unwanted") + continue; + TorrentContentModelFolder* newParent = currentParent->childFolderWithName(pathPart); + if (!newParent) { + newParent = new TorrentContentModelFolder(pathPart, currentParent); + currentParent->appendChild(newParent); + } + currentParent = newParent; + } + // Actually create the file + TorrentContentModelFile* fileItem = new TorrentContentModelFile(info.fileName(i), info.fileSize(i), currentParent, i); + currentParent->appendChild(fileItem); + m_filesIndex.push_back(fileItem); } - // Actually create the file - TorrentContentModelFile* fileItem = new TorrentContentModelFile(info.fileName(i), info.fileSize(i), current_parent, i); - current_parent->appendChild(fileItem); - m_filesIndex.push_back(fileItem); - } - emit layoutChanged(); + emit layoutChanged(); } void TorrentContentModel::selectAll() { - for (int i=0; ichildCount(); ++i) { - TorrentContentModelItem* child = m_rootItem->child(i); - if (child->priority() == prio::IGNORED) - child->setPriority(prio::NORMAL); - } - emit dataChanged(index(0, 0), index(rowCount(), columnCount())); + for (int i = 0; i < m_rootItem->childCount(); ++i) { + TorrentContentModelItem* child = m_rootItem->child(i); + if (child->priority() == prio::IGNORED) + child->setPriority(prio::NORMAL); + } + emit dataChanged(index(0, 0), index(rowCount(), columnCount())); } void TorrentContentModel::selectNone() { - for (int i=0; ichildCount(); ++i) { - m_rootItem->child(i)->setPriority(prio::IGNORED); - } - emit dataChanged(index(0, 0), index(rowCount(), columnCount())); + for (int i = 0; i < m_rootItem->childCount(); ++i) + m_rootItem->child(i)->setPriority(prio::IGNORED); + emit dataChanged(index(0, 0), index(rowCount(), columnCount())); } diff --git a/src/webui/www/public/properties_content.html b/src/webui/www/public/properties_content.html index a35ce4f31..55efe430f 100644 --- a/src/webui/www/public/properties_content.html +++ b/src/webui/www/public/properties_content.html @@ -97,7 +97,7 @@ QBT_TR(Name)QBT_TR QBT_TR(Size)QBT_TR QBT_TR(Progress)QBT_TR - QBT_TR(Priority)QBT_TR + QBT_TR(Download Priority)QBT_TR