0030268: Inspectors - improvements in VInspector plugin
[occt.git] / tools / TreeModel / TreeModel_ItemBase.cxx
index 464a788..38ef9b2 100644 (file)
 // commercial license or contractual agreement. 
 
 #include <inspector/TreeModel_ItemBase.hxx>
-
+#include <inspector/TreeModel_ItemProperties.hxx>
 #include <inspector/TreeModel_ItemRole.hxx>
+#include <inspector/TreeModel_ItemStream.hxx>
 
+#include <Standard_Dump.hxx>
 #include <Standard_WarningsDisable.hxx>
 #include <QStringList>
 #include <Standard_WarningsRestore.hxx>
@@ -26,7 +28,7 @@
 // purpose :
 // =======================================================================
 TreeModel_ItemBase::TreeModel_ItemBase (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
- : m_bInitialized (false)
+ : m_iStreamChildren (0), m_bInitialized (false)
 {
   m_pParent = theParent;
   m_iRow = theRow;
@@ -34,7 +36,7 @@ TreeModel_ItemBase::TreeModel_ItemBase (TreeModel_ItemBasePtr theParent, const i
 }
 
 // =======================================================================
-// function :  reset
+// function :  Reset
 // purpose :
 // =======================================================================
 void TreeModel_ItemBase::Reset()
@@ -46,7 +48,12 @@ void TreeModel_ItemBase::Reset()
       anItem->Reset();
   }
   m_bInitialized = false;
+  if (!myProperties.IsNull())
+  {
+    myProperties->Reset();
+  }
   myCachedValues.clear();
+  myStream.str ("");
 }
 
 // =======================================================================
@@ -55,7 +62,7 @@ void TreeModel_ItemBase::Reset()
 // =======================================================================
 void TreeModel_ItemBase::Reset (int theRole)
 {
-  if (!myCachedValues.contains (theRole))  
+  if (!myCachedValues.contains (theRole))
     return;
 
   myCachedValues.remove (theRole);
@@ -74,7 +81,11 @@ TreeModel_ItemBasePtr TreeModel_ItemBase::Child (int theRow, int theColumn, cons
 
   TreeModel_ItemBasePtr anItem;
   if (isToCreate) {
-    anItem = createChild (theRow, theColumn);
+    if (theRow < m_iStreamChildren)
+      anItem = TreeModel_ItemStream::CreateItem (currentItem(), theRow, theColumn);
+    else
+      anItem = createChild (theRow - m_iStreamChildren, theColumn);
+
     if (anItem)
       m_ChildItems[aPos] = anItem;
   }
@@ -99,8 +110,77 @@ QVariant TreeModel_ItemBase::cachedValue (const int theItemRole) const
   if (myCachedValues.contains (theItemRole))
     return myCachedValues[theItemRole];
 
-  const_cast<TreeModel_ItemBase*>(this)->myCachedValues.insert (theItemRole,
-    theItemRole == TreeModel_ItemRole_RowCountRole ? QVariant (initRowCount()) : initValue (theItemRole));
+  QVariant aValueToCache;
+  if (theItemRole == TreeModel_ItemRole_RowCountRole)
+    aValueToCache = initRowCount() + const_cast<TreeModel_ItemBase*>(this)->initStreamRowCount();
+  else
+    aValueToCache = initValue (theItemRole);
 
+  myCachedValues.insert (theItemRole, aValueToCache);
   return myCachedValues.contains (theItemRole) ? myCachedValues[theItemRole] : QVariant();
 }
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void TreeModel_ItemBase::Init()
+{
+  m_bInitialized = true;
+
+  initStream(myStream);
+  initStreamRowCount();
+}
+
+// =======================================================================
+// function : Object
+// purpose :
+// =======================================================================
+const Handle(Standard_Transient)& TreeModel_ItemBase::Object() const
+{
+  static Handle(Standard_Transient) aNullObject;
+  return aNullObject;
+}
+
+// =======================================================================
+// function : initStreamRowCount
+// purpose :
+// =======================================================================
+int TreeModel_ItemBase::initStreamRowCount()
+{
+  int aStreamChildrenCount = 0;
+  if (Column() == 0)
+  {
+    Standard_SStream aStream;
+    initStream (aStream);
+    if (!Standard_Dump::Text (aStream).IsEmpty())
+    {
+      if (!myProperties)
+      {
+        myProperties = new TreeModel_ItemProperties();
+        myProperties->SetItem (currentItem());
+      }
+      myProperties->Init();
+      aStreamChildrenCount = myProperties->Children().Extent();
+    }
+  }
+  m_iStreamChildren = aStreamChildrenCount;
+  return m_iStreamChildren;
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant TreeModel_ItemBase::initValue (const int theItemRole) const
+{
+  if (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole)
+    return QVariant();
+
+  switch (Column())
+  {
+    case 1: { return Row(); }
+  }
+
+  return QVariant();
+}