summaryrefslogtreecommitdiffstats
path: root/smtreeitem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'smtreeitem.cpp')
-rw-r--r--smtreeitem.cpp40
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(){