X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FXGUI%2FXGUI_ContextMenuMgr.cpp;h=e42131d55865497631ec136d9cc1000517deb9ba;hb=c837befca5d8a28a000ac1b87345f038d87b727f;hp=cb60a464da929248870b8800ebaab162a7246196;hpb=a2c1642bfb2277cc05c30b5646518a69c07c1952;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_ContextMenuMgr.cpp b/src/XGUI/XGUI_ContextMenuMgr.cpp index cb60a464d..e42131d55 100644 --- a/src/XGUI/XGUI_ContextMenuMgr.cpp +++ b/src/XGUI/XGUI_ContextMenuMgr.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2022 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 @@ -12,10 +12,9 @@ // // 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 +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "XGUI_ContextMenuMgr.h" @@ -24,8 +23,9 @@ #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" @@ -47,13 +47,15 @@ #include #include #include -#include "ModelAPI_Folder.h" +#include +#include +#include #include #include #include -#include +#include #include #include @@ -64,10 +66,14 @@ #include #include +#ifdef WIN32 +#pragma warning(disable : 4456) // for nested foreach +#endif + XGUI_ContextMenuMgr::XGUI_ContextMenuMgr(XGUI_Workshop* theParent) : QObject(theParent), myWorkshop(theParent), - mySeparator1(0), mySeparator2(0) + mySeparator1(0), mySeparator2(0), mySeparator3(0) { } @@ -83,58 +89,86 @@ void XGUI_ContextMenuMgr::createActions() QMainWindow* aDesktop = myWorkshop->mainWindow(); #endif - QAction* aAction = ModuleBase_Tools::createAction(QIcon(":pictures/delete.png"), tr("Delete"), + QAction* anAction = ModuleBase_Tools::createAction(QIcon(":pictures/delete.png"), tr("Delete"), aDesktop); - aDesktop->addAction(aAction); + aDesktop->addAction(anAction); - addAction("DELETE_CMD", aAction); - aAction->setShortcutContext(Qt::ApplicationShortcut); + addAction("DELETE_CMD", anAction); + anAction->setShortcutContext(Qt::ApplicationShortcut); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/rename_edit.png"), tr("Rename"), + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/rename_edit.png"), tr("Rename"), aDesktop, this, SLOT(onRename())); - addAction("RENAME_CMD", aAction); + anAction->setShortcut(Qt::Key_F2); + addAction("RENAME_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/move.png"), +#ifdef HAVE_SALOME + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/move_to_end.png"), XGUI_Workshop::MOVE_TO_END_COMMAND, this); - addAction("MOVE_CMD", aAction); + addAction("MOVE_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/clean_history.png"), + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/move_to_end_split.png"), + XGUI_Workshop::MOVE_TO_END_SPLIT_COMMAND, this); + addAction("MOVE_SPLIT_CMD", anAction); +#endif + + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/recover.png"), + tr("Recover"), this); + addAction("RECOVER_CMD", anAction); + + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/clean_history.png"), tr("Clean history"), aDesktop); - addAction("CLEAN_HISTORY_CMD", aAction); + addAction("CLEAN_HISTORY_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/color.png"), tr("Color..."), aDesktop); - addAction("COLOR_CMD", aAction); + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/color.png"), tr("Color..."), aDesktop); + addAction("COLOR_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(""), tr("Deflection..."), aDesktop); - addAction("DEFLECTION_CMD", aAction); + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/autocolor.png"), + tr("Auto color"), aDesktop); + addAction("AUTOCOLOR_CMD", anAction); -#ifdef USE_TRANSPARENCY - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/transparency.png"), + anAction = ModuleBase_Tools::createAction(QIcon(""), tr("Deflection..."), aDesktop); + addAction("DEFLECTION_CMD", anAction); + + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/transparency.png"), tr("Transparency..."), aDesktop); - addAction("TRANSPARENCY_CMD", aAction); -#endif + addAction("TRANSPARENCY_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil.png"), tr("Show"), aDesktop); - addAction("SHOW_CMD", aAction); + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil.png"), + tr("Show"), aDesktop); + addAction("SHOW_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil.png"), tr("Show only"), - aDesktop); - addAction("SHOW_ONLY_CMD", aAction); + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil.png"), + tr("Show only"), aDesktop); + addAction("SHOW_ONLY_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil_closed.png"), tr("Hide"), + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil_closed.png"), tr("Hide"), aDesktop); - addAction("HIDE_CMD", aAction); + addAction("HIDE_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil_closed.png"), tr("Hide all"), + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil_closed.png"), + tr("Hide all"), aDesktop); + addAction("HIDEALL_CMD", anAction); + + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/shading.png"), + tr("Shading"), aDesktop); + addAction("SHADING_CMD", anAction); + + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/wireframe.png"), tr("Wireframe"), aDesktop); - addAction("HIDEALL_CMD", aAction); + addAction("WIREFRAME_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/shading.png"), tr("Shading"), aDesktop); - addAction("SHADING_CMD", aAction); + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/edges_dir.png"), tr("Show edges direction"), + aDesktop); + anAction->setCheckable(true); + addAction("SHOW_EDGES_DIRECTION_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/wireframe.png"), tr("Wireframe"), + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/iso_lines.png"), tr("Define Isos..."), aDesktop); - addAction("WIREFRAME_CMD", aAction); + addAction("ISOLINES_CMD", anAction); + + anAction = ModuleBase_Tools::createAction(QIcon(), tr("Show Isos"), aDesktop); + anAction->setCheckable(true); + addAction("SHOW_ISOLINES_CMD", anAction); mySeparator1 = ModuleBase_Tools::createAction(QIcon(), "", aDesktop); mySeparator1->setSeparator(true); @@ -142,60 +176,72 @@ void XGUI_ContextMenuMgr::createActions() mySeparator2 = ModuleBase_Tools::createAction(QIcon(), "", aDesktop); mySeparator2->setSeparator(true); - //mySelectActions = new QActionGroup(this); - //mySelectActions->setExclusive(true); + mySeparator3 = ModuleBase_Tools::createAction(QIcon(), "", aDesktop); + mySeparator3->setSeparator(true); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/vertex.png"), tr("Vertices"), aDesktop, + anAction = 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); + anAction->setCheckable(true); + addAction("SELECT_VERTEX_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/edge.png"), tr("Edges"), aDesktop, + anAction = 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); + anAction->setCheckable(true); + addAction("SELECT_EDGE_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/face.png"), tr("Faces"), aDesktop, + anAction = 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); + anAction->setCheckable(true); + addAction("SELECT_FACE_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/result.png"), tr("Results"), aDesktop, + anAction = 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); + anAction->setCheckable(true); + addAction("SELECT_RESULT_CMD", anAction); - aAction->setChecked(true); + anAction->setChecked(true); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/find_result.png"), + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/find_result.png"), tr("Select results"), aDesktop); - addAction("SHOW_RESULTS_CMD", aAction); + addAction("SHOW_RESULTS_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(":pictures/find_result.png"), + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/find_result.png"), tr("Select parent feature"), aDesktop); - addAction("SHOW_FEATURE_CMD", aAction); + addAction("SHOW_FEATURE_CMD", anAction); #ifdef TINSPECTOR - aAction = ModuleBase_Tools::createAction(QIcon(), tr("TInspector"), aDesktop); - addAction("TINSPECTOR_VIEW", aAction); + anAction = ModuleBase_Tools::createAction(QIcon(), tr("TInspector"), aDesktop); + addAction("TINSPECTOR_VIEW", anAction); #endif // Features folders actions - aAction = ModuleBase_Tools::createAction(QIcon(), + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/create_folder.png"), tr("Insert a folder before"), aDesktop); - addAction("INSERT_FOLDER_CMD", aAction); + addAction("INSERT_FOLDER_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(), + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/insert_folder_before.png"), tr("Move into the previous folder"), aDesktop); - addAction("ADD_TO_FOLDER_BEFORE_CMD", aAction); + addAction("ADD_TO_FOLDER_BEFORE_CMD", anAction); - aAction = ModuleBase_Tools::createAction(QIcon(), + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/insert_folder_after.png"), tr("Move into the next folder"), aDesktop); - addAction("ADD_TO_FOLDER_AFTER_CMD", aAction); + addAction("ADD_TO_FOLDER_AFTER_CMD", anAction); + + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/move_out_before.png"), + tr("Move out before the folder"), aDesktop); + addAction("ADD_OUT_FOLDER_BEFORE_CMD", anAction); + + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/move_out_after.png"), + tr("Move out after the folder"), aDesktop); + addAction("ADD_OUT_FOLDER_AFTER_CMD", anAction); + + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/normal-view-inversed.png"), + tr("Set view by inverted normal to face"), aDesktop); + addAction("SET_VIEW_INVERTEDNORMAL_CMD", anAction); + + anAction = ModuleBase_Tools::createAction(QIcon(":pictures/normal-view.png"), + tr("Set view by normal to face"), aDesktop); + addAction("SET_VIEW_NORMAL_CMD", anAction); buildObjBrowserMenu(); buildViewerMenu(); @@ -234,8 +280,8 @@ QStringList XGUI_ContextMenuMgr::actionIds() const void XGUI_ContextMenuMgr::onAction(bool isChecked) { - QAction* aAction = static_cast(sender()); - emit actionTriggered(aAction->data().toString(), isChecked); + QAction* anAction = static_cast(sender()); + emit actionTriggered(anAction->data().toString(), isChecked); } void XGUI_ContextMenuMgr::updateCommandsStatus() @@ -266,8 +312,8 @@ void XGUI_ContextMenuMgr::onContextMenuRequest(QContextMenuEvent* theEvent) void XGUI_ContextMenuMgr::updateObjectBrowserMenu() { - foreach(QAction* aAction, myActions) - aAction->setEnabled(false); + foreach(QAction* anAction, myActions) + anAction->setEnabled(false); XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); QObjectPtrList aObjects = aSelMgr->selection()->selectedObjects(); @@ -286,6 +332,9 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() //Process Feature if (aSelected == 1) { // single selection ObjectPtr aObject = aObjects.first(); + ResultPtr aResult; + if (hasResult) + aResult = std::dynamic_pointer_cast(aObject); if (aObject) { if (hasResult && myWorkshop->canBeShaded(aObject)) { XGUI_Displayer::DisplayMode aMode = aDisplayer->displayMode(aObject); @@ -296,10 +345,15 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() action("WIREFRAME_CMD")->setEnabled(true); action("SHADING_CMD")->setEnabled(true); } + action("SHOW_EDGES_DIRECTION_CMD")->setEnabled(true); + action("SHOW_EDGES_DIRECTION_CMD")->setChecked(ModelAPI_Tools::isShowEdgesDirection(aResult)); + + action("SHOW_ISOLINES_CMD")->setEnabled(true); + action("SHOW_ISOLINES_CMD")->setChecked(ModelAPI_Tools::isShownIsoLines(aResult)); + action("ISOLINES_CMD")->setEnabled(true); } if (!hasFeature) { - bool aHasSubResults = ModelAPI_Tools::hasSubResults( - std::dynamic_pointer_cast(aObject)); + bool aHasSubResults = ModelAPI_Tools::hasSubResults(aResult); if (aHasSubResults) { action("HIDE_CMD")->setEnabled(true); action("SHOW_CMD")->setEnabled(true); @@ -314,8 +368,24 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() if (!(hasParameter || hasFeature)) action("SHOW_ONLY_CMD")->setEnabled(true); } - else if (hasFeature && myWorkshop->canMoveFeature()) +#ifdef HAVE_SALOME + else if (hasFeature && myWorkshop->canMoveFeature()) { action("MOVE_CMD")->setEnabled(true); + action("MOVE_SPLIT_CMD")->setEnabled(true); + } +#endif + if (hasFeature && aObject->document() != aMgr->moduleDocument() && + aObject->document() == aMgr->activeDocument()) + { + XGUI_OperationMgr* anOperationMgr = myWorkshop->operationMgr(); + if (!anOperationMgr->hasOperation()) { + FeaturePtr aFeature = std::dynamic_pointer_cast(aObject); + std::list > aResults; + ModelAPI_Tools::getConcealedResults(aFeature, aResults); + if (!aResults.empty()) // check the feature conceals at least one result + action("RECOVER_CMD")->setEnabled(true); + } + } if( aMgr->activeDocument() == aObject->document() ) { @@ -326,7 +396,7 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() } } // end single selection - } else { // multiselection + } else { // multi-selection // parameter is commented because the actions are not in the list of result parameter actions if (hasResult /*&& (!hasParameter)*/) { action("SHOW_CMD")->setEnabled(true); @@ -334,42 +404,102 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() action("SHOW_ONLY_CMD")->setEnabled(true); action("SHADING_CMD")->setEnabled(true); action("WIREFRAME_CMD")->setEnabled(true); + action("SHOW_EDGES_DIRECTION_CMD")->setEnabled(true); + action("SHOW_ISOLINES_CMD")->setEnabled(true); + action("ISOLINES_CMD")->setEnabled(true); } - } // end multiselection + if (hasFeature && myWorkshop->canMoveFeature()) { + action("MOVE_CMD")->setEnabled(true); + action("MOVE_SPLIT_CMD")->setEnabled(true); + } + } // end multi-selection // Check folder management commands state if only features are selected if ((!hasResult) && hasFeature && (!hasParameter) && (!hasCompositeOwner) && (!hasResultInHistory) && (!hasFolder)) { - QModelIndexList aIndexes = aSelMgr->selection()->selectedIndexes(); - QModelIndex aFirstIdx = aIndexes.first(); - QModelIndex aLastIdx = aIndexes.last(); - QModelIndex aParentIdx = aFirstIdx.parent(); + 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 (aParentIdx == aLastIdx.parent()) { // if all selected are from the same level - XGUI_DataModel* aModel = myWorkshop->objectBrowser()->dataModel(); - ObjectPtr aDataObj = aModel->object(aParentIdx); - - ObjectPtr aPrevObj; - if (aFirstIdx.row() > 0) { - QModelIndex aPrevIdx = aFirstIdx.sibling(aFirstIdx.row() - 1, 0); - aPrevObj = aModel->object(aPrevIdx); + 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(); + + 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 aNextObj; - if (aLastIdx.row() < (aModel->rowCount(aParentIdx) - 1)) { - QModelIndex aNextIdx = aFirstIdx.sibling(aLastIdx.row() + 1, 0); - aNextObj = aModel->object(aNextIdx); - } + ObjectPtr aPrevObj; + if (aFirstIdx.row() > 0) { + QModelIndex aPrevIdx = aFirstIdx.sibling(aFirstIdx.row() - 1, 0); + aPrevObj = aModel->object(aPrevIdx); + } - 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 = hasFeature && (!isInFolder); + ObjectPtr aNextObj; + if (aLastIdx.row() < (aModel->rowCount(aParentIdx) - 1)) { + QModelIndex aNextIdx = aFirstIdx.sibling(aLastIdx.row() + 1, 0); + aNextObj = aModel->object(aNextIdx); + } - action("INSERT_FOLDER_CMD")->setEnabled(isOutsideFolder); - action("ADD_TO_FOLDER_BEFORE_CMD")->setEnabled(isOutsideFolder && isPrevFolder); - action("ADD_TO_FOLDER_AFTER_CMD")->setEnabled(isOutsideFolder && isNextFolder); + 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 @@ -380,7 +510,7 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() break; } if (!hasCompositeOwner && allActive ) { - if (hasFeature || hasParameter) + if (hasResult || hasFeature || hasParameter) // #2924 results can be erased action("DELETE_CMD")->setEnabled(true); } if (!hasCompositeOwner && allActive && (hasFeature|| hasParameter)) @@ -402,7 +532,7 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() } } if (aDeactivate) { - // If at leas a one objec can not be edited then Show/Hide has to be disabled + // If at leas a one object 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); @@ -410,9 +540,9 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() 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 + action("AUTOCOLOR_CMD")->setEnabled(myWorkshop->canChangeProperty("AUTOCOLOR_CMD")); + #ifdef _DEBUG #ifdef TINSPECTOR action("TINSPECTOR_VIEW")->setEnabled(true); @@ -427,8 +557,8 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() void XGUI_ContextMenuMgr::updateViewerMenu() { - foreach(QAction* aAction, myActions) - aAction->setEnabled(false); + foreach(QAction* anAction, myActions) + anAction->setEnabled(false); XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); XGUI_Displayer* aDisplayer = myWorkshop->displayer(); @@ -436,18 +566,20 @@ void XGUI_ContextMenuMgr::updateViewerMenu() aSelMgr->selection()->getSelected(ModuleBase_ISelection::Viewer); if (aPrsList.size() > 0) { bool isVisible = false; - bool isShading = false; bool canBeShaded = false; + bool hasPlanar = false; ObjectPtr aObject; foreach(ModuleBase_ViewerPrsPtr aPrs, aPrsList) { aObject = aPrs->object(); - ResultPtr aRes = std::dynamic_pointer_cast(aObject); - if (aRes && aRes->isDisplayed()) { + if (!aObject.get()) + continue; + GeomShapePtr aShape = aPrs->shape(); + if (aObject->isDisplayed()) { isVisible = true; - canBeShaded = myWorkshop->displayer()->canBeShaded(aObject); - isShading = - (myWorkshop->displayer()->displayMode(aObject) == XGUI_Displayer::Shading); - break; + canBeShaded = aDisplayer->canBeShaded(aObject); + } + if (aShape.get()) { + hasPlanar = (aShape->isFace() && aShape->isPlanar()); } } if (isVisible) { @@ -460,11 +592,27 @@ void XGUI_ContextMenuMgr::updateViewerMenu() action("WIREFRAME_CMD")->setEnabled(true); action("SHADING_CMD")->setEnabled(true); } + action("ISOLINES_CMD")->setEnabled(true); + + if (aPrsList.size() == 1) { + ResultPtr aResult = std::dynamic_pointer_cast(aObject); + if (aResult.get()) { + action("SHOW_ISOLINES_CMD")->setEnabled(true); + action("SHOW_ISOLINES_CMD")->setChecked(ModelAPI_Tools::isShownIsoLines(aResult)); + + action("SHOW_EDGES_DIRECTION_CMD")->setEnabled(true); + action("SHOW_EDGES_DIRECTION_CMD")->setChecked( + ModelAPI_Tools::isShowEdgesDirection(aResult)); + } + } } action("SHOW_ONLY_CMD")->setEnabled(true); action("HIDE_CMD")->setEnabled(true); } else action("SHOW_CMD")->setEnabled(true); + + action("SET_VIEW_NORMAL_CMD")->setEnabled(hasPlanar); + action("SET_VIEW_INVERTEDNORMAL_CMD")->setEnabled(hasPlanar); } //issue #2159 Hide all incomplete behavior #ifdef HAVE_SALOME @@ -475,7 +623,7 @@ void XGUI_ContextMenuMgr::updateViewerMenu() #endif // Update selection menu - QIntList aModes = aDisplayer->activeSelectionModes(); + QIntList aModes = myWorkshop->selectionActivate()->activeSelectionModes(); action("SELECT_VERTEX_CMD")->setEnabled(true); action("SELECT_EDGE_CMD")->setEnabled(true); action("SELECT_FACE_CMD")->setEnabled(true); @@ -516,10 +664,8 @@ void XGUI_ContextMenuMgr::updateViewerMenu() 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); } @@ -552,10 +698,10 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu() 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")); + aList.append(mySeparator2); + aList.append(action("DELETE_CMD")); myObjBrowserMenus[ModelAPI_ResultConstruction::group()] = aList; //------------------------------------- @@ -563,6 +709,7 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu() aList.clear(); aList.append(action("WIREFRAME_CMD")); aList.append(action("SHADING_CMD")); + aList.append(action("SHOW_EDGES_DIRECTION_CMD")); 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")); @@ -572,27 +719,56 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu() 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_ISOLINES_CMD")); + aList.append(action("ISOLINES_CMD")); aList.append(action("SHOW_FEATURE_CMD")); + aList.append(mySeparator3); + aList.append(action("DELETE_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; + + aList.clear(); + aList.append(action("WIREFRAME_CMD")); + aList.append(action("SHADING_CMD")); + aList.append(action("SHOW_EDGES_DIRECTION_CMD")); + 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(mySeparator2); + aList.append(action("AUTOCOLOR_CMD")); + aList.append(action("RENAME_CMD")); + aList.append(action("COLOR_CMD")); + aList.append(action("DEFLECTION_CMD")); + aList.append(action("TRANSPARENCY_CMD")); + aList.append(action("SHOW_ISOLINES_CMD")); + aList.append(action("ISOLINES_CMD")); + aList.append(action("SHOW_FEATURE_CMD")); + aList.append(mySeparator3); + aList.append(action("DELETE_CMD")); + // Group menu + myObjBrowserMenus[ModelAPI_ResultGroup::group()] = aList; //------------------------------------- // Feature menu aList.clear(); aList.append(action("RENAME_CMD")); aList.append(action("SHOW_RESULTS_CMD")); aList.append(action("MOVE_CMD")); + aList.append(action("MOVE_SPLIT_CMD")); + aList.append(action("RECOVER_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(action("DELETE_CMD")); myObjBrowserMenus[ModelAPI_Feature::group()] = aList; @@ -606,23 +782,32 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu() //------------------------------------- aList.clear(); + aList.append(action("RENAME_CMD")); aList.append(action("DELETE_CMD")); myObjBrowserMenus[ModelAPI_Folder::group()] = aList; + //--------------------------------------- + // Step objects menu + aList.clear(); + aList.append(action("SHOW_CMD")); + aList.append(action("HIDE_CMD")); + aList.append(action("SHOW_ONLY_CMD")); + myObjBrowserMenus[ModelAPI_ResultField::ModelAPI_FieldStep::group()] = aList; } void XGUI_ContextMenuMgr::buildViewerMenu() { QActionsList aList; // 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 + aList.append(mySeparator3); + aList.append(action("SET_VIEW_NORMAL_CMD")); + aList.append(action("SET_VIEW_INVERTEDNORMAL_CMD")); + aList.append(mySeparator1); + aList.append(action("SHOW_ONLY_CMD")); + aList.append(action("HIDE_CMD")); myViewerMenu[ModelAPI_ResultConstruction::group()] = aList; // Result part menu myViewerMenu[ModelAPI_ResultPart::group()] = aList; @@ -631,20 +816,28 @@ void XGUI_ContextMenuMgr::buildViewerMenu() aList.clear(); aList.append(action("WIREFRAME_CMD")); aList.append(action("SHADING_CMD")); - aList.append(mySeparator1); - aList.append(action("HIDE_CMD")); - aList.append(action("SHOW_ONLY_CMD")); + aList.append(action("SHOW_EDGES_DIRECTION_CMD")); aList.append(mySeparator2); aList.append(action("COLOR_CMD")); aList.append(action("DEFLECTION_CMD")); -#ifdef USE_TRANSPARENCY aList.append(action("TRANSPARENCY_CMD")); -#endif + aList.append(action("SHOW_ISOLINES_CMD")); + aList.append(action("ISOLINES_CMD")); + aList.append(mySeparator3); + aList.append(action("SET_VIEW_NORMAL_CMD")); + aList.append(action("SET_VIEW_INVERTEDNORMAL_CMD")); + aList.append(mySeparator1); + aList.append(action("SHOW_ONLY_CMD")); + aList.append(action("HIDE_CMD")); myViewerMenu[ModelAPI_ResultBody::group()] = aList; // Group menu myViewerMenu[ModelAPI_ResultGroup::group()] = aList; myViewerMenu[ModelAPI_ResultField::group()] = aList; //------------------------------------- + // Step objects menu + aList.clear(); + aList.append(action("HIDE_CMD")); + myViewerMenu[ModelAPI_ResultField::ModelAPI_FieldStep::group()] = aList; } @@ -659,37 +852,44 @@ void XGUI_ContextMenuMgr::addObjBrowserMenu(QMenu* theMenu) const XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); QObjectPtrList aObjects = aSelMgr->selection()->selectedObjects(); int aSelected = aObjects.size(); - QActionsList aActions; + QActionsList anActions; if (aSelected == 1) { ObjectPtr aObject = aObjects.first(); std::string aName = aObject->groupName(); if (myObjBrowserMenus.contains(aName)) - aActions = myObjBrowserMenus[aName]; + anActions = myObjBrowserMenus[aName]; } else if (aSelected > 1) { - aActions.append(action("WIREFRAME_CMD")); - 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(mySeparator2); - //aActions.append(action("MOVE_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")); + anActions.append(action("WIREFRAME_CMD")); + anActions.append(action("SHADING_CMD")); + anActions.append(action("SHOW_EDGES_DIRECTION_CMD")); + anActions.append(mySeparator1); + anActions.append(action("SHOW_CMD")); + anActions.append(action("HIDE_CMD")); + anActions.append(action("SHOW_ONLY_CMD")); + anActions.append(mySeparator2); + anActions.append(action("ADD_TO_FOLDER_BEFORE_CMD")); + anActions.append(action("ADD_TO_FOLDER_AFTER_CMD")); + anActions.append(action("ADD_OUT_FOLDER_BEFORE_CMD")); + anActions.append(action("ADD_OUT_FOLDER_AFTER_CMD")); + anActions.append(mySeparator3); + anActions.append(action("MOVE_CMD")); + anActions.append(action("MOVE_SPLIT_CMD")); + anActions.append(action("COLOR_CMD")); + anActions.append(action("DEFLECTION_CMD")); + anActions.append(action("TRANSPARENCY_CMD")); + anActions.append(action("SHOW_ISOLINES_CMD")); + anActions.append(action("ISOLINES_CMD")); + anActions.append(action("CLEAN_HISTORY_CMD")); + anActions.append(action("DELETE_CMD")); } #ifdef _DEBUG if (aSelected == 0) { #ifdef TINSPECTOR - aActions.append(action("TINSPECTOR_VIEW")); + anActions.append(action("TINSPECTOR_VIEW")); #endif } #endif - theMenu->addActions(aActions); + theMenu->addActions(anActions); addFeatures(theMenu); // It is commented out because Object Browser does not have actions @@ -703,13 +903,12 @@ void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const QList aPrsList = aSelMgr->selection()->getSelected(ModuleBase_ISelection::Viewer); int aSelected = aPrsList.size(); - QActionsList aActions; + QActionsList anActions; // 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")); @@ -725,19 +924,19 @@ void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const if (aObject.get() != NULL) { std::string aName = aObject->groupName(); if (myViewerMenu.contains(aName)) - aActions = myViewerMenu[aName]; + anActions = myViewerMenu[aName]; } } else if (aSelected > 1) { - aActions.append(action("HIDE_CMD")); + anActions.append(action("COLOR_CMD")); + anActions.append(action("DEFLECTION_CMD")); + anActions.append(action("TRANSPARENCY_CMD")); + anActions.append(mySeparator1); + anActions.append(action("SHOW_ONLY_CMD")); + anActions.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")); -#ifdef USE_TRANSPARENCY - aActions.append(action("TRANSPARENCY_CMD")); -#endif - theMenu->addActions(aActions); + anActions.append(action("HIDEALL_CMD")); + theMenu->addActions(anActions); QMap aMenuActions; ModuleBase_IModule* aModule = myWorkshop->module(); @@ -748,12 +947,12 @@ void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const // 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]; + QList anActionsList = theMenu->actions(); + int anActionsListSize = anActionsList.size(); + QAction* aFirstAction = anActionsList[0]; QMap::const_iterator anIt = aMenuActions.begin(), aLast = aMenuActions.end(); for (; anIt != aLast; anIt++) { - if (anIt.key() > anActionsSize) + if (anIt.key() > anActionsListSize) theMenu->addAction(anIt.value()); else theMenu->insertAction(aFirstAction, *anIt); @@ -803,10 +1002,10 @@ void XGUI_ContextMenuMgr::onRename() void XGUI_ContextMenuMgr::addFeatures(QMenu* theMenu) const { SessionPtr aMgr = ModelAPI_Session::get(); - DocumentPtr aActiveDoc = aMgr->activeDocument(); + DocumentPtr anActiveDoc = aMgr->activeDocument(); XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); - XGUI_ActionsMgr* aActionMgr = myWorkshop->actionsMgr(); + XGUI_ActionsMgr* anActionMgr = myWorkshop->actionsMgr(); const Config_DataModelReader* aDataModelXML = myWorkshop->dataModelXMLReader(); QModelIndexList aSelectedIndexes = aSelMgr->selection()->selectedIndexes(); @@ -818,9 +1017,7 @@ void XGUI_ContextMenuMgr::addFeatures(QMenu* theMenu) const 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())) + if (aIsRoot && (anActiveDoc != aMgr->moduleDocument())) return; // Get name of the selected index @@ -836,9 +1033,9 @@ void XGUI_ContextMenuMgr::addFeatures(QMenu* theMenu) const QStringList aFeturesList = QString(aFeaturesStr.c_str()).split(",", QString::SkipEmptyParts); foreach(QString aFea, aFeturesList) { - QAction* aAction = aActionMgr->action(aFea); - if (aAction) - theMenu->addAction(aAction); + QAction* anAction = anActionMgr->action(aFea); + if (anAction) + theMenu->addAction(anAction); } } } @@ -846,11 +1043,11 @@ void XGUI_ContextMenuMgr::addFeatures(QMenu* theMenu) const } #define UNCHECK_ACTION(NAME) \ -{ QAction* aAction = action(NAME); \ -bool isBlock = aAction->signalsBlocked(); \ -aAction->blockSignals(true); \ -aAction->setChecked(false); \ - aAction->blockSignals(isBlock); } +{ QAction* anAction = action(NAME); \ +bool isBlock = anAction->signalsBlocked(); \ +anAction->blockSignals(true); \ +anAction->setChecked(false); \ + anAction->blockSignals(isBlock); } void XGUI_ContextMenuMgr::onResultSelection(bool theChecked)