Browse Source

Cache last traverse result while parsing file tree

PR #16376.
adaptive-webui-19844
Prince Gupta 2 years ago committed by GitHub
parent
commit
d5e6d161f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 30
      src/gui/torrentcontentmodel.cpp

30
src/gui/torrentcontentmodel.cpp

@ -505,34 +505,46 @@ void TorrentContentModel::setupModelData(const BitTorrent::AbstractFileStorage & @@ -505,34 +505,46 @@ void TorrentContentModel::setupModelData(const BitTorrent::AbstractFileStorage &
qDebug("Torrent contains %d files", filesCount);
m_filesIndex.reserve(filesCount);
TorrentContentModelFolder *currentParent;
QHash<TorrentContentModelFolder *, QHash<QString, TorrentContentModelFolder *>> folderMap;
QVector<QString> lastParentPath;
TorrentContentModelFolder *lastParent = m_rootItem;
// Iterate over files
for (int i = 0; i < filesCount; ++i)
{
currentParent = m_rootItem;
const QString path = info.filePath(i).data();
// Iterate of parts of the path to create necessary folders
QList<QStringView> pathFolders = QStringView(path).split(u'/', Qt::SkipEmptyParts);
pathFolders.removeLast();
const QString fileName = pathFolders.takeLast().toString();
if (!std::equal(lastParentPath.begin(), lastParentPath.end()
, pathFolders.begin(), pathFolders.end()))
{
lastParentPath.clear();
lastParentPath.reserve(pathFolders.size());
// rebuild the path from the root
lastParent = m_rootItem;
for (const QStringView pathPart : asConst(pathFolders))
{
const QString folderName = pathPart.toString();
TorrentContentModelFolder *&newParent = folderMap[currentParent][folderName];
lastParentPath.push_back(folderName);
TorrentContentModelFolder *&newParent = folderMap[lastParent][folderName];
if (!newParent)
{
newParent = new TorrentContentModelFolder(folderName, currentParent);
currentParent->appendChild(newParent);
newParent = new TorrentContentModelFolder(folderName, lastParent);
lastParent->appendChild(newParent);
}
currentParent = newParent;
lastParent = newParent;
}
}
// Actually create the file
TorrentContentModelFile *fileItem = new TorrentContentModelFile(
info.filePath(i).filename(), info.fileSize(i), currentParent, i);
currentParent->appendChild(fileItem);
fileName, info.fileSize(i), lastParent, i);
lastParent->appendChild(fileItem);
m_filesIndex.push_back(fileItem);
}
emit layoutChanged();

Loading…
Cancel
Save