X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=20f4e47c7bc6e25184a512f58fdd12f54bfc6543;hb=80a21be87c81ef61f0842b32e8b2ac7d4359acb4;hp=60bad111dbc77e1b051e2f6df8c41965a11821cc;hpb=4962dedc0409862fb541d468d61b3b1d029cdabd;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 60bad111d..20f4e47c7 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -14,9 +14,14 @@ #include "XGUI_Displayer.h" #include "XGUI_OperationMgr.h" #include "XGUI_SalomeConnector.h" +#include "XGUI_SalomeViewer.h" #include "XGUI_ActionsMgr.h" #include "XGUI_ErrorDialog.h" +#include "XGUI_ViewerProxy.h" +#include "XGUI_PropertyPanel.h" +#include "XGUI_ContextMenuMgr.h" +#include #include #include #include @@ -24,10 +29,13 @@ #include #include -#include #include +#include +#include +#include #include #include +#include #include #include @@ -47,26 +55,38 @@ #include #endif + +QMap XGUI_Workshop::myIcons; + +QString XGUI_Workshop::featureIcon(const std::string& theId) +{ + QString aId(theId.c_str()); + if (myIcons.contains(aId)) + return myIcons[aId]; + return QString(); +} + XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) : QObject(), myCurrentFile(QString()), myPartSetModule(NULL), mySalomeConnector(theConnector), - myPropertyPanelDock(0), + myPropertyPanel(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. + myDisplayer = new XGUI_Displayer(this); mySelector = new XGUI_SelectionMgr(this); - connect(mySelector, SIGNAL(selectionChanged()), this, SLOT(changeCurrentDocument())); + myOperationMgr = new XGUI_OperationMgr(this); myActionsMgr = new XGUI_ActionsMgr(this); myErrorDlg = new XGUI_ErrorDialog(myMainWindow); + myContextMenuMgr = new XGUI_ContextMenuMgr(this); + + myViewerProxy = new XGUI_ViewerProxy(this); connect(myOperationMgr, SIGNAL(operationStarted()), this, SLOT(onOperationStarted())); connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), @@ -87,27 +107,18 @@ void XGUI_Workshop::startApplication() 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"); + Events_ID aFeatureId = aLoop->eventByName(EVENT_FEATURE_LOADED); aLoop->registerListener(this, aFeatureId); Events_ID aPartSetId = aLoop->eventByName("PartSetModuleEvent"); aLoop->registerListener(this, aPartSetId); + Events_ID aFeatureUpdatedId = aLoop->eventByName(EVENT_FEATURE_UPDATED); + aLoop->registerListener(this, aFeatureUpdatedId); activateModule(); if (myMainWindow) { myMainWindow->show(); updateCommandStatus(); } onNew(); - // Testing of document creation - //boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); - //boost::shared_ptr aPoint1 = aMgr->rootDocument()->addFeature("Point"); - //boost::shared_ptr aPart = aMgr->rootDocument()->addFeature("Part"); - //aPart->execute(); - //aMgr->setCurrentDocument(aPart->data()->docRef("PartDocument")->value()); - //boost::shared_ptr aPoint2 = aMgr->rootDocument()->addFeature("Point"); - //aPoint2 = aMgr->rootDocument()->addFeature("Point"); - - //aPart = aMgr->rootDocument()->addFeature("Part"); - //aPart->execute(); } //****************************************************** @@ -168,6 +179,7 @@ void XGUI_Workshop::initMenu() QIcon(":pictures/close.png"), QKeySequence::Close); aCommand->connectTo(this, SLOT(onExit())); + myContextMenuMgr->createActions(); } //****************************************************** @@ -180,74 +192,85 @@ XGUI_Workbench* XGUI_Workshop::addWorkbench(const QString& theName) //****************************************************** void XGUI_Workshop::processEvent(const Events_Message* theMessage) { - static Events_ID aFeatureId = Events_Loop::loop()->eventByName("FeatureEvent"); - if (theMessage->eventID() == aFeatureId) { + //A message to start feature creation received. + static Events_ID aFeatureLoadedId = Events_Loop::loop()->eventByName(EVENT_FEATURE_LOADED); + if (theMessage->eventID() == aFeatureLoadedId) { const Config_FeatureMessage* aFeatureMsg = dynamic_cast(theMessage); addFeature(aFeatureMsg); return; } + //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); + if (theMessage->eventID() == aFeatureUpdatedId && myOperationMgr->hasOperation()) + { + const Model_FeatureUpdatedMessage* anUpdateMsg = + dynamic_cast(theMessage); + boost::shared_ptr aNewFeature = anUpdateMsg->feature(); + boost::shared_ptr aCurrentFeature = myOperationMgr->currentOperation()->feature(); + if(aNewFeature == aCurrentFeature) { + myPropertyPanel->updateContentWidget(aCurrentFeature); + } + } + //An operation passed by message. Start it, process and commit. const Config_PointerMessage* aPartSetMsg = dynamic_cast(theMessage); if (aPartSetMsg) { - ModuleBase_PropPanelOperation* anOperation = - (ModuleBase_PropPanelOperation*)(aPartSetMsg->pointer()); + ModuleBase_Operation* anOperation = + (ModuleBase_Operation*)(aPartSetMsg->pointer()); if (myOperationMgr->startOperation(anOperation)) { - if (anOperation->xmlRepresentation().isEmpty()) { + myPropertyPanel->updateContentWidget(anOperation->feature()); + if (anOperation->getDescription()->xmlRepresentation().isEmpty()) { anOperation->commit(); updateCommandStatus(); } } return; } + //Show error dialog if error message received. const Events_Error* anAppError = dynamic_cast(theMessage); if (anAppError) { - emit errorOccurred(QString::fromLatin1(anAppError->description())); - myErrorDlg->show(); - myErrorDlg->raise(); - myErrorDlg->activateWindow(); + emit errorOccurred(QString::fromLatin1(anAppError->description())); + myErrorDlg->show(); + myErrorDlg->raise(); + myErrorDlg->activateWindow(); } -#ifdef _DEBUG - qDebug() << "XGUI_Workshop::ProcessEvent: " - << "Catch message, but it can not be processed."; -#endif - } //****************************************************** void XGUI_Workshop::onOperationStarted() { - ModuleBase_PropPanelOperation* aOperation = - (ModuleBase_PropPanelOperation*)(myOperationMgr->currentOperation()); + ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - if(!aOperation->xmlRepresentation().isEmpty()) { //!< No need for property panel + if(!aOperation->getDescription()->xmlRepresentation().isEmpty()) { //!< No need for property panel connectWithOperation(aOperation); - QWidget* aPropWidget = myPropertyPanelDock->findChild(XGUI::PROP_PANEL_WDG); - qDeleteAll(aPropWidget->children()); showPropertyPanel(); ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aOperation); - aFactory.createWidget(aPropWidget); - setPropertyPannelTitle(aOperation->description()); + QWidget* aContent = myPropertyPanel->contentWidget(); + qDeleteAll(aContent->children()); + aFactory.createWidget(aContent); + myPropertyPanel->setModelWidgets(aFactory.getModelWidgets()); + myPropertyPanel->setWindowTitle(aOperation->getDescription()->description()); } } //****************************************************** void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) { - ModuleBase_PropPanelOperation* aOperation = - (ModuleBase_PropPanelOperation*)(myOperationMgr->currentOperation()); - - if(aOperation->xmlRepresentation().isEmpty()) { //!< No need for property panel - updateCommandStatus(); - } else { - hidePropertyPanel(); - updateCommandStatus(); + ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - if (myMainWindow) { - myActionsMgr->restoreCommandState(); - } + //!< No need for property panel + updateCommandStatus(); + hidePropertyPanel(); + if(myOperationMgr->operationsCount() > 1) { + myActionsMgr->updateAction(theOperation->getDescription()->operationId()); + return; + } + if(!aOperation->getDescription()->xmlRepresentation().isEmpty()) { + myActionsMgr->restoreCommandState(); } } @@ -262,17 +285,27 @@ void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage) #endif return; } + // Remember features icons + myIcons[QString::fromStdString(theMessage->id())] = QString::fromStdString(theMessage->icon()); + //Find or create Workbench QString aWchName = QString::fromStdString(theMessage->workbenchId()); + QString aNestedFeatures = QString::fromStdString(theMessage->nestedFeatures()); + bool isUsePropPanel = theMessage->isUseInput(); if (isSalomeMode()) { + QString aId = QString::fromStdString(theMessage->id()); salomeConnector()->addFeature(aWchName, QString::fromStdString(theMessage->id()), - QString::fromStdString(theMessage->text()), + aId, QString::fromStdString(theMessage->tooltip()), QIcon(theMessage->icon().c_str()), - false, this, + isUsePropPanel, this, SLOT(onFeatureTriggered()), QKeySequence()); + myActionsMgr->addCommand(aId, salomeConnector()->command(aId)); + salomeConnector()->setNestedActions(aId, aNestedFeatures.split(" ")); + } else { + XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); XGUI_Workbench* aPage = aMenuBar->findWorkbench(aWchName); if (!aPage) { @@ -284,14 +317,12 @@ void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage) if (!aGroup) { aGroup = aPage->addGroup(aGroupName); } - bool isUsePropPanel = theMessage->isUseInput(); //Create feature... XGUI_Command* aCommand = aGroup->addFeature(QString::fromStdString(theMessage->id()), QString::fromStdString(theMessage->text()), QString::fromStdString(theMessage->tooltip()), QIcon(theMessage->icon().c_str()), QKeySequence(), isUsePropPanel); - QString aNestedFeatures = QString::fromStdString(theMessage->nestedFeatures()); aCommand->setUnblockableCommands(aNestedFeatures.split(" ")); myActionsMgr->addCommand(aCommand); myPartSetModule->featureCreated(aCommand); @@ -305,17 +336,17 @@ void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage) */ void XGUI_Workshop::connectWithOperation(ModuleBase_Operation* theOperation) { - QPushButton* aOkBtn = myPropertyPanelDock->findChild(XGUI::PROP_PANEL_OK); + QPushButton* aOkBtn = myPropertyPanel->findChild(XGUI::PROP_PANEL_OK); connect(aOkBtn, SIGNAL(clicked()), theOperation, SLOT(commit())); - QPushButton* aCancelBtn = myPropertyPanelDock->findChild(XGUI::PROP_PANEL_CANCEL); + QPushButton* aCancelBtn = myPropertyPanel->findChild(XGUI::PROP_PANEL_CANCEL); connect(aCancelBtn, SIGNAL(clicked()), theOperation, SLOT(abort())); QAction* aCommand = 0; if (isSalomeMode()) { - aCommand = salomeConnector()->command(theOperation->operationId()); + aCommand = salomeConnector()->command(theOperation->getDescription()->operationId()); } else { XGUI_MainMenu* aMenu = myMainWindow->menuObject(); - aCommand = aMenu->feature(theOperation->operationId()); + aCommand = aMenu->feature(theOperation->getDescription()->operationId()); } //Abort operation on uncheck the command connect(aCommand, SIGNAL(triggered(bool)), theOperation, SLOT(setRunning(bool))); @@ -360,6 +391,7 @@ void XGUI_Workshop::onNew() createDockWidgets(); mySelector->connectViewers(); } + myViewerProxy->connectToViewer(); showObjectBrowser(); if (!isSalomeMode()) { myMainWindow->showPythonConsole(); @@ -392,7 +424,7 @@ void XGUI_Workshop::onOpen() } //show file dialog, check if readable and open - myCurrentFile = QFileDialog::getOpenFileName(mainWindow()); + myCurrentFile = QFileDialog::getExistingDirectory(mainWindow()); if(myCurrentFile.isEmpty()) return; QFileInfo aFileInfo(myCurrentFile); @@ -441,6 +473,9 @@ void XGUI_Workshop::onUndo() objectBrowser()->setCurrentIndex(QModelIndex()); boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); boost::shared_ptr aDoc = aMgr->rootDocument(); + //if (!operationMgr()->abortOperation()) + // return; + operationMgr()->abortOperation(); aDoc->undo(); updateCommandStatus(); } @@ -458,7 +493,8 @@ void XGUI_Workshop::onRedo() //****************************************************** XGUI_Module* XGUI_Workshop::loadModule(const QString& theModule) { - QString libName = library(theModule); + QString libName = + QString::fromStdString(library(theModule.toStdString())); if (libName.isEmpty()) { qWarning( qPrintable( tr( "Information about module \"%1\" doesn't exist." ).arg( theModule ) )); @@ -469,7 +505,6 @@ XGUI_Module* XGUI_Workshop::loadModule(const QString& theModule) CREATE_FUNC crtInst = 0; #ifdef WIN32 - HINSTANCE modLib = ::LoadLibrary((LPTSTR) qPrintable(libName)); if (!modLib) { LPVOID lpMsgBuf; @@ -494,23 +529,24 @@ XGUI_Module* XGUI_Workshop::loadModule(const QString& theModule) } #else void* modLib = dlopen( libName.toLatin1(), RTLD_LAZY ); - if ( !modLib ) - err = QString( "Can not load library %1. %2" ).arg( libName ).arg( dlerror() ); - else - { + if ( !modLib ) { + err = QString( "Can not load library %1. %2" ).arg( libName ).arg( dlerror() ); + } else { crtInst = (CREATE_FUNC)dlsym( modLib, CREATE_MODULE ); - if ( !crtInst ) - err = QString( "Failed to find function %1. %2" ).arg( CREATE_MODULE ).arg( dlerror() ); + if ( !crtInst ) { + err = QString( "Failed to find function %1. %2" ).arg( CREATE_MODULE ).arg( dlerror() ); + } } #endif XGUI_Module* aModule = crtInst ? crtInst(this) : 0; if (!err.isEmpty()) { - if (mainWindow() && mainWindow()->isVisible()) + if (mainWindow()) { QMessageBox::warning(mainWindow(), tr("Error"), err); - else + } else { qWarning( qPrintable( err )); + } } return aModule; } @@ -518,7 +554,9 @@ XGUI_Module* XGUI_Workshop::loadModule(const QString& theModule) //****************************************************** bool XGUI_Workshop::activateModule() { - myPartSetModule = loadModule("PartSet"); + Config_ModuleReader aModuleReader; + QString moduleName = QString::fromStdString(aModuleReader.getModuleName()); + myPartSetModule = loadModule(moduleName); if (!myPartSetModule) return false; myPartSetModule->createFeatures(); @@ -539,25 +577,25 @@ void XGUI_Workshop::updateCommandStatus() if (aMgr->hasRootDocument()) { XGUI_Command* aUndoCmd; XGUI_Command* aRedoCmd; - for (aIt = aCommands.constBegin(); aIt != aCommands.constEnd(); ++aIt) { - if ((*aIt)->id() == "UNDO_CMD") - aUndoCmd = (*aIt); - else if ((*aIt)->id() == "REDO_CMD") - aRedoCmd = (*aIt); + foreach(XGUI_Command* aCmd, aCommands) { + if (aCmd->id() == "UNDO_CMD") + aUndoCmd = aCmd; + else if (aCmd->id() == "REDO_CMD") + aRedoCmd = aCmd; else // Enable all commands - (*aIt)->enable(); + aCmd->enable(); } boost::shared_ptr aDoc = aMgr->rootDocument(); aUndoCmd->setEnabled(aDoc->canUndo()); aRedoCmd->setEnabled(aDoc->canRedo()); } else { - for (aIt = aCommands.constBegin(); aIt != aCommands.constEnd(); ++aIt) { - if ((*aIt)->id() == "NEW_CMD") - (*aIt)->enable(); - else if ((*aIt)->id() == "EXIT_CMD") - (*aIt)->enable(); + foreach(XGUI_Command* aCmd, aCommands) { + if (aCmd->id() == "NEW_CMD") + aCmd->enable(); + else if (aCmd->id() == "EXIT_CMD") + aCmd->enable(); else - (*aIt)->disable(); + aCmd->disable(); } } } @@ -569,55 +607,11 @@ QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent) aObjDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); aObjDock->setWindowTitle(tr("Object browser")); myObjectBrowser = new XGUI_ObjectsBrowser(aObjDock); + connect(myObjectBrowser, SIGNAL(activePartChanged(FeaturePtr)), this, SLOT(changeCurrentDocument(FeaturePtr))); aObjDock->setWidget(myObjectBrowser); - return aObjDock; -} - -//****************************************************** -QDockWidget* XGUI_Workshop::createPropertyPanel(QWidget* theParent) -{ - QDockWidget* aPropPanel = new QDockWidget(theParent); - aPropPanel->setWindowTitle(tr("Property Panel")); - QAction* aViewAct = aPropPanel->toggleViewAction(); - aPropPanel->setObjectName(XGUI::PROP_PANEL); - - QWidget* aContent = new QWidget(aPropPanel); - QVBoxLayout* aMainLay = new QVBoxLayout(aContent); - aMainLay->setContentsMargins(3, 3, 3, 3); - aPropPanel->setWidget(aContent); - - QFrame* aFrm = new QFrame(aContent); - aFrm->setFrameStyle(QFrame::Sunken); - aFrm->setFrameShape(QFrame::Panel); - QHBoxLayout* aBtnLay = new QHBoxLayout(aFrm); - aBtnLay->setContentsMargins(0, 0, 0, 0); - aMainLay->addWidget(aFrm); - - QPushButton* aBtn = new QPushButton(QIcon(":pictures/button_help.png"), "", aFrm); - aBtn->setFlat(true); - aBtnLay->addWidget(aBtn); - aBtnLay->addStretch(1); - aBtn = new QPushButton(QIcon(":pictures/button_ok.png"), "", aFrm); - aBtn->setObjectName(XGUI::PROP_PANEL_OK); - aBtn->setFlat(true); - aBtnLay->addWidget(aBtn); - aBtn = new QPushButton(QIcon(":pictures/button_cancel.png"), "", aFrm); - aBtn->setObjectName(XGUI::PROP_PANEL_CANCEL); - aBtn->setFlat(true); - aBtnLay->addWidget(aBtn); - - QWidget* aCustomWidget = new QWidget(aContent); - aCustomWidget->setObjectName(XGUI::PROP_PANEL_WDG); - aMainLay->addWidget(aCustomWidget); - aMainLay->addStretch(1); - - return aPropPanel; -} -//****************************************************** -void XGUI_Workshop::setPropertyPannelTitle(const QString& theTitle) -{ - myPropertyPanelDock->setWindowTitle(theTitle); + myContextMenuMgr->connectObjectBrowser(); + return aObjDock; } //****************************************************** @@ -631,30 +625,30 @@ void XGUI_Workshop::createDockWidgets() myMainWindow; QDockWidget* aObjDock = createObjectBrowser(aDesktop); aDesktop->addDockWidget(Qt::LeftDockWidgetArea, aObjDock); - myPropertyPanelDock = createPropertyPanel(aDesktop); - aDesktop->addDockWidget(Qt::LeftDockWidgetArea, myPropertyPanelDock); + myPropertyPanel = new XGUI_PropertyPanel(aDesktop); + aDesktop->addDockWidget(Qt::LeftDockWidgetArea, myPropertyPanel); hidePropertyPanel(); //tabifyDockWidget(aObjDock, myPropertyPanelDock); + aDesktop->tabifyDockWidget(aObjDock, myPropertyPanel); } //****************************************************** void XGUI_Workshop::showPropertyPanel() { - QAction* aViewAct = myPropertyPanelDock->toggleViewAction(); + QAction* aViewAct = myPropertyPanel->toggleViewAction(); //setEnabled(true); - myPropertyPanelDock->show(); - myPropertyPanelDock->raise(); + myPropertyPanel->show(); + myPropertyPanel->raise(); } //****************************************************** void XGUI_Workshop::hidePropertyPanel() { - QAction* aViewAct = myPropertyPanelDock->toggleViewAction(); + QAction* aViewAct = myPropertyPanel->toggleViewAction(); //setEnabled(false); - myPropertyPanelDock->hide(); + myPropertyPanel->hide(); } //****************************************************** @@ -681,32 +675,15 @@ void XGUI_Workshop::onFeatureTriggered() } //****************************************************** -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() +void XGUI_Workshop::changeCurrentDocument(FeaturePtr thePart) { - 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"); + boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + if (thePart) { + boost::shared_ptr aDocRef = thePart->data()->docRef("PartDocument"); if (aDocRef) aMgr->setCurrentDocument(aDocRef->value()); + } else { + aMgr->setCurrentDocument(aMgr->rootDocument()); } } @@ -715,3 +692,10 @@ void XGUI_Workshop::salomeViewerSelectionChanged() { emit salomeViewerSelection(); } + + +//************************************************************** +XGUI_SalomeViewer* XGUI_Workshop::salomeViewer() const +{ + return mySalomeConnector->viewer(); +}