X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_ContextMenuMgr.cpp;h=87c91f9753ec01b48737e0a66f23e9cdd044b48b;hb=57af37f78b56b87216f62d45537e0ad3e7197cf3;hp=6122c232f2af642a6f36549f55651ddac6879269;hpb=2469ecd08c3b16def494626928ff81e575bdfe3d;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_ContextMenuMgr.cpp b/src/XGUI/XGUI_ContextMenuMgr.cpp index 6122c232f..87c91f975 100644 --- a/src/XGUI/XGUI_ContextMenuMgr.cpp +++ b/src/XGUI/XGUI_ContextMenuMgr.cpp @@ -1,4 +1,22 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> +// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or +// email : webmaster.salome@opencascade.com +// #include "XGUI_ContextMenuMgr.h" #include "XGUI_Workshop.h" @@ -6,11 +24,13 @@ #include "XGUI_SelectionMgr.h" #include "XGUI_Displayer.h" #include "XGUI_ViewerProxy.h" -#include "XGUI_Selection.h" #include "XGUI_SalomeConnector.h" +#include "XGUI_Selection.h" +#include "XGUI_SelectionActivate.h" #include "XGUI_DataModel.h" #include "XGUI_OperationMgr.h" #include "XGUI_Tools.h" +#include "XGUI_ActionsMgr.h" #ifndef HAVE_SALOME #include @@ -27,10 +47,16 @@ #include #include #include +#include +#include +#include + +#include #include #include #include +#include #include #include @@ -38,12 +64,12 @@ #include #include #include - +#include XGUI_ContextMenuMgr::XGUI_ContextMenuMgr(XGUI_Workshop* theParent) : QObject(theParent), myWorkshop(theParent), - mySeparator(0) + mySeparator1(0), mySeparator2(0), mySeparator3(0) { } @@ -59,71 +85,131 @@ void XGUI_ContextMenuMgr::createActions() QMainWindow* aDesktop = myWorkshop->mainWindow(); #endif - QAction* aAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this); + QAction* aAction = ModuleBase_Tools::createAction(QIcon(":pictures/delete.png"), tr("Delete"), + aDesktop); aDesktop->addAction(aAction); addAction("DELETE_CMD", aAction); aAction->setShortcutContext(Qt::ApplicationShortcut); - aAction = new QAction(QIcon(":pictures/rename_edit.png"), tr("Rename"), this); + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/rename_edit.png"), tr("Rename"), + aDesktop, this, SLOT(onRename())); 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); + aAction = ModuleBase_Tools::createAction(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); + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/clean_history.png"), + tr("Clean history"), aDesktop); addAction("CLEAN_HISTORY_CMD", aAction); - aAction = new QAction(QIcon(":pictures/color.png"), tr("Color..."), this); + 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); + +#ifdef USE_TRANSPARENCY + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/transparency.png"), + tr("Transparency..."), aDesktop); + addAction("TRANSPARENCY_CMD", aAction); +#endif + + 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 = new QAction(this); - mySeparator->setSeparator(true); + mySeparator1 = ModuleBase_Tools::createAction(QIcon(), "", aDesktop); + mySeparator1->setSeparator(true); + + mySeparator2 = ModuleBase_Tools::createAction(QIcon(), "", aDesktop); + mySeparator2->setSeparator(true); + + mySeparator3 = ModuleBase_Tools::createAction(QIcon(), "", aDesktop); + mySeparator3->setSeparator(true); - mySelectActions = new QActionGroup(this); - mySelectActions->setExclusive(true); + //mySelectActions = new QActionGroup(this); + //mySelectActions->setExclusive(true); - aAction = new QAction(QIcon(":pictures/vertex.png"), tr("Vertices"), this); + 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); + //mySelectActions->addAction(aAction); - aAction = new QAction(QIcon(":pictures/edge.png"), tr("Edges"), this); + 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); + //mySelectActions->addAction(aAction); - aAction = new QAction(QIcon(":pictures/face.png"), tr("Faces"), this); + 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); + //mySelectActions->addAction(aAction); - aAction = new QAction(QIcon(":pictures/result.png"), tr("Result"), this); + 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); + //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 + + // Features folders actions + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/create_folder.png"), + tr("Insert a folder before"), aDesktop); + addAction("INSERT_FOLDER_CMD", aAction); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/insert_folder_before.png"), + tr("Move into the previous folder"), aDesktop); + addAction("ADD_TO_FOLDER_BEFORE_CMD", aAction); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/insert_folder_after.png"), + tr("Move into the next folder"), aDesktop); + addAction("ADD_TO_FOLDER_AFTER_CMD", aAction); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/move_out_before.png"), + tr("Move out before the folder"), aDesktop); + addAction("ADD_OUT_FOLDER_BEFORE_CMD", aAction); + + aAction = ModuleBase_Tools::createAction(QIcon(":pictures/move_out_after.png"), + tr("Move out after the folder"), aDesktop); + addAction("ADD_OUT_FOLDER_AFTER_CMD", aAction); + buildObjBrowserMenu(); buildViewerMenu(); } @@ -191,7 +277,7 @@ void XGUI_ContextMenuMgr::onContextMenuRequest(QContextMenuEvent* theEvent) } } -void XGUI_ContextMenuMgr::updateObjectBrowserMenu() +void XGUI_ContextMenuMgr::updateObjectBrowserMenu() { foreach(QAction* aAction, myActions) aAction->setEnabled(false); @@ -205,11 +291,13 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() bool hasResult = false; bool hasFeature = false; bool hasParameter = false; - bool hasSubFeature = false; - ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter, hasSubFeature); - + bool hasCompositeOwner = false; + bool hasResultInHistory = false; + bool hasFolder = false; + ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter, + hasCompositeOwner, hasResultInHistory, hasFolder); //Process Feature - if (aSelected == 1) { + if (aSelected == 1) { // single selection ObjectPtr aObject = aObjects.first(); if (aObject) { if (hasResult && myWorkshop->canBeShaded(aObject)) { @@ -242,16 +330,16 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() else if (hasFeature && myWorkshop->canMoveFeature()) action("MOVE_CMD")->setEnabled(true); - else if (hasFeature || hasParameter) - action("CLEAN_HISTORY_CMD")->setEnabled(!hasSubFeature); - if( aMgr->activeDocument() == aObject->document() ) { action("RENAME_CMD")->setEnabled(true); - action("DELETE_CMD")->setEnabled(!hasSubFeature); + action("DELETE_CMD")->setEnabled(!hasCompositeOwner); + action("CLEAN_HISTORY_CMD")->setEnabled(!hasCompositeOwner && + (hasFeature || hasParameter)); } } - } else { + // end single selection + } else { // multiselection // parameter is commented because the actions are not in the list of result parameter actions if (hasResult /*&& (!hasParameter)*/) { action("SHOW_CMD")->setEnabled(true); @@ -260,20 +348,114 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() action("SHADING_CMD")->setEnabled(true); action("WIREFRAME_CMD")->setEnabled(true); } - } + } // end multiselection + + // Check folder management commands state if only features are selected + if ((!hasResult) && hasFeature && (!hasParameter) && (!hasCompositeOwner) && + (!hasResultInHistory) && (!hasFolder)) { + std::list aFeatures = aSelMgr->getSelectedFeatures(); + if (aFeatures.size() > 0) { // Check that features do not include Parts + QModelIndexList aIndexes = aSelMgr->selection()->selectedIndexes(); + QModelIndex aFirstIdx = aIndexes.first(); + QModelIndex aLastIdx = aIndexes.last(); + QModelIndex aParentIdx = aFirstIdx.parent(); + + // if all selected are from the same level + bool isSameParent = true; + foreach(QModelIndex aIdx, aIndexes) { + if (aIdx.parent() != aParentIdx) { + isSameParent = false; + break; + } + } + if (isSameParent) { + // Check is selection continuous + XGUI_DataModel* aModel = myWorkshop->objectBrowser()->dataModel(); + DocumentPtr aDoc = aMgr->activeDocument(); + std::list aFeatures = aSelMgr->getSelectedFeatures(); + + bool isContinuos = true; + if (aSelected > 1) { + int aId = -1; + foreach(FeaturePtr aF, aFeatures) { + if (aId == -1) + aId = aDoc->index(aF); + else { + aId++; + if (aId != aDoc->index(aF)) { + isContinuos = false; + break; + } + } + } + } + if (isContinuos) { + ObjectPtr aDataObj = aModel->object(aParentIdx); + + ObjectPtr aPrevObj; + if (aFirstIdx.row() > 0) { + QModelIndex aPrevIdx = aFirstIdx.sibling(aFirstIdx.row() - 1, 0); + aPrevObj = aModel->object(aPrevIdx); + } + + ObjectPtr aNextObj; + if (aLastIdx.row() < (aModel->rowCount(aParentIdx) - 1)) { + QModelIndex aNextIdx = aFirstIdx.sibling(aLastIdx.row() + 1, 0); + aNextObj = aModel->object(aNextIdx); + } + + bool isPrevFolder = (aPrevObj.get() && + (aPrevObj->groupName() == ModelAPI_Folder::group())); + bool isNextFolder = (aNextObj.get() && + (aNextObj->groupName() == ModelAPI_Folder::group())); + bool isInFolder = (aDataObj.get() && + (aDataObj->groupName() == ModelAPI_Folder::group())); + bool isOutsideFolder = !isInFolder; + + bool hasFirst = false; + bool hasLast = false; + if (isInFolder) { + FolderPtr aFolder = std::dynamic_pointer_cast(aDataObj); + FeaturePtr aFirstFeatureInFolder; + AttributeReferencePtr aFirstFeatAttr = + aFolder->data()->reference(ModelAPI_Folder::FIRST_FEATURE_ID()); + if (aFirstFeatAttr) + aFirstFeatureInFolder = ModelAPI_Feature::feature(aFirstFeatAttr->value()); + hasFirst = (aFirstFeatureInFolder == aFeatures.front()); + + FeaturePtr aLastFeatureInFolder; + AttributeReferencePtr aLastFeatAttr = + aFolder->data()->reference(ModelAPI_Folder::LAST_FEATURE_ID()); + if (aLastFeatAttr) + aLastFeatureInFolder = ModelAPI_Feature::feature(aLastFeatAttr->value()); + hasLast = (aLastFeatureInFolder == aFeatures.back()); + } + action("INSERT_FOLDER_CMD")->setEnabled(isOutsideFolder); + action("ADD_TO_FOLDER_BEFORE_CMD")->setEnabled(isOutsideFolder && isPrevFolder); + action("ADD_TO_FOLDER_AFTER_CMD")->setEnabled(isOutsideFolder && isNextFolder); + action("ADD_OUT_FOLDER_BEFORE_CMD")->setEnabled(isInFolder && hasFirst); + action("ADD_OUT_FOLDER_AFTER_CMD")->setEnabled(isInFolder && hasLast); + } + } + } + } // end folder management commands + bool allActive = true; foreach( ObjectPtr aObject, aObjects ) if( aMgr->activeDocument() != aObject->document() ) { allActive = false; break; } - if (!hasSubFeature && allActive ) { + if (!hasCompositeOwner && allActive ) { if (hasFeature || hasParameter) action("DELETE_CMD")->setEnabled(true); } - if (!hasSubFeature && allActive && (hasFeature|| hasParameter)) + if (!hasCompositeOwner && allActive && (hasFeature|| hasParameter)) action("CLEAN_HISTORY_CMD")->setEnabled(true); - } + + action("SHOW_RESULTS_CMD")->setEnabled(hasFeature); + action("SHOW_FEATURE_CMD")->setEnabled(hasResult && hasResultInHistory); + } // end selection processing // Show/Hide command has to be disabled for objects from non active document bool aDeactivate = false; @@ -293,8 +475,17 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() action("SHOW_ONLY_CMD")->setEnabled(false); } - if (myWorkshop->canChangeColor()) - action("COLOR_CMD")->setEnabled(true); + action("COLOR_CMD")->setEnabled(myWorkshop->canChangeProperty("COLOR_CMD")); + action("DEFLECTION_CMD")->setEnabled(myWorkshop->canChangeProperty("DEFLECTION_CMD")); +#ifdef USE_TRANSPARENCY + action("TRANSPARENCY_CMD")->setEnabled(myWorkshop->canChangeProperty("TRANSPARENCY_CMD")); +#endif + #ifdef _DEBUG + #ifdef TINSPECTOR + action("TINSPECTOR_VIEW")->setEnabled(true); + #endif + #endif + ModuleBase_IModule* aModule = myWorkshop->module(); if (aModule) @@ -308,7 +499,8 @@ void XGUI_ContextMenuMgr::updateViewerMenu() XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - QList aPrsList = aSelMgr->selection()->getSelected(ModuleBase_ISelection::Viewer); + QList aPrsList = + aSelMgr->selection()->getSelected(ModuleBase_ISelection::Viewer); if (aPrsList.size() > 0) { bool isVisible = false; bool isShading = false; @@ -320,7 +512,8 @@ void XGUI_ContextMenuMgr::updateViewerMenu() if (aRes && aRes->isDisplayed()) { isVisible = true; canBeShaded = myWorkshop->displayer()->canBeShaded(aObject); - isShading = (myWorkshop->displayer()->displayMode(aObject) == XGUI_Displayer::Shading); + isShading = + (myWorkshop->displayer()->displayMode(aObject) == XGUI_Displayer::Shading); break; } } @@ -340,26 +533,35 @@ void XGUI_ContextMenuMgr::updateViewerMenu() } else action("SHOW_CMD")->setEnabled(true); } + //issue #2159 Hide all incomplete behavior +#ifdef HAVE_SALOME + action("HIDEALL_CMD")->setEnabled(true); +#else if (myWorkshop->displayer()->objectsCount() > 0) action("HIDEALL_CMD")->setEnabled(true); - if (myWorkshop->canChangeColor()) - action("COLOR_CMD")->setEnabled(true); - - action("DELETE_CMD")->setEnabled(true); +#endif // Update selection menu - QIntList aModes = aDisplayer->activeSelectionModes(); - if (aModes.count() <= 1) { - action("SELECT_VERTEX_CMD")->setEnabled(true); - action("SELECT_EDGE_CMD")->setEnabled(true); - action("SELECT_FACE_CMD")->setEnabled(true); - action("SELECT_RESULT_CMD")->setEnabled(true); - if (aModes.count() == 1) { - switch (aModes.first()) { - case TopAbs_VERTEX: + QIntList aModes = myWorkshop->selectionActivate()->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: + case TopAbs_EDGE: action("SELECT_EDGE_CMD")->setChecked(true); break; case TopAbs_FACE: @@ -368,12 +570,25 @@ void XGUI_ContextMenuMgr::updateViewerMenu() default: action("SELECT_RESULT_CMD")->setChecked(true); } - } else - action("SELECT_RESULT_CMD")->setChecked(true); + } } + ModuleBase_IModule* aModule = myWorkshop->module(); if (aModule) aModule->updateViewerMenu(myActions); + + if (myWorkshop->canChangeProperty("COLOR_CMD")) + action("COLOR_CMD")->setEnabled(true); + + if (myWorkshop->canChangeProperty("DEFLECTION_CMD")) + action("DEFLECTION_CMD")->setEnabled(true); + +#ifdef USE_TRANSPARENCY + if (myWorkshop->canChangeProperty("TRANSPARENCY_CMD")) + action("TRANSPARENCY_CMD")->setEnabled(true); +#endif + + action("DELETE_CMD")->setEnabled(true); } void XGUI_ContextMenuMgr::connectObjectBrowser() @@ -391,53 +606,80 @@ void XGUI_ContextMenuMgr::connectViewer() void XGUI_ContextMenuMgr::buildObjBrowserMenu() { - QAction* aSeparator = new QAction(this); + 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(action("COLOR_CMD")); - aList.append(mySeparator); + aList.append(mySeparator1); aList.append(action("RENAME_CMD")); + aList.append(action("COLOR_CMD")); + aList.append(action("DEFLECTION_CMD")); +#ifdef USE_TRANSPARENCY + aList.append(action("TRANSPARENCY_CMD")); +#endif + 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(action("COLOR_CMD")); - aList.append(mySeparator); + aList.append(mySeparator1); // 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(mySeparator2); aList.append(action("RENAME_CMD")); + aList.append(action("COLOR_CMD")); + aList.append(action("DEFLECTION_CMD")); +#ifdef USE_TRANSPARENCY + aList.append(action("TRANSPARENCY_CMD")); +#endif + 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("DELETE_CMD")); + aList.append(action("RENAME_CMD")); + aList.append(action("SHOW_RESULTS_CMD")); aList.append(action("MOVE_CMD")); + aList.append(mySeparator1); + aList.append(action("INSERT_FOLDER_CMD")); + aList.append(action("ADD_TO_FOLDER_BEFORE_CMD")); + aList.append(action("ADD_TO_FOLDER_AFTER_CMD")); + aList.append(mySeparator2); + aList.append(action("ADD_OUT_FOLDER_BEFORE_CMD")); + aList.append(action("ADD_OUT_FOLDER_AFTER_CMD")); + aList.append(mySeparator3); aList.append(action("CLEAN_HISTORY_CMD")); - aList.append(mySeparator); - aList.append(action("RENAME_CMD")); + aList.append(action("DELETE_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")); + aList.append(mySeparator1); + aList.append(action("CLEAN_HISTORY_CMD")); + aList.append(action("DELETE_CMD")); myObjBrowserMenus[ModelAPI_ResultParameter::group()] = aList; //------------------------------------- + + aList.clear(); + aList.append(action("RENAME_CMD")); + aList.append(action("DELETE_CMD")); + myObjBrowserMenus[ModelAPI_Folder::group()] = aList; + } void XGUI_ContextMenuMgr::buildViewerMenu() @@ -446,7 +688,12 @@ void XGUI_ContextMenuMgr::buildViewerMenu() // Result construction menu aList.append(action("HIDE_CMD")); aList.append(action("SHOW_ONLY_CMD")); + aList.append(mySeparator1); aList.append(action("COLOR_CMD")); + aList.append(action("DEFLECTION_CMD")); +#ifdef USE_TRANSPARENCY + aList.append(action("TRANSPARENCY_CMD")); +#endif myViewerMenu[ModelAPI_ResultConstruction::group()] = aList; // Result part menu myViewerMenu[ModelAPI_ResultPart::group()] = aList; @@ -455,20 +702,31 @@ void XGUI_ContextMenuMgr::buildViewerMenu() aList.clear(); aList.append(action("WIREFRAME_CMD")); aList.append(action("SHADING_CMD")); - aList.append(action("COLOR_CMD")); - aList.append(mySeparator); + aList.append(mySeparator1); aList.append(action("HIDE_CMD")); aList.append(action("SHOW_ONLY_CMD")); + aList.append(mySeparator2); + aList.append(action("COLOR_CMD")); + aList.append(action("DEFLECTION_CMD")); +#ifdef USE_TRANSPARENCY + aList.append(action("TRANSPARENCY_CMD")); +#endif 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(); @@ -479,50 +737,60 @@ void XGUI_ContextMenuMgr::addObjBrowserMenu(QMenu* theMenu) const if (myObjBrowserMenus.contains(aName)) aActions = myObjBrowserMenus[aName]; } else if (aSelected > 1) { - aActions.append(action("SHADING_CMD")); aActions.append(action("WIREFRAME_CMD")); - aActions.append(mySeparator); + aActions.append(action("SHADING_CMD")); + aActions.append(mySeparator1); 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(mySeparator2); + aActions.append(action("ADD_TO_FOLDER_BEFORE_CMD")); + aActions.append(action("ADD_TO_FOLDER_AFTER_CMD")); + aActions.append(action("ADD_OUT_FOLDER_BEFORE_CMD")); + aActions.append(action("ADD_OUT_FOLDER_AFTER_CMD")); + aActions.append(mySeparator3); //aActions.append(action("MOVE_CMD")); - aActions.append(action("CLEAN_HISTORY_CMD")); aActions.append(action("COLOR_CMD")); + aActions.append(action("DEFLECTION_CMD")); +#ifdef USE_TRANSPARENCY + aActions.append(action("TRANSPARENCY_CMD")); +#endif + 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); - ModuleBase_IModule* aModule = myWorkshop->module(); - if (aModule) { - theMenu->addSeparator(); - aModule->addObjectBrowserMenu(theMenu); - } - theMenu->addSeparator(); - theMenu->addActions(myWorkshop->objectBrowser()->actions()); + // 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 { - ModuleBase_IModule* aModule = myWorkshop->module(); - if (aModule) { - if (aModule->addViewerMenu(theMenu, myActions)) - theMenu->addSeparator(); - } XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); - QList aPrsList = aSelMgr->selection()->getSelected(ModuleBase_ISelection::Viewer); + 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()) { + if (!aOpMgr->hasOperation() && + myWorkshop->selectionActivate()->activeSelectionPlace() == XGUI_SelectionActivate::Workshop) { 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(); @@ -534,15 +802,38 @@ void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const 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")); } // 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")); +#ifdef USE_TRANSPARENCY + aActions.append(action("TRANSPARENCY_CMD")); +#endif 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(); @@ -578,8 +869,73 @@ void XGUI_ContextMenuMgr::onRename() { QObjectPtrList anObjects = myWorkshop->selector()->selection()->selectedObjects(); if (!myWorkshop->abortAllOperations()) - return; + 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() == 1) { + 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"); +}