Browse Source

Optimizations to TorrentContentModel

First step to address issue #24.
adaptive-webui-19844
Christophe Dumez 12 years ago
parent
commit
30be83d445
  1. 11
      src/properties/propertieswidget.cpp
  2. 41
      src/torrentcontentmodel.cpp
  3. 4
      src/torrentcontentmodel.h
  4. 12
      src/torrentcontentmodelitem.cpp
  5. 6
      src/torrentcontentmodelitem.h

11
src/properties/propertieswidget.cpp

@ -234,13 +234,12 @@ void PropertiesWidget::updateTorrentInfos(const QTorrentHandle& _h) {
} }
} }
void PropertiesWidget::loadTorrentInfos(const QTorrentHandle &_h) { void PropertiesWidget::loadTorrentInfos(const QTorrentHandle& _h)
{
clear(); clear();
h = _h; h = _h;
if (!h.is_valid()) { if (!h.is_valid())
clear();
return; return;
}
try { try {
// Save path // Save path
@ -261,9 +260,7 @@ void PropertiesWidget::loadTorrentInfos(const QTorrentHandle &_h) {
PropListModel->model()->setupModelData(h.get_torrent_info()); PropListModel->model()->setupModelData(h.get_torrent_info());
filesList->setExpanded(PropListModel->index(0, 0), true); filesList->setExpanded(PropListModel->index(0, 0), true);
} }
} catch(invalid_handle& e) { } catch(const invalid_handle& e) { }
}
// Load dynamic data // Load dynamic data
loadDynamicData(); loadDynamicData();
} }

41
src/torrentcontentmodel.cpp

