Salome HOME
Clean Property panel before starting of a new operation.
[modules/shaper.git] / src / XGUI / XGUI_Workshop.cpp
index 08713ee470cea09fcef4cb02b30affea929cbd07..cdf0c42a5cf06512e9937562b8755867ebcaa84d 100644 (file)
@@ -20,6 +20,7 @@
 #include "XGUI_ViewerProxy.h"
 #include "XGUI_PropertyPanel.h"
 #include "XGUI_ContextMenuMgr.h"
+#include "XGUI_ModuleConnector.h"
 
 #include <Model_Events.h>
 #include <ModelAPI_PluginManager.h>
@@ -28,6 +29,8 @@
 #include <ModelAPI_AttributeDocRef.h>
 #include <ModelAPI_Object.h>
 
+#include <PartSetPlugin_Part.h>
+
 #include <Events_Loop.h>
 #include <Events_Error.h>
 #include <ModuleBase_Operation.h>
@@ -91,13 +94,15 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
           this, SLOT(onContextMenuCommand(const QString&, bool)));
 
   myViewerProxy = new XGUI_ViewerProxy(this);
+  
+  myModuleConnector = new XGUI_ModuleConnector(this);
 
   connect(myOperationMgr, SIGNAL(operationStarted()), SLOT(onOperationStarted()));
   connect(myOperationMgr, SIGNAL(operationResumed()), SLOT(onOperationStarted()));
   connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), SLOT(onOperationStopped(ModuleBase_Operation*)));
   connect(myMainWindow, SIGNAL(exitKeySequence()), SLOT(onExit()));
   connect(myOperationMgr, SIGNAL(operationStarted()), myActionsMgr, SLOT(update()));
-  connect(myOperationMgr, SIGNAL(operationStopped()), myActionsMgr, SLOT(update()));
+  connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), myActionsMgr, SLOT(update()));
   connect(this, SIGNAL(errorOccurred(const QString&)), myErrorDlg, SLOT(addError(const QString&)));
 }
 
@@ -121,7 +126,6 @@ void XGUI_Workshop::startApplication()
   Events_ID aFeatureUpdatedId = aLoop->eventByName(EVENT_FEATURE_UPDATED);
   aLoop->registerListener(this, aFeatureUpdatedId);
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_CREATED));
-  aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_DELETED));
 
   activateModule();
   if (myMainWindow) {
@@ -226,7 +230,7 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage)
     bool aHasPart = false;
     for (aIt = aFeatures.begin(); aIt != aFeatures.end(); ++aIt) {
       FeaturePtr aFeature = (*aIt);
-      if (aFeature->getKind() == "Part") {
+      if (aFeature->getKind() == PARTSET_PART_KIND) {
         aHasPart = true;
         break;
       }
@@ -238,13 +242,6 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage)
     }
   }
 
-  // Process deletion of a part
-  if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_FEATURE_DELETED)) {
-    PluginManagerPtr aMgr = ModelAPI_PluginManager::get();
-    if (aMgr->currentDocument() == aMgr->rootDocument())
-      activatePart(FeaturePtr()); // Activate PartSet
-  }
-
   //Update property panel on corresponding message. If there is no current operation (no
   //property panel), or received message has different feature to the current - do nothing.
   static Events_ID aFeatureUpdatedId = Events_Loop::loop()->eventByName(EVENT_FEATURE_UPDATED);
@@ -267,6 +264,8 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage)
   //An operation passed by message. Start it, process and commit.
   const Config_PointerMessage* aPartSetMsg = dynamic_cast<const Config_PointerMessage*>(theMessage);
   if (aPartSetMsg) {
+    // Clear previous content
+    myPropertyPanel->cleanContent();
     ModuleBase_Operation* anOperation =
         (ModuleBase_Operation*)(aPartSetMsg->pointer());
 
@@ -283,9 +282,6 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage)
   const Events_Error* anAppError = dynamic_cast<const Events_Error*>(theMessage);
   if (anAppError) {
     emit errorOccurred(QString::fromLatin1(anAppError->description()));
-    myErrorDlg->show();
-    myErrorDlg->raise();
-    myErrorDlg->activateWindow();
   }
 
 }
@@ -300,13 +296,14 @@ void XGUI_Workshop::onOperationStarted()
 
     showPropertyPanel();
 
-    ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aOperation);
+    ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aOperation, myModuleConnector);
     QWidget* aContent = myPropertyPanel->contentWidget();
     qDeleteAll(aContent->children());
     aFactory.createWidget(aContent);
     myPropertyPanel->setModelWidgets(aFactory.getModelWidgets());
     myPropertyPanel->setWindowTitle(aOperation->getDescription()->description());
   }
+  updateCommandStatus();
 }
 
 //******************************************************
@@ -343,8 +340,8 @@ void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage)
                               QString::fromStdString(theMessage->tooltip()),
                               QIcon(theMessage->icon().c_str()),
                               QKeySequence(), isUsePropPanel);
-    myActionsMgr->addCommand(aAction);
     salomeConnector()->setNestedActions(aId, aNestedFeatures.split(" "));
