X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=9ee12eea2d9d8daf99be34525a398603093f2e0c;hb=19bc85698899d6bee8704e7b0953ee045b0eb66f;hp=a3fac8efc54a4c71c8aefc520bfe60b3d418b259;hpb=adea5ec53d88cc286323d1547acb6ead25593b50;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index a3fac8efc..9ee12eea2 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -126,6 +126,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) //****************************************************** XGUI_Workshop::~XGUI_Workshop(void) { + delete myDisplayer; } //****************************************************** @@ -146,6 +147,8 @@ void XGUI_Workshop::startApplication() aLoop->registerListener(this, Events_Loop::eventByName("LongOperation")); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_PLUGIN_LOADED)); aLoop->registerListener(this, Events_Loop::eventByName("CurrentDocumentChanged")); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TOSHOW)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TOHIDE)); registerValidators(); activateModule(); @@ -195,10 +198,11 @@ void XGUI_Workshop::initMenu() aCommand->connectTo(this, SLOT(onRedo())); aCommand = aGroup->addFeature("REBUILD_CMD", tr("Rebuild"), tr("Rebuild data objects"), - QIcon(":pictures/rebuild.png")); + QIcon(":pictures/rebuild.png"), QKeySequence()); + aCommand->connectTo(this, SLOT(onRebuild())); aCommand = aGroup->addFeature("SAVEAS_CMD", tr("Save as..."), tr("Save the document into a file"), - QIcon(":pictures/save.png")); + QIcon(":pictures/save.png"), QKeySequence()); aCommand->connectTo(this, SLOT(onSaveAs())); //aCommand->disable(); @@ -240,7 +244,7 @@ void XGUI_Workshop::processEvent(const boost::shared_ptr& theMes std::cout << "XGUI_Workshop::processEvent: " << "Working in another thread." << std::endl; #endif SessionPtr aMgr = ModelAPI_Session::get(); - PostponeMessageQtEvent* aPostponeEvent = new PostponeMessageQtEvent(aMgr->activeDocument()); + PostponeMessageQtEvent* aPostponeEvent = new PostponeMessageQtEvent(theMessage); QApplication::postEvent(this, aPostponeEvent); return; } @@ -297,6 +301,28 @@ void XGUI_Workshop::processEvent(const boost::shared_ptr& theMes QApplication::restoreOverrideCursor(); } + else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TOSHOW)) { + boost::shared_ptr anUpdateMsg = + boost::dynamic_pointer_cast(theMessage); + const std::set& aObjList = anUpdateMsg->objects(); + QList 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)) { + boost::shared_ptr anUpdateMsg = + boost::dynamic_pointer_cast(theMessage); + const std::set& aObjList = anUpdateMsg->objects(); + QList 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)) { boost::shared_ptr aPartSetMsg = @@ -316,6 +342,7 @@ void XGUI_Workshop::processEvent(const boost::shared_ptr& theMes // Find and Activate active part if (myPartActivating) return; + myActionsMgr->update(); SessionPtr aMgr = ModelAPI_Session::get(); DocumentPtr aActiveDoc = aMgr->activeDocument(); DocumentPtr aDoc = aMgr->moduleDocument(); @@ -372,7 +399,7 @@ void XGUI_Workshop::onFeatureUpdatedMsg(const boost::shared_ptrvalidateCurrentOperation(); + myOperationMgr->onValidateOperation(); if (myObjectBrowser) myObjectBrowser->processEvent(theMsg); } @@ -384,16 +411,26 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const boost::shared_ptr::const_iterator aIt; for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { ObjectPtr aObj = (*aIt); - if (!aObj->data() || !aObj->data()->isValid()) + if (!aObj->data() || !aObj->data()->isValid() || aObj->document()->isConcealed(aObj)) myDisplayer->erase(aObj, false); else { - if (myDisplayer->isVisible(aObj)) // TODO VSV: Correction sketch drawing + if (myDisplayer->isVisible(aObj)) { myDisplayer->display(aObj, false); // In order to update presentation - else { if (myOperationMgr->hasOperation()) { ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - if (aOperation->hasObject(aObj)) { // Display only current operation results + if (!aOperation->hasObject(aObj)) + if (!myDisplayer->isActive(aObj)) + myDisplayer->activate(aObj); + } + } else { + if (myOperationMgr->hasOperation()) { + ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); + // Display only current operation results if operation has preview + if (aOperation->hasObject(aObj) && aOperation->hasPreview()) { myDisplayer->display(aObj, false); + // Deactivate object of current operation from selection + if (myDisplayer->isActive(aObj)) + myDisplayer->deactivate(aObj); } } } @@ -418,7 +455,8 @@ void XGUI_Workshop::onFeatureCreatedMsg(const boost::shared_ptrhasOperation()) { ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - if (aOperation->hasObject(*aIt)) { // Display only current operation results + if (!(*aIt)->document()->isConcealed(*aIt) && + aOperation->hasObject(*aIt)) { // Display only current operation results myDisplayer->display(*aIt, false); isDisplayed = true; } @@ -428,9 +466,9 @@ void XGUI_Workshop::onFeatureCreatedMsg(const boost::shared_ptrprocessEvent(theMsg); if (isDisplayed) myDisplayer->updateViewer(); - if (aHasPart) { - activateLastPart(); - } + //if (aHasPart) { // TODO: Avoid activate last part on loading of document + // activateLastPart(); + //} } //****************************************************** @@ -467,6 +505,7 @@ void XGUI_Workshop::onOperationStarted() for (; anIt != aLast; anIt++) { aWidget = *anIt; aWidget->setFeature(aOperation->feature()); + aWidget->enableFocusProcessing(); QObject::connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onWidgetValuesChanged())); // Init default values if (!aOperation->isEditOperation() && !aWidget->isComputedDefault()) { @@ -474,8 +513,14 @@ void XGUI_Workshop::onOperationStarted() } } + aOperation->setPropertyPanel(myPropertyPanel); myPropertyPanel->setModelWidgets(aWidgets); - myPropertyPanel->setWindowTitle(aOperation->getDescription()->description()); + myPropertyPanel->activateNextWidget(NULL); + // Widget activation (from the previous method) may commit the current operation + // if pre-selection is enougth for it. So we shouldn't update prop panel's title + if(myOperationMgr->isCurrentOperation(aOperation)) { + myPropertyPanel->setWindowTitle(aOperation->getDescription()->description()); + } } updateCommandStatus(); } @@ -493,22 +538,8 @@ bool XGUI_Workshop::event(QEvent * theEvent) { PostponeMessageQtEvent* aPostponedEv = dynamic_cast(theEvent); if (aPostponedEv) { -#ifdef _DEBUG - std::cout << "XGUI_Workshop::event " << "Got PostponeMessageQtEvent" << std::endl; - bool isMyThread = (QApplication::instance()->thread() == QThread::currentThread()); - std::cout << "XGUI_Workshop::event " << "I am in the Qt's thread: " - << isMyThread << std::endl; -#endif - boost::shared_ptr aDoc = aPostponedEv->resultDoc(); - if (aDoc) { -#ifdef _DEBUG - std::cout << "XGUI_Workshop::event " << "Passed boost ptr is ok, doc id: " << aDoc->id() - << std::endl; -#endif - } - //TODO(mpv): After modifications in the XGUI_QtEvents.* this code should be like... - //boost::shared_ptr aEventPtr = aPostponedEv->postponedMessage(); - //processEvent(aEventPtr); + boost::shared_ptr aEventPtr = aPostponedEv->postponedMessage(); + processEvent(aEventPtr); return true; } return false; @@ -538,7 +569,8 @@ void XGUI_Workshop::addFeature(const boost::shared_ptr& t QString::fromStdString(theMessage->text()), QString::fromStdString(theMessage->tooltip()), QIcon(theMessage->icon().c_str()), - QKeySequence(), isUsePropPanel); + QKeySequence(), + isUsePropPanel); salomeConnector()->setNestedActions(aFeatureId, aNestedFeatures.split(" ", QString::SkipEmptyParts)); myActionsMgr->addCommand(aAction); myModule->featureCreated(aAction); @@ -555,6 +587,7 @@ void XGUI_Workshop::addFeature(const boost::shared_ptr& t if (!aGroup) { aGroup = aPage->addGroup(aGroupName); } + QString aDocKind = QString::fromStdString(theMessage->documentKind()); // Check if hotkey sequence is already defined: QKeySequence aHotKey = myActionsMgr->registerShortcut( QString::fromStdString(theMessage->keysequence())); @@ -562,7 +595,9 @@ void XGUI_Workshop::addFeature(const boost::shared_ptr& t XGUI_Command* aCommand = aGroup->addFeature(aFeatureId, QString::fromStdString(theMessage->text()), QString::fromStdString(theMessage->tooltip()), - QIcon(theMessage->icon().c_str()), aHotKey, + QIcon(theMessage->icon().c_str()), + aDocKind, + aHotKey, isUsePropPanel); aCommand->setNestedCommands(aNestedFeatures.split(" ", QString::SkipEmptyParts)); myActionsMgr->addCommand(aCommand); @@ -582,11 +617,14 @@ void XGUI_Workshop::connectWithOperation(ModuleBase_Operation* theOperation) aCommand = salomeConnector()->command(theOperation->getDescription()->operationId()); } else { XGUI_MainMenu* aMenu = myMainWindow->menuObject(); - aCommand = aMenu->feature(theOperation->getDescription()->operationId()); + FeaturePtr aFeature = theOperation->feature(); + if(aFeature) + aCommand = aMenu->feature(QString::fromStdString(aFeature->getKind())); } //Abort operation on uncheck the command - if (aCommand) + if (aCommand) { connect(aCommand, SIGNAL(triggered(bool)), theOperation, SLOT(setRunning(bool))); + } } /* @@ -602,9 +640,7 @@ void XGUI_Workshop::saveDocument(const QString& theName, std::list& bool XGUI_Workshop::isActiveOperationAborted() { - if(!myOperationMgr->hasOperation()) - return true; - return myOperationMgr->abortOperation(); + return myOperationMgr->abortAllOperations(); } //****************************************************** @@ -744,7 +780,7 @@ void XGUI_Workshop::onUndo() objectBrowser()->treeView()->setCurrentIndex(QModelIndex()); SessionPtr aMgr = ModelAPI_Session::get(); if (aMgr->isOperation()) - operationMgr()->abortOperation(); + operationMgr()->onAbortOperation(); aMgr->undo(); updateCommandStatus(); } @@ -755,11 +791,27 @@ void XGUI_Workshop::onRedo() objectBrowser()->treeView()->setCurrentIndex(QModelIndex()); SessionPtr aMgr = ModelAPI_Session::get(); if (aMgr->isOperation()) - operationMgr()->abortOperation(); + operationMgr()->onAbortOperation(); aMgr->redo(); updateCommandStatus(); } +//****************************************************** +void XGUI_Workshop::onRebuild() +{ + SessionPtr aMgr = ModelAPI_Session::get(); + bool aWasOperation = aMgr->isOperation(); // keep this value + if (!aWasOperation) { + aMgr->startOperation(); + } + static const Events_ID aRebuildEvent = Events_Loop::loop()->eventByName("Rebuild"); + Events_Loop::loop()->send(boost::shared_ptr( + new Events_Message(aRebuildEvent, this))); + if (!aWasOperation) { + aMgr->finishOperation(); + } +} + //****************************************************** void XGUI_Workshop::onPreferences() { @@ -832,7 +884,7 @@ ModuleBase_IModule* XGUI_Workshop::loadModule(const QString& theModule) if (!err.isEmpty()) { if (mainWindow()) { - QMessageBox::warning(mainWindow(), tr("Error"), err); + Events_Error::send(err.toStdString()); } else { qWarning(qPrintable(err)); } @@ -868,8 +920,7 @@ void XGUI_Workshop::updateCommandStatus() if (aMgr->hasModuleDocument()) { QAction* aUndoCmd; QAction* aRedoCmd; - foreach(QAction* aCmd, aCommands) - { + foreach(QAction* aCmd, aCommands) { QString aId = aCmd->data().toString(); if (aId == "UNDO_CMD") aUndoCmd = aCmd; @@ -882,8 +933,7 @@ void XGUI_Workshop::updateCommandStatus() aUndoCmd->setEnabled(aMgr->canUndo()); aRedoCmd->setEnabled(aMgr->canRedo()); } else { - foreach(QAction* aCmd, aCommands) - { + foreach(QAction* aCmd, aCommands) { QString aId = aCmd->data().toString(); if (aId == "NEW_CMD") aCmd->setEnabled(true); @@ -950,14 +1000,12 @@ void XGUI_Workshop::createDockWidgets() connect(aOkBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onCommitOperation())); QPushButton* aCancelBtn = myPropertyPanel->findChild(XGUI::PROP_PANEL_CANCEL); connect(aCancelBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onAbortOperation())); -//TODO(sbh): KeyReleasedProblem connect(myPropertyPanel, SIGNAL(keyReleased(QKeyEvent*)), myOperationMgr, SLOT(onKeyReleased(QKeyEvent*))); - - connect(myPropertyPanel, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)), myOperationMgr, - SLOT(onWidgetActivated(ModuleBase_ModelWidget*))); - connect(myOperationMgr, SIGNAL(activateNextWidget(ModuleBase_ModelWidget*)), myPropertyPanel, - SLOT(onActivateNextWidget(ModuleBase_ModelWidget*))); + //connect(myPropertyPanel, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)), myOperationMgr, + // SLOT(onWidgetActivated(ModuleBase_ModelWidget*))); + //connect(myOperationMgr, SIGNAL(activateNextWidget(ModuleBase_ModelWidget*)), myPropertyPanel, + // SLOT(onActivateNextWidget(ModuleBase_ModelWidget*))); connect(myOperationMgr, SIGNAL(operationValidated(bool)), myPropertyPanel, SLOT(setAcceptEnabled(bool))); @@ -1051,6 +1099,12 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) showObjects(aObjects, false); else if (theId == "SHOW_ONLY_CMD") showOnlyObjects(aObjects); + else if (theId == "SHADING_CMD") + setDisplayMode(aObjects, XGUI_Displayer::Shading); + else if (theId == "WIREFRAME_CMD") + setDisplayMode(aObjects, XGUI_Displayer::Wireframe); + else if (theId == "HIDEALL_CMD") + myDisplayer->eraseAll(); } //************************************************************** @@ -1159,16 +1213,27 @@ void XGUI_Workshop::showOnlyObjects(const QList& theList) //************************************************************** void XGUI_Workshop::updateCommandsOnViewSelection() { - SessionPtr aMgr = ModelAPI_Session::get(); - ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); XGUI_Selection* aSelection = mySelector->selection(); if (aSelection->getSelected().size() == 0) return; + // Restrict validators to manage only nested (child) features + // of the current feature i.e. if current feature is Sketch - + // Sketch Features & Constraints can be validated. + QStringList aNestedIds; + if(myOperationMgr->hasOperation()) { + FeaturePtr aFeature = myOperationMgr->currentOperation()->feature(); + if(aFeature) { + aNestedIds << myActionsMgr->nestedCommands(QString::fromStdString(aFeature->getKind())); + } + } + SessionPtr aMgr = ModelAPI_Session::get(); + ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); QList aActions = getModuleCommands(); - foreach(QAction* aAction, aActions) - { + foreach(QAction* aAction, aActions) { QString aId = aAction->data().toString(); + if(!aNestedIds.contains(aId)) + continue; std::list aValidators; std::list > anArguments; aFactory->validators(aId.toStdString(), aValidators, anArguments); @@ -1221,3 +1286,13 @@ void XGUI_Workshop::displayGroupResults(DocumentPtr theDoc, std::string theGroup for (int i = 0; i < theDoc->size(theGroup); i++) myDisplayer->display(theDoc->object(theGroup, i), false); } + +//************************************************************** +void XGUI_Workshop::setDisplayMode(const QList& theList, int theMode) +{ + foreach(ObjectPtr aObj, theList) { + myDisplayer->setDisplayMode(aObj, (XGUI_Displayer::DisplayMode)theMode, false); + } + if (theList.size() > 0) + myDisplayer->updateViewer(); +}