Salome HOME
DOF is visualized in label widget.
[modules/shaper.git] / src / XGUI / XGUI_Workshop.cpp
index d28a944b2a7a13526d3455314ab70fac1f21fe1c..fbdb6379b393f11fddb917661ea703cfa44ac69f 100755 (executable)
@@ -77,6 +77,7 @@
 #include <Config_PointerMessage.h>
 #include <Config_PropManager.h>
 #include <Config_SelectionFilterMessage.h>
+#include <Config_DataModelReader.h>
 
 #include <SUIT_ResourceMgr.h>
 
@@ -135,6 +136,9 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
     QLocale::setDefault( QLocale::system() );
 #endif
 
+  myDataModelXMLReader = new Config_DataModelReader();
+  myDataModelXMLReader->readAll();
+
   myDisplayer = new XGUI_Displayer(this);
 
   mySelector = new XGUI_SelectionMgr(this);
@@ -149,8 +153,8 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
           SLOT(onContextMenuCommand(const QString&, bool)));
 
   myViewerProxy = new XGUI_ViewerProxy(this);
-  connect(myViewerProxy, SIGNAL(selectionChanged()),
-          myActionsMgr,  SLOT(updateOnViewSelection()));
+  //connect(myViewerProxy, SIGNAL(selectionChanged()),
+  //        myActionsMgr,  SLOT(updateOnViewSelection()));
 
   myModuleConnector = new XGUI_ModuleConnector(this);
 
@@ -200,6 +204,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
 XGUI_Workshop::~XGUI_Workshop(void)
 {
   delete myDisplayer;
+  delete myDataModelXMLReader;
 }
 
 //******************************************************
@@ -485,13 +490,18 @@ void XGUI_Workshop::setPropertyPanel(ModuleBase_Operation* theOperation)
       return;
     }
   }
+  // for performance purpose, flush should be done after all controls are filled
+  bool isUpdateFlushed = false;
   foreach (ModuleBase_ModelWidget* aWidget, aWidgets) {
     bool isStoreValue = !aFOperation->isEditOperation() &&
                         !aWidget->getDefaultValue().empty() &&
                         !aWidget->isComputedDefault();
-    aWidget->setFeature(aFeature, isStoreValue);
+    aWidget->setFeature(aFeature, isStoreValue, isUpdateFlushed);
+    if (!isStoreValue)
+      aWidget->restoreValue();
     aWidget->enableFocusProcessing();
   }
+  ModuleBase_Tools::flushUpdated(aFeature);
 
   // update visible state of Preview button
 #ifdef HAVE_SALOME
@@ -535,10 +545,12 @@ void XGUI_Workshop::connectToPropertyPanel(const bool isToConnect)
        if (isToConnect) {
         connect(aWidget, SIGNAL(valueStateChanged(int)), this, SLOT(onWidgetStateChanged(int)));
         connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onValuesChanged()));
-      }
+        connect(aWidget, SIGNAL(objectUpdated()), this, SLOT(onWidgetObjectUpdated()));
+       }
       else {
         disconnect(aWidget, SIGNAL(valueStateChanged(int)), this, SLOT(onWidgetStateChanged(int)));
         disconnect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onValuesChanged()));
+        disconnect(aWidget, SIGNAL(objectUpdated()), this, SLOT(onWidgetObjectUpdated()));
       }
     }
   }
@@ -929,6 +941,11 @@ void XGUI_Workshop::onValuesChanged()
   }
 }
 
+void XGUI_Workshop::onWidgetObjectUpdated()
+{
+  operationMgr()->onValidateOperation();
+}
+
 ModuleBase_IModule* XGUI_Workshop::loadModule(const QString& theModule)
 {
   QString libName = QString::fromStdString(library(theModule.toStdString()));
@@ -1002,6 +1019,9 @@ bool XGUI_Workshop::createModule()
   //  myModule, SLOT(onBeforeObjectErase(ObjectPtr, AISObjectPtr)));
 
   myModule->createFeatures();
+#ifdef HAVE_SALOME
+  salomeConnector()->createFeatureActions();
+#endif
   //myActionsMgr->update();
   return true;
 }