@ -57,7 +57,7 @@ void TorrentContentModel::updateFilesProgress(const std::vector<libtorrent::size
emit dataChanged(index(0,0), index(rowCount(), columnCount())); emit dataChanged(index(0,0), index(rowCount(), columnCount()));
} }
void TorrentContentModel::updateFilesPriorities(const std::vector<int> &fprio) void TorrentContentModel::updateFilesPriorities(const std::vector<int>& fprio)
{ {
emit layoutAboutToBeChanged(); emit layoutAboutToBeChanged();
Q_ASSERT(m_filesIndex.size() == (int)fprio.size()); Q_ASSERT(m_filesIndex.size() == (int)fprio.size());
@ -71,8 +71,9 @@ void TorrentContentModel::updateFilesPriorities(const std::vector<int> &fprio)
std::vector<int> TorrentContentModel::getFilesPriorities() const std::vector<int> TorrentContentModel::getFilesPriorities() const
{ {
std::vector<int> prio; std::vector<int> prio;
for (int i=0; i<m_filesIndex.size(); ++i) { prio.reserve(m_filesIndex.size());
prio.push_back(m_filesIndex[i]->getPriority()); foreach (const TorrentContentModelItem* file, m_filesIndex) {
prio.push_back(file->getPriority());
} }
return prio; return prio;
} }
@ -147,7 +148,7 @@ TorrentContentModelItem::FileType TorrentContentModel::getType(const QModelIndex
int TorrentContentModel::getFileIndex(const QModelIndex& index) int TorrentContentModel::getFileIndex(const QModelIndex& index)
{ {
TorrentContentModelItem *item = static_cast<TorrentContentModelItem*>(index.internalPointer()); TorrentContentModelItem* item = static_cast<TorrentContentModelItem*>(index.internalPointer());
return item->getFileIndex(); return item->getFileIndex();
} }
@ -238,7 +239,7 @@ QModelIndex TorrentContentModel::parent(const QModelIndex& index) const
int TorrentContentModel::rowCount(const QModelIndex& parent) const int TorrentContentModel::rowCount(const QModelIndex& parent) const
{ {
TorrentContentModelItem *parentItem; TorrentContentModelItem* parentItem;
if (parent.column() > 0) if (parent.column() > 0)
return 0; return 0;
@ -260,7 +261,7 @@ void TorrentContentModel::clear()
endResetModel(); endResetModel();
} }
void TorrentContentModel::setupModelData(const libtorrent::torrent_info &t) void TorrentContentModel::setupModelData(const libtorrent::torrent_info& t)
{ {
qDebug("setup model data called"); qDebug("setup model data called");
if (t.num_files() == 0) if (t.num_files() == 0)
@ -271,28 +272,28 @@ void TorrentContentModel::setupModelData(const libtorrent::torrent_info &t)
qDebug("Torrent contains %d files", t.num_files()); qDebug("Torrent contains %d files", t.num_files());
m_filesIndex.reserve(t.num_files()); m_filesIndex.reserve(t.num_files());
TorrentContentModelItem *parent = m_rootItem; TorrentContentModelItem* parent = m_rootItem;
TorrentContentModelItem *root_folder = parent; TorrentContentModelItem* root_folder = parent;
TorrentContentModelItem *current_parent; TorrentContentModelItem* current_parent;
// Iterate over files // Iterate over files
for (int i=0; i<t.num_files(); ++i) { for (int i=0; i<t.num_files(); ++i) {
libtorrent::file_entry fentry = t.file_at(i); const libtorrent::file_entry& fentry = t.file_at(i);
current_parent = root_folder; current_parent = root_folder;
#if LIBTORRENT_VERSION_MINOR >= 16 #if LIBTORRENT_VERSION_MINOR >= 16
QString path = QDir::cleanPath(misc::toQStringU(fentry.path)).replace("\\", "/"); QString path = misc::toQStringU(fentry.path);
#else #else
QString path = QDir::cleanPath(misc::toQStringU(fentry.path.string())).replace("\\", "/"); QString path = misc::toQStringU(fentry.path.string());
#endif #endif
// Iterate of parts of the path to create necessary folders // Iterate of parts of the path to create necessary folders
QStringList pathFolders = path.split("/"); QStringList pathFolders = path.split(QRegExp("[/\\\\]"), QString::SkipEmptyParts);
pathFolders.removeAll(".unwanted"); pathFolders.removeLast();
pathFolders.takeLast(); foreach (const QString& pathPart, pathFolders) {
foreach (const QString &pathPart, pathFolders) { if (pathPart == ".unwanted")
TorrentContentModelItem *new_parent = current_parent->childWithName(pathPart); continue;
if (!new_parent) { TorrentContentModelItem* new_parent = current_parent->childWithName(pathPart);
if (!new_parent)
new_parent = new TorrentContentModelItem(pathPart, current_parent); new_parent = new TorrentContentModelItem(pathPart, current_parent);
}
current_parent = new_parent; current_parent = new_parent;
} }
// Actually create the file // Actually create the file
@ -304,7 +305,7 @@ void TorrentContentModel::setupModelData(const libtorrent::torrent_info &t)
void TorrentContentModel::selectAll() void TorrentContentModel::selectAll()
{ {
for (int i=0; i<m_rootItem->childCount(); ++i) { for (int i=0; i<m_rootItem->childCount(); ++i) {
TorrentContentModelItem *child = m_rootItem->child(i); TorrentContentModelItem* child = m_rootItem->child(i);
if (child->getPriority() == prio::IGNORED) if (child->getPriority() == prio::IGNORED)
child->setPriority(prio::NORMAL); child->setPriority(prio::NORMAL);
} }

4
src/torrentcontentmodel.h

@ -70,8 +70,8 @@ public slots:
void selectNone(); void selectNone();
private: private:
TorrentContentModelItem *m_rootItem; TorrentContentModelItem* m_rootItem;
QVector<TorrentContentModelItem *> m_filesIndex; QVector<TorrentContentModelItem*> m_filesIndex;
}; };
#endif // TORRENTCONTENTMODEL_H #endif // TORRENTCONTENTMODEL_H

12
src/torrentcontentmodelitem.cpp

@ -252,15 +252,15 @@ void TorrentContentModelItem::updatePriority()
return; return;
} }
} }
// All child items have the same priorrity // All child items have the same priority
// Update mine if necessary // Update own if necessary
if (prio != getPriority()) if (prio != getPriority())
setPriority(prio); setPriority(prio);
} }
TorrentContentModelItem* TorrentContentModelItem::childWithName(const QString& name) const TorrentContentModelItem* TorrentContentModelItem::childWithName(const QString& name) const
{ {
foreach (TorrentContentModelItem *child, m_childItems) { foreach (TorrentContentModelItem* child, m_childItems) {
if (child->getName() == name) if (child->getName() == name)
return child; return child;
} }
@ -272,7 +272,7 @@ bool TorrentContentModelItem::isFolder() const
return (m_type==FOLDER); return (m_type==FOLDER);
} }
void TorrentContentModelItem::appendChild(TorrentContentModelItem *item) void TorrentContentModelItem::appendChild(TorrentContentModelItem* item)
{ {
Q_ASSERT(item); Q_ASSERT(item);
Q_ASSERT(m_type != TFILE); Q_ASSERT(m_type != TFILE);
@ -285,7 +285,7 @@ void TorrentContentModelItem::appendChild(TorrentContentModelItem *item)
m_childItems.insert(i, item); m_childItems.insert(i, item);
} }
TorrentContentModelItem* TorrentContentModelItem::child(int row) TorrentContentModelItem* TorrentContentModelItem::child(int row) const
{ {
//Q_ASSERT(row >= 0 && row < childItems.size()); //Q_ASSERT(row >= 0 && row < childItems.size());
return m_childItems.value(row, 0); return m_childItems.value(row, 0);
@ -315,7 +315,7 @@ int TorrentContentModelItem::row() const
return 0; return 0;
} }
TorrentContentModelItem* TorrentContentModelItem::parent() TorrentContentModelItem* TorrentContentModelItem::parent() const
{ {
return m_parentItem; return m_parentItem;
} }

6
src/torrentcontentmodelitem.h

@ -80,18 +80,18 @@ public:
bool isFolder() const; bool isFolder() const;
void appendChild(TorrentContentModelItem *item); void appendChild(TorrentContentModelItem *item);
TorrentContentModelItem *child(int row); TorrentContentModelItem* child(int row) const;
int childCount() const; int childCount() const;
int columnCount() const; int columnCount() const;
QVariant data(int column) const; QVariant data(int column) const;
int row() const; int row() const;
TorrentContentModelItem *parent(); TorrentContentModelItem* parent() const;
void deleteAllChildren(); void deleteAllChildren();
const QList<TorrentContentModelItem*>& children() const; const QList<TorrentContentModelItem*>& children() const;
private: private:
TorrentContentModelItem *m_parentItem; TorrentContentModelItem* m_parentItem;
FileType m_type; FileType m_type;
QList<TorrentContentModelItem*> m_childItems; QList<TorrentContentModelItem*> m_childItems;
QList<QVariant> m_itemData; QList<QVariant> m_itemData;

Loading…
Cancel
Save