[Kst] branches/work/kst/1.5/kst/src/libkstapp (silent)

Andrew Walker arwalker at sumusltd.com
Tue Jul 24 20:47:11 CEST 2007


SVN commit 691970 by arwalker:

CCBUG:142897 SVN_SILENT first draft of support for hierarchical data sources in the data wizard

 M  +117 -13   kstdatawizard_i.cpp  
 M  +2 -0      kstdatawizard_i.h  


--- branches/work/kst/1.5/kst/src/libkstapp/kstdatawizard_i.cpp #691969:691970
@@ -59,6 +59,7 @@
 {
   _configWidget = 0L;
   _inTest = false;
+  _hierarchy = false;
   KST::vectorDefaults.sync();
   QString default_source = KST::vectorDefaults.dataSource();
   _url->setMode(KFile::File | KFile::Directory | KFile::ExistingOnly);
@@ -284,22 +285,23 @@
     KstDataSourcePtr ds = *KST::dataSourceList.findReusableFileName(file);
     QStringList fl;
     bool complete = false;
-    bool hierarchy = false;
     QString fileType;
     int index = 0;
     int count;
 
+    _hierarchy = false;
+
     if (ds) {
       ds->readLock();
       fl = ds->fieldList();
       fileType = ds->fileType();
       complete = ds->fieldListIsComplete();
-      hierarchy = ds->supportsHierarchy();
+      _hierarchy = ds->supportsHierarchy();
       ds->unlock();
       ds = 0L;
     } else {
       fl = KstDataSource::fieldListForSource(file, QString::null, &fileType, &complete);
-      hierarchy = KstDataSource::supportsHierarchy(file, QString::null);
+      _hierarchy = KstDataSource::supportsHierarchy(file, QString::null);
     }
 
     if (!fl.isEmpty() && !fileType.isEmpty()) {
@@ -336,14 +338,60 @@
       count = 1;
     }
 
-    for (QStringList::ConstIterator it = fl.begin(); it != fl.end(); ++it) {
-      QListViewItem *item = new QListViewItem(_vectors, *it);
-      QString str;
+    _fields.clear();
 
-      item->setDragEnabled(true);
-      str.sprintf("%0*d", count, index++);
-      item->setText(1, str);
-      _countMap[*it] = str;
+    if (_hierarchy) {
+      for (QStringList::ConstIterator it = fl.begin(); it != fl.end(); ++it) {
+        QStringList     entries = QStringList::split(QDir::separator(), (*it), FALSE);
+        QString         item;
+        QListViewItem*  parent = 0L;
+        QListViewItem*  parentOld = 0L;
+
+        for (QStringList::ConstIterator itEntry = entries.begin(); itEntry != entries.end(); ++itEntry) {
+          item += (*itEntry);
+
+          if (item.compare(*it) != 0) {
+            parent = _fields.find(item);
+            if (parent == 0L) {
+              if (parentOld) {
+                QListViewItem *listItem = new QListViewItem(parentOld, *itEntry);
+
+                parentOld->setOpen(true);
+                _fields.insert(item, listItem);
+                parentOld = listItem;
+              } else {
+                QListViewItem *listItem = new QListViewItem(_vectors, *itEntry);
+
+                _fields.insert(item, listItem);
+                parentOld = listItem;
+              }
+            } else {
+              parentOld = parent;
+            }
+
+            item += QDir::separator();
+          } else if (parentOld) {
+            QListViewItem *listItem = new QListViewItem(parentOld, *itEntry);
+
+            parentOld->setOpen(true);
+            _fields.insert(item, listItem);
+          } else {
+            QListViewItem *listItem = new QListViewItem(_vectors, *itEntry);
+
+            _fields.insert(item, listItem);
+          }
+        }
+      }
+    } else {
+      for (QStringList::ConstIterator it = fl.begin(); it != fl.end(); ++it) {
+        QListViewItem *item = new QListViewItem(_vectors, *it);
+        QString str;
+
+        item->setDragEnabled(true);
+        str.sprintf("%0*d", count, index++);
+        item->setText(1, str);
+        _countMap[*it] = str;
+      }
     }
 
     _vectors->sort();
@@ -1375,7 +1423,9 @@
   QListViewItemIterator it(_vectors);
   while (it.current()) {
     if (it.current()->isSelected()) {
-      lst.append(it.current());
+      if (it.current()->childCount() == 0) {
+        lst.append(it.current());
+      }
     }
     ++it;
   }
@@ -1383,9 +1433,36 @@
   QListViewItem *last = _vectorsToPlot->lastItem();
   QPtrListIterator<QListViewItem> iter(lst);
   while (iter.current()) {
+    QListViewItem* parent;
     QListViewItem *item = iter.current();
-    _vectors->takeItem(item);
+    parent = item->parent();
+
+    while (parent) {
+      item->setText(0, parent->text(0) + QDir::separator() + item->text(0));
+      parent = parent->parent();
+    }
+
+    parent = item->parent();
+    if (parent) {
+      QListViewItem* parentNew;
+
+      parent->takeItem(item);
+      parentNew = parent;
+      while (parentNew) {
+        parent = parentNew;
+        if (parent->childCount() == 0) {
+          parentNew = parent->parent();
+          parent->setSelected(false);
+          parent->setVisible(false);
+        } else {
+          parentNew = 0L;
+        }
+      }
+    } else {
+      _vectors->takeItem(item);
+    }
     _vectorsToPlot->insertItem(item);
+
     item->moveItem(last);
     item->setSelected(false);
     last = item;
@@ -1415,7 +1492,34 @@
   QPtrListIterator<QListViewItem> iter(lst);
   while (iter.current()) {
     _vectorsToPlot->takeItem(iter.current());
-    _vectors->insertItem(iter.current());
+    if (_hierarchy) {
+      QListViewItem* parent = 0L;
+      QStringList entries;
+      QString text = iter.current()->text(0);
+      QString item;
+
+      entries = QStringList::split(QDir::separator(), text, FALSE);
+      for (QStringList::ConstIterator itEntry = entries.begin(); itEntry != entries.end(); ++itEntry) {
+        item += (*itEntry);
+        if (text.compare(item) != 0) {
+          parent = _fields.find(item);
+          if (parent) {
+            parent->setVisible(true);
+          }
+          item += QDir::separator();
+        } else {
+          iter.current()->setText(0, entries.back());
+
+          if (parent) {
+            parent->insertItem(iter.current());
+          } else {
+            _vectors->insertItem(iter.current());
+          }
+        }
+      }
+    } else {
+      _vectors->insertItem(iter.current());
+    }
     iter.current()->setSelected(false);
     ++iter;
   }
--- branches/work/kst/1.5/kst/src/libkstapp/kstdatawizard_i.h #691969:691970
@@ -75,6 +75,8 @@
   private:
     static const QString &defaultTag;
     QString _file;
+    QDict<QListViewItem> _fields;
+    bool _hierarchy;
     bool _inTest;
     QGuardedPtr<QWidget> _configWidget;
     KstDataSourceList _sourceCache;


More information about the Kst mailing list