X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_ContextMenuMgr.cpp;h=a1fa3c468ae1314710e5d9d38b179e95976dd683;hb=409ad39d4655a87a91986bf9927e47bfc08b5341;hp=494ecf28d011cf8dcf54d04dae64ac496ebd843e;hpb=6fd9fac7189104e2d2114583bc8ad0bd857d328f;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_ContextMenuMgr.cpp b/src/XGUI/XGUI_ContextMenuMgr.cpp index 494ecf28d..a1fa3c468 100644 --- a/src/XGUI/XGUI_ContextMenuMgr.cpp +++ b/src/XGUI/XGUI_ContextMenuMgr.cpp @@ -8,30 +8,47 @@ #include "XGUI_ViewerProxy.h" #include "XGUI_Selection.h" #include "XGUI_SalomeConnector.h" +#include "XGUI_DataModel.h" +#include "XGUI_OperationMgr.h" #include "XGUI_Tools.h" +#include "XGUI_ActionsMgr.h" +#ifndef HAVE_SALOME #include +#endif //#include "PartSetPlugin_Part.h" #include #include #include -#include #include #include #include +#include +#include +#include +#include + +#include #include +#include +#include +#include #include +#include #include #include #include +#include +#include XGUI_ContextMenuMgr::XGUI_ContextMenuMgr(XGUI_Workshop* theParent) : QObject(theParent), - myWorkshop(theParent) + myWorkshop(theParent), + mySeparator(0) { } @@ -41,45 +58,106 @@ XGUI_ContextMenuMgr::~XGUI_ContextMenuMgr() void XGUI_ContextMenuMgr::createActions() { - QAction* aAction = new QAction(QIcon(":pictures/edit.png"), tr("Edit..."), this); - addAction("EDIT_CMD", aAction); - - aAction = new QAction(QIcon(":pictures/activate.png"), tr("Activate"), this); - addAction("ACTIVATE_PART_CMD", aAction); - - aAction = new QAction(QIcon(":pictures/assembly.png"), tr("Deactivate"), this); - addAction("DEACTIVATE_PART_CMD", aAction); - - 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 = ModuleBase_Tools::createAction(QIcon(":pictures/delete.png"), tr("Delete"), + aDesktop); aDesktop->addAction(aAction); addAction("DELETE_CMD", aAction); - aAction->setShortcut(Qt::Key_Delete); aAction->setShortcutContext(Qt::ApplicationShortcut); - aAction = new QAction(QIcon(":pictures/color.png"), tr("Color"), this); + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/rename_edit.png"), tr("Rename"), + aDesktop, this, SLOT(onRename())); + addAction("RENAME_CMD", aAction); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/move.png"), + XGUI_Workshop::MOVE_TO_END_COMMAND, this); + addAction("MOVE_CMD", aAction); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/clean_history.png"), + tr("Clean history"), aDesktop); + addAction("CLEAN_HISTORY_CMD", aAction); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/color.png"), tr("Color..."), aDesktop); addAction("COLOR_CMD", aAction); - aAction = new QAction(QIcon(":pictures/eye_pencil.png"), tr("Show"), this); + aAction = ModuleBase_Tools::createAction(QIcon(""), tr("Deflection..."), aDesktop); + addAction("DEFLECTION_CMD", aAction); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil.png"), tr("Show"), aDesktop); addAction("SHOW_CMD", aAction); - aAction = new QAction(QIcon(":pictures/eye_pencil.png"), tr("Show only"), this); + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil.png"), tr("Show only"), + aDesktop); addAction("SHOW_ONLY_CMD", aAction); - aAction = new QAction(QIcon(":pictures/eye_pencil_closed.png"), tr("Hide"), this); + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil_closed.png"), tr("Hide"), + aDesktop); addAction("HIDE_CMD", aAction); - aAction = new QAction(QIcon(":pictures/eye_pencil_closed.png"), tr("Hide all"), this); + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil_closed.png"), tr("Hide all"), + aDesktop); addAction("HIDEALL_CMD", aAction); - aAction = new QAction(QIcon(":pictures/shading.png"), tr("Shading"), this); + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/shading.png"), tr("Shading"), aDesktop); addAction("SHADING_CMD", aAction); - aAction = new QAction(QIcon(":pictures/wireframe.png"), tr("Wireframe"), this); + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/wireframe.png"), tr("Wireframe"), + aDesktop); addAction("WIREFRAME_CMD", aAction); + + mySeparator = ModuleBase_Tools::createAction(QIcon(), "", aDesktop); + mySeparator->setSeparator(true); + + //mySelectActions = new QActionGroup(this); + //mySelectActions->setExclusive(true); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/vertex.png"), tr("Vertices"), aDesktop, + this, SLOT(onShapeSelection(bool))); + aAction->setCheckable(true); + addAction("SELECT_VERTEX_CMD", aAction); + //mySelectActions->addAction(aAction); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/edge.png"), tr("Edges"), aDesktop, + this, SLOT(onShapeSelection(bool))); + aAction->setCheckable(true); + addAction("SELECT_EDGE_CMD", aAction); + //mySelectActions->addAction(aAction); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/face.png"), tr("Faces"), aDesktop, + this, SLOT(onShapeSelection(bool))); + aAction->setCheckable(true); + addAction("SELECT_FACE_CMD", aAction); + //mySelectActions->addAction(aAction); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/result.png"), tr("Results"), aDesktop, + this, SLOT(onResultSelection(bool))); + aAction->setCheckable(true); + addAction("SELECT_RESULT_CMD", aAction); + //mySelectActions->addAction(aAction); + + aAction->setChecked(true); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/find_result.png"), + tr("Select results"), aDesktop); + addAction("SHOW_RESULTS_CMD", aAction); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/find_result.png"), + tr("Select parent feature"), aDesktop); + addAction("SHOW_FEATURE_CMD", aAction); + +#ifdef TINSPECTOR + aAction = ModuleBase_Tools::createAction(QIcon(), tr("TInspector"), aDesktop); + addAction("TINSPECTOR_VIEW", aAction); +#endif + + buildObjBrowserMenu(); + buildViewerMenu(); } void XGUI_ContextMenuMgr::addAction(const QString& theId, QAction* theAction) @@ -125,11 +203,13 @@ void XGUI_ContextMenuMgr::updateCommandsStatus() void XGUI_ContextMenuMgr::onContextMenuRequest(QContextMenuEvent* theEvent) { - QMenu* aMenu = 0; - if (sender() == myWorkshop->objectBrowser()) - aMenu = objectBrowserMenu(); - else if (sender() == myWorkshop->viewer()) { - aMenu = viewerMenu(); + QMenu* aMenu = new QMenu(); + if (sender() == myWorkshop->objectBrowser()) { + updateObjectBrowserMenu(); + addObjBrowserMenu(aMenu); + } else if (sender() == myWorkshop->viewer()) { + updateViewerMenu(); + addViewerMenu(aMenu); } if (aMenu && (aMenu->actions().size() > 0)) { @@ -143,9 +223,11 @@ void XGUI_ContextMenuMgr::onContextMenuRequest(QContextMenuEvent* theEvent) } } -QMenu* XGUI_ContextMenuMgr::objectBrowserMenu() const +void XGUI_ContextMenuMgr::updateObjectBrowserMenu() { - QMenu* aMenu = new QMenu(); + foreach(QAction* aAction, myActions) + aAction->setEnabled(false); + XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); QObjectPtrList aObjects = aSelMgr->selection()->selectedObjects(); int aSelected = aObjects.size(); @@ -155,148 +237,515 @@ QMenu* XGUI_ContextMenuMgr::objectBrowserMenu() const bool hasResult = false; bool hasFeature = false; bool hasParameter = false; - XGUI_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter); - + bool hasCompositeOwner = false; + ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter, + hasCompositeOwner); //Process Feature if (aSelected == 1) { ObjectPtr aObject = aObjects.first(); if (aObject) { - ResultPartPtr aPart = std::dynamic_pointer_cast(aObject); - if (aPart) { - if (aMgr->activeDocument() == aPart->partDoc()) - aMenu->addAction(action("DEACTIVATE_PART_CMD")); - else - aMenu->addAction(action("ACTIVATE_PART_CMD")); - } else if (hasFeature && aObject->document() == aMgr->activeDocument()) { - aMenu->addAction(action("EDIT_CMD")); - } else { - if (aDisplayer->isVisible(aObject)) { - if (aDisplayer->canBeShaded(aObject)) { - if (aDisplayer->displayMode(aObject) == XGUI_Displayer::Shading) - aMenu->addAction(action("WIREFRAME_CMD")); - else - aMenu->addAction(action("SHADING_CMD")); + 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) { + bool aHasSubResults = ModelAPI_Tools::hasSubResults( + std::dynamic_pointer_cast(aObject)); + if (aHasSubResults) { + action("HIDE_CMD")->setEnabled(true); + action("SHOW_CMD")->setEnabled(true); + } + else { + if (aObject->isDisplayed()) { + action("HIDE_CMD")->setEnabled(true); + } else if (hasResult && (!hasParameter)) { + action("SHOW_CMD")->setEnabled(true); } - aMenu->addSeparator(); - aMenu->addAction(action("HIDE_CMD")); - } else if (!hasParameter) { - aMenu->addAction(action("SHOW_CMD")); } - if (hasParameter) - aMenu->addAction(action("EDIT_CMD")); - else - aMenu->addAction(action("SHOW_ONLY_CMD")); + if (!(hasParameter || hasFeature)) + action("SHOW_ONLY_CMD")->setEnabled(true); + } + else if (hasFeature && myWorkshop->canMoveFeature()) + action("MOVE_CMD")->setEnabled(true); + + if( aMgr->activeDocument() == aObject->document() ) + { + action("RENAME_CMD")->setEnabled(true); + action("DELETE_CMD")->setEnabled(!hasCompositeOwner); + action("CLEAN_HISTORY_CMD")->setEnabled(!hasCompositeOwner && + (hasFeature || hasParameter)); } - } else { // If feature is 0 the it means that selected root object (document) - if (aMgr->activeDocument() != aMgr->moduleDocument()) - aMenu->addAction(action("ACTIVATE_PART_CMD")); } } else { - if (hasResult && (!hasParameter)) { - aMenu->addAction(action("SHOW_CMD")); - aMenu->addAction(action("HIDE_CMD")); - aMenu->addAction(action("SHOW_ONLY_CMD")); - aMenu->addSeparator(); - aMenu->addAction(action("SHADING_CMD")); - aMenu->addAction(action("WIREFRAME_CMD")); + // 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); + action("SHADING_CMD")->setEnabled(true); + action("WIREFRAME_CMD")->setEnabled(true); + } + } + bool allActive = true; + foreach( ObjectPtr aObject, aObjects ) + if( aMgr->activeDocument() != aObject->document() ) { + allActive = false; + break; + } + if (!hasCompositeOwner && allActive ) { + if (hasFeature || hasParameter) + action("DELETE_CMD")->setEnabled(true); + } + if (!hasCompositeOwner && allActive && (hasFeature|| hasParameter)) + action("CLEAN_HISTORY_CMD")->setEnabled(true); + + action("SHOW_RESULTS_CMD")->setEnabled(hasFeature); + action("SHOW_FEATURE_CMD")->setEnabled(hasResult); + } + + // 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 (hasFeature || hasParameter) - aMenu->addAction(action("DELETE_CMD")); } + 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()) - aMenu->addAction(action("COLOR_CMD")); + action("COLOR_CMD")->setEnabled(true); + + if (myWorkshop->canChangeDeflection()) + action("DEFLECTION_CMD")->setEnabled(true); + + #ifdef _DEBUG + #ifdef TINSPECTOR + action("TINSPECTOR_VIEW")->setEnabled(true); + #endif + #endif - aMenu->addSeparator(); - aMenu->addActions(myWorkshop->objectBrowser()->actions()); ModuleBase_IModule* aModule = myWorkshop->module(); if (aModule) - aModule->addObjectBrowserItems(aMenu); - - if (aMenu->actions().size() > 0) { - return aMenu; - } - delete aMenu; - return 0; + aModule->updateObjectBrowserMenu(myActions); } -QMenu* XGUI_ContextMenuMgr::viewerMenu() const +void XGUI_ContextMenuMgr::updateViewerMenu() { - QMenu* aMenu = new QMenu(); - addViewerItems(aMenu); - if (aMenu->actions().size() > 0) { - return aMenu; - } - delete aMenu; - return 0; -} + foreach(QAction* aAction, myActions) + aAction->setEnabled(false); -void XGUI_ContextMenuMgr::addViewerItems(QMenu* theMenu) const -{ - bool aIsDone = false; - ModuleBase_IModule* aModule = myWorkshop->module(); - if (aModule) - aIsDone = aModule->addViewerItems(theMenu, myActions); - - if (!aIsDone) { - XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); - QObjectPtrList aObjects = aSelMgr->selection()->selectedObjects(); - if (aObjects.size() > 0) { - //if (aObjects.size() == 1) - // theMenu->addAction(action("EDIT_CMD")); - bool isVisible = false; - bool isShading = false; - bool canBeShaded = false; - foreach(ObjectPtr aObject, aObjects) - { - ResultPtr aRes = std::dynamic_pointer_cast(aObject); - if (aRes && myWorkshop->displayer()->isVisible(aRes)) { - isVisible = true; - canBeShaded = myWorkshop->displayer()->canBeShaded(aObject); - isShading = (myWorkshop->displayer()->displayMode(aObject) == XGUI_Displayer::Shading); - break; - } + XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); + XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + QList aPrsList = + aSelMgr->selection()->getSelected(ModuleBase_ISelection::Viewer); + if (aPrsList.size() > 0) { + bool isVisible = false; + bool isShading = false; + bool canBeShaded = false; + ObjectPtr aObject; + foreach(ModuleBase_ViewerPrsPtr aPrs, aPrsList) { + aObject = aPrs->object(); + ResultPtr aRes = std::dynamic_pointer_cast(aObject); + if (aRes && aRes->isDisplayed()) { + isVisible = true; + canBeShaded = myWorkshop->displayer()->canBeShaded(aObject); + isShading = + (myWorkshop->displayer()->displayMode(aObject) == XGUI_Displayer::Shading); + break; } - if (isVisible) { - if (canBeShaded) { - if (isShading) - theMenu->addAction(action("WIREFRAME_CMD")); - else - theMenu->addAction(action("SHADING_CMD")); - } - theMenu->addSeparator(); - theMenu->addAction(action("SHOW_ONLY_CMD")); - theMenu->addAction(action("HIDE_CMD")); - } else - theMenu->addAction(action("SHOW_CMD")); - //theMenu->addAction(action("DELETE_CMD")); } - if (myWorkshop->displayer()->objectsCount() > 0) - theMenu->addAction(action("HIDEALL_CMD")); - if (myWorkshop->canChangeColor()) - theMenu->addAction(action("COLOR_CMD")); + if (isVisible) { + if (canBeShaded) { + 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); + } else + action("SHOW_CMD")->setEnabled(true); } - if (!myWorkshop->isSalomeMode()) { - theMenu->addSeparator(); - QMdiArea* aMDI = myWorkshop->mainWindow()->mdiArea(); - if (aMDI->actions().size() > 0) { - QMenu* aSubMenu = theMenu->addMenu(tr("Windows")); - aSubMenu->addActions(aMDI->actions()); + if (myWorkshop->displayer()->objectsCount() > 0) + action("HIDEALL_CMD")->setEnabled(true); + + // Update selection menu + QIntList aModes = aDisplayer->activeSelectionModes(); + action("SELECT_VERTEX_CMD")->setEnabled(true); + action("SELECT_EDGE_CMD")->setEnabled(true); + action("SELECT_FACE_CMD")->setEnabled(true); + action("SELECT_RESULT_CMD")->setEnabled(true); + + action("SELECT_RESULT_CMD")->setChecked(false); + action("SELECT_VERTEX_CMD")->setChecked(false); + action("SELECT_EDGE_CMD")->setChecked(false); + action("SELECT_FACE_CMD")->setChecked(false); + action("SELECT_RESULT_CMD")->setChecked(false); + if (aModes.count() == 0) { + action("SELECT_RESULT_CMD")->setChecked(true); + } else { + foreach(int aMode, aModes) { + switch (aMode) { + case TopAbs_VERTEX: + action("SELECT_VERTEX_CMD")->setChecked(true); + break; + case TopAbs_EDGE: + action("SELECT_EDGE_CMD")->setChecked(true); + break; + case TopAbs_FACE: + action("SELECT_FACE_CMD")->setChecked(true); + break; + default: + action("SELECT_RESULT_CMD")->setChecked(true); + } } } + ModuleBase_IModule* aModule = myWorkshop->module(); + if (aModule) + aModule->updateViewerMenu(myActions); + + if (myWorkshop->canChangeColor()) + action("COLOR_CMD")->setEnabled(true); + + if (myWorkshop->canChangeDeflection()) + action("DEFLECTION_CMD")->setEnabled(true); + + action("DELETE_CMD")->setEnabled(true); } -void XGUI_ContextMenuMgr::connectObjectBrowser() const +void XGUI_ContextMenuMgr::connectObjectBrowser() { connect(myWorkshop->objectBrowser(), SIGNAL(contextMenuRequested(QContextMenuEvent*)), this, SLOT(onContextMenuRequest(QContextMenuEvent*))); } -void XGUI_ContextMenuMgr::connectViewer() const +void XGUI_ContextMenuMgr::connectViewer() { connect(myWorkshop->viewer(), SIGNAL(contextMenuRequested(QContextMenuEvent*)), this, SLOT(onContextMenuRequest(QContextMenuEvent*))); } + +void XGUI_ContextMenuMgr::buildObjBrowserMenu() +{ + QAction* aSeparator = ModuleBase_Tools::createAction(QIcon(), "", myWorkshop->desktop()); + aSeparator->setSeparator(true); + + QActionsList aList; + + // Result construction menu + aList.append(action("SHOW_CMD")); + aList.append(action("HIDE_CMD")); + aList.append(action("SHOW_ONLY_CMD")); + aList.append(mySeparator); + aList.append(action("RENAME_CMD")); + aList.append(action("COLOR_CMD")); + aList.append(action("DEFLECTION_CMD")); + aList.append(action("SHOW_FEATURE_CMD")); + myObjBrowserMenus[ModelAPI_ResultConstruction::group()] = aList; + + //------------------------------------- + // Result body menu + aList.clear(); + aList.append(action("WIREFRAME_CMD")); + aList.append(action("SHADING_CMD")); + aList.append(mySeparator); // this separator is not shown as this action is added after show only + // qt list container contains only one instance of the same action + aList.append(action("SHOW_CMD")); + aList.append(action("HIDE_CMD")); + aList.append(action("SHOW_ONLY_CMD")); + aList.append(mySeparator); + aList.append(action("RENAME_CMD")); + aList.append(action("COLOR_CMD")); + aList.append(action("DEFLECTION_CMD")); + aList.append(action("SHOW_FEATURE_CMD")); + myObjBrowserMenus[ModelAPI_ResultBody::group()] = aList; + // Group menu + myObjBrowserMenus[ModelAPI_ResultGroup::group()] = aList; + myObjBrowserMenus[ModelAPI_ResultField::group()] = aList; + // Result part menu + myObjBrowserMenus[ModelAPI_ResultPart::group()] = aList; + //------------------------------------- + // Feature menu + aList.clear(); + aList.append(action("RENAME_CMD")); + aList.append(action("SHOW_RESULTS_CMD")); + aList.append(action("MOVE_CMD")); + aList.append(mySeparator); + aList.append(action("CLEAN_HISTORY_CMD")); + aList.append(action("DELETE_CMD")); + myObjBrowserMenus[ModelAPI_Feature::group()] = aList; + + aList.clear(); + aList.append(action("RENAME_CMD")); + aList.append(mySeparator); + aList.append(action("CLEAN_HISTORY_CMD")); + aList.append(action("DELETE_CMD")); + myObjBrowserMenus[ModelAPI_ResultParameter::group()] = aList; + //------------------------------------- +} + +void XGUI_ContextMenuMgr::buildViewerMenu() +{ + QActionsList aList; + // Result construction menu + aList.append(action("HIDE_CMD")); + aList.append(action("SHOW_ONLY_CMD")); + aList.append(mySeparator); + aList.append(action("COLOR_CMD")); + aList.append(action("DEFLECTION_CMD")); + myViewerMenu[ModelAPI_ResultConstruction::group()] = aList; + // Result part menu + myViewerMenu[ModelAPI_ResultPart::group()] = aList; + //------------------------------------- + // Result body menu + aList.clear(); + aList.append(action("WIREFRAME_CMD")); + aList.append(action("SHADING_CMD")); + aList.append(mySeparator); + aList.append(action("HIDE_CMD")); + aList.append(action("SHOW_ONLY_CMD")); + aList.append(mySeparator); + aList.append(action("COLOR_CMD")); + aList.append(action("DEFLECTION_CMD")); + myViewerMenu[ModelAPI_ResultBody::group()] = aList; + // Group menu + myViewerMenu[ModelAPI_ResultGroup::group()] = aList; + myViewerMenu[ModelAPI_ResultField::group()] = aList; + //------------------------------------- +} + + +void XGUI_ContextMenuMgr::addObjBrowserMenu(QMenu* theMenu) const +{ + ModuleBase_IModule* aModule = myWorkshop->module(); + if (aModule) { + theMenu->addSeparator(); + aModule->addObjectBrowserMenu(theMenu); + } + + XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); + QObjectPtrList aObjects = aSelMgr->selection()->selectedObjects(); + int aSelected = aObjects.size(); + QActionsList aActions; + if (aSelected == 1) { + ObjectPtr aObject = aObjects.first(); + std::string aName = aObject->groupName(); + if (myObjBrowserMenus.contains(aName)) + aActions = myObjBrowserMenus[aName]; + } else if (aSelected > 1) { + aActions.append(action("WIREFRAME_CMD")); + aActions.append(action("SHADING_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("MOVE_CMD")); + aActions.append(action("COLOR_CMD")); + aActions.append(action("DEFLECTION_CMD")); + + aActions.append(action("CLEAN_HISTORY_CMD")); + aActions.append(action("DELETE_CMD")); + } +#ifdef _DEBUG + if (aSelected == 0) { + #ifdef TINSPECTOR + aActions.append(action("TINSPECTOR_VIEW")); + #endif + } +#endif + theMenu->addActions(aActions); + addFeatures(theMenu); + + // It is commented out because Object Browser does not have actions + //theMenu->addSeparator(); + //theMenu->addActions(myWorkshop->objectBrowser()->actions()); +} + +void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const +{ + XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); + QList aPrsList = + aSelMgr->selection()->getSelected(ModuleBase_ISelection::Viewer); + int aSelected = aPrsList.size(); + QActionsList aActions; + + // Create selection menu + XGUI_OperationMgr* aOpMgr = myWorkshop->operationMgr(); + QIntList aModes; + myWorkshop->module()->activeSelectionModes(aModes); + if ((!aOpMgr->hasOperation()) && aModes.isEmpty()) { + QMenu* aSelMenu = new QMenu(tr("Selection mode"), theMenu); + aSelMenu->addAction(action("SELECT_VERTEX_CMD")); + aSelMenu->addAction(action("SELECT_EDGE_CMD")); + aSelMenu->addAction(action("SELECT_FACE_CMD")); + //IMP: an attempt to use result selection with other selection modes + //aSelMenu->addSeparator(); + aSelMenu->addAction(action("SELECT_RESULT_CMD")); + theMenu->addMenu(aSelMenu); + theMenu->addSeparator(); + } + if (aSelected == 1) { + ObjectPtr aObject = aPrsList.first()->object(); + if (aObject.get() != NULL) { + std::string aName = aObject->groupName(); + if (myViewerMenu.contains(aName)) + aActions = myViewerMenu[aName]; + } + } else if (aSelected > 1) { + aActions.append(action("HIDE_CMD")); + } + // hide all is shown always even if selection in the viewer is empty + aActions.append(action("HIDEALL_CMD")); + aActions.append(action("COLOR_CMD")); + aActions.append(action("DEFLECTION_CMD")); + + theMenu->addActions(aActions); + + QMap aMenuActions; + ModuleBase_IModule* aModule = myWorkshop->module(); + if (aModule) { + if (aModule->addViewerMenu(myActions, theMenu, aMenuActions)) + theMenu->addSeparator(); + } + + // insert the module menu items on specific positions in the popup menu: some actions should be + // in the begin of the list, Delete action should be the last by #1343 issue + QList anActions = theMenu->actions(); + int anActionsSize = anActions.size(); + QAction* aFirstAction = anActions[0]; + QMap::const_iterator anIt = aMenuActions.begin(), aLast = aMenuActions.end(); + for (; anIt != aLast; anIt++) { + if (anIt.key() > anActionsSize) + theMenu->addAction(anIt.value()); + else + theMenu->insertAction(aFirstAction, *anIt); + } + +#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 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(); +} + +void XGUI_ContextMenuMgr::addFeatures(QMenu* theMenu) const +{ + SessionPtr aMgr = ModelAPI_Session::get(); + DocumentPtr aActiveDoc = aMgr->activeDocument(); + + XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); + XGUI_ActionsMgr* aActionMgr = myWorkshop->actionsMgr(); + const Config_DataModelReader* aDataModelXML = myWorkshop->dataModelXMLReader(); + QModelIndexList aSelectedIndexes = aSelMgr->selection()->selectedIndexes(); + + QString aName; + int aLen = 0; + bool aIsRoot = false; + foreach(QModelIndex aIdx, aSelectedIndexes) { + // Process only first column + if (aIdx.column() == 0) { + aIsRoot = !aIdx.parent().isValid(); + // Exit if the selected index belongs to non active document + if (aIsRoot && (aActiveDoc != aMgr->moduleDocument())) + return; + if ((!aIsRoot) && (aIdx.internalPointer() != aActiveDoc.get())) + return; + + // Get name of the selected index + aName = aIdx.data().toString(); + aLen = aName.indexOf('('); + if (aLen != -1) { + aName = aName.left(--aLen); + } + std::string aFeaturesStr = aIsRoot? + aDataModelXML->rootFolderFeatures(aName.toStdString()) : + aDataModelXML->subFolderFeatures(aName.toStdString()); + if (aFeaturesStr.length() > 0) { + QStringList aFeturesList = + QString(aFeaturesStr.c_str()).split(",", QString::SkipEmptyParts); + foreach(QString aFea, aFeturesList) { + QAction* aAction = aActionMgr->action(aFea); + if (aAction) + theMenu->addAction(aAction); + } + } + } + } +} + +#define UNCHECK_ACTION(NAME) \ +{ QAction* aAction = action(NAME); \ +bool isBlock = aAction->signalsBlocked(); \ +aAction->blockSignals(true); \ +aAction->setChecked(false); \ + aAction->blockSignals(isBlock); } + + +void XGUI_ContextMenuMgr::onResultSelection(bool theChecked) +{ + UNCHECK_ACTION("SELECT_VERTEX_CMD"); + UNCHECK_ACTION("SELECT_EDGE_CMD"); + UNCHECK_ACTION("SELECT_FACE_CMD"); +} + +void XGUI_ContextMenuMgr::onShapeSelection(bool theChecked) +{ + UNCHECK_ACTION("SHOW_RESULTS_CMD"); +}