diff options
Diffstat (limited to 'smtreeitem.cpp')
-rw-r--r-- | smtreeitem.cpp | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/smtreeitem.cpp b/smtreeitem.cpp index 77a75d5..4548655 100644 --- a/smtreeitem.cpp +++ b/smtreeitem.cpp @@ -5,6 +5,9 @@ 2 of the License, or (at your option) any later version. */ +#include <QVector> +#include <QHash> + #include "smtreeitem.h" SmTreeItem::SmTreeItem(const QList<QVariant> &data, SmTreeItem *parent) : mData(data), mParent(parent) {} @@ -16,15 +19,34 @@ SmTreeItem::SmTreeItem(int rows, SmTreeItem *parent) : mParent(parent){ } SmTreeItem::SmTreeItem(const SmTreeItem &other){ - mData = other.mData; - if(other.mParent){ - mParent = new SmTreeItem(*mParent); - }else{ - mParent = 0; - } - foreach(SmTreeItem *child, other.mChildren){ - mChildren << new SmTreeItem(*child); - } + 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); + + } } SmTreeItem::~SmTreeItem(){ |