Salome HOME
Copyrights update 2015.
[modules/paravis.git] / src / Plugins / MEDReader / ParaViewPlugin / pqMEDReaderPanel.cxx
index c33b648f75aa273f8aa1ee0aab135c1a041994dc..4a0ec188edd103f0a6c60f404b7f48f63723c994 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2010-2014  CEA/DEN, EDF R&D
+// Copyright (C) 2010-2015  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -39,6 +39,7 @@
 #include "vtkStringArray.h"
 #include "vtkDataSetAttributes.h"
 #include "vtkMEDReader.h"
+#include "vtkSMSourceProxy.h"
 
 #include "pqTreeWidgetItemObject.h"
 #include "pqSMAdaptor.h"
@@ -51,6 +52,8 @@
 
 #include <QHeaderView>
 
+#include <sstream>
+
 static const char ZE_SEP[]="@@][@@";
 
 class PixSingle
@@ -118,7 +121,7 @@ public:
   QMap<QTreeWidgetItem*, QString> TreeItemToPropMap;
 };
 
-pqMEDReaderPanel::pqMEDReaderPanel(pqProxy *object_proxy, QWidget *p):Superclass(object_proxy,p),_reload_req(false),_optional_widget(0)
+pqMEDReaderPanel::pqMEDReaderPanel(pqProxy *object_proxy, QWidget *p):Superclass(object_proxy,p),_reload_req(false),_is_fields_status_changed(false),_optional_widget(0)
 {
   initAll();
 }
@@ -135,7 +138,10 @@ void pqMEDReaderPanel::initAll()
   vtkPVSILInformation *info(vtkPVSILInformation::New());
   reader->GatherInformation(info);
   vtkGraph *g(info->GetSIL());
-  vtkMutableDirectedGraph *g2(vtkMutableDirectedGraph::SafeDownCast(g));
+  if(!g)//something wrong server side...
+    return ;
+  //vtkMutableDirectedGraph *g2(vtkMutableDirectedGraph::SafeDownCast(g));// agy: this line does not work in client/server mode ! but it works in standard mode ! Don't know why. ParaView bug ?
+  vtkMutableDirectedGraph *g2(static_cast<vtkMutableDirectedGraph *>(g));
   int idNames(0);
   vtkAbstractArray *verticesNames(g2->GetVertexData()->GetAbstractArray("Names",idNames));
   vtkStringArray *verticesNames2(vtkStringArray::SafeDownCast(verticesNames));
@@ -212,7 +218,7 @@ void pqMEDReaderPanel::initAll()
               QString name2(QString::fromStdString((const char *)verticesNames2->GetValue(id3))); QList<QString> strs2; strs2.append(name2);
               pqTreeWidgetItemObject *item2(new pqTreeWidgetItemObject(item1,strs2));
               item2->setData(0,Qt::UserRole,name2);
-              item2->setData(0,Qt::CheckStateRole,0);
+              item2->setChecked(false);
               vtkAdjacentVertexIterator *it3(vtkAdjacentVertexIterator::New());//fields !
               g2->GetAdjacentVertices(id3,it3);
               vtkIdType id3Arrs(it3->Next());
