X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=d9402eea4013c7e988deaa7101ca76937f57709d;hb=ac63def3eb29ba78d5e285c5edb026fb083f302b;hp=12f3a4767fc4a1921fe71165269af02b57e70aed;hpb=9e869ede4d8c56262bb20534543c2bf56cd6a91b;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 12f3a4767..d9402eea4 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -1,13 +1,6 @@ -#include "ModuleBase_IModule.h" -#include "XGUI_Constants.h" -#include "XGUI_Command.h" -#include "XGUI_MainMenu.h" -#include "XGUI_MainWindow.h" -#include "XGUI_MenuGroupPanel.h" +//#include "XGUI_Constants.h" #include "XGUI_Tools.h" -#include "XGUI_Workbench.h" #include "XGUI_Workshop.h" -#include "XGUI_Viewer.h" #include "XGUI_SelectionMgr.h" #include "XGUI_Selection.h" #include "XGUI_ObjectsBrowser.h" @@ -20,9 +13,18 @@ #include "XGUI_PropertyPanel.h" #include "XGUI_ContextMenuMgr.h" #include "XGUI_ModuleConnector.h" -#include "XGUI_Preferences.h" #include +#include +#include +#include +#include +#include +#include + +#include +#include + #include #include #include @@ -33,7 +35,7 @@ #include #include -#include +//#include #include #include @@ -46,11 +48,14 @@ #include #include #include +#include #include #include #include #include +#include +#include #include #include @@ -75,12 +80,39 @@ QMap XGUI_Workshop::myIcons; -QString XGUI_Workshop::featureIcon(const std::string& theId) + +QIcon XGUI_Workshop::featureIcon(const FeaturePtr& theFeature) { - QString aId(theId.c_str()); - if (myIcons.contains(aId)) - return myIcons[aId]; - return QString(); + 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); + 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) @@ -94,7 +126,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) myUpdatePrefs(false), myPartActivating(false) { - myMainWindow = mySalomeConnector ? 0 : new XGUI_MainWindow(); + myMainWindow = mySalomeConnector ? 0 : new AppElements_MainWindow(); myDisplayer = new XGUI_Displayer(this); @@ -114,10 +146,15 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) myModuleConnector = new XGUI_ModuleConnector(this); connect(myOperationMgr, SIGNAL(operationStarted(ModuleBase_Operation*)), - SLOT(onOperationStarted())); - connect(myOperationMgr, SIGNAL(operationResumed()), SLOT(onOperationStarted())); + SLOT(onOperationStarted(ModuleBase_Operation*))); + connect(myOperationMgr, SIGNAL(operationResumed(ModuleBase_Operation*)), + SLOT(onOperationResumed(ModuleBase_Operation*))); connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), SLOT(onOperationStopped(ModuleBase_Operation*))); + connect(myOperationMgr, SIGNAL(operationCommitted(ModuleBase_Operation*)), + SLOT(onOperationCommitted(ModuleBase_Operation*))); + connect(myOperationMgr, SIGNAL(operationAborted(ModuleBase_Operation*)), + SLOT(onOperationAborted(ModuleBase_Operation*))); connect(myMainWindow, SIGNAL(exitKeySequence()), SLOT(onExit())); // TODO(sbh): It seems that application works properly without update on operationStarted connect(myOperationMgr, SIGNAL(operationStarted(ModuleBase_Operation*)), @@ -137,6 +174,10 @@ XGUI_Workshop::~XGUI_Workshop(void) void XGUI_Workshop::startApplication() { initMenu(); + + Config_PropManager::registerProp("Plugins", "default_path", "Default Path", + Config_Prop::Directory, ""); + //Initialize event listening Events_Loop* aLoop = Events_Loop::loop(); aLoop->registerListener(this, Events_Error::errorID()); //!< Listening application errors. @@ -151,14 +192,19 @@ void XGUI_Workshop::startApplication() 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)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_SELFILTER_LOADED)); registerValidators(); + + // Calling of loadCustomProps before activating module is required + // by Config_PropManger to restore user-defined path to plugins + ModuleBase_Preferences::loadCustomProps(); activateModule(); if (myMainWindow) { myMainWindow->show(); updateCommandStatus(); } - XGUI_Preferences::loadCustomProps(); + onNew(); } @@ -199,9 +245,9 @@ void XGUI_Workshop::initMenu() return; } // File commands group - XGUI_MenuGroupPanel* aGroup = myMainWindow->menuObject()->generalPage(); + AppElements_MenuGroupPanel* aGroup = myMainWindow->menuObject()->generalPage(); - XGUI_Command* aCommand; + AppElements_Command* aCommand; aCommand = aGroup->addFeature("SAVE_CMD", tr("Save..."), tr("Save the document"), QIcon(":pictures/save.png"), QKeySequence::Save); @@ -249,9 +295,9 @@ void XGUI_Workshop::initMenu() } //****************************************************** -XGUI_Workbench* XGUI_Workshop::addWorkbench(const QString& theName) +AppElements_Workbench* XGUI_Workshop::addWorkbench(const QString& theName) { - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); + AppElements_MainMenu* aMenuBar = myMainWindow->menuObject(); return aMenuBar->addWorkbench(theName); } @@ -324,7 +370,7 @@ void XGUI_Workshop::processEvent(const std::shared_ptr& theMessa std::shared_ptr anUpdateMsg = std::dynamic_pointer_cast(theMessage); const std::set& aObjList = anUpdateMsg->objects(); - QList aList; + QObjectPtrList aList; std::set::const_iterator aIt; for (aIt = aObjList.cbegin(); aIt != aObjList.cend(); ++aIt) aList.append(*aIt); @@ -335,7 +381,7 @@ void XGUI_Workshop::processEvent(const std::shared_ptr& theMessa std::shared_ptr anUpdateMsg = std::dynamic_pointer_cast(theMessage); const std::set& aObjList = anUpdateMsg->objects(); - QList aList; + QObjectPtrList aList; std::set::const_iterator aIt; for (aIt = aObjList.cbegin(); aIt != aObjList.cend(); ++aIt) aList.append(*aIt); @@ -380,7 +426,21 @@ void XGUI_Workshop::processEvent(const std::shared_ptr& theMessa // If not found then activate global document activatePart(ResultPartPtr()); - } else { + } + else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_SELFILTER_LOADED)) { + std::shared_ptr aMsg = + std::dynamic_pointer_cast(theMessage); + if (aMsg) { + if (aMsg->attributeId().empty()) { // feature validator + moduleConnector()->selectionFilters()->assignFilter(aMsg->selectionFilterId(), aMsg->featureId(), aMsg->attributeId()); + } else { // attribute validator + moduleConnector()->selectionFilters()->assignFilter(aMsg->selectionFilterId(), aMsg->featureId(), aMsg->attributeId()); + } + } + } + + + else { //Show error dialog if error message received. std::shared_ptr anAppError = std::dynamic_pointer_cast(theMessage); if (anAppError) { @@ -428,7 +488,6 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const std::shared_ptr aObjects = theMsg->objects(); std::set::const_iterator aIt; - QIntList aModes; for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { ObjectPtr aObj = (*aIt); bool aHide = !aObj->data() || !aObj->data()->isValid(); @@ -443,15 +502,14 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const std::shared_ptrdisplay(aObj, false); // In order to update presentation if (myOperationMgr->hasOperation()) { ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - if (!aOperation->hasObject(aObj)) - if (!myDisplayer->isActive(aObj)) - myDisplayer->activate(aObj, aModes); + if (aOperation->hasObject(aObj) && myDisplayer->isActive(aObj)) + myDisplayer->deactivate(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()) { + if (aOperation->hasObject(aObj)/* && aOperation->hasPreview()*/) { myDisplayer->display(aObj, false); // Deactivate object of current operation from selection if (myDisplayer->isActive(aObj)) @@ -504,50 +562,34 @@ void XGUI_Workshop::onObjectDeletedMsg(const std::shared_ptrcurrentOperation(); - if (this->isSalomeMode()) - aOperation->setNestedFeatures(mySalomeConnector->nestedActions(aOperation->id())); - else - aOperation->setNestedFeatures(myActionsMgr->nestedCommands(aOperation->id())); - - if (aOperation->getDescription()->hasXmlRepresentation()) { //!< No need for property panel - connectWithOperation(aOperation); - - showPropertyPanel(); - QString aXmlRepr = aOperation->getDescription()->xmlRepresentation(); - ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aXmlRepr.toStdString(), - myModuleConnector); - - myPropertyPanel->cleanContent(); - aFactory.createWidget(myPropertyPanel->contentWidget()); - ModuleBase_Tools::zeroMargins(myPropertyPanel->contentWidget()); - - QList aWidgets = aFactory.getModelWidgets(); - foreach (ModuleBase_ModelWidget* aWidget, aWidgets) { - aWidget->setFeature(aOperation->feature()); - aWidget->enableFocusProcessing(); - QObject::connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onWidgetValuesChanged())); - // Init default values - if (!aOperation->isEditOperation() && !aWidget->isComputedDefault()) { - aWidget->storeValue(); - } - } + setNestedFeatures(theOperation); - aOperation->setPropertyPanel(myPropertyPanel); - myPropertyPanel->setModelWidgets(aWidgets); - if (!aOperation->activateByPreselection()) - 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()); - } + if (theOperation->getDescription()->hasXmlRepresentation()) { //!< No need for property panel + connectWithOperation(theOperation); + setPropertyPanel(theOperation); } updateCommandStatus(); + + myModule->operationStarted(theOperation); } +//****************************************************** +void XGUI_Workshop::onOperationResumed(ModuleBase_Operation* theOperation) +{ + setNestedFeatures(theOperation); + + if (theOperation->getDescription()->hasXmlRepresentation()) { //!< No need for property panel + connectWithOperation(theOperation); + setPropertyPanel(theOperation); + } + updateCommandStatus(); + + myModule->operationResumed(theOperation); +} + + //****************************************************** void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) { @@ -555,6 +597,65 @@ void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) updateCommandStatus(); hidePropertyPanel(); myPropertyPanel->cleanContent(); + + // Activate objects created by current operation + FeaturePtr aFeature = theOperation->feature(); + myDisplayer->activate(aFeature); + const std::list& aResults = aFeature->results(); + std::list::const_iterator aIt; + for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { + myDisplayer->activate(*aIt); + } + myModule->operationStopped(theOperation); +} + + +void XGUI_Workshop::onOperationCommitted(ModuleBase_Operation* theOperation) +{ + myModule->operationCommitted(theOperation); +} + +void XGUI_Workshop::onOperationAborted(ModuleBase_Operation* theOperation) +{ + myModule->operationAborted(theOperation); +} + +void XGUI_Workshop::setNestedFeatures(ModuleBase_Operation* theOperation) +{ + if (this->isSalomeMode()) + theOperation->setNestedFeatures(mySalomeConnector->nestedActions(theOperation->id())); + else + theOperation->setNestedFeatures(myActionsMgr->nestedCommands(theOperation->id())); +} + +void XGUI_Workshop::setPropertyPanel(ModuleBase_Operation* theOperation) +{ + showPropertyPanel(); + QString aXmlRepr = theOperation->getDescription()->xmlRepresentation(); + ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aXmlRepr.toStdString(), + myModuleConnector); + + myPropertyPanel->cleanContent(); + aFactory.createWidget(myPropertyPanel->contentWidget()); + ModuleBase_Tools::zeroMargins(myPropertyPanel->contentWidget()); + + QList aWidgets = aFactory.getModelWidgets(); + foreach (ModuleBase_ModelWidget* aWidget, aWidgets) { + aWidget->setFeature(theOperation->feature()); + aWidget->enableFocusProcessing(); + QObject::connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onWidgetValuesChanged())); + // Init default values + if (!theOperation->isEditOperation() && !aWidget->isComputedDefault()) { + aWidget->storeValue(); + } + } + + myPropertyPanel->setModelWidgets(aWidgets); + theOperation->setPropertyPanel(myPropertyPanel); + + myModule->propertyPanelDefined(theOperation); + + myPropertyPanel->setWindowTitle(theOperation->getDescription()->description()); } bool XGUI_Workshop::event(QEvent * theEvent) @@ -598,17 +699,17 @@ void XGUI_Workshop::addFeature(const std::shared_ptr& the salomeConnector()->setDocumentKind(aFeatureId, QString::fromStdString(theMessage->documentKind())); myActionsMgr->addCommand(aAction); - myModule->featureCreated(aAction); + myModule->actionCreated(aAction); } else { - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); - XGUI_Workbench* aPage = aMenuBar->findWorkbench(aWchName); + AppElements_MainMenu* aMenuBar = myMainWindow->menuObject(); + AppElements_Workbench* aPage = aMenuBar->findWorkbench(aWchName); if (!aPage) { aPage = addWorkbench(aWchName); } //Find or create Group QString aGroupName = QString::fromStdString(theMessage->groupId()); - XGUI_MenuGroupPanel* aGroup = aPage->findGroup(aGroupName); + AppElements_MenuGroupPanel* aGroup = aPage->findGroup(aGroupName); if (!aGroup) { aGroup = aPage->addGroup(aGroupName); } @@ -617,7 +718,7 @@ void XGUI_Workshop::addFeature(const std::shared_ptr& the QKeySequence aHotKey = myActionsMgr->registerShortcut( QString::fromStdString(theMessage->keysequence())); // Create feature... - XGUI_Command* aCommand = aGroup->addFeature(aFeatureId, + AppElements_Command* aCommand = aGroup->addFeature(aFeatureId, QString::fromStdString(theMessage->text()), QString::fromStdString(theMessage->tooltip()), QIcon(theMessage->icon().c_str()), @@ -626,7 +727,7 @@ void XGUI_Workshop::addFeature(const std::shared_ptr& the isUsePropPanel); aCommand->setNestedCommands(aNestedFeatures.split(" ", QString::SkipEmptyParts)); myActionsMgr->addCommand(aCommand); - myModule->featureCreated(aCommand); + myModule->actionCreated(aCommand); } } @@ -641,7 +742,7 @@ void XGUI_Workshop::connectWithOperation(ModuleBase_Operation* theOperation) if (isSalomeMode()) { aCommand = salomeConnector()->command(theOperation->getDescription()->operationId()); } else { - XGUI_MainMenu* aMenu = myMainWindow->menuObject(); + AppElements_MainMenu* aMenu = myMainWindow->menuObject(); FeaturePtr aFeature = theOperation->feature(); if(aFeature) aCommand = aMenu->feature(QString::fromStdString(aFeature->getKind())); @@ -841,17 +942,17 @@ void XGUI_Workshop::onRebuild() //****************************************************** void XGUI_Workshop::onPreferences() { - XGUI_Prefs aModif; - XGUI_Preferences::editPreferences(aModif); + ModuleBase_Prefs aModif; + ModuleBase_Preferences::editPreferences(aModif); if (aModif.size() > 0) { QString aSection; - foreach (XGUI_Pref aPref, aModif) + foreach (ModuleBase_Pref aPref, aModif) { aSection = aPref.first; - if (aSection == XGUI_Preferences::VIEWER_SECTION) { + if (aSection == ModuleBase_Preferences::VIEWER_SECTION) { if (!isSalomeMode()) myMainWindow->viewer()->updateFromResources(); - } else if (aSection == XGUI_Preferences::MENU_SECTION) { + } else if (aSection == ModuleBase_Preferences::MENU_SECTION) { if (!isSalomeMode()) myMainWindow->menuObject()->updateFromResources(); } @@ -938,8 +1039,8 @@ void XGUI_Workshop::updateCommandStatus() if (isSalomeMode()) { // update commands in SALOME mode aCommands = salomeConnector()->commandList(); } else { - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); - foreach (XGUI_Command* aCmd, aMenuBar->features()) + AppElements_MainMenu* aMenuBar = myMainWindow->menuObject(); + foreach (AppElements_Command* aCmd, aMenuBar->features()) aCommands.append(aCmd); } SessionPtr aMgr = ModelAPI_Session::get(); @@ -978,8 +1079,8 @@ QList XGUI_Workshop::getModuleCommands() const if (isSalomeMode()) { // update commands in SALOME mode aCommands = salomeConnector()->commandList(); } else { - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); - foreach(XGUI_Command* aCmd, aMenuBar->features()) + AppElements_MainMenu* aMenuBar = myMainWindow->menuObject(); + foreach(AppElements_Command* aCmd, aMenuBar->features()) { aCommands.append(aCmd); } @@ -1016,15 +1117,18 @@ void XGUI_Workshop::createDockWidgets() aDesktop->addDockWidget(Qt::LeftDockWidgetArea, aObjDock); myPropertyPanel = new XGUI_PropertyPanel(aDesktop); myPropertyPanel->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea); + + connect(myPropertyPanel, SIGNAL(noMoreWidgets()), myModule, SLOT(onNoMoreWidgets())); + aDesktop->addDockWidget(Qt::LeftDockWidgetArea, myPropertyPanel); hidePropertyPanel(); //tabifyDockWidget(aObjDock, myPropertyPanel); myPropertyPanel->installEventFilter(myOperationMgr); - QPushButton* aOkBtn = myPropertyPanel->findChild(XGUI::PROP_PANEL_OK); + QPushButton* aOkBtn = myPropertyPanel->findChild(PROP_PANEL_OK); connect(aOkBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onCommitOperation())); - QPushButton* aCancelBtn = myPropertyPanel->findChild(XGUI::PROP_PANEL_CANCEL); + QPushButton* aCancelBtn = myPropertyPanel->findChild(PROP_PANEL_CANCEL); connect(aCancelBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onAbortOperation())); connect(myPropertyPanel, SIGNAL(keyReleased(QKeyEvent*)), myOperationMgr, SLOT(onKeyReleased(QKeyEvent*))); @@ -1107,7 +1211,7 @@ ModuleBase_IViewer* XGUI_Workshop::salomeViewer() const //************************************************************** void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) { - QList aObjects = mySelector->selection()->selectedObjects(); + QObjectPtrList aObjects = mySelector->selection()->selectedObjects(); if ((theId == "ACTIVATE_PART_CMD") && (aObjects.size() > 0)) { ResultPartPtr aPart = std::dynamic_pointer_cast(aObjects.first()); activatePart(aPart); @@ -1127,6 +1231,11 @@ 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); + } } //************************************************************** @@ -1177,7 +1286,7 @@ void XGUI_Workshop::activateLastPart() } //************************************************************** -void XGUI_Workshop::deleteObjects(const QList& theList) +void XGUI_Workshop::deleteObjects(const QObjectPtrList& theList) { QMainWindow* aDesktop = isSalomeMode() ? salomeConnector()->desktop() : myMainWindow; QMessageBox::StandardButton aRes = QMessageBox::warning( @@ -1208,27 +1317,23 @@ void XGUI_Workshop::deleteObjects(const QList& theList) } //************************************************************** -void XGUI_Workshop::showObjects(const QList& theList, bool isVisible) +void XGUI_Workshop::showObjects(const QObjectPtrList& theList, bool isVisible) { foreach (ObjectPtr aObj, theList) { - ResultPtr aRes = std::dynamic_pointer_cast(aObj); - if (aRes) { - if (isVisible) { - myDisplayer->display(aRes, false); - } else { - myDisplayer->erase(aRes, false); - } + if (isVisible) { + myDisplayer->display(aObj, false); + } else { + myDisplayer->erase(aObj, false); } } myDisplayer->updateViewer(); } //************************************************************** -void XGUI_Workshop::showOnlyObjects(const QList& theList) +void XGUI_Workshop::showOnlyObjects(const QObjectPtrList& theList) { - myDisplayer->eraseAll(false); - showObjects(theList, true); + myDisplayer->showOnly(theList); } @@ -1310,7 +1415,7 @@ void XGUI_Workshop::displayGroupResults(DocumentPtr theDoc, std::string theGroup } //************************************************************** -void XGUI_Workshop::setDisplayMode(const QList& theList, int theMode) +void XGUI_Workshop::setDisplayMode(const QObjectPtrList& theList, int theMode) { foreach(ObjectPtr aObj, theList) { myDisplayer->setDisplayMode(aObj, (XGUI_Displayer::DisplayMode)theMode, false);