@@ -1065,6 +1085,7 @@ QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent)
   aObjDock->setStyleSheet(
       "::title { position: relative; padding-left: 5px; text-align: left center }");
   myObjectBrowser = new XGUI_ObjectsBrowser(aObjDock);
+  myObjectBrowser->setXMLReader(myDataModelXMLReader);
   myModule->customizeObjectBrowser(myObjectBrowser);
   aObjDock->setWidget(myObjectBrowser);
 
@@ -1261,11 +1282,11 @@ void XGUI_Workshop::deleteObjects()
   // 3. delete objects
   std::set<FeaturePtr> anIgnoredFeatures;
   std::set<FeaturePtr> aDirectRefFeatures, aIndirectRefFeatures;
-  findReferences(anObjects, aDirectRefFeatures, aIndirectRefFeatures);
+  ModuleBase_Tools::findReferences(anObjects, aDirectRefFeatures, aIndirectRefFeatures);
 
   bool doDeleteReferences = true;
-  if (isDeleteFeatureWithReferences(anObjects, aDirectRefFeatures, aIndirectRefFeatures,
-                                    desktop(), doDeleteReferences)) {
+  if (ModuleBase_Tools::isDeleteFeatureWithReferences(anObjects, aDirectRefFeatures, 
+      aIndirectRefFeatures, desktop(), doDeleteReferences)) {
     // start operation
     QString aDescription = contextMenuMgr()->action("DELETE_CMD")->text();
     aDescription += " " + aDescription.arg(XGUI_Tools::unionOfObjectNames(anObjects, ", "));
@@ -1316,7 +1337,7 @@ void XGUI_Workshop::cleanHistory()
     if (aFeature.get()) {
       std::set<FeaturePtr> alreadyProcessed;
       aDirectRefFeatures.clear();
-      XGUI_Tools::refsDirectToFeatureInAllDocuments(aFeature, aFeature, aFeatures,
+      ModuleBase_Tools::refsDirectToFeatureInAllDocuments(aFeature, aFeature, aFeatures,
                                                     aDirectRefFeatures, alreadyProcessed);
       if (aDirectRefFeatures.empty() && !anUnusedObjects.contains(aFeature))
         anUnusedObjects.append(aFeature);
@@ -1373,7 +1394,7 @@ void XGUI_Workshop::cleanHistory()
     mySelector->clearSelection();
 
     std::set<FeaturePtr> anIgnoredFeatures;
-    if (removeFeatures(anUnusedObjects, anIgnoredFeatures, anActionId)) {
+    if (removeFeatures(anUnusedObjects, anIgnoredFeatures, anActionId, true)) {
       operationMgr()->commitOperation();
     }
     else {
@@ -1438,110 +1459,11 @@ void XGUI_Workshop::moveObjects()
 }
 
 //**************************************************************
-void XGUI_Workshop::findReferences(const QObjectPtrList& theList,
-                                   std::set<FeaturePtr>& aDirectRefFeatures,
-                                   std::set<FeaturePtr>& aIndirectRefFeatures)
-{
-  foreach (ObjectPtr aDeletedObj, theList) {
-    std::set<FeaturePtr> alreadyProcessed;
-    XGUI_Tools::refsToFeatureInAllDocuments(aDeletedObj, aDeletedObj, theList, aDirectRefFeatures,
-                                            aIndirectRefFeatures, alreadyProcessed);
-    std::set<FeaturePtr> aDifference;
-    std::set_difference(aIndirectRefFeatures.begin(), aIndirectRefFeatures.end(), 
-                        aDirectRefFeatures.begin(), aDirectRefFeatures.end(), 
-                        std::inserter(aDifference, aDifference.begin()));
-    aIndirectRefFeatures = aDifference;
-  }
-}
-
-bool XGUI_Workshop::isDeleteFeatureWithReferences(const QObjectPtrList& theList,
-                                   const std::set<FeaturePtr>& aDirectRefFeatures,
-                                   const std::set<FeaturePtr>& aIndirectRefFeatures,
-                                   QWidget* theParent,
-                                   bool& doDeleteReferences)
-{
-  doDeleteReferences = true;
-
-  QString aDirectNames, aIndirectNames;
-  if (!aDirectRefFeatures.empty()) {
-    QStringList aDirectRefNames;
-    foreach (const FeaturePtr& aFeature, aDirectRefFeatures)
-      aDirectRefNames.append(aFeature->name().c_str());
-    aDirectNames = aDirectRefNames.join(", ");
-
-    QStringList aIndirectRefNames;
-    foreach (const FeaturePtr& aFeature, aIndirectRefFeatures)
-      aIndirectRefNames.append(aFeature->name().c_str());
-    aIndirectNames = aIndirectRefNames.join(", ");
-  }
-
-  bool aCanReplaceParameters = !aDirectRefFeatures.empty();
-  QStringList aPartFeatureNames;
-  foreach (ObjectPtr aObj, theList) {
-    FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
-    // invalid feature data means that the feature is already removed in model,
-    // we needn't process it. E.g. delete of feature from create operation. The operation abort
-    // will delete the operation
-    if (!aFeature->data()->isValid())
-      continue;
-    ResultPtr aFirstResult = aFeature->firstResult();
-    if (!aFirstResult.get())
-      continue;
-    std::string aResultGroupName = aFirstResult->groupName();
-    if (aResultGroupName == ModelAPI_ResultPart::group())
-      aPartFeatureNames.append(aFeature->name().c_str());
-
-    if (aCanReplaceParameters && aResultGroupName != ModelAPI_ResultParameter::group())
-      aCanReplaceParameters = false;
-  }
-  QString aPartNames = aPartFeatureNames.join(", ");
-
-  QMessageBox aMessageBox(theParent);
-  aMessageBox.setWindowTitle(tr("Delete features"));
-  aMessageBox.setIcon(QMessageBox::Warning);
-  aMessageBox.setStandardButtons(QMessageBox::No | QMessageBox::Yes);
-  aMessageBox.setDefaultButton(QMessageBox::No);
-
-  QString aText;
-  if (!aDirectNames.isEmpty() || !aIndirectNames.isEmpty()) {
-    if (aCanReplaceParameters) {
-      aText = QString(tr("Selected parameters are used in the following features: %1.\nThese features will be deleted.\nOr parameters could be replaced by their values.\n")
-                      .arg(aDirectNames));
-      if (!aIndirectNames.isEmpty())
-        aText += QString(tr("(Also these features will be deleted: %1)\n")).arg(aIndirectNames);
-      QPushButton *aReplaceButton = aMessageBox.addButton(tr("Replace"), QMessageBox::ActionRole);
-    } else {
-      aText = QString(tr("Selected features are used in the following features: %1.\nThese features will be deleted.\n")).arg(aDirectNames);
-      if (!aIndirectNames.isEmpty())
-        aText += QString(tr("(Also these features will be deleted: %1)\n")).arg(aIndirectNames);
-    }
-  }
-  if (!aPartNames.isEmpty())
-    aText += QString(tr("The following parts will be deleted: %1.\n")).arg(aPartNames);
-
-  if (!aText.isEmpty()) {
-    aText += "Would you like to continue?";
-    aMessageBox.setText(aText);
-    aMessageBox.exec();
-    QMessageBox::ButtonRole aButtonRole = aMessageBox.buttonRole(aMessageBox.clickedButton());
-
-    if (aButtonRole == QMessageBox::NoRole)
-      return false;
-
-    if (aButtonRole == QMessageBox::ActionRole) {
-      foreach (ObjectPtr aObj, theList)
-        ModelAPI_ReplaceParameterMessage::send(aObj, this);
-      doDeleteReferences = false;
-    }
-  }
-  return true;
-}
-
 bool XGUI_Workshop::deleteFeatures(const QObjectPtrList& theFeatures,
                                    const std::set<FeaturePtr>& theIgnoredFeatures)
 {
   std::set<FeaturePtr> aDirectRefFeatures, aIndirectRefFeatures;
-  findReferences(theFeatures, aDirectRefFeatures, aIndirectRefFeatures);
+  ModuleBase_Tools::findReferences(theFeatures, aDirectRefFeatures, aIndirectRefFeatures);
   return deleteFeaturesInternal(theFeatures, aDirectRefFeatures, aIndirectRefFeatures,
                                 theIgnoredFeatures);
 }
@@ -1552,6 +1474,7 @@ bool XGUI_Workshop::deleteFeaturesInternal(const QObjectPtrList& theList,
                                            const std::set<FeaturePtr>& theIgnoredFeatures,
                                            const bool doDeleteReferences)
 {
+  bool isDone = false;
   if (doDeleteReferences) {
     std::set<FeaturePtr> aFeaturesToDelete = aDirectRefFeatures;
     aFeaturesToDelete.insert(aIndirectRefFeatures.begin(), aIndirectRefFeatures.end());
@@ -1564,7 +1487,9 @@ bool XGUI_Workshop::deleteFeaturesInternal(const QObjectPtrList& theList,
       FeaturePtr aFeature = (*anIt);
       DocumentPtr aDoc = aFeature->document();
       if (theIgnoredFeatures.find(aFeature) == theIgnoredFeatures.end()) {
+        // flush REDISPLAY signal after remove feature
         aDoc->removeFeature(aFeature);
+        isDone = true;
 #ifdef DEBUG_DELETE
         anInfo.append(ModuleBase_Tools::objectInfo(aFeature).toStdString().c_str());
 #endif
@@ -1577,13 +1502,21 @@ bool XGUI_Workshop::deleteFeaturesInternal(const QObjectPtrList& theList,
   }
 
   QString anActionId = "DELETE_CMD";
-  return removeFeatures(theList, theIgnoredFeatures, anActionId);
+  isDone = removeFeatures(theList, theIgnoredFeatures, anActionId, false) || isDone;
+
+  if (isDone) {
+    // the redisplay signal should be flushed in order to erase the feature presentation in the viewer
+    // if should be done after removeFeature() of document
+    Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
+  }
+  return isDone;
 }
 
 //**************************************************************
 bool XGUI_Workshop::removeFeatures(const QObjectPtrList& theList,
                                    const std::set<FeaturePtr>& theIgnoredFeatures,
-                                   const QString& theActionId)
+                                   const QString& theActionId,
+                                   const bool theFlushRedisplay)
 {
   bool isDone = false;
 
@@ -1611,11 +1544,18 @@ bool XGUI_Workshop::removeFeatures(const QObjectPtrList& theList,
         anInfo.append(anInfoStr);
         qDebug(QString("remove feature :%1").arg(anInfoStr).toStdString().c_str());
 #endif
+        // flush REDISPLAY signal after remove feature
         aDoc->removeFeature(aFeature);
         isDone = true;
       }
     }
   }
+  if (isDone && theFlushRedisplay) {
+    // the redisplay signal should be flushed in order to erase the feature presentation in the viewer
+    // if should be done after removeFeature() of document
+    Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
+  }
+
 #ifdef DEBUG_DELETE
   qDebug(QString("remove features:%1").arg(anInfo.join("; ")).toStdString().c_str());
 #endif
@@ -1721,7 +1661,7 @@ bool XGUI_Workshop::canMoveFeature()
       std::set<FeaturePtr> aPlacedFeatures(aFeaturesBetween.begin(), aFeaturesBetween.end());
       // 2. Get all reference features to the selected object in the document 
       std::set<FeaturePtr> aRefFeatures;
-      XGUI_Tools::refsToFeatureInFeatureDocument(aObject, aRefFeatures);
+      ModuleBase_Tools::refsToFeatureInFeatureDocument(aObject, aRefFeatures);
 
       if (aRefFeatures.empty())
         continue;