X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=ee91afe7628823881dfc65949ecb442f1443d709;hb=ed67f7abf2985c7225b7862c076257825a421993;hp=41c911529b558fc01f1ebe6032f7a178c3fe7b33;hpb=fd4dd622a85a0dd19ff5616391f94e980abc26a1;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 41c911529..ee91afe76 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -11,6 +11,7 @@ #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" @@ -40,6 +41,7 @@ #include #include #include +#include //#include @@ -77,10 +79,6 @@ #include #include #include -#include -#include -#include -#include #ifdef _DEBUG #include @@ -96,44 +94,6 @@ //#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; -} XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) : QObject(), @@ -144,7 +104,8 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) myObjectBrowser(0), myDisplayer(0), myUpdatePrefs(false), - myPartActivating(false) + myPartActivating(false), + myIsLoadingData(false) { myMainWindow = mySalomeConnector ? 0 : new AppElements_MainWindow(); @@ -202,10 +163,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)); @@ -383,10 +342,6 @@ 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)); @@ -426,30 +381,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); @@ -511,8 +443,8 @@ void XGUI_Workshop::onFeatureUpdatedMsg(const std::shared_ptronValidateOperation(); - if (myObjectBrowser) - myObjectBrowser->processEvent(theMsg); + //if (myObjectBrowser) + // myObjectBrowser->processEvent(theMsg); } //****************************************************** @@ -550,7 +482,11 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const std::shared_ptrredisplay(aObj, false); if (myOperationMgr->hasOperation()) { ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); if (!aOperation->isEditOperation() && @@ -561,6 +497,10 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const std::shared_ptrcurrentOperation(); 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)) @@ -604,8 +544,8 @@ void XGUI_Workshop::onFeatureCreatedMsg(const std::shared_ptrprocessEvent(theMsg); + //if (myObjectBrowser) + // myObjectBrowser->processEvent(theMsg); if (isDisplayed) myDisplayer->updateViewer(); //if (aHasPart) { // TODO: Avoid activate last part on loading of document @@ -613,14 +553,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) { @@ -667,6 +599,21 @@ void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) //QIntList aModes; //myDisplayer->activateObjects(aModes); myModule->operationStopped(theOperation); + + // if the operation is nested, do not deactivate objects + //if (myOperationMgr->operationsCount() == 0) { + // Activate selection mode for all objects + QIntList aModes; + // TODO: check on OCC_6.9.0 + // the module current active modes should not be deactivated in order to save the objects selected + // the deactivate object in the mode of selection leads to the object is deselected in the viewer. + // But, in OCC_6.8.0 this deselection does not happened automatically. It is necessary to call + // ClearOutdatedSelection, but this method has an error in the realization, which should be fixed in + // the OCC_6.9.0 release. Moreother, it is possible that ClearOutdatedSelection will be called inside + // Deactivate method of AIS_InteractiveContext. In this case, we need not call it. + module()->activeSelectionModes(aModes); + myDisplayer->activateObjects(aModes); + //} } @@ -739,15 +686,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); @@ -778,19 +744,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); @@ -908,10 +862,12 @@ void XGUI_Workshop::onOpen() return; } QApplication::setOverrideCursor(Qt::WaitCursor); + myIsLoadingData = true; aSession->load(myCurrentDir.toLatin1().constData()); myObjectBrowser->rebuildDataTree(); displayAllResults(); updateCommandStatus(); + myIsLoadingData = false; QApplication::restoreOverrideCursor(); } @@ -1017,6 +973,7 @@ void XGUI_Workshop::onRebuild() if (!aWasOperation) { aMgr->finishOperation(); } + updateCommandStatus(); } //****************************************************** @@ -1181,8 +1138,9 @@ 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()); + //connect(myObjectBrowser, SIGNAL(activePartChanged(ObjectPtr)), this, + // SLOT(changeCurrentDocument(ObjectPtr))); aObjDock->setWidget(myObjectBrowser); myContextMenuMgr->connectObjectBrowser(); @@ -1265,23 +1223,6 @@ void XGUI_Workshop::onFeatureTriggered() } } -//****************************************************** -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::salomeViewerSelectionChanged() { @@ -1298,12 +1239,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); @@ -1319,51 +1255,28 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) 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) - myModule->editFeature(aFeature); - } -} - -//************************************************************** -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() { ModuleBase_IModule* aModule = module(); // 1. allow the module to delete objects, do nothing if it has succeed - if (aModule->deleteObjects()) + if (aModule->deleteObjects()) { + updateCommandStatus(); return; + } 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"); @@ -1481,18 +1394,64 @@ 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()) { + std::string aSection, aName, aDefault; + aBody->colorConfigInfo(aSection, aName, aDefault); + if (!aSection.empty() && !aName.empty()) { + aColor = Config_PropManager::color(aSection, aName, aDefault); + } + } + } + } + } + else { + AISObjectPtr anAISObj = myDisplayer->getAISObject(anObject); + if (anAISObj.get()) { + aColor.resize(3); + anAISObj->getColor(aColor[0], aColor[1], aColor[2]); + } + } if (!aColor.empty()) break; } @@ -1500,55 +1459,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); } } } @@ -1654,7 +1602,7 @@ bool XGUI_Workshop::displayObject(ObjectPtr theObj) myDisplayer->display(theObj, false); if (aNb == 0) viewer()->fitAll(); - } else + } else if (!(myIsLoadingData || myPartActivating)) myDisplayer->display(theObj, false); return true; @@ -1686,7 +1634,13 @@ QList XGUI_Workshop::processHistoryList(const std::list if (isEditing) { anId.chop(ModuleBase_Operation::EditSuffix().size()); } - ActionInfo anInfo = myActionsMgr->actionInfoById(anId); + ActionInfo anInfo; + QAction* aContextMenuAct = myContextMenuMgr->actionByName(anId); + if (aContextMenuAct) { + anInfo.initFrom(aContextMenuAct); + } else { + anInfo = myActionsMgr->actionInfoById(anId); + } if (isEditing) { anInfo.text = anInfo.text.prepend("Modify "); }