@@ -222,60 +228,66 @@ void pqMEDReaderPanel::initAll()
                 {
                   vtkIdType id4(it3Arrs->Next());
                   std::string name3CppFull((const char *)verticesNames2->GetValue(id4));
-                  std::size_t pos(name3CppFull.find_first_of(ZE_SEP));
+                  std::size_t pos(name3CppFull.find(ZE_SEP));
                   std::string name3Only(name3CppFull.substr(0,pos)); std::string spatialDiscr(name3CppFull.substr(pos+sizeof(ZE_SEP)-1));
                   QString name3(QString::fromStdString(name3Only)); QList<QString> strs3; strs3.append(name3);
                   QString toolTipName3(name3+QString(" (")+spatialDiscr.c_str()+QString(")"));
-                 //
-                 vtkAdjacentVertexIterator *it4(vtkAdjacentVertexIterator::New());// is it a special field ? A field mesh ?
-                 g2->GetAdjacentVertices(id4,it4);
-                 bool isSpecial(it4->HasNext());
-                 it4->Delete();
-                 //
+                  //
+                  vtkAdjacentVertexIterator *it4(vtkAdjacentVertexIterator::New());// is it a special field ? A field mesh ?
+                  g2->GetAdjacentVertices(id4,it4);
+                  bool isSpecial(it4->HasNext());
+                  it4->Delete();
+                  //
                   pqTreeWidgetItemObject *item3(new pqTreeWidgetItemObject(item2,strs3));
                   _all_lev4.push_back(item3);
                   item3->setData(0,Qt::UserRole,name3);
-                  item3->setData(0,Qt::CheckStateRole,0);
-                 if(isSpecial)
-                   {
-                     QFont font; font.setItalic(true); font.setUnderline(true);
-                     item3->setData(0,Qt::FontRole,QVariant(font));
-                     item3->setData(0,Qt::ToolTipRole,QString("Whole \"%1\" mesh").arg(name3));
-                     item3->setData(0,Qt::DecorationRole,PixSingle::GetInstance().getWholeMeshPix());
-                   }
-                 else
-                   {
-                     item3->setData(0,Qt::ToolTipRole,toolTipName3);
-                     item3->setData(0,Qt::DecorationRole,PixSingle::GetInstance().getPixFromStr(spatialDiscr));
-                   }
-                  this->propertyManager()->registerLink(item3,"checked",SIGNAL(checkedStateChanged(bool)),this->proxy(),SMProperty,ll);
+                  item3->setChecked(false);
+                  if(isSpecial)
+                    {
+                      QFont font; font.setItalic(true);        font.setUnderline(true);
+                      item3->setData(0,Qt::FontRole,QVariant(font));
+                      item3->setData(0,Qt::ToolTipRole,QString("Whole \"%1\" mesh").arg(name3));
+                      item3->setData(0,Qt::DecorationRole,PixSingle::GetInstance().getWholeMeshPix());
+                    }
+                  else
+                    {
+                      item3->setData(0,Qt::ToolTipRole,toolTipName3);
+                      item3->setData(0,Qt::DecorationRole,PixSingle::GetInstance().getPixFromStr(spatialDiscr));
+                    }
                   _leaves.insert(std::pair<pqTreeWidgetItemObject *,int>(item3,ll));
-                  connect(item2,SIGNAL(checkedStateChanged(bool)),item3,SLOT(setChecked(bool)));
+                  std::ostringstream pdm; pdm << name0.toStdString() << "/" << name1.toStdString() << "/" << name2.toStdString() << "/" << name3CppFull;
+                  (static_cast<vtkSMStringVectorProperty *>(SMProperty))->SetElement(2*ll,pdm.str().c_str());
+                  char tmp2[2]; tmp2[0]=(kk==0?'1':'0'); tmp2[1]='\0';
+                  std::string tmp(tmp2);
+                  (static_cast<vtkSMStringVectorProperty *>(SMProperty))->SetElement(2*ll+1,tmp.c_str());
+                  //SMProperty->ResetToDefault();
+                  item2->setChecked(kk==0);
+                  item3->setChecked(kk==0);
+                  item3->setProperty("PosInStringVector",QVariant(ll));
                   connect(item3,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
                   ll++;
                 }
-              vtkIdType id3Gts(it3->Next());
-              vtkAdjacentVertexIterator *it3Gts(vtkAdjacentVertexIterator::New());//geo types in fields !
-              g2->GetAdjacentVertices(id3Gts,it3Gts);
-              QString toolTipName2(name2);
-              while(it3Gts->HasNext())
-                {
-                  vtkIdType idGt(it3Gts->Next());
-                  std::string gtName((const char *)verticesNames2->GetValue(idGt));
-                  toolTipName2=QString("%1\n- %2").arg(toolTipName2).arg(QString(gtName.c_str()));
-                }
-              item2->setData(0,Qt::ToolTipRole,toolTipName2);
-              it3Gts->Delete();
-              it3->Delete();
-              it3Arrs->Delete();
-              if(kk==0)
-                item2->setChecked(true);
-              kk++;
-            }
-          it2->Delete();
-        }
-      it1->Delete();
-    }
+                connect(item2,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev3HasBeenFired(bool)));
+                vtkIdType id3Gts(it3->Next());
+                vtkAdjacentVertexIterator *it3Gts(vtkAdjacentVertexIterator::New());//geo types in fields !
+                g2->GetAdjacentVertices(id3Gts,it3Gts);
+                QString toolTipName2(name2);
+                while(it3Gts->HasNext())
+                  {
+                    vtkIdType idGt(it3Gts->Next());
+                    std::string gtName((const char *)verticesNames2->GetValue(idGt));
+                    toolTipName2=QString("%1\n- %2").arg(toolTipName2).arg(QString(gtName.c_str()));
+                  }
+                item2->setData(0,Qt::ToolTipRole,toolTipName2);
+                it3Gts->Delete();
+                it3->Delete();
+                it3Arrs->Delete();
+                kk++;
+              }
+            it2->Delete();
+          }
+        it1->Delete();
+      }
   it0->Delete();
   this->UI->Fields->header()->setStretchLastSection(true);
   this->UI->Fields->expandAll();
@@ -337,11 +349,36 @@ void pqMEDReaderPanel::updateSIL()
     }
 }
 
