From d7ea394993fca27d0c5b5195431c1da2421a059d Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Mon, 27 Aug 2012 21:04:24 +0300 Subject: [PATCH] Great improve size calculation in torrent content model Step to address issue #24. --- src/torrentcontentmodelfile.cpp | 4 +--- src/torrentcontentmodelfolder.cpp | 20 +++++++------------- src/torrentcontentmodelfolder.h | 2 +- src/torrentcontentmodelitem.cpp | 1 + 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/torrentcontentmodelfile.cpp b/src/torrentcontentmodelfile.cpp index a8d640f0d..e25103884 100644 --- a/src/torrentcontentmodelfile.cpp +++ b/src/torrentcontentmodelfile.cpp @@ -53,9 +53,8 @@ TorrentContentModelFile::TorrentContentModelFile(const libtorrent::file_entry& f m_size = (qulonglong)f.size; - // Update parent + // Add to parent m_parentItem->appendChild(this); - m_parentItem->updateSize(); } int TorrentContentModelFile::fileIndex() const @@ -74,7 +73,6 @@ void TorrentContentModelFile::setPriority(int new_prio, bool update_parent) // Update parent if (update_parent) { - m_parentItem->updateSize(); m_parentItem->updateProgress(); m_parentItem->updatePriority(); } diff --git a/src/torrentcontentmodelfolder.cpp b/src/torrentcontentmodelfolder.cpp index 91f50e817..bb35adb91 100644 --- a/src/torrentcontentmodelfolder.cpp +++ b/src/torrentcontentmodelfolder.cpp @@ -39,7 +39,7 @@ TorrentContentModelFolder::TorrentContentModelFolder(const QString& name, Torren if (m_name.endsWith(".!qB")) m_name.chop(4); - // Update parent + // Add to parent m_parentItem->appendChild(this); } @@ -71,6 +71,9 @@ void TorrentContentModelFolder::appendChild(TorrentContentModelItem* item) { Q_ASSERT(item); m_childItems.append(item); + // Update own size + if (item->itemType() == FileType) + increaseSize(item->size()); } TorrentContentModelItem* TorrentContentModelFolder::child(int row) const @@ -132,7 +135,6 @@ void TorrentContentModelFolder::setPriority(int new_prio, bool update_parent) child->setPriority(m_priority, false); } - updateSize(); updateProgress(); } @@ -154,19 +156,11 @@ void TorrentContentModelFolder::updateProgress() } } -void TorrentContentModelFolder::updateSize() +void TorrentContentModelFolder::increaseSize(qulonglong delta) { if (isRootItem()) return; - qulonglong size = 0; - foreach (TorrentContentModelItem* child, m_childItems) { - if (child->priority() != prio::IGNORED) - size += child->size(); - } - - if (size != m_size) { - m_size = size; - m_parentItem->updateSize(); - } + m_size += delta; + m_parentItem->increaseSize(delta); } diff --git a/src/torrentcontentmodelfolder.h b/src/torrentcontentmodelfolder.h index 1f520b2a1..8adff1288 100644 --- a/src/torrentcontentmodelfolder.h +++ b/src/torrentcontentmodelfolder.h @@ -46,7 +46,7 @@ public: ItemType itemType() const { return FolderType; } - void updateSize(); + void increaseSize(qulonglong delta); void updateProgress(); void updatePriority(); diff --git a/src/torrentcontentmodelitem.cpp b/src/torrentcontentmodelitem.cpp index 23aa99ce5..429d8eddb 100644 --- a/src/torrentcontentmodelitem.cpp +++ b/src/torrentcontentmodelitem.cpp @@ -36,6 +36,7 @@ TorrentContentModelItem::TorrentContentModelItem(TorrentContentModelFolder* parent) : m_parentItem(parent) + , m_size(0) , m_priority(prio::NORMAL) , m_totalDone(0) {