X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_ContextMenuMgr.cpp;h=e1b8584766d9865eb70e67d9ee6c6de6354c2363;hb=220bd2b37119be1c65abf88a88792445cb9d99f8;hp=8c47f51d1282e09168e30eae16f2635c698e7b09;hpb=94d268940c8d2279cda597bbfa01f8b50fed8c62;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_ContextMenuMgr.cpp b/src/XGUI/XGUI_ContextMenuMgr.cpp index 8c47f51d1..e1b858476 100644 --- a/src/XGUI/XGUI_ContextMenuMgr.cpp +++ b/src/XGUI/XGUI_ContextMenuMgr.cpp @@ -8,8 +8,13 @@ #include "XGUI_ViewerProxy.h" #include "XGUI_Selection.h" #include "XGUI_SalomeConnector.h" +#include "XGUI_DataModel.h" +#include "XGUI_OperationMgr.h" +#include "XGUI_Tools.h" +#ifndef HAVE_SALOME #include +#endif //#include "PartSetPlugin_Part.h" @@ -21,14 +26,17 @@ #include #include #include +#include #include #include +#include #include #include #include #include +#include XGUI_ContextMenuMgr::XGUI_ContextMenuMgr(XGUI_Workshop* theParent) @@ -44,16 +52,28 @@ XGUI_ContextMenuMgr::~XGUI_ContextMenuMgr() void XGUI_ContextMenuMgr::createActions() { - QAction* aAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this); +#ifdef HAVE_SALOME + QMainWindow* aDesktop = myWorkshop->salomeConnector()->desktop(); +#else QMainWindow* aDesktop = myWorkshop->mainWindow(); - if (!aDesktop) - aDesktop = myWorkshop->salomeConnector()->desktop(); +#endif + + QAction* aAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this); aDesktop->addAction(aAction); addAction("DELETE_CMD", aAction); - aAction->setShortcut(Qt::Key_Delete); aAction->setShortcutContext(Qt::ApplicationShortcut); + aAction = new QAction(QIcon(":pictures/rename_edit.png"), tr("Rename"), this); + addAction("RENAME_CMD", aAction); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onRename())); + + aAction = new QAction(QIcon(":pictures/move.png"), XGUI_Workshop::MOVE_TO_END_COMMAND, this); + addAction("MOVE_CMD", aAction); + + aAction = new QAction(QIcon(":pictures/clean_history.png"), tr("Clean history"), this); + addAction("CLEAN_HISTORY_CMD", aAction); + aAction = new QAction(QIcon(":pictures/color.png"), tr("Color..."), this); addAction("COLOR_CMD", aAction); @@ -126,13 +146,13 @@ void XGUI_ContextMenuMgr::updateCommandsStatus() void XGUI_ContextMenuMgr::onContextMenuRequest(QContextMenuEvent* theEvent) { - QMenu* aMenu = 0; + QMenu* aMenu = new QMenu(); if (sender() == myWorkshop->objectBrowser()) { updateObjectBrowserMenu(); - aMenu = objBrowserMenu(); + addObjBrowserMenu(aMenu); } else if (sender() == myWorkshop->viewer()) { updateViewerMenu(); - aMenu = viewerMenu(); + addViewerMenu(aMenu); } if (aMenu && (aMenu->actions().size() > 0)) { @@ -160,34 +180,55 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() bool hasResult = false; bool hasFeature = false; bool hasParameter = false; - ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter); + bool hasSubFeature = false; + ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter, hasSubFeature); //Process Feature if (aSelected == 1) { ObjectPtr aObject = aObjects.first(); if (aObject) { + if (hasResult && myWorkshop->canBeShaded(aObject)) { + XGUI_Displayer::DisplayMode aMode = aDisplayer->displayMode(aObject); + if (aMode != XGUI_Displayer::NoMode) { + action("WIREFRAME_CMD")->setEnabled(aMode == XGUI_Displayer::Shading); + action("SHADING_CMD")->setEnabled(aMode == XGUI_Displayer::Wireframe); + } else { + action("WIREFRAME_CMD")->setEnabled(true); + action("SHADING_CMD")->setEnabled(true); + } + } if (!hasFeature) { - if (aObject->isDisplayed()) { - if (aDisplayer->canBeShaded(aObject)) { - action("WIREFRAME_CMD")->setEnabled(true); - action("SHADING_CMD")->setEnabled(true); - } + bool aHasSubResults = ModelAPI_Tools::hasSubResults( + std::dynamic_pointer_cast(aObject)); + if (aHasSubResults) { action("HIDE_CMD")->setEnabled(true); - } else if (hasResult && (!hasParameter)) { action("SHOW_CMD")->setEnabled(true); } - - ResultPartPtr aPartRes = std::dynamic_pointer_cast(aObject); - if (aPartRes) { - action("SHOW_CMD")->setEnabled(true); + else { + if (aObject->isDisplayed()) { + action("HIDE_CMD")->setEnabled(true); + } else if (hasResult && (!hasParameter)) { + action("SHOW_CMD")->setEnabled(true); + } } - if (!(hasParameter || hasFeature)) action("SHOW_ONLY_CMD")->setEnabled(true); } - } + else if (hasFeature && myWorkshop->canMoveFeature()) + action("MOVE_CMD")->setEnabled(true); + + else if (hasFeature || hasParameter) + action("CLEAN_HISTORY_CMD")->setEnabled(true); + + if( aMgr->activeDocument() == aObject->document() ) + { + action("RENAME_CMD")->setEnabled(true); + action("DELETE_CMD")->setEnabled(!hasSubFeature); + } + } } else { - if (hasResult && (!hasParameter)) { + // parameter is commented because the actions are not in the list of result parameter actions + if (hasResult /*&& (!hasParameter)*/) { action("SHOW_CMD")->setEnabled(true); action("HIDE_CMD")->setEnabled(true); action("SHOW_ONLY_CMD")->setEnabled(true); @@ -195,11 +236,44 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() action("WIREFRAME_CMD")->setEnabled(true); } } - if (hasFeature || hasParameter) - action("DELETE_CMD")->setEnabled(true); + bool allActive = true; + foreach( ObjectPtr aObject, aObjects ) + if( aMgr->activeDocument() != aObject->document() ) { + allActive = false; + break; + } + if (!hasSubFeature && allActive ) { + if (hasFeature || hasParameter) + action("DELETE_CMD")->setEnabled(true); + } + if (allActive && (hasFeature|| hasParameter)) + action("CLEAN_HISTORY_CMD")->setEnabled(true); + } + + // Show/Hide command has to be disabled for objects from non active document + bool aDeactivate = false; + foreach (ObjectPtr aObj, aObjects) { + if (!aObj->document()->isActive()) { + if ((aObj->document() != ModelAPI_Session::get()->moduleDocument()) || + aObj->groupName() == ModelAPI_ResultPart::group()) { + aDeactivate = true; + break; + } + } } + if (aDeactivate) { + // If at leas a one objec can not be edited then Show/Hide has to be disabled + action("SHOW_CMD")->setEnabled(false); + action("HIDE_CMD")->setEnabled(false); + action("SHOW_ONLY_CMD")->setEnabled(false); + } + if (myWorkshop->canChangeColor()) action("COLOR_CMD")->setEnabled(true); + + ModuleBase_IModule* aModule = myWorkshop->module(); + if (aModule) + aModule->updateObjectBrowserMenu(myActions); } void XGUI_ContextMenuMgr::updateViewerMenu() @@ -208,13 +282,14 @@ void XGUI_ContextMenuMgr::updateViewerMenu() aAction->setEnabled(false); XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); - QObjectPtrList aObjects = aSelMgr->selection()->selectedObjects(); - if (aObjects.size() > 0) { + QList aPrsList = aSelMgr->selection()->getSelected(ModuleBase_ISelection::Viewer); + if (aPrsList.size() > 0) { bool isVisible = false; bool isShading = false; bool canBeShaded = false; - foreach(ObjectPtr aObject, aObjects) - { + ObjectPtr aObject; + foreach(ModuleBase_ViewerPrs aPrs, aPrsList) { + aObject = aPrs.object(); ResultPtr aRes = std::dynamic_pointer_cast(aObject); if (aRes && aRes->isDisplayed()) { isVisible = true; @@ -225,8 +300,15 @@ void XGUI_ContextMenuMgr::updateViewerMenu() } if (isVisible) { if (canBeShaded) { - action("WIREFRAME_CMD")->setEnabled(true); - action("SHADING_CMD")->setEnabled(true); + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + XGUI_Displayer::DisplayMode aMode = aDisplayer->displayMode(aObject); + if (aMode != XGUI_Displayer::NoMode) { + action("WIREFRAME_CMD")->setEnabled(aMode == XGUI_Displayer::Shading); + action("SHADING_CMD")->setEnabled(aMode == XGUI_Displayer::Wireframe); + } else { + action("WIREFRAME_CMD")->setEnabled(true); + action("SHADING_CMD")->setEnabled(true); + } } action("SHOW_ONLY_CMD")->setEnabled(true); action("HIDE_CMD")->setEnabled(true); @@ -237,6 +319,12 @@ void XGUI_ContextMenuMgr::updateViewerMenu() action("HIDEALL_CMD")->setEnabled(true); if (myWorkshop->canChangeColor()) action("COLOR_CMD")->setEnabled(true); + + action("DELETE_CMD")->setEnabled(true); + + ModuleBase_IModule* aModule = myWorkshop->module(); + if (aModule) + aModule->updateViewerMenu(myActions); } void XGUI_ContextMenuMgr::connectObjectBrowser() @@ -264,9 +352,9 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu() aList.append(action("HIDE_CMD")); aList.append(action("SHOW_ONLY_CMD")); aList.append(action("COLOR_CMD")); + aList.append(mySeparator); + aList.append(action("RENAME_CMD")); myObjBrowserMenus[ModelAPI_ResultConstruction::group()] = aList; - // Result part menu - myObjBrowserMenus[ModelAPI_ResultPart::group()] = aList; //------------------------------------- // Result body menu aList.clear(); @@ -277,14 +365,28 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu() aList.append(action("SHOW_CMD")); aList.append(action("HIDE_CMD")); aList.append(action("SHOW_ONLY_CMD")); + aList.append(mySeparator); + aList.append(action("RENAME_CMD")); myObjBrowserMenus[ModelAPI_ResultBody::group()] = aList; // Group menu myObjBrowserMenus[ModelAPI_ResultGroup::group()] = aList; + // Result part menu + myObjBrowserMenus[ModelAPI_ResultPart::group()] = aList; //------------------------------------- // Feature menu aList.clear(); aList.append(action("DELETE_CMD")); + aList.append(action("MOVE_CMD")); + aList.append(action("CLEAN_HISTORY_CMD")); + aList.append(mySeparator); + aList.append(action("RENAME_CMD")); myObjBrowserMenus[ModelAPI_Feature::group()] = aList; + + aList.clear(); + aList.append(action("DELETE_CMD")); + aList.append(action("CLEAN_HISTORY_CMD")); + aList.append(mySeparator); + aList.append(action("RENAME_CMD")); myObjBrowserMenus[ModelAPI_ResultParameter::group()] = aList; //------------------------------------- } @@ -295,7 +397,6 @@ void XGUI_ContextMenuMgr::buildViewerMenu() // Result construction menu aList.append(action("HIDE_CMD")); aList.append(action("SHOW_ONLY_CMD")); - aList.append(action("HIDEALL_CMD")); aList.append(action("COLOR_CMD")); myViewerMenu[ModelAPI_ResultConstruction::group()] = aList; // Result part menu @@ -309,7 +410,6 @@ void XGUI_ContextMenuMgr::buildViewerMenu() aList.append(mySeparator); aList.append(action("HIDE_CMD")); aList.append(action("SHOW_ONLY_CMD")); - aList.append(action("HIDEALL_CMD")); myViewerMenu[ModelAPI_ResultBody::group()] = aList; // Group menu myViewerMenu[ModelAPI_ResultGroup::group()] = aList; @@ -318,9 +418,8 @@ void XGUI_ContextMenuMgr::buildViewerMenu() } -QMenu* XGUI_ContextMenuMgr::objBrowserMenu() const +void XGUI_ContextMenuMgr::addObjBrowserMenu(QMenu* theMenu) const { - QMenu* aMenu = new QMenu(); XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); QObjectPtrList aObjects = aSelMgr->selection()->selectedObjects(); int aSelected = aObjects.size(); @@ -334,52 +433,90 @@ QMenu* XGUI_ContextMenuMgr::objBrowserMenu() const aActions.append(action("SHADING_CMD")); aActions.append(action("WIREFRAME_CMD")); aActions.append(mySeparator); + aActions.append(action("SHOW_CMD")); aActions.append(action("HIDE_CMD")); aActions.append(action("SHOW_ONLY_CMD")); aActions.append(mySeparator); aActions.append(action("DELETE_CMD")); + //aActions.append(action("MOVE_CMD")); + aActions.append(action("CLEAN_HISTORY_CMD")); + aActions.append(action("COLOR_CMD")); } - aMenu->addActions(aActions); + theMenu->addActions(aActions); ModuleBase_IModule* aModule = myWorkshop->module(); if (aModule) { - aMenu->addSeparator(); - aModule->addObjectBrowserMenu(aMenu); + theMenu->addSeparator(); + aModule->addObjectBrowserMenu(theMenu); } - aMenu->addSeparator(); - aMenu->addActions(myWorkshop->objectBrowser()->actions()); - - return aMenu; + theMenu->addSeparator(); + theMenu->addActions(myWorkshop->objectBrowser()->actions()); } -QMenu* XGUI_ContextMenuMgr::viewerMenu() const +void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const { - QMenu* aMenu = new QMenu(); ModuleBase_IModule* aModule = myWorkshop->module(); - if (aModule) - aModule->addViewerMenu(aMenu, myActions); - + if (aModule) { + if (aModule->addViewerMenu(theMenu, myActions)) + theMenu->addSeparator(); + } XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); - QObjectPtrList aObjects = aSelMgr->selection()->selectedObjects(); - int aSelected = aObjects.size(); + QList aPrsList = aSelMgr->selection()->getSelected(ModuleBase_ISelection::Viewer); + int aSelected = aPrsList.size(); QActionsList aActions; if (aSelected == 1) { - ObjectPtr aObject = aObjects.first(); - std::string aName = aObject->groupName(); - if (myViewerMenu.contains(aName)) - aActions = myViewerMenu[aName]; + ObjectPtr aObject = aPrsList.first().object(); + if (aObject.get() != NULL) { + std::string aName = aObject->groupName(); + if (myViewerMenu.contains(aName)) + aActions = myViewerMenu[aName]; + } + aActions.append(action("COLOR_CMD")); } else if (aSelected > 1) { aActions.append(action("HIDE_CMD")); + aActions.append(action("COLOR_CMD")); } - aMenu->addActions(aActions); - - if (!myWorkshop->isSalomeMode()) { - aMenu->addSeparator(); - QMdiArea* aMDI = myWorkshop->mainWindow()->mdiArea(); - if (aMDI->actions().size() > 0) { - QMenu* aSubMenu = aMenu->addMenu(tr("Windows")); - aSubMenu->addActions(aMDI->actions()); - } + // hide all is shown always even if selection in the viewer is empty + aActions.append(action("HIDEALL_CMD")); + theMenu->addActions(aActions); + +#ifndef HAVE_SALOME + theMenu->addSeparator(); + QMdiArea* aMDI = myWorkshop->mainWindow()->mdiArea(); + if (aMDI->actions().size() > 0) { + QMenu* aSubMenu = theMenu->addMenu(tr("Windows")); + aSubMenu->addActions(aMDI->actions()); + } +#endif +} + +QStringList XGUI_ContextMenuMgr::actionObjectGroups(const QString& theName) +{ + QStringList aGroups; + + QMap::const_iterator anIt = myObjBrowserMenus.begin(), + aLast = myObjBrowserMenus.end(); + for (; anIt != aLast; anIt++) { + QString aGroupName(anIt.key().c_str()); + if (aGroups.contains(aGroupName)) + continue; + QActionsList anActions = anIt.value(); + QActionsList::const_iterator anAIt = anActions.begin(), anALast = anActions.end(); + bool aFound = false; + for (; anAIt != anALast && !aFound; anAIt++) + aFound = (*anAIt)->data().toString() == theName; + if (aFound) + aGroups.append(aGroupName); } - return aMenu; + return aGroups; +} + +void XGUI_ContextMenuMgr::onRename() +{ + QObjectPtrList anObjects = myWorkshop->selector()->selection()->selectedObjects(); + if (!myWorkshop->abortAllOperations()) + return; + // restore selection in case if dialog box was shown + myWorkshop->objectBrowser()->setObjectsSelected(anObjects); + myWorkshop->objectBrowser()->onEditItem(); }