X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=0f6cd8c773be3290069b876b37757c29c288d54b;hb=2e4a932b26ac2a7539c1b787d77956828ffd8f82;hp=a824d664c740f1bcba914d2fdfb60a939b215dc8;hpb=114994217c1f77cdc9ab17984456c46808812325;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index a824d664c..0f6cd8c77 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -11,12 +11,14 @@ #include "XGUI_SalomeConnector.h" #include "XGUI_ActionsMgr.h" #include "XGUI_ErrorDialog.h" +#include "XGUI_ColorDialog.h" #include "XGUI_ViewerProxy.h" #include "XGUI_PropertyPanel.h" #include "XGUI_ContextMenuMgr.h" #include "XGUI_ModuleConnector.h" #include #include +#include #include #include @@ -66,6 +68,8 @@ #include #include +#include + #include #include #include @@ -78,10 +82,7 @@ #include #include #include -#include -#include -#include -#include +#include #ifdef _DEBUG #include @@ -96,45 +97,7 @@ //#define DEBUG_FEATURE_CREATED //#define DEBUG_FEATURE_REDISPLAY - -QMap XGUI_Workshop::myIcons; - - -QIcon XGUI_Workshop::featureIcon(const FeaturePtr& theFeature) -{ - QIcon anIcon; - - std::string aKind = theFeature->getKind(); - QString aId(aKind.c_str()); - if (!myIcons.contains(aId)) - return anIcon; - - QString anIconString = myIcons[aId]; - - ModelAPI_ExecState aState = theFeature->data()->execState(); - switch(aState) { - case ModelAPI_StateDone: - case ModelAPI_StateNothing: { - anIcon = QIcon(anIconString); - } - break; - case ModelAPI_StateMustBeUpdated: { - anIcon = ModuleBase_Tools::lighter(anIconString); - } - break; - case ModelAPI_StateExecFailed: { - anIcon = ModuleBase_Tools::composite(":pictures/exec_state_failed.png", anIconString); - } - break; - case ModelAPI_StateInvalidArgument: { - anIcon = ModuleBase_Tools::composite(":pictures/exec_state_invalid_parameters.png", - anIconString); - } - break; - default: break; - } - return anIcon; -} +//#define DEBUG_DELETE XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) : QObject(), @@ -150,14 +113,23 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) { myMainWindow = mySalomeConnector ? 0 : new AppElements_MainWindow(); + if (myMainWindow) { + SUIT_ResourceMgr* aResMgr = ModuleBase_Preferences::resourceMgr(); + bool aCloc = aResMgr->booleanValue("language", "locale", true); + if (aCloc) + QLocale::setDefault( QLocale::c() ); + else + QLocale::setDefault( QLocale::system() ); + } + myDisplayer = new XGUI_Displayer(this); mySelector = new XGUI_SelectionMgr(this); //connect(mySelector, SIGNAL(selectionChanged()), this, SLOT(updateModuleCommands())); - myOperationMgr = new XGUI_OperationMgr(this); + myOperationMgr = new XGUI_OperationMgr(this, 0); myActionsMgr = new XGUI_ActionsMgr(this); - myErrorDlg = new XGUI_ErrorDialog(myMainWindow); + myErrorDlg = new XGUI_ErrorDialog(QApplication::desktop()); myContextMenuMgr = new XGUI_ContextMenuMgr(this); connect(myContextMenuMgr, SIGNAL(actionTriggered(const QString&, bool)), this, SLOT(onContextMenuCommand(const QString&, bool))); @@ -167,6 +139,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) myActionsMgr, SLOT(updateOnViewSelection())); myModuleConnector = new XGUI_ModuleConnector(this); + myOperationMgr->setWorkshop(moduleConnector()); connect(myOperationMgr, SIGNAL(operationStarted(ModuleBase_Operation*)), SLOT(onOperationStarted(ModuleBase_Operation*))); @@ -178,8 +151,21 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) SLOT(onOperationCommitted(ModuleBase_Operation*))); connect(myOperationMgr, SIGNAL(operationAborted(ModuleBase_Operation*)), SLOT(onOperationAborted(ModuleBase_Operation*))); - connect(myMainWindow, SIGNAL(exitKeySequence()), SLOT(onExit())); + if (myMainWindow) + connect(myMainWindow, SIGNAL(exitKeySequence()), SLOT(onExit())); connect(this, SIGNAL(errorOccurred(const QString&)), myErrorDlg, SLOT(addError(const QString&))); + + //Config_PropManager::registerProp("Visualization", "object_default_color", "Object color", + // Config_Prop::Color, "225,225,225"); + + Config_PropManager::registerProp("Visualization", "result_body_color", "Body color", + Config_Prop::Color, ModelAPI_ResultBody::DEFAULT_COLOR()); + Config_PropManager::registerProp("Visualization", "result_group_color", "Group color", + Config_Prop::Color, ModelAPI_ResultGroup::DEFAULT_COLOR()); + Config_PropManager::registerProp("Visualization", "result_construction_color", "Construction color", + Config_Prop::Color, ModelAPI_ResultConstruction::DEFAULT_COLOR()); + Config_PropManager::registerProp("Visualization", "result_part_color", "Part color", + Config_Prop::Color, ModelAPI_ResultPart::DEFAULT_COLOR()); } //****************************************************** @@ -204,12 +190,8 @@ void XGUI_Workshop::startApplication() aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); - aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_DELETED)); aLoop->registerListener(this, Events_LongOp::eventID()); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_PLUGIN_LOADED)); - aLoop->registerListener(this, Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED)); - aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TOSHOW)); - aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TOHIDE)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_SELFILTER_LOADED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_UPDATE_VIEWER_BLOCKED)); @@ -220,7 +202,7 @@ void XGUI_Workshop::startApplication() // Calling of loadCustomProps before activating module is required // by Config_PropManger to restore user-defined path to plugins ModuleBase_Preferences::loadCustomProps(); - activateModule(); + createModule(); if (myMainWindow) { myMainWindow->show(); updateCommandStatus(); @@ -231,6 +213,29 @@ void XGUI_Workshop::startApplication() emit applicationStarted(); } +void XGUI_Workshop::activateModule() +{ + myModule->activateSelectionFilters(); + + connect(myDisplayer, SIGNAL(objectDisplayed(ObjectPtr, AISObjectPtr)), + myModule, SLOT(onObjectDisplayed(ObjectPtr, AISObjectPtr))); + connect(myDisplayer, SIGNAL(beforeObjectErase(ObjectPtr, AISObjectPtr)), + myModule, SLOT(onBeforeObjectErase(ObjectPtr, AISObjectPtr))); + + myActionsMgr->update(); + +} + +void XGUI_Workshop::deactivateModule() +{ + myModule->deactivateSelectionFilters(); + + disconnect(myDisplayer, SIGNAL(objectDisplayed(ObjectPtr, AISObjectPtr)), + myModule, SLOT(onObjectDisplayed(ObjectPtr, AISObjectPtr))); + disconnect(myDisplayer, SIGNAL(beforeObjectErase(ObjectPtr, AISObjectPtr)), + myModule, SLOT(onBeforeObjectErase(ObjectPtr, AISObjectPtr))); +} + //****************************************************** void XGUI_Workshop::initMenu() { @@ -276,7 +281,7 @@ void XGUI_Workshop::initMenu() AppElements_Command* aCommand; - aCommand = aGroup->addFeature("SAVE_CMD", tr("Save..."), tr("Save the document"), + aCommand = aGroup->addFeature("SAVE_CMD", tr("Save"), tr("Save the document"), QIcon(":pictures/save.png"), QKeySequence::Save); aCommand->connectTo(this, SLOT(onSave())); //aCommand->disable(); @@ -385,34 +390,12 @@ void XGUI_Workshop::processEvent(const std::shared_ptr& theMessa std::shared_ptr anUpdateMsg = std::dynamic_pointer_cast(theMessage); onFeatureUpdatedMsg(anUpdateMsg); - } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED)) { - std::shared_ptr aDelMsg = - std::dynamic_pointer_cast(theMessage); - onObjectDeletedMsg(aDelMsg); } else if (theMessage->eventID() == Events_LongOp::eventID()) { if (Events_LongOp::isPerformed()) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); } else { QApplication::restoreOverrideCursor(); } - } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TOSHOW)) { - std::shared_ptr anUpdateMsg = - std::dynamic_pointer_cast(theMessage); - const std::set& aObjList = anUpdateMsg->objects(); - QObjectPtrList aList; - std::set::const_iterator aIt; - for (aIt = aObjList.cbegin(); aIt != aObjList.cend(); ++aIt) - aList.append(*aIt); - showObjects(aList, true); - } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TOHIDE)) { - std::shared_ptr anUpdateMsg = - std::dynamic_pointer_cast(theMessage); - const std::set& aObjList = anUpdateMsg->objects(); - QObjectPtrList aList; - std::set::const_iterator aIt; - for (aIt = aObjList.cbegin(); aIt != aObjList.cend(); ++aIt) - aList.append(*aIt); - showObjects(aList, false); } //An operation passed by message. Start it, process and commit. else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OPERATION_LAUNCHED)) { @@ -428,30 +411,7 @@ void XGUI_Workshop::processEvent(const std::shared_ptr& theMessa updateCommandStatus(); } } - } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOCUMENT_CHANGED)) { - myActionsMgr->update(); - // Find and Activate active part - if (myPartActivating) - return; - SessionPtr aMgr = ModelAPI_Session::get(); - DocumentPtr aActiveDoc = aMgr->activeDocument(); - DocumentPtr aDoc = aMgr->moduleDocument(); - if (aActiveDoc == aDoc) { - activatePart(ResultPartPtr()); - return; - } - std::string aGrpName = ModelAPI_ResultPart::group(); - for (int i = 0; i < aDoc->size(aGrpName); i++) { - ResultPartPtr aPart = std::dynamic_pointer_cast(aDoc->object(aGrpName, i)); - if (aPart->partDoc() == aActiveDoc) { - activatePart(aPart); // Activate a part which corresponds to active Doc - return; - } - } - // If not found then activate global document - activatePart(ResultPartPtr()); - - } + } else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_SELFILTER_LOADED)) { std::shared_ptr aMsg = std::dynamic_pointer_cast(theMessage); @@ -468,6 +428,7 @@ void XGUI_Workshop::processEvent(const std::shared_ptr& theMessa } else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_UPDATE_VIEWER_UNBLOCKED)) { // the viewer's update context is unblocked, the viewer's update works myDisplayer->enableUpdateViewer(true); + myDisplayer->updateViewer(); } else { //Show error dialog if error message received. std::shared_ptr anAppError = std::dynamic_pointer_cast(theMessage); @@ -513,8 +474,8 @@ void XGUI_Workshop::onFeatureUpdatedMsg(const std::shared_ptronValidateOperation(); - if (myObjectBrowser) - myObjectBrowser->processEvent(theMsg); + //if (myObjectBrowser) + // myObjectBrowser->processEvent(theMsg); } //****************************************************** @@ -536,7 +497,8 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const std::shared_ptrdata() || !aObj->data()->isValid(); + bool aHide = !aObj->data() || !aObj->data()->isValid() || + aObj->isDisabled() || (!aObj->isDisplayed()); if (!aHide) { // check that this is not hidden result ResultPtr aRes = std::dynamic_pointer_cast(aObj); aHide = aRes && aRes->isConcealed(); @@ -557,25 +519,12 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const std::shared_ptrredisplay(aObj, false); - if (myOperationMgr->hasOperation()) { - ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - if (!aOperation->isEditOperation() && - aOperation->hasObject(aObj) && myDisplayer->isActive(aObj)) - myDisplayer->deactivate(aObj); - } + // Deactivate object of current operation from selection + deactivateActiveObject(aObj, false); } else { // display object if the current operation has it - ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - if (aOperation && aOperation->hasObject(aObj)) { - ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - #ifdef DEBUG_FEATURE_REDISPLAY - QString anObjInfo = ModuleBase_Tools::objectInfo((aObj)); - qDebug(QString(" display object = %1").arg(anObjInfo).toStdString().c_str()); - #endif - if (displayObject(aObj)) { - // Deactivate object of current operation from selection - if (myDisplayer->isActive(aObj)) - myDisplayer->deactivate(aObj); - } + if (displayObject(aObj)) { + // Deactivate object of current operation from selection + deactivateActiveObject(aObj, false); } } } @@ -583,6 +532,15 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const std::shared_ptrupdateViewer(); } +//****************************************************** +void XGUI_Workshop::deactivateActiveObject(const ObjectPtr& theObject, const bool theUpdateViewer) +{ + if (!myModule->canActivateSelection(theObject)) { + if (myDisplayer->isActive(theObject)) + myDisplayer->deactivate(theObject, theUpdateViewer); + } +} + //****************************************************** void XGUI_Workshop::onFeatureCreatedMsg(const std::shared_ptr& theMsg) { @@ -603,19 +561,22 @@ void XGUI_Workshop::onFeatureCreatedMsg(const std::shared_ptrdata() || !anObject->data()->isValid()) - continue; - //ResultPartPtr aPart = std::dynamic_pointer_cast(*aIt); - //if (aPart) { - //aHasPart = true; - // If a feature is created from the aplication's python console - // it doesn't stored in the operation mgr and doesn't displayed - //} else { - isDisplayed = displayObject(*aIt); - //} + // we should not display disabled objects + bool aHide = !anObject->data()->isValid() || + anObject->isDisabled() || + !anObject->isDisplayed(); + if (!aHide) { + // setDisplayed has to be called in order to synchronize internal state of the object + // with list of displayed objects + if (myModule->canDisplayObject(anObject)) { + anObject->setDisplayed(true); + isDisplayed = displayObject(*aIt); + } else + anObject->setDisplayed(false); + } } - if (myObjectBrowser) - myObjectBrowser->processEvent(theMsg); + //if (myObjectBrowser) + // myObjectBrowser->processEvent(theMsg); if (isDisplayed) myDisplayer->updateViewer(); //if (aHasPart) { // TODO: Avoid activate last part on loading of document @@ -623,14 +584,6 @@ void XGUI_Workshop::onFeatureCreatedMsg(const std::shared_ptr& theMsg) -{ - if (myObjectBrowser) - myObjectBrowser->processEvent(theMsg); - //std::set aFeatures = theMsg->objects(); -} - //****************************************************** void XGUI_Workshop::onOperationStarted(ModuleBase_Operation* theOperation) { @@ -642,7 +595,22 @@ void XGUI_Workshop::onOperationStarted(ModuleBase_Operation* theOperation) } updateCommandStatus(); - myModule->operationStarted(theOperation); + myModule->onOperationStarted(theOperation); + + // the objects of the current operation should be deactivated + QObjectPtrList anObjects; + FeaturePtr aFeature = theOperation->feature(); + anObjects.append(aFeature); + std::list aResults = aFeature->results(); + std::list::const_iterator aIt; + for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { + anObjects.append(*aIt); + } + QObjectPtrList::const_iterator anIt = anObjects.begin(), aLast = anObjects.end(); + for (; anIt != aLast; anIt++) + deactivateActiveObject(*anIt, false); + if (anObjects.size() > 0) + myDisplayer->updateViewer(); } //****************************************************** @@ -656,7 +624,7 @@ void XGUI_Workshop::onOperationResumed(ModuleBase_Operation* theOperation) } updateCommandStatus(); - myModule->operationResumed(theOperation); + myModule->onOperationResumed(theOperation); } @@ -670,30 +638,36 @@ void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) hidePropertyPanel(); myPropertyPanel->cleanContent(); - // Activate objects created by current operation - // in order to clean selection modes - // the deactivation should be pefromed in the same place, where the mode is activated, - // e.g. activation in the current widget activation, deactivation - in the widget's deactivation - //QIntList aModes; - //myDisplayer->activateObjects(aModes); - myModule->operationStopped(theOperation); - - if (myOperationMgr->operationsCount() == 0) { - // Activate selection mode for all objects - QIntList aModes; - myDisplayer->activateObjects(aModes); + myModule->onOperationStopped(theOperation); + + // the deactivated objects of the current operation should be activated back. + // They were deactivated on operation start or an object redisplay + QObjectPtrList anObjects; + FeaturePtr aFeature = theOperation->feature(); + if (myDisplayer->isVisible(aFeature) && !myDisplayer->isActive(aFeature)) + anObjects.append(aFeature); + std::list aResults = aFeature->results(); + std::list::const_iterator aIt; + for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { + ResultPtr anObject = *aIt; + if (myDisplayer->isVisible(anObject) && !myDisplayer->isActive(anObject)) { + anObjects.append(anObject); + } } + QIntList aModes; + module()->activeSelectionModes(aModes); + myDisplayer->activateObjects(aModes, anObjects); } void XGUI_Workshop::onOperationCommitted(ModuleBase_Operation* theOperation) { - myModule->operationCommitted(theOperation); + myModule->onOperationCommitted(theOperation); } void XGUI_Workshop::onOperationAborted(ModuleBase_Operation* theOperation) { - myModule->operationAborted(theOperation); + myModule->onOperationAborted(theOperation); } void XGUI_Workshop::setNestedFeatures(ModuleBase_Operation* theOperation) @@ -755,15 +729,34 @@ void XGUI_Workshop::addFeature(const std::shared_ptr& the } ActionInfo aFeatureInfo; aFeatureInfo.initFrom(theMessage); - // Remember features icons - myIcons[QString::fromStdString(theMessage->id())] = aFeatureInfo.iconFile; QString aWchName = QString::fromStdString(theMessage->workbenchId()); QStringList aNestedFeatures = QString::fromStdString(theMessage->nestedFeatures()).split(" ", QString::SkipEmptyParts); QString aDocKind = QString::fromStdString(theMessage->documentKind()); + QList aNestedActList; + bool isColumnButton = !aNestedFeatures.isEmpty(); + if (isColumnButton) { + QString aNestedActions = QString::fromStdString(theMessage->actionsWhenNested()); + if (aNestedActions.contains("accept")) { + QAction* anAction = myActionsMgr->operationStateAction(XGUI_ActionsMgr::AcceptAll, NULL); + connect(anAction, SIGNAL(triggered()), myOperationMgr, SLOT(commitAllOperations())); + aNestedActList << anAction; + } + if (aNestedActions.contains("abort")) { + QAction* anAction = myActionsMgr->operationStateAction(XGUI_ActionsMgr::AbortAll, NULL); + connect(anAction, SIGNAL(triggered()), myOperationMgr, SLOT(abortAllOperations())); + aNestedActList << anAction; + } + } + if (isSalomeMode()) { - QAction* aAction = salomeConnector()->addFeature(aWchName, aFeatureInfo); + QAction* aAction; + if (isColumnButton) { + aAction = salomeConnector()->addNestedFeature(aWchName, aFeatureInfo, aNestedActList); + } else { + aAction = salomeConnector()->addFeature(aWchName, aFeatureInfo); + } salomeConnector()->setNestedActions(aFeatureInfo.id, aNestedFeatures); salomeConnector()->setDocumentKind(aFeatureInfo.id, aDocKind); @@ -794,19 +787,7 @@ void XGUI_Workshop::addFeature(const std::shared_ptr& the // Enrich created button with accept/abort buttons if necessary AppElements_Button* aButton = aCommand->button(); if (aButton->isColumnButton()) { - QString aNestedActions = QString::fromStdString(theMessage->actionsWhenNested()); - QList anActList; - if (aNestedActions.contains("accept")) { - QAction* anAction = myActionsMgr->operationStateAction(XGUI_ActionsMgr::AcceptAll, aButton); - connect(anAction, SIGNAL(triggered()), myOperationMgr, SLOT(commitAllOperations())); - anActList << anAction; - } - if (aNestedActions.contains("abort")) { - QAction* anAction = myActionsMgr->operationStateAction(XGUI_ActionsMgr::AbortAll, aButton); - connect(anAction, SIGNAL(triggered()), myOperationMgr, SLOT(abortAllOperations())); - anActList << anAction; - } - aButton->setAdditionalButtons(anActList); + aButton->setAdditionalButtons(aNestedActList); } myActionsMgr->addCommand(aCommand); myModule->actionCreated(aCommand); @@ -909,12 +890,11 @@ void XGUI_Workshop::onOpen() } else if (anAnswer == QMessageBox::Cancel) { return; } - aSession->closeAll(); myCurrentDir = ""; } //show file dialog, check if readable and open - myCurrentDir = QFileDialog::getExistingDirectory(mainWindow()); + myCurrentDir = QFileDialog::getExistingDirectory(mainWindow(), tr("Select folder")); if (myCurrentDir.isEmpty()) return; QFileInfo aFileInfo(myCurrentDir); @@ -925,9 +905,10 @@ void XGUI_Workshop::onOpen() } QApplication::setOverrideCursor(Qt::WaitCursor); myIsLoadingData = true; + aSession->closeAll(); aSession->load(myCurrentDir.toLatin1().constData()); myObjectBrowser->rebuildDataTree(); - displayAllResults(); + //displayAllResults(); updateCommandStatus(); myIsLoadingData = false; QApplication::restoreOverrideCursor(); @@ -955,7 +936,7 @@ bool XGUI_Workshop::onSaveAs() if(!isActiveOperationAborted()) return false; QFileDialog dialog(mainWindow()); - dialog.setWindowTitle(tr("Select directory to save files...")); + dialog.setWindowTitle(tr("Select folder to save files...")); dialog.setFileMode(QFileDialog::Directory); dialog.setFilter(tr("Folders (*)")); dialog.setOptions(QFileDialog::HideNameFilterDetails | QFileDialog::ShowDirsOnly); @@ -964,6 +945,7 @@ bool XGUI_Workshop::onSaveAs() if (!dialog.exec()) { return false; } + QString aTempDir = dialog.selectedFiles().first(); QDir aDir(aTempDir); if (aDir.exists() && !aDir.entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries).isEmpty()) { @@ -1035,6 +1017,7 @@ void XGUI_Workshop::onRebuild() if (!aWasOperation) { aMgr->finishOperation(); } + updateCommandStatus(); } //****************************************************** @@ -1118,7 +1101,7 @@ ModuleBase_IModule* XGUI_Workshop::loadModule(const QString& theModule) } //****************************************************** -bool XGUI_Workshop::activateModule() +bool XGUI_Workshop::createModule() { Config_ModuleReader aModuleReader; QString moduleName = QString::fromStdString(aModuleReader.getModuleName()); @@ -1126,13 +1109,13 @@ bool XGUI_Workshop::activateModule() if (!myModule) return false; - connect(myDisplayer, SIGNAL(objectDisplayed(ObjectPtr, AISObjectPtr)), - myModule, SLOT(onObjectDisplayed(ObjectPtr, AISObjectPtr))); - connect(myDisplayer, SIGNAL(beforeObjectErase(ObjectPtr, AISObjectPtr)), - myModule, SLOT(onBeforeObjectErase(ObjectPtr, AISObjectPtr))); + //connect(myDisplayer, SIGNAL(objectDisplayed(ObjectPtr, AISObjectPtr)), + // myModule, SLOT(onObjectDisplayed(ObjectPtr, AISObjectPtr))); + //connect(myDisplayer, SIGNAL(beforeObjectErase(ObjectPtr, AISObjectPtr)), + // myModule, SLOT(onBeforeObjectErase(ObjectPtr, AISObjectPtr))); myModule->createFeatures(); - myActionsMgr->update(); + //myActionsMgr->update(); return true; } @@ -1149,20 +1132,16 @@ void XGUI_Workshop::updateCommandStatus() } SessionPtr aMgr = ModelAPI_Session::get(); if (aMgr->hasModuleDocument()) { - QAction *aUndoCmd, *aRedoCmd; foreach(QAction* aCmd, aCommands) { QString aId = aCmd->data().toString(); if (aId == "UNDO_CMD") - aUndoCmd = aCmd; + aCmd->setEnabled(myModule->canUndo()); else if (aId == "REDO_CMD") - aRedoCmd = aCmd; + aCmd->setEnabled(myModule->canRedo()); else // Enable all commands aCmd->setEnabled(true); } - - aUndoCmd->setEnabled(myModule->canUndo()); - aRedoCmd->setEnabled(myModule->canRedo()); updateHistory(); } else { foreach(QAction* aCmd, aCommands) { @@ -1199,8 +1178,8 @@ QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent) aObjDock->setStyleSheet( "::title { position: relative; padding-left: 5px; text-align: left center }"); myObjectBrowser = new XGUI_ObjectsBrowser(aObjDock); - connect(myObjectBrowser, SIGNAL(activePartChanged(ObjectPtr)), this, - SLOT(changeCurrentDocument(ObjectPtr))); + myObjectBrowser->setDataModel(myModule->dataModel()); + myModule->customizeObjectBrowser(myObjectBrowser); aObjDock->setWidget(myObjectBrowser); myContextMenuMgr->connectObjectBrowser(); @@ -1273,32 +1252,15 @@ void XGUI_Workshop::hideObjectBrowser() } //****************************************************** -void XGUI_Workshop::onFeatureTriggered() -{ - QAction* aCmd = dynamic_cast(sender()); - if (aCmd) { - QString aId = salomeConnector()->commandId(aCmd); - if (!aId.isNull()) - myModule->launchOperation(aId); - } -} - -//****************************************************** -void XGUI_Workshop::changeCurrentDocument(ObjectPtr theObj) -{ - SessionPtr aMgr = ModelAPI_Session::get(); - if (theObj) { - ResultPartPtr aPart = std::dynamic_pointer_cast(theObj); - if (aPart) { - DocumentPtr aPartDoc = aPart->partDoc(); - if (aPartDoc) { - aMgr->setActiveDocument(aPartDoc); - return; - } - } - } - aMgr->setActiveDocument(aMgr->moduleDocument()); -} +//void XGUI_Workshop::onFeatureTriggered() +//{ +// QAction* aCmd = dynamic_cast(sender()); +// if (aCmd) { +// QString aId = salomeConnector()->commandId(aCmd); +// if (!aId.isNull()) +// myModule->launchOperation(aId); +// } +//} //****************************************************** void XGUI_Workshop::salomeViewerSelectionChanged() @@ -1316,12 +1278,7 @@ ModuleBase_IViewer* XGUI_Workshop::salomeViewer() const void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) { QObjectPtrList aObjects = mySelector->selection()->selectedObjects(); - if ((theId == "ACTIVATE_PART_CMD") && (aObjects.size() > 0)) { - ResultPartPtr aPart = std::dynamic_pointer_cast(aObjects.first()); - activatePart(aPart); - } else if (theId == "DEACTIVATE_PART_CMD") - activatePart(ResultPartPtr()); - else if (theId == "DELETE_CMD") + if (theId == "DELETE_CMD") deleteObjects(); else if (theId == "COLOR_CMD") changeColor(aObjects); @@ -1335,49 +1292,14 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) setDisplayMode(aObjects, XGUI_Displayer::Shading); else if (theId == "WIREFRAME_CMD") setDisplayMode(aObjects, XGUI_Displayer::Wireframe); - else if (theId == "HIDEALL_CMD") - myDisplayer->eraseAll(); - else if (theId == "EDIT_CMD") { - FeaturePtr aFeature = std::dynamic_pointer_cast(aObjects.first()); - if (aFeature == NULL) { - ResultParameterPtr aParam = - std::dynamic_pointer_cast(aObjects.first()); - if (aParam.get() != NULL) { - aFeature = ModelAPI_Feature::feature(aParam); - } - } - if (aFeature.get() != NULL) - myModule->editFeature(aFeature); + else if (theId == "HIDEALL_CMD") { + QObjectPtrList aList = myDisplayer->displayedObjects(); + foreach (ObjectPtr aObj, aList) + aObj->setDisplayed(false); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); } } -//************************************************************** -void XGUI_Workshop::activatePart(ResultPartPtr theFeature) -{ - if (!myPartActivating) { - myPartActivating = true; - if (theFeature) - theFeature->activate(); - changeCurrentDocument(theFeature); - myObjectBrowser->activatePart(theFeature); - myPartActivating = false; - } - updateCommandStatus(); -} - -//************************************************************** -//void XGUI_Workshop::activateLastPart() -//{ -// SessionPtr aMgr = ModelAPI_Session::get(); -// DocumentPtr aDoc = aMgr->moduleDocument(); -// std::string aGrpName = ModelAPI_ResultPart::group(); -// ObjectPtr aLastPart = aDoc->object(aGrpName, aDoc->size(aGrpName) - 1); -// ResultPartPtr aPart = std::dynamic_pointer_cast(aLastPart); -// if (aPart) { -// activatePart(aPart); -// } -//} - //************************************************************** void XGUI_Workshop::deleteObjects() { @@ -1391,12 +1313,19 @@ void XGUI_Workshop::deleteObjects() if (!isActiveOperationAborted()) return; QObjectPtrList anObjects = mySelector->selection()->selectedObjects(); + bool hasResult = false; + bool hasFeature = false; + bool hasParameter = false; + ModuleBase_Tools::checkObjects(anObjects, hasResult, hasFeature, hasParameter); + if (!(hasFeature || hasParameter)) + return; + // 1. start operation QString aDescription = contextMenuMgr()->action("DELETE_CMD")->text(); aDescription += tr(" %1"); QStringList aObjectNames; foreach (ObjectPtr aObj, anObjects) { - if (!aObj->data().get()) + if (!aObj->data()->isValid()) continue; aObjectNames << QString::fromStdString(aObj->data()->name()); } @@ -1405,7 +1334,8 @@ void XGUI_Workshop::deleteObjects() SessionPtr aMgr = ModelAPI_Session::get(); aMgr->startOperation(aDescription.toStdString()); // 2. close the documents of the removed parts if the result part is in a list of selected objects - foreach (ObjectPtr aObj, anObjects) + // this is performed in the RemoveFeature of Part object. + /*foreach (ObjectPtr aObj, anObjects) { ResultPartPtr aPart = std::dynamic_pointer_cast(aObj); if (aPart) { @@ -1414,7 +1344,7 @@ void XGUI_Workshop::deleteObjects() aDoc->close(); } } - } + }*/ // 3. delete objects QMainWindow* aDesktop = isSalomeMode() ? salomeConnector()->desktop() : myMainWindow; std::set anIgnoredFeatures; @@ -1436,10 +1366,65 @@ bool XGUI_Workshop::deleteFeatures(const QObjectPtrList& theList, { // 1. find all referenced features std::set aRefFeatures; - foreach (ObjectPtr aObj, theList) { - FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); - if (aFeature.get() != NULL) { - aObj->document()->refsToFeature(aFeature, aRefFeatures, false); + foreach (ObjectPtr aDeletedObj, theList) { + FeaturePtr aDeletedFeature = ModelAPI_Feature::feature(aDeletedObj); + if (aDeletedFeature.get() != NULL) { + DocumentPtr aDeletedFeatureDoc = aDeletedObj->document(); + // 1.1 find references in the current document + aDeletedFeatureDoc->refsToFeature(aDeletedFeature, aRefFeatures, false); + // 1.2 find references in all documents if the document of the feature is + // "PartSet". Features of this document can be used in all other documents + SessionPtr aMgr = ModelAPI_Session::get(); + DocumentPtr aModuleDoc = aMgr->moduleDocument(); + if (aDeletedFeatureDoc == aModuleDoc) { + // the deleted feature and results of the feature should be found in references + std::list aDeletedObjects; + aDeletedObjects.push_back(aDeletedFeature); + typedef std::list > ResultsList; + const ResultsList& aDeletedResults = aDeletedFeature->results(); + ResultsList::const_iterator aRIter = aDeletedResults.begin(); + for (; aRIter != aDeletedResults.cend(); aRIter++) { + ResultPtr aRes = *aRIter; + if (aRes.get()) + aDeletedObjects.push_back(aRes); + } + // get all opened documents; found features in the documents; + // get a list of objects where a feature refers; + // search in these objects the deleted objects. + std::list anOpenedDocs = aMgr->allOpenedDocuments(); + std::list::const_iterator anIt = anOpenedDocs.begin(), + aLast = anOpenedDocs.end(); + std::list > > aRefs; + for (; anIt != aLast; anIt++) { + DocumentPtr aDocument = *anIt; + if (aDocument == aDeletedFeatureDoc) + continue; // this document has been already processed in 1.1 + + int aFeaturesCount = aDocument->size(ModelAPI_Feature::group()); + for (int aId = 0; aId < aFeaturesCount; aId++) { + ObjectPtr anObject = aDocument->object(ModelAPI_Feature::group(), aId); + FeaturePtr aFeature = std::dynamic_pointer_cast(anObject); + if (!aFeature.get()) + continue; + + aRefs.clear(); + aFeature->data()->referencesToObjects(aRefs); + std::list > >::iterator aRef = aRefs.begin(); + bool aHasReferenceToDeleted = false; + for(; aRef != aRefs.end() && !aHasReferenceToDeleted; aRef++) { + std::list::iterator aRefObj = aRef->second.begin(); + for(; aRefObj != aRef->second.end() && !aHasReferenceToDeleted; aRefObj++) { + std::list::const_iterator aDelIt = aDeletedObjects.begin(); + for(; aDelIt != aDeletedObjects.end() && !aHasReferenceToDeleted; aDelIt++) { + aHasReferenceToDeleted = *aDelIt == *aRefObj; + } + } + } + if (aHasReferenceToDeleted) + aRefFeatures.insert(aFeature); + } + } + } } } // 2. warn about the references remove, break the delete operation if the user chose it @@ -1464,22 +1449,52 @@ These features will be deleted also. Would you like to continue?")).arg(aNames), // 3. remove referenced features std::set::const_iterator anIt = aRefFeatures.begin(), aLast = aRefFeatures.end(); +#ifdef DEBUG_DELETE + QStringList anInfo; +#endif for (; anIt != aLast; anIt++) { FeaturePtr aFeature = (*anIt); DocumentPtr aDoc = aFeature->document(); - if (theIgnoredFeatures.find(aFeature) == theIgnoredFeatures.end()) + if (theIgnoredFeatures.find(aFeature) == theIgnoredFeatures.end()) { aDoc->removeFeature(aFeature); +#ifdef DEBUG_DELETE + anInfo.append(ModuleBase_Tools::objectInfo(aFeature).toStdString().c_str()); +#endif + } } +#ifdef DEBUG_DELETE + qDebug(QString("remove references:%1").arg(anInfo.join("; ")).toStdString().c_str()); + anInfo.clear(); +#endif // 4. remove the parameter features foreach (ObjectPtr aObj, theList) { + ResultPtr aResult = std::dynamic_pointer_cast(aObj); + if (aResult.get() != NULL) { // results could not be removed, + // they are removed by a corresponded feature remove + continue; + } FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); if (aFeature) { + // TODO: to learn the workshop to delegate the Part object deletion to the PartSet module + // part features are removed in the PartSet module. This condition should be moved there + if (aFeature->getKind() == "Part") + continue; + DocumentPtr aDoc = aObj->document(); - if (theIgnoredFeatures.find(aFeature) == theIgnoredFeatures.end()) + if (theIgnoredFeatures.find(aFeature) == theIgnoredFeatures.end()) { aDoc->removeFeature(aFeature); +#ifdef DEBUG_DELETE + QString anInfoStr = ModuleBase_Tools::objectInfo(aFeature); + anInfo.append(anInfoStr); + qDebug(QString("remove feature :%1").arg(anInfoStr).toStdString().c_str()); +#endif + } } } +#ifdef DEBUG_DELETE + qDebug(QString("remove features:%1").arg(anInfo.join("; ")).toStdString().c_str()); +#endif return true; } @@ -1508,18 +1523,69 @@ bool XGUI_Workshop::canChangeColor() const aTypes.insert(ModelAPI_ResultGroup::group()); aTypes.insert(ModelAPI_ResultConstruction::group()); aTypes.insert(ModelAPI_ResultBody::group()); + aTypes.insert(ModelAPI_ResultPart::group()); + return hasResults(aObjects, aTypes); } +void setColor(ResultPtr theResult, std::vector& theColor) +{ + if (!theResult.get()) + return; + + AttributeIntArrayPtr aColorAttr = theResult->data()->intArray(ModelAPI_Result::COLOR_ID()); + if (aColorAttr.get() != NULL) { + if (!aColorAttr->size()) { + aColorAttr->setSize(3); + } + aColorAttr->setValue(0, theColor[0]); + aColorAttr->setValue(1, theColor[1]); + aColorAttr->setValue(2, theColor[2]); + } +} + //************************************************************** void XGUI_Workshop::changeColor(const QObjectPtrList& theObjects) { + AttributeIntArrayPtr aColorAttr; + // 1. find the current color of the object. This is a color of AIS presentation + // The objects are iterated until a first valid color is found std::vector aColor; foreach(ObjectPtr anObject, theObjects) { - - AISObjectPtr anAISObj = myDisplayer->getAISObject(anObject); - aColor.resize(3); - anAISObj->getColor(aColor[0], aColor[1], aColor[2]); + if (anObject->groupName() == ModelAPI_ResultPart::group()) { + ResultPartPtr aPart = std::dynamic_pointer_cast(anObject); + DocumentPtr aPartDoc = aPart->partDoc(); + // the document should be checked on null, because in opened document if the part + // has not been activated yet, the part document is empty + if (!aPartDoc.get()) { + emit errorOccurred(QString::fromLatin1("Color can not be changed on a part with an empty document")); + } + else { + if (aPartDoc->size(ModelAPI_ResultBody::group()) > 0) { + ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultBody::group(), 0); + ResultBodyPtr aBody = std::dynamic_pointer_cast(aObject); + if (aBody.get()) { + XGUI_CustomPrs::getResultColor(aBody, aColor); + } + } + } + } + else { + ResultPtr aResult = std::dynamic_pointer_cast(anObject); + if (aResult.get()) + XGUI_CustomPrs::getResultColor(aResult, aColor); + else { + // TODO: remove the obtaining a color from the AIS object + // this does not happen never because: + // 1. The color can be changed only on results + // 2. The result can be not visualized in the viewer(e.g. Origin Construction) + AISObjectPtr anAISObj = myDisplayer->getAISObject(anObject); + if (anAISObj.get()) { + aColor.resize(3); + anAISObj->getColor(aColor[0], aColor[1], aColor[2]); + } + } + } if (!aColor.empty()) break; } @@ -1527,55 +1593,44 @@ void XGUI_Workshop::changeColor(const QObjectPtrList& theObjects) return; // 2. show the dialog to change the value - QDialog* aDlg = new QDialog(); - QVBoxLayout* aLay = new QVBoxLayout(aDlg); - - QtxColorButton* aColorBtn = new QtxColorButton(aDlg); - aColorBtn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - - aLay->addWidget(aColorBtn); - aColorBtn->setColor(QColor(aColor[0], aColor[1], aColor[2])); - - QDialogButtonBox* aButtons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, - Qt::Horizontal, aDlg); - connect(aButtons, SIGNAL(accepted()), aDlg, SLOT(accept())); - connect(aButtons, SIGNAL(rejected()), aDlg, SLOT(reject())); - aLay->addWidget(aButtons); - + XGUI_ColorDialog* aDlg = new XGUI_ColorDialog(mainWindow()); + aDlg->setColor(aColor); aDlg->move(QCursor::pos()); bool isDone = aDlg->exec() == QDialog::Accepted; if (!isDone) return; - QColor aColorResult = aColorBtn->color(); - int aRedResult = aColorResult.red(), - aGreenResult = aColorResult.green(), - aBlueResult = aColorResult.blue(); - - if (aRedResult == aColor[0] && aGreenResult == aColor[1] && aBlueResult == aColor[2]) - return; + bool isRandomColor = aDlg->isRandomColor(); // 3. abort the previous operation and start a new one SessionPtr aMgr = ModelAPI_Session::get(); bool aWasOperation = aMgr->isOperation(); // keep this value if (!aWasOperation) { - QString aDescription = contextMenuMgr()->action("DELETE_CMD")->text(); + QString aDescription = contextMenuMgr()->action("COLOR_CMD")->text(); aMgr->startOperation(aDescription.toStdString()); } // 4. set the value to all results - AttributeIntArrayPtr aColorAttr; foreach(ObjectPtr anObj, theObjects) { ResultPtr aResult = std::dynamic_pointer_cast(anObj); if (aResult.get() != NULL) { - aColorAttr = aResult->data()->intArray(ModelAPI_Result::COLOR_ID()); - if (aColorAttr.get() != NULL) { - if (!aColorAttr->size()) { - aColorAttr->setSize(3); + if (aResult->groupName() == ModelAPI_ResultPart::group()) { + ResultPartPtr aPart = std::dynamic_pointer_cast(aResult); + DocumentPtr aPartDoc = aPart->partDoc(); + // the document should be checked on null, because in opened document if the part + // has not been activated yet, the part document is empty + if (aPartDoc.get()) { + for (int i = 0; i < aPartDoc->size(ModelAPI_ResultBody::group()); i++) { + ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultBody::group(), i); + ResultBodyPtr aBody = std::dynamic_pointer_cast(aObject); + std::vector aColorResult = aDlg->getColor(); + setColor(aBody, aColorResult); + } } - aColorAttr->setValue(0, aRedResult); - aColorAttr->setValue(1, aGreenResult); - aColorAttr->setValue(2, aBlueResult); + } + else { + std::vector aColorResult = aDlg->getColor(); + setColor(aResult, aColorResult); } } } @@ -1585,23 +1640,52 @@ void XGUI_Workshop::changeColor(const QObjectPtrList& theObjects) } //************************************************************** +#define SET_DISPLAY_GROUP(aGroupName, aDisplay) \ +for (int i = 0; i < aDoc->size(aGroupName); i++) { \ + aDoc->object(aGroupName, i)->setDisplayed(aDisplay); \ +} void XGUI_Workshop::showObjects(const QObjectPtrList& theList, bool isVisible) { - foreach (ObjectPtr aObj, theList) - { - if (isVisible) { - displayObject(aObj); + foreach (ObjectPtr aObj, theList) { + /* + ResultPartPtr aPartRes = std::dynamic_pointer_cast(aObj); + if (aPartRes) { + DocumentPtr aDoc = aPartRes->partDoc(); + SET_DISPLAY_GROUP(ModelAPI_ResultBody::group(), isVisible) + SET_DISPLAY_GROUP(ModelAPI_ResultConstruction::group(), isVisible) + SET_DISPLAY_GROUP(ModelAPI_ResultGroup::group(), isVisible) } else { - myDisplayer->erase(aObj, false); - } + */ + aObj->setDisplayed(isVisible); + //} } - myDisplayer->updateViewer(); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); } //************************************************************** void XGUI_Workshop::showOnlyObjects(const QObjectPtrList& theList) { - myDisplayer->showOnly(theList); + // Hide all displayed objects + QObjectPtrList aList = myDisplayer->displayedObjects(); + foreach (ObjectPtr aObj, aList) + aObj->setDisplayed(false); + + // Show only objects from the list + foreach (ObjectPtr aObj, theList) { + /* + ResultPartPtr aPartRes = std::dynamic_pointer_cast(aObj); + if (aPartRes) { + DocumentPtr aDoc = aPartRes->partDoc(); + SET_DISPLAY_GROUP(ModelAPI_ResultBody::group(), true) + SET_DISPLAY_GROUP(ModelAPI_ResultConstruction::group(), true) + SET_DISPLAY_GROUP(ModelAPI_ResultGroup::group(), true) + } else { + */ + aObj->setDisplayed(true); + //} + } + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); + } @@ -1613,7 +1697,7 @@ void XGUI_Workshop::registerValidators() const } //************************************************************** -void XGUI_Workshop::displayAllResults() +/*void XGUI_Workshop::displayAllResults() { SessionPtr aMgr = ModelAPI_Session::get(); DocumentPtr aRootDoc = aMgr->moduleDocument(); @@ -1624,7 +1708,7 @@ void XGUI_Workshop::displayAllResults() displayDocumentResults(aPart->partDoc()); } myDisplayer->updateViewer(); -} +}*/ //************************************************************** void XGUI_Workshop::displayDocumentResults(DocumentPtr theDoc) @@ -1638,8 +1722,10 @@ void XGUI_Workshop::displayDocumentResults(DocumentPtr theDoc) //************************************************************** void XGUI_Workshop::displayGroupResults(DocumentPtr theDoc, std::string theGroup) { - for (int i = 0; i < theDoc->size(theGroup); i++) - displayObject(theDoc->object(theGroup, i)); + for (int i = 0; i < theDoc->size(theGroup); i++) + theDoc->object(theGroup, i)->setDisplayed(true); + //displayObject(theDoc->object(theGroup, i)); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); } //************************************************************** @@ -1666,7 +1752,6 @@ void XGUI_Workshop::closeDocument() SessionPtr aMgr = ModelAPI_Session::get(); aMgr->closeAll(); - objectBrowser()->clearContent(); } //**************************************************************