-void pqMEDReaderPanel::aLev4HasBeenFired()
+void pqMEDReaderPanel::aLev3HasBeenFired(bool v)
 {
   pqTreeWidgetItemObject *zeItem(qobject_cast<pqTreeWidgetItemObject *>(sender()));
   if(!zeItem)
     return;
+  for(int i=0;i<zeItem->childCount();i++)
+    {
+      QTreeWidgetItem *elt(zeItem->child(i));
+      pqTreeWidgetItemObject *eltC(dynamic_cast<pqTreeWidgetItemObject *>(elt));
+      if(eltC)
+        {
+          eltC->setChecked(v);
+          aLev4HasBeenFiredBy(eltC);
+        }
+    }
+  putLev3InOrder();
+  somethingChangedInFieldRepr();
+}
+
+void pqMEDReaderPanel::aLev4HasBeenFired()
+{
+  pqTreeWidgetItemObject *zeItem(qobject_cast<pqTreeWidgetItemObject *>(sender()));
+  if(zeItem)
+    aLev4HasBeenFiredBy(zeItem);
+  putLev3InOrder();
+  somethingChangedInFieldRepr();
+}
+
+void pqMEDReaderPanel::aLev4HasBeenFiredBy(pqTreeWidgetItemObject *zeItem)
+{
   pqTreeWidgetItemObject *father(dynamic_cast<pqTreeWidgetItemObject *>(zeItem->QTreeWidgetItem::parent()));
   QTreeWidgetItem *godFather(father->QTreeWidgetItem::parent()->parent());
   if(!father)
@@ -351,26 +388,20 @@ void pqMEDReaderPanel::aLev4HasBeenFired()
       bool isActivatedTSChanged(false);
       // This part garantees that all leaves having not the same father than zeItem are desactivated
       foreach(pqTreeWidgetItemObject* elt,this->_all_lev4)
-        {
-          QTreeWidgetItem *testFath(elt->QTreeWidgetItem::parent());
-          if(testFath!=father)
-            if(elt->isChecked())
+      {
+        QTreeWidgetItem *testFath(elt->QTreeWidgetItem::parent());
+        if(testFath!=father)
+          if(elt->isChecked())
+            {
               {
+                disconnect(elt,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
                 elt->setChecked(false);
-                if(godFather!=testFath->parent()->parent())
-                  isActivatedTSChanged=true;
+                connect(elt,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
               }
-        }
-      //If all leaves are checked the father is check too
-      bool allItemsAreChked(true);
-      for(int i=0;i<father->childCount() && allItemsAreChked;i++)
-        {
-          pqTreeWidgetItemObject *elt(dynamic_cast<pqTreeWidgetItemObject *>(father->child(i)));
-          if(elt && !elt->isChecked())
-            allItemsAreChked=false;
-        }
-      if(allItemsAreChked && !father->isChecked())
-        father->setChecked(true);
+              if(godFather!=testFath->parent()->parent())
+                isActivatedTSChanged=true;
+            }
+      }
       // the user by clicking to a new entry has changed of TimeStepSeries -> notify it to thee time step selector widget
       if(isActivatedTSChanged)
         {
@@ -389,19 +420,40 @@ void pqMEDReaderPanel::aLev4HasBeenFired()
             allItemsAreUnChked=false;
         }
       if(allItemsAreUnChked)
-        zeItem->setChecked(true);// OK zeItem was required to be unchecked but as it is the last one. Recheck it !
-      else
-        {// if all items are uncheked inside a same parent - uncheck the parent
-          allItemsAreUnChked=true;
-          for(int i=0;i<father->childCount() && allItemsAreUnChked;i++)
+        {
+          disconnect(zeItem,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
+          zeItem->setChecked(true);// OK zeItem was required to be unchecked but as it is the last one. Recheck it !
+          connect(zeItem,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
+        }
+    }
+}
+
+void pqMEDReaderPanel::putLev3InOrder()
+{
+  std::vector<pqTreeWidgetItemObject *>::iterator it0(_all_lev4.begin()),it1;
+  while(it0!=_all_lev4.end())
+    {
+      QTreeWidgetItem *curFather((*it0)->QTreeWidgetItem::parent());
+      for(it1=it0+1;it1!=_all_lev4.end() && (*it1)->QTreeWidgetItem::parent()==curFather;it1++);
+      bool isAllFalse(true),isAllTrue(true);
+      for(std::vector<pqTreeWidgetItemObject *>::iterator it=it0;it!=it1;it++)
+        {
+          if((*it)->isChecked())
+            isAllFalse=false;
+          else
+            isAllTrue=false;
+        }
+      if(isAllFalse || isAllTrue)
+        {
+          pqTreeWidgetItemObject *father(dynamic_cast<pqTreeWidgetItemObject *>(curFather));
+          if(father)
             {
-              pqTreeWidgetItemObject *elt(dynamic_cast<pqTreeWidgetItemObject *>(father->child(i)));
-              if(elt && elt->isChecked())
-            allItemsAreUnChked=false;
+              disconnect(father,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev3HasBeenFired(bool)));
+              father->setChecked(isAllTrue);
+              connect(father,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev3HasBeenFired(bool)));
             }
-          if(allItemsAreUnChked && father->isChecked())
-            father->setChecked(false);
-        } 
+        }
+      it0=it1;
     }
 }
 
@@ -462,12 +514,80 @@ int pqMEDReaderPanel::getMaxNumberOfTS() const
   int ret(0);
   for(std::vector<pqTreeWidgetItemObject *>::const_iterator it=_all_lev4.begin();it!=_all_lev4.end();it++)
     {
-      if((*it)->property("checked").toInt())
+      QTreeWidgetItem *obj((*it)->QTreeWidgetItem::parent()->QTreeWidgetItem::parent()->QTreeWidgetItem::parent());
+      pqTreeWidgetItemObject *objC(dynamic_cast<pqTreeWidgetItemObject *>(obj));
+      ret=std::max(ret,objC->property("NbOfTS").toInt());
+    }
+  return ret;
+}
+
+void pqMEDReaderPanel::updateInformationAndDomains()
+{
+  pqNamedObjectPanel::updateInformationAndDomains();
+  if(_is_fields_status_changed)
+    {
+      vtkSMProxy *proxy(this->proxy());
+      vtkSMProperty *SMProperty(proxy->GetProperty("FieldsStatus"));
+      SMProperty->Modified();// agy : THE LINE FOR 7.5.1 !
+      _is_fields_status_changed=false;
+    }
+}
+
+/*!
+ * This slot is called by this->UI->Fields when one/several leaves have been modified.
+ */
+void pqMEDReaderPanel::somethingChangedInFieldRepr()
+{
+  ///
+  vtkSMProxy *proxy(this->proxy());
+  vtkSMProperty *SMProperty(proxy->GetProperty("FieldsStatus"));
+  vtkSMStringVectorProperty *sm(dynamic_cast<vtkSMStringVectorProperty *>(SMProperty));
+  unsigned int nb(sm->GetNumberOfElements());
+  std::vector<std::string> sts(nb);
+  for(unsigned int i=0;i<nb;i++)
+    sts[i]=sm->GetElement(i);
+  ///
+  pqExodusIIVariableSelectionWidget *sc(this->UI->Fields);
+  for(int i0=0;i0<sc->topLevelItemCount();i0++)
+    {
+      QTreeWidgetItem *lev0(sc->topLevelItem(i0));//TS
+      for(int i1=0;i1<lev0->childCount();i1++)
         {
-          QTreeWidgetItem *obj((*it)->QTreeWidgetItem::parent()->QTreeWidgetItem::parent()->QTreeWidgetItem::parent());
-          pqTreeWidgetItemObject *objC(dynamic_cast<pqTreeWidgetItemObject *>(obj));
-          ret=std::max(ret,objC->property("NbOfTS").toInt());
+          QTreeWidgetItem *lev1(lev0->child(i1));//Mesh
+          for(int i2=0;i2<lev1->childCount();i2++)
+            {
+              QTreeWidgetItem *lev2(lev1->child(i2));//Comp
+              for(int i3=0;i3<lev2->childCount();i3++)
+                {
+                  QTreeWidgetItem *lev3(lev2->child(i3));
+                  pqTreeWidgetItemObject *scc(dynamic_cast<pqTreeWidgetItemObject *>(lev3));
+                  int ll(scc->property("PosInStringVector").toInt());
+                  int v(scc->isChecked());
+                  std::ostringstream oss; oss << v;
+                  sts[2*ll+1]=oss.str();
+                }
+            }
         }
     }
-  return ret;
+  ///
+  const char **args=new const char *[nb];
+  for(unsigned int i=0;i<nb;i++)
+    {
+      args[i]=sts[i].c_str();
+    }
+  {//agy : let's go to put info in property FieldsStatus
+    int iup(sm->GetImmediateUpdate());
+    //sm->SetNumberOfElements(0);
+    sm->SetElements(args,nb);
+    proxy->UpdateVTKObjects(); // push properties states abroad
+    sm->SetImmediateUpdate(iup);
+  }
+  delete [] args;
+  //
+  ((vtkSMSourceProxy *)proxy)->UpdatePipelineInformation();//performs an update of all properties of proxy and proxy itself
+  // here wonderful proxy is declared modified right after FieldsStatus and FieldsTreeInfo -> IMPORTANT : The updated MTime of proxy will be the ref
+  // to detect modified properties.
+  _is_fields_status_changed=true;
+  setModified();
 }
+