X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=08713ee470cea09fcef4cb02b30affea929cbd07;hb=88b2abea2c66eabdb32af017fb15cc90643e7664;hp=a956d04871e44558890fa789101dde8871002dd2;hpb=8c37fcd892dbda4a381c3966847c982f28c4ab57;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index a956d0487..08713ee47 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -19,20 +19,24 @@ #include "XGUI_ErrorDialog.h" #include "XGUI_ViewerProxy.h" #include "XGUI_PropertyPanel.h" +#include "XGUI_ContextMenuMgr.h" #include #include #include #include #include +#include #include #include #include #include #include +#include #include #include +#include #include #include @@ -41,6 +45,7 @@ #include #include #include +#include #ifdef _DEBUG #include @@ -52,9 +57,20 @@ #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()), + myCurrentDir(QString()), myPartSetModule(NULL), mySalomeConnector(theConnector), myPropertyPanel(0), @@ -66,17 +82,22 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) 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); + connect(myContextMenuMgr, SIGNAL(actionTriggered(const QString&, bool)), + this, SLOT(onContextMenuCommand(const QString&, bool))); myViewerProxy = new XGUI_ViewerProxy(this); - connect(myOperationMgr, SIGNAL(operationStarted()), this, SLOT(onOperationStarted())); - connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), - this, SLOT(onOperationStopped(ModuleBase_Operation*))); + 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(this, SIGNAL(errorOccurred(const QString&)), myErrorDlg, SLOT(addError(const QString&))); } @@ -99,6 +120,9 @@ void XGUI_Workshop::startApplication() aLoop->registerListener(this, aPartSetId); 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) { myMainWindow->show(); @@ -110,18 +134,20 @@ void XGUI_Workshop::startApplication() //****************************************************** void XGUI_Workshop::initMenu() { + myContextMenuMgr->createActions(); + if (isSalomeMode()) { // Create only Undo, Redo commands - salomeConnector()->addEditCommand("UNDO_CMD", + QAction* aAction = salomeConnector()->addEditCommand("UNDO_CMD", tr("Undo"), tr("Undo last command"), QIcon(":pictures/undo.png"), - false, this, SLOT(onUndo()), - QKeySequence::Undo); - salomeConnector()->addEditCommand("REDO_CMD", + QKeySequence::Undo, false); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onUndo())); + aAction = salomeConnector()->addEditCommand("REDO_CMD", tr("Redo"), tr("Redo last command"), QIcon(":pictures/redo.png"), - false, this, SLOT(onRedo()), - QKeySequence::Redo); + QKeySequence::Redo, false); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onRedo())); salomeConnector()->addEditMenuSeparator(); return; } @@ -164,7 +190,12 @@ void XGUI_Workshop::initMenu() aCommand = aGroup->addFeature("EXIT_CMD", tr("Exit"), tr("Exit application"), QIcon(":pictures/close.png"), QKeySequence::Close); aCommand->connectTo(this, SLOT(onExit())); - + //FIXME: SBH's test action. Can be used for some GUI tests. + //#ifdef _DEBUG + // aCommand = aGroup->addFeature("TEST_CMD", "Test!", "Private debug button", + // QIcon(":pictures/close.png")); + // aCommand->connectTo(myActionsMgr, SLOT(update())); + //#endif } //****************************************************** @@ -181,9 +212,39 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage) static Events_ID aFeatureLoadedId = Events_Loop::loop()->eventByName(EVENT_FEATURE_LOADED); if (theMessage->eventID() == aFeatureLoadedId) { const Config_FeatureMessage* aFeatureMsg = dynamic_cast(theMessage); - addFeature(aFeatureMsg); + if(!aFeatureMsg->isInternal()) { + addFeature(aFeatureMsg); + } return; } + // Process creation of Part + if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_FEATURE_CREATED)) { + const Model_FeatureUpdatedMessage* aUpdMsg = dynamic_cast(theMessage); + std::set aFeatures = aUpdMsg->features(); + + std::set::const_iterator aIt; + bool aHasPart = false; + for (aIt = aFeatures.begin(); aIt != aFeatures.end(); ++aIt) { + FeaturePtr aFeature = (*aIt); + if (aFeature->getKind() == "Part") { + aHasPart = true; + break; + } + } + if (aHasPart) { + //The created part will be created in Object Browser later and we have to activate it + // only when it is created everywere + QTimer::singleShot(50, this, SLOT(activateLastPart())); + } + } + + // 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); @@ -191,10 +252,16 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage) { 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); + std::set aFeatures = anUpdateMsg->features(); + + FeaturePtr aCurrentFeature = myOperationMgr->currentOperation()->feature(); + std::set::const_iterator aIt; + for (aIt = aFeatures.begin(); aIt != aFeatures.end(); ++aIt) { + FeaturePtr aNewFeature = (*aIt); + if(aNewFeature == aCurrentFeature) { + myPropertyPanel->updateContentWidget(aCurrentFeature); + break; + } } } //An operation passed by message. Start it, process and commit. @@ -204,6 +271,7 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage) (ModuleBase_Operation*)(aPartSetMsg->pointer()); if (myOperationMgr->startOperation(anOperation)) { + myPropertyPanel->updateContentWidget(anOperation->feature()); if (anOperation->getDescription()->xmlRepresentation().isEmpty()) { anOperation->commit(); updateCommandStatus(); @@ -244,15 +312,9 @@ void XGUI_Workshop::onOperationStarted() //****************************************************** void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) { - ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - - if(aOperation->getDescription()->xmlRepresentation().isEmpty()) { //!< No need for property panel - updateCommandStatus(); - } else { - hidePropertyPanel(); - updateCommandStatus(); - myActionsMgr->restoreCommandState(); - } + //!< No need for property panel + updateCommandStatus(); + hidePropertyPanel(); } /* @@ -266,22 +328,24 @@ 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(); + QString aId = QString::fromStdString(theMessage->id()); if (isSalomeMode()) { - QString aId = QString::fromStdString(theMessage->id()); - salomeConnector()->addFeature(aWchName, - QString::fromStdString(theMessage->id()), - aId, - QString::fromStdString(theMessage->tooltip()), - QIcon(theMessage->icon().c_str()), - isUsePropPanel, this, - SLOT(onFeatureTriggered()), QKeySequence()); - myActionsMgr->addCommand(aId, salomeConnector()->command(aId)); + QAction* aAction = salomeConnector()->addFeature(aWchName, + aId, + QString::fromStdString(theMessage->text()), + QString::fromStdString(theMessage->tooltip()), + QIcon(theMessage->icon().c_str()), + QKeySequence(), isUsePropPanel); + myActionsMgr->addCommand(aAction); salomeConnector()->setNestedActions(aId, aNestedFeatures.split(" ")); - + myPartSetModule->featureCreated(aAction); } else { XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); @@ -296,12 +360,12 @@ void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage) aGroup = aPage->addGroup(aGroupName); } //Create feature... - XGUI_Command* aCommand = aGroup->addFeature(QString::fromStdString(theMessage->id()), + XGUI_Command* aCommand = aGroup->addFeature(aId, QString::fromStdString(theMessage->text()), QString::fromStdString(theMessage->tooltip()), QIcon(theMessage->icon().c_str()), QKeySequence(), isUsePropPanel); - aCommand->setUnblockableCommands(aNestedFeatures.split(" ")); + aCommand->setNestedCommands(aNestedFeatures.split(" ", QString::SkipEmptyParts)); myActionsMgr->addCommand(aCommand); myPartSetModule->featureCreated(aCommand); } @@ -314,11 +378,6 @@ void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage) */ void XGUI_Workshop::connectWithOperation(ModuleBase_Operation* theOperation) { - QPushButton* aOkBtn = myPropertyPanel->findChild(XGUI::PROP_PANEL_OK); - connect(aOkBtn, SIGNAL(clicked()), theOperation, SLOT(commit())); - QPushButton* aCancelBtn = myPropertyPanel->findChild(XGUI::PROP_PANEL_CANCEL); - connect(aCancelBtn, SIGNAL(clicked()), theOperation, SLOT(abort())); - QAction* aCommand = 0; if (isSalomeMode()) { aCommand = salomeConnector()->command(theOperation->getDescription()->operationId()); @@ -336,8 +395,8 @@ void XGUI_Workshop::connectWithOperation(ModuleBase_Operation* theOperation) void XGUI_Workshop::saveDocument(QString theName) { QApplication::restoreOverrideCursor(); - boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); - boost::shared_ptr aDoc = aMgr->rootDocument(); + PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + DocumentPtr aDoc = aMgr->rootDocument(); aDoc->save(theName.toLatin1().constData()); QApplication::restoreOverrideCursor(); } @@ -345,15 +404,18 @@ void XGUI_Workshop::saveDocument(QString theName) //****************************************************** void XGUI_Workshop::onExit() { - boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); - boost::shared_ptr aDoc = aMgr->rootDocument(); + PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + DocumentPtr 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(); + bool saved = onSave(); + if(!saved) { + return; + } } else if (anAnswer == QMessageBox::Cancel) { return; } @@ -384,8 +446,8 @@ void XGUI_Workshop::onNew() void XGUI_Workshop::onOpen() { //save current file before close if modified - boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); - boost::shared_ptr aDoc = aMgr->rootDocument(); + PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + DocumentPtr aDoc = aMgr->rootDocument(); if(aDoc->isModified()) { //TODO(sbh): re-launch the app? int anAnswer = QMessageBox::question( @@ -398,59 +460,72 @@ void XGUI_Workshop::onOpen() return; } aDoc->close(); - myCurrentFile = ""; + myCurrentDir = ""; } //show file dialog, check if readable and open - myCurrentFile = QFileDialog::getOpenFileName(mainWindow()); - if(myCurrentFile.isEmpty()) + myCurrentDir = QFileDialog::getExistingDirectory(mainWindow()); + if(myCurrentDir.isEmpty()) return; - QFileInfo aFileInfo(myCurrentFile); + QFileInfo aFileInfo(myCurrentDir); if(!aFileInfo.exists() || !aFileInfo.isReadable()) { QMessageBox::critical(myMainWindow, tr("Warning"), tr("Unable to open the file.")); - myCurrentFile = ""; + myCurrentDir = ""; return; } QApplication::setOverrideCursor(Qt::WaitCursor); - aDoc->load(myCurrentFile.toLatin1().constData()); + aDoc->load(myCurrentDir.toLatin1().constData()); QApplication::restoreOverrideCursor(); updateCommandStatus(); } //****************************************************** -void XGUI_Workshop::onSave() +bool XGUI_Workshop::onSave() { - if(myCurrentFile.isEmpty()) { - onSaveAs(); - return; + if(myCurrentDir.isEmpty()) { + return onSaveAs(); } - saveDocument(myCurrentFile); + saveDocument(myCurrentDir); updateCommandStatus(); + return true; } //****************************************************** -void XGUI_Workshop::onSaveAs() +bool XGUI_Workshop::onSaveAs() { - QString aTemp = myCurrentFile; - myCurrentFile = QFileDialog::getSaveFileName(mainWindow()); - if(myCurrentFile.isEmpty()) { - myCurrentFile = aTemp; - return; + QFileDialog dialog(mainWindow()); + dialog.setWindowTitle(tr("Select directory to save files...")); + dialog.setFileMode(QFileDialog::Directory); + dialog.setFilter(tr("Folders (*)")); + dialog.setOptions(QFileDialog::HideNameFilterDetails | QFileDialog::ShowDirsOnly); + dialog.setViewMode(QFileDialog::Detail); + + if(!dialog.exec()) { + return false; } - QFileInfo aFileInfo(myCurrentFile); - if(aFileInfo.exists() && !aFileInfo.isWritable()) { - QMessageBox::critical(myMainWindow, tr("Warning"), tr("Unable to save the file.")); - return; + QString aTempDir = dialog.selectedFiles().first(); + QDir aDir(aTempDir); + if(aDir.exists() && !aDir.entryInfoList(QDir::NoDotAndDotDot|QDir::AllEntries).isEmpty()) { + int answer = QMessageBox::question(myMainWindow, + QString(), + tr("The folder already contains some files, save anyway?"), + QMessageBox::Save|QMessageBox::Cancel); + if(answer == QMessageBox::Cancel) { + return false; + } } - onSave(); + myCurrentDir = aTempDir; + return onSave(); } //****************************************************** void XGUI_Workshop::onUndo() { - objectBrowser()->setCurrentIndex(QModelIndex()); - boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); - boost::shared_ptr aDoc = aMgr->rootDocument(); + objectBrowser()->treeView()->setCurrentIndex(QModelIndex()); + PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + DocumentPtr aDoc = aMgr->rootDocument(); + if (aDoc->isOperation()) + operationMgr()->abortOperation(); aDoc->undo(); updateCommandStatus(); } @@ -458,9 +533,9 @@ void XGUI_Workshop::onUndo() //****************************************************** void XGUI_Workshop::onRedo() { - objectBrowser()->setCurrentIndex(QModelIndex()); - boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); - boost::shared_ptr aDoc = aMgr->rootDocument(); + objectBrowser()->treeView()->setCurrentIndex(QModelIndex()); + PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + DocumentPtr aDoc = aMgr->rootDocument(); aDoc->redo(); updateCommandStatus(); } @@ -468,7 +543,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 ) )); @@ -479,7 +555,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; @@ -503,24 +578,25 @@ 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 - { + void* modLib = dlopen( libName.toLatin1(), RTLD_LAZY | RTLD_GLOBAL ); + 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; } @@ -528,48 +604,55 @@ 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(); + myActionsMgr->update(); return true; } //****************************************************** void XGUI_Workshop::updateCommandStatus() { - if (isSalomeMode()) // TODO: update commands in SALOME - return; - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); - - QList aCommands = aMenuBar->features(); - QList::const_iterator aIt; - - boost::shared_ptr aMgr = ModelAPI_PluginManager::get(); + QList aCommands; + if (isSalomeMode()) { // update commands in SALOME mode + aCommands = salomeConnector()->commandList(); + } else { + XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); + foreach (XGUI_Command* aCmd, aMenuBar->features()) + aCommands.append(aCmd); + } + PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); 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); + QAction* aUndoCmd; + QAction* aRedoCmd; + foreach(QAction* aCmd, aCommands) { + QString aId = aCmd->data().toString(); + if (aId == "UNDO_CMD") + aUndoCmd = aCmd; + else if (aId == "REDO_CMD") + aRedoCmd = aCmd; else // Enable all commands - (*aIt)->enable(); + aCmd->setEnabled(true); } - boost::shared_ptr aDoc = aMgr->rootDocument(); + DocumentPtr 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(QAction* aCmd, aCommands) { + QString aId = aCmd->data().toString(); + if (aId == "NEW_CMD") + aCmd->setEnabled(true); + else if (aId == "EXIT_CMD") + aCmd->setEnabled(true); else - (*aIt)->disable(); + aCmd->setEnabled(false); } } + myActionsMgr->update(); } //****************************************************** @@ -579,7 +662,10 @@ 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); + + myContextMenuMgr->connectObjectBrowser(); return aObjDock; } @@ -599,6 +685,11 @@ void XGUI_Workshop::createDockWidgets() hidePropertyPanel(); //tabifyDockWidget(aObjDock, myPropertyPanel); + + QPushButton* aOkBtn = myPropertyPanel->findChild(XGUI::PROP_PANEL_OK); + connect(aOkBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onCommitOperation())); + QPushButton* aCancelBtn = myPropertyPanel->findChild(XGUI::PROP_PANEL_CANCEL); + connect(aCancelBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onAbortOperation())); } //****************************************************** @@ -644,18 +735,15 @@ void XGUI_Workshop::onFeatureTriggered() } //****************************************************** -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"); + PluginManagerPtr 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()); } } @@ -671,3 +759,55 @@ XGUI_SalomeViewer* XGUI_Workshop::salomeViewer() const { return mySalomeConnector->viewer(); } + +//************************************************************** +void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) +{ + QFeatureList aFeatures = mySelector->selectedFeatures(); + if ((theId == "ACTIVATE_PART_CMD") && (aFeatures.size() > 0)) + activatePart(aFeatures.first()); + else if (theId == "DEACTIVATE_PART_CMD") + activatePart(FeaturePtr()); + else if (theId == "DELETE_CMD") + deleteFeatures(aFeatures); +} + +//************************************************************** +void XGUI_Workshop::activatePart(FeaturePtr theFeature) +{ + changeCurrentDocument(theFeature); + myObjectBrowser->activatePart(theFeature); +} + +//************************************************************** +void XGUI_Workshop::activateLastPart() +{ + PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + DocumentPtr aDoc = aMgr->rootDocument(); + FeaturePtr aLastPart = aDoc->feature(PARTS_GROUP, aDoc->size(PARTS_GROUP) - 1, true); + activatePart(aLastPart); +} + +//************************************************************** +void XGUI_Workshop::deleteFeatures(QFeatureList theList) +{ + QMainWindow* aDesktop = isSalomeMode()? salomeConnector()->desktop() : myMainWindow; + QMessageBox::StandardButton aRes = QMessageBox::warning(aDesktop, tr("Delete features"), + tr("Seleted features will be deleted. Continue?"), + QMessageBox::No | QMessageBox::Yes, QMessageBox::No); + if (aRes == QMessageBox::Yes) { + PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + aMgr->rootDocument()->startOperation(); + foreach (FeaturePtr aFeature, theList) { + if (aFeature->getKind() == "Part") { + DocumentPtr aDoc = aFeature->data()->docRef("PartDocument")->value(); + if (aDoc == aMgr->currentDocument()) { + aDoc->close(); + } + } //else + //aDoc = aFeature->document(); + aMgr->rootDocument()->removeFeature(aFeature); + } + aMgr->rootDocument()->finishOperation(); + } +}