X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=60bad111dbc77e1b051e2f6df8c41965a11821cc;hb=d86c77d1c6210bbe04fbc3e5b00f9e212e1ec930;hp=1835a13f096d9fe0f06dce2c4f425905ebd6a412;hpb=3950546b72ab1ff2c303c4314e0d2d7574a1629c;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 1835a13f0..60bad111d 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -8,12 +8,14 @@ #include "XGUI_Workbench.h" #include "XGUI_Workshop.h" #include "XGUI_Viewer.h" -#include "XGUI_WidgetFactory.h" +#include "ModuleBase_WidgetFactory.h" #include "XGUI_SelectionMgr.h" #include "XGUI_ObjectsBrowser.h" #include "XGUI_Displayer.h" #include "XGUI_OperationMgr.h" #include "XGUI_SalomeConnector.h" +#include "XGUI_ActionsMgr.h" +#include "XGUI_ErrorDialog.h" #include #include @@ -21,6 +23,7 @@ #include #include +#include #include #include #include @@ -45,19 +48,30 @@ #endif XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) - : QObject(), + : QObject(), + myCurrentFile(QString()), myPartSetModule(NULL), mySalomeConnector(theConnector), myPropertyPanelDock(0), - myObjectBrowser(0) + myObjectBrowser(0), + myDisplayer(0) { myMainWindow = mySalomeConnector? 0 : new XGUI_MainWindow(); + + // In SALOME viewer is accessible only when module is initialized + // and in SALOME mode myDisplayer object has to be created later + // So, displayer will be created on demand. + mySelector = new XGUI_SelectionMgr(this); - myDisplayer = myMainWindow? new XGUI_Displayer(myMainWindow->viewer()) : 0; + connect(mySelector, SIGNAL(selectionChanged()), this, SLOT(changeCurrentDocument())); myOperationMgr = new XGUI_OperationMgr(this); + myActionsMgr = new XGUI_ActionsMgr(this); + myErrorDlg = new XGUI_ErrorDialog(myMainWindow); + connect(myOperationMgr, SIGNAL(operationStarted()), this, SLOT(onOperationStarted())); connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), this, SLOT(onOperationStopped(ModuleBase_Operation*))); + connect(this, SIGNAL(errorOccurred(const QString&)), myErrorDlg, SLOT(addError(const QString&))); } //****************************************************** @@ -71,6 +85,7 @@ void XGUI_Workshop::startApplication() initMenu(); //Initialize event listening Events_Loop* aLoop = Events_Loop::loop(); + aLoop->registerListener(this, Events_Error::errorID()); //!< Listening application errors. //TODO(sbh): Implement static method to extract event id [SEID] Events_ID aFeatureId = aLoop->eventByName("FeatureEvent"); aLoop->registerListener(this, aFeatureId); @@ -167,25 +182,30 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage) { static Events_ID aFeatureId = Events_Loop::loop()->eventByName("FeatureEvent"); if (theMessage->eventID() == aFeatureId) { - const Config_FeatureMessage* aFeatureMsg = - dynamic_cast(theMessage); + const Config_FeatureMessage* aFeatureMsg = dynamic_cast(theMessage); addFeature(aFeatureMsg); return; } - const Config_PointerMessage* aPartSetMsg = - dynamic_cast(theMessage); + const Config_PointerMessage* aPartSetMsg = dynamic_cast(theMessage); if (aPartSetMsg) { ModuleBase_PropPanelOperation* anOperation = (ModuleBase_PropPanelOperation*)(aPartSetMsg->pointer()); if (myOperationMgr->startOperation(anOperation)) { - if (anOperation->isPerformedImmediately()) { + if (anOperation->xmlRepresentation().isEmpty()) { anOperation->commit(); updateCommandStatus(); } } return; } + const Events_Error* anAppError = dynamic_cast(theMessage); + if (anAppError) { + emit errorOccurred(QString::fromLatin1(anAppError->description())); + myErrorDlg->show(); + myErrorDlg->raise(); + myErrorDlg->activateWindow(); + } #ifdef _DEBUG qDebug() << "XGUI_Workshop::ProcessEvent: " @@ -207,7 +227,7 @@ void XGUI_Workshop::onOperationStarted() showPropertyPanel(); - XGUI_WidgetFactory aFactory = XGUI_WidgetFactory(aOperation); + ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aOperation); aFactory.createWidget(aPropWidget); setPropertyPannelTitle(aOperation->description()); } @@ -216,12 +236,18 @@ void XGUI_Workshop::onOperationStarted() //****************************************************** void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) { - hidePropertyPanel(); - updateCommandStatus(); + ModuleBase_PropPanelOperation* aOperation = + (ModuleBase_PropPanelOperation*)(myOperationMgr->currentOperation()); - if (myMainWindow) { - XGUI_MainMenu* aMenu = myMainWindow->menuObject(); - aMenu->restoreCommandState(); + if(aOperation->xmlRepresentation().isEmpty()) { //!< No need for property panel + updateCommandStatus(); + } else { + hidePropertyPanel(); + updateCommandStatus(); + + if (myMainWindow) { + myActionsMgr->restoreCommandState(); + } } } @@ -265,9 +291,9 @@ void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage) QString::fromStdString(theMessage->tooltip()), QIcon(theMessage->icon().c_str()), QKeySequence(), isUsePropPanel); - - connect(aCommand, SIGNAL(toggled(bool)), - myMainWindow->menuObject(), SLOT(onFeatureChecked(bool))); + QString aNestedFeatures = QString::fromStdString(theMessage->nestedFeatures()); + aCommand->setUnblockableCommands(aNestedFeatures.split(" ")); + myActionsMgr->addCommand(aCommand); myPartSetModule->featureCreated(aCommand); } } @@ -292,12 +318,37 @@ void XGUI_Workshop::connectWithOperation(ModuleBase_Operation* theOperation) aCommand = aMenu->feature(theOperation->operationId()); } //Abort operation on uncheck the command - connect(aCommand, SIGNAL(toggled(bool)), theOperation, SLOT(setRunning(bool))); + connect(aCommand, SIGNAL(triggered(bool)), theOperation, SLOT(setRunning(bool))); +} + +/* + * Saves document with given name. + */ +void XGUI_Workshop::saveDocument(QString theName) +{ + QApplication::restoreOverrideCursor(); + boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + boost::shared_ptr aDoc = aMgr->rootDocument(); + aDoc->save(theName.toLatin1().constData()); + QApplication::restoreOverrideCursor(); } //****************************************************** void XGUI_Workshop::onExit() { + boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + boost::shared_ptr aDoc = aMgr->rootDocument(); + if(aDoc->isModified()) { + int anAnswer = QMessageBox::question( + myMainWindow, tr("Save current file"), + tr("The document is modified, save before exit?"), + QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel); + if(anAnswer == QMessageBox::Save) { + onSave(); + } else if (anAnswer == QMessageBox::Cancel) { + return; + } + } qApp->exit(); } @@ -307,7 +358,7 @@ void XGUI_Workshop::onNew() QApplication::setOverrideCursor(Qt::WaitCursor); if (objectBrowser() == 0) { createDockWidgets(); - mySelector->connectObjectBrowser(objectBrowser()); + mySelector->connectViewers(); } showObjectBrowser(); if (!isSalomeMode()) { @@ -322,21 +373,66 @@ void XGUI_Workshop::onNew() //****************************************************** void XGUI_Workshop::onOpen() { - //QString aFileName = QFileDialog::getOpenFileName(mainWindow()); + //save current file before close if modified + boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + boost::shared_ptr aDoc = aMgr->rootDocument(); + if(aDoc->isModified()) { + //TODO(sbh): re-launch the app? + int anAnswer = QMessageBox::question( + myMainWindow, tr("Save current file"), + tr("The document is modified, save before opening another?"), + QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel); + if(anAnswer == QMessageBox::Save) { + onSave(); + } else if (anAnswer == QMessageBox::Cancel) { + return; + } + aDoc->close(); + myCurrentFile = ""; + } + + //show file dialog, check if readable and open + myCurrentFile = QFileDialog::getOpenFileName(mainWindow()); + if(myCurrentFile.isEmpty()) + return; + QFileInfo aFileInfo(myCurrentFile); + if(!aFileInfo.exists() || !aFileInfo.isReadable()) { + QMessageBox::critical(myMainWindow, tr("Warning"), tr("Unable to open the file.")); + myCurrentFile = ""; + return; + } + QApplication::setOverrideCursor(Qt::WaitCursor); + aDoc->load(myCurrentFile.toLatin1().constData()); + QApplication::restoreOverrideCursor(); updateCommandStatus(); } //****************************************************** void XGUI_Workshop::onSave() { + if(myCurrentFile.isEmpty()) { + onSaveAs(); + return; + } + saveDocument(myCurrentFile); updateCommandStatus(); } //****************************************************** void XGUI_Workshop::onSaveAs() { - //QString aFileName = QFileDialog::getSaveFileName(mainWindow()); - updateCommandStatus(); + QString aTemp = myCurrentFile; + myCurrentFile = QFileDialog::getSaveFileName(mainWindow()); + if(myCurrentFile.isEmpty()) { + myCurrentFile = aTemp; + return; + } + QFileInfo aFileInfo(myCurrentFile); + if(aFileInfo.exists() && !aFileInfo.isWritable()) { + QMessageBox::critical(myMainWindow, tr("Warning"), tr("Unable to save the file.")); + return; + } + onSave(); } //****************************************************** @@ -583,3 +679,39 @@ void XGUI_Workshop::onFeatureTriggered() myPartSetModule->launchOperation(aId); } } + +//****************************************************** +XGUI_Displayer* XGUI_Workshop::displayer() const +{ + // In SALOME viewer is accessible only when module is initialized + // and in SALOME mode myDisplayer object has to be created later (on demand) + if (!myDisplayer) { + XGUI_Workshop* that = (XGUI_Workshop*)this; + that->myDisplayer = isSalomeMode() ? + new XGUI_Displayer(salomeConnector()->AISContext()): + new XGUI_Displayer(myMainWindow->viewer()->AISContext()); + } + return myDisplayer; +} + +//****************************************************** +void XGUI_Workshop::changeCurrentDocument() +{ + QFeatureList aFeatures = objectBrowser()->selectedFeatures(); + + // Set current document + if (aFeatures.size() > 0) { + FeaturePtr aFeature = aFeatures.first(); + + boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + boost::shared_ptr aDocRef = aFeature->data()->docRef("PartDocument"); + if (aDocRef) + aMgr->setCurrentDocument(aDocRef->value()); + } +} + +//****************************************************** +void XGUI_Workshop::salomeViewerSelectionChanged() +{ + emit salomeViewerSelection(); +}