+    myActionsMgr->addCommand(aAction);
     myPartSetModule->featureCreated(aAction);
   } else {
 
@@ -507,7 +504,8 @@ bool XGUI_Workshop::onSaveAs()
   QDir aDir(aTempDir);
   if(aDir.exists() && !aDir.entryInfoList(QDir::NoDotAndDotDot|QDir::AllEntries).isEmpty()) {
     int answer = QMessageBox::question(myMainWindow,
-                                       QString(),
+                                       //: Title of the dialog which asks user if he wants to save study in existing non-empty folder
+                                       tr("Save"),
                                        tr("The folder already contains some files, save anyway?"),
                                        QMessageBox::Save|QMessageBox::Cancel);
     if(answer == QMessageBox::Cancel) {
@@ -536,6 +534,8 @@ void XGUI_Workshop::onRedo()
   objectBrowser()->treeView()->setCurrentIndex(QModelIndex());
   PluginManagerPtr aMgr = ModelAPI_PluginManager::get();
   DocumentPtr aDoc = aMgr->rootDocument();
+  if (aDoc->isOperation())
+    operationMgr()->abortOperation();
   aDoc->redo();
   updateCommandStatus();
 }
@@ -661,6 +661,7 @@ QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent)
   QDockWidget* aObjDock = new QDockWidget(theParent);
   aObjDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
   aObjDock->setWindowTitle(tr("Object browser"));
+  aObjDock->setStyleSheet("::title { position: relative; padding-left: 5px; text-align: left center }");
   myObjectBrowser = new XGUI_ObjectsBrowser(aObjDock);
   connect(myObjectBrowser, SIGNAL(activePartChanged(FeaturePtr)), this, SLOT(changeCurrentDocument(FeaturePtr)));
   aObjDock->setWidget(myObjectBrowser);
@@ -690,6 +691,9 @@ void XGUI_Workshop::createDockWidgets()
   connect(aOkBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onCommitOperation()));
   QPushButton* aCancelBtn = myPropertyPanel->findChild<QPushButton*>(XGUI::PROP_PANEL_CANCEL);
   connect(aCancelBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onAbortOperation()));
+
+  connect(myPropertyPanel, SIGNAL(keyReleased(const std::string&, QKeyEvent*)),
+          myOperationMgr, SLOT(onKeyReleased(const std::string&, QKeyEvent*)));
 }
 
 //******************************************************
@@ -739,9 +743,15 @@ void XGUI_Workshop::changeCurrentDocument(FeaturePtr thePart)
 {
   PluginManagerPtr aMgr = ModelAPI_PluginManager::get();
   if (thePart) {
-    boost::shared_ptr<ModelAPI_AttributeDocRef> aDocRef = thePart->data()->docRef("PartDocument");
-    if (aDocRef)
-      aMgr->setCurrentDocument(aDocRef->value());
+    DocumentPtr aFeaDoc;
+    if (!XGUI_Tools::isModelObject(thePart)) {
+      aFeaDoc = thePart->data()->docRef("PartDocument")->value();
+    } else {
+      ObjectPtr aObject = boost::dynamic_pointer_cast<ModelAPI_Object>(thePart);
+      aFeaDoc = aObject->featureRef()->data()->docRef("PartDocument")->value();
+    }
+    if (aFeaDoc)
+      aMgr->setCurrentDocument(aFeaDoc);
   } else {
     aMgr->setCurrentDocument(aMgr->rootDocument());
   }
@@ -770,6 +780,10 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked)
     activatePart(FeaturePtr());
   else if (theId == "DELETE_CMD")
     deleteFeatures(aFeatures);
+  else if (theId == "SHOW_CMD")
+    showFeatures(aFeatures, true);
+  else if (theId == "HIDE_CMD")
+    showFeatures(aFeatures, false);
 }
 
 //**************************************************************
@@ -799,15 +813,33 @@ void XGUI_Workshop::deleteFeatures(QFeatureList theList)
     PluginManagerPtr aMgr = ModelAPI_PluginManager::get();
     aMgr->rootDocument()->startOperation();
     foreach (FeaturePtr aFeature, theList) {
-      if (aFeature->getKind() == "Part") {
-        DocumentPtr aDoc = aFeature->data()->docRef("PartDocument")->value();
+      if (aFeature->getKind() == PARTSET_PART_KIND) {
+        DocumentPtr aDoc;
+        if (!XGUI_Tools::isModelObject(aFeature)) {
+          aDoc = aFeature->data()->docRef("PartDocument")->value();
+        } else {
+          ObjectPtr aObject = boost::dynamic_pointer_cast<ModelAPI_Object>(aFeature);
+          aDoc = aObject->featureRef()->data()->docRef("PartDocument")->value();
+          aFeature = aObject->featureRef();
+        }
         if (aDoc == aMgr->currentDocument()) {
           aDoc->close();
         }
-      } //else
-        //aDoc = aFeature->document();
-      aMgr->rootDocument()->removeFeature(aFeature);
+      } else {
+        if (XGUI_Tools::isModelObject(aFeature)) {
+          ObjectPtr aObject = boost::dynamic_pointer_cast<ModelAPI_Object>(aFeature);
+          aFeature = aObject->featureRef();
+        }
+      }
+      aFeature->document()->removeFeature(aFeature);
     }
     aMgr->rootDocument()->finishOperation();
   }
 }
+
+//**************************************************************
+void XGUI_Workshop::showFeatures(QFeatureList theList, bool isVisible)
+{
+//  foreach (FeaturePtr aFeature, theList) {
+//  }
+}