X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_ContextMenuMgr.cpp;h=87c91f9753ec01b48737e0a66f23e9cdd044b48b;hb=57af37f78b56b87216f62d45537e0ad3e7197cf3;hp=e22a952e244ceb7183b17139a3c239845ba8687a;hpb=87b6a30a3afb8fb32e7e43ade8d9c947d9eb1684;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_ContextMenuMgr.cpp b/src/XGUI/XGUI_ContextMenuMgr.cpp index e22a952e2..87c91f975 100644 --- a/src/XGUI/XGUI_ContextMenuMgr.cpp +++ b/src/XGUI/XGUI_ContextMenuMgr.cpp @@ -24,8 +24,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,6 +48,8 @@ #include #include #include +#include +#include #include @@ -66,7 +69,7 @@ XGUI_ContextMenuMgr::XGUI_ContextMenuMgr(XGUI_Workshop* theParent) : QObject(theParent), myWorkshop(theParent), - mySeparator(0) + mySeparator1(0), mySeparator2(0), mySeparator3(0) { } @@ -107,6 +110,12 @@ void XGUI_ContextMenuMgr::createActions() 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); @@ -129,8 +138,14 @@ void XGUI_ContextMenuMgr::createActions() aDesktop); addAction("WIREFRAME_CMD", aAction); - mySeparator = ModuleBase_Tools::createAction(QIcon(), "", aDesktop); - 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); @@ -174,6 +189,27 @@ void XGUI_ContextMenuMgr::createActions() 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(); } @@ -257,10 +293,11 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() bool hasParameter = false; bool hasCompositeOwner = false; bool hasResultInHistory = false; + bool hasFolder = false; ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter, - hasCompositeOwner, hasResultInHistory); + hasCompositeOwner, hasResultInHistory, hasFolder); //Process Feature - if (aSelected == 1) { + if (aSelected == 1) { // single selection ObjectPtr aObject = aObjects.first(); if (aObject) { if (hasResult && myWorkshop->canBeShaded(aObject)) { @@ -301,7 +338,8 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() (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); @@ -310,7 +348,98 @@ 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() ) { @@ -326,7 +455,7 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() 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; @@ -346,12 +475,11 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu() action("SHOW_ONLY_CMD")->setEnabled(false); } - if (myWorkshop->canChangeColor()) - action("COLOR_CMD")->setEnabled(true); - - if (myWorkshop->canChangeDeflection()) - action("DEFLECTION_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); @@ -414,7 +542,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); @@ -449,12 +577,17 @@ void XGUI_ContextMenuMgr::updateViewerMenu() if (aModule) aModule->updateViewerMenu(myActions); - if (myWorkshop->canChangeColor()) + if (myWorkshop->canChangeProperty("COLOR_CMD")) action("COLOR_CMD")->setEnabled(true); - if (myWorkshop->canChangeDeflection()) + 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); } @@ -482,10 +615,13 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu() aList.append(action("SHOW_CMD")); aList.append(action("HIDE_CMD")); aList.append(action("SHOW_ONLY_CMD")); - aList.append(mySeparator); + aList.append(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; @@ -494,15 +630,18 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu() 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 + 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 @@ -516,18 +655,31 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu() aList.append(action("RENAME_CMD")); aList.append(action("SHOW_RESULTS_CMD")); aList.append(action("MOVE_CMD")); - aList.append(mySeparator); + 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; aList.clear(); aList.append(action("RENAME_CMD")); - aList.append(mySeparator); + 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() @@ -536,9 +688,12 @@ void XGUI_ContextMenuMgr::buildViewerMenu() // Result construction menu aList.append(action("HIDE_CMD")); aList.append(action("SHOW_ONLY_CMD")); - aList.append(mySeparator); + 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; @@ -547,12 +702,15 @@ void XGUI_ContextMenuMgr::buildViewerMenu() aList.clear(); aList.append(action("WIREFRAME_CMD")); aList.append(action("SHADING_CMD")); - aList.append(mySeparator); + aList.append(mySeparator1); aList.append(action("HIDE_CMD")); aList.append(action("SHOW_ONLY_CMD")); - aList.append(mySeparator); + 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; @@ -581,15 +739,22 @@ void XGUI_ContextMenuMgr::addObjBrowserMenu(QMenu* theMenu) const } else if (aSelected > 1) { aActions.append(action("WIREFRAME_CMD")); aActions.append(action("SHADING_CMD")); - aActions.append(mySeparator); + aActions.append(mySeparator1); aActions.append(action("SHOW_CMD")); aActions.append(action("HIDE_CMD")); aActions.append(action("SHOW_ONLY_CMD")); - aActions.append(mySeparator); + 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("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")); } @@ -618,9 +783,8 @@ void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const // 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")); @@ -645,7 +809,9 @@ void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const 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; @@ -724,7 +890,7 @@ void XGUI_ContextMenuMgr::addFeatures(QMenu* theMenu) const bool aIsRoot = false; foreach(QModelIndex aIdx, aSelectedIndexes) { // Process only first column - if (aIdx.column() == 0) { + if (aIdx.column() == 1) { aIsRoot = !aIdx.parent().isValid(); // Exit if the selected index belongs to non active document if (aIsRoot && (aActiveDoc != aMgr->moduleDocument()))