diff options
author | Arno <am@disconnect.de> | 2013-09-28 08:55:45 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2013-09-28 08:55:45 +0200 |
commit | 697541ea2c50ba97fc4b4e31e9e7c4d82be51899 (patch) | |
tree | 1f8e724c653a1f69fe0ece21dcb5409300af87e3 | |
parent | 09df993cd04065196279ce2c8c375df0d9080f78 (diff) | |
download | SheMov-697541ea2c50ba97fc4b4e31e9e7c4d82be51899.tar.gz SheMov-697541ea2c50ba97fc4b4e31e9e7c4d82be51899.tar.bz2 SheMov-697541ea2c50ba97fc4b4e31e9e7c4d82be51899.zip |
Fix copy constructor of SmTreeItem
Seems the copy constructor of SmTreeItem was botched. After copying a
rootItem, some children wouldn't show up. I guess it has something to do
with the QHash of the parents.
Replace it with an explictit deep copy function where needed.
-rw-r--r-- | archivemodel.cpp | 16 | ||||
-rw-r--r-- | archivemodel.h | 1 | ||||
-rw-r--r-- | smtreeitem.cpp | 27 | ||||
-rw-r--r-- | smtreeitem.h | 4 |
4 files changed, 19 insertions, 29 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp index 75f6509..b4a1e2b 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -976,11 +976,25 @@ ArchiveCollector::ArchiveCollector(int numFields, int order, QObject *parent) : SmTreeItem *ArchiveCollector::rootItem(){ mAccessMx.lock(); - SmTreeItem *retval = new SmTreeItem(*mRootItem); + SmTreeItem *retval = copyRecursive(mRootItem, 0); mAccessMx.unlock(); return retval; } +SmTreeItem *ArchiveCollector::copyRecursive(SmTreeItem *item, SmTreeItem *parent){ + SmTreeItem *newItem = new SmTreeItem(*item); + newItem->setParent(parent); + if(parent){ + parent->appendChild(newItem); + } + if(item->childCount()){ + for(int i = 0; i < item->childCount(); ++i){ + copyRecursive(item->child(i), newItem); + } + } + return newItem; +} + void ArchiveCollector::setCancelled(bool cancel){ QMutexLocker l(&mCancelledMx); mCancelled = cancel; diff --git a/archivemodel.h b/archivemodel.h index 83f8513..12b76be 100644 --- a/archivemodel.h +++ b/archivemodel.h @@ -130,6 +130,7 @@ class ArchiveCollector : public QThread { virtual void run(); private: + SmTreeItem *copyRecursive(SmTreeItem *item, SmTreeItem *parent); void populateBySeriesName(); void populateByGenre(); void populateByActor(); diff --git a/smtreeitem.cpp b/smtreeitem.cpp index 4548655..a8e183c 100644 --- a/smtreeitem.cpp +++ b/smtreeitem.cpp @@ -21,32 +21,7 @@ SmTreeItem::SmTreeItem(int rows, SmTreeItem *parent) : mParent(parent){ SmTreeItem::SmTreeItem(const SmTreeItem &other){ mParent = 0; mData = other.mData; - QVector<SmTreeItem*> remaining; - QHash<const SmTreeItem*, SmTreeItem*> parents; - parents.insert(&other, this); - const SmTreeItem *cur = &other; - for(int i = 0; i < cur->childCount(); ++i){ - remaining << cur->child(i); - } - while(cur){ - cur = remaining.last(); - remaining.pop_back(); - for(int i = 0; i < cur->childCount(); ++i){ - remaining << cur->child(i); - } - if(remaining.isEmpty()){ - break; - } - SmTreeItem *newItem = new SmTreeItem(mData.size()); - for(int i = 0; i < cur->columnCount(); ++i){ - newItem->setData(i, cur->data(i)); - } - SmTreeItem *newParent = parents.value(cur->parent()); - newParent->appendChild(newItem); - newItem->setParent(newParent); - parents.insert(cur, newItem); - - } + mForegroundColor = other.mForegroundColor; } SmTreeItem::~SmTreeItem(){ diff --git a/smtreeitem.h b/smtreeitem.h index a048714..4e5265c 100644 --- a/smtreeitem.h +++ b/smtreeitem.h @@ -15,7 +15,6 @@ class SmTreeItem { public: SmTreeItem(const QList<QVariant> &data, SmTreeItem *parent = 0); SmTreeItem(int rows, SmTreeItem *parent = 0); - SmTreeItem(const SmTreeItem &other); ~SmTreeItem(); void appendChild(SmTreeItem *child); SmTreeItem *child(int row) const; @@ -31,9 +30,10 @@ class SmTreeItem { void setForegroundColor(const QVariant &data); bool insertChild(int where, SmTreeItem *child); bool removeChild(int where, bool deleteChild = true); - + friend class ArchiveCollector; private: + SmTreeItem(const SmTreeItem &other); QList<SmTreeItem*> mChildren; QList<QVariant> mData; QVariant mForegroundColor; |