X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_ContextMenuMgr.cpp;h=c9a9689f4f39c0f12c6ac3df9431a3752bc9d0c7;hb=b115d201dce26907dc14be25abffd39d1f45304b;hp=8f4a49175b051d78f46dfee7224e8db3e184691e;hpb=f1cd93fd02a54259f72e3191d037323a496b2bef;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_ContextMenuMgr.cpp b/src/XGUI/XGUI_ContextMenuMgr.cpp index 8f4a49175..c9a9689f4 100644 --- a/src/XGUI/XGUI_ContextMenuMgr.cpp +++ b/src/XGUI/XGUI_ContextMenuMgr.cpp @@ -7,6 +7,7 @@ #include "XGUI_Displayer.h" #include "XGUI_ViewerProxy.h" #include "XGUI_Selection.h" +#include "XGUI_SalomeConnector.h" #include @@ -15,9 +16,12 @@ #include #include #include -#include #include #include +#include + +#include +#include #include #include @@ -36,17 +40,18 @@ 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); + QAction* aAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this); + QMainWindow* aDesktop = myWorkshop->mainWindow(); + if (!aDesktop) + aDesktop = myWorkshop->salomeConnector()->desktop(); + aDesktop->addAction(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); addAction("DELETE_CMD", aAction); + aAction->setShortcut(Qt::Key_Delete); + aAction->setShortcutContext(Qt::ApplicationShortcut); + + aAction = new QAction(QIcon(":pictures/color.png"), tr("Color"), this); + addAction("COLOR_CMD", aAction); aAction = new QAction(QIcon(":pictures/eye_pencil.png"), tr("Show"), this); addAction("SHOW_CMD", aAction); @@ -83,6 +88,16 @@ QAction* XGUI_ContextMenuMgr::action(const QString& theId) const return 0; } +QAction* XGUI_ContextMenuMgr::actionByName(const QString& theName) const +{ + foreach(QAction* eachAction, myActions) { + if (eachAction->text() == theName) { + return eachAction; + } + } + return NULL; +} + QStringList XGUI_ContextMenuMgr::actionIds() const { return myActions.keys(); @@ -108,7 +123,12 @@ void XGUI_ContextMenuMgr::onContextMenuRequest(QContextMenuEvent* theEvent) } if (aMenu && (aMenu->actions().size() > 0)) { + // it is possible that some objects should do something before and after the popup menu exec + // e.g. a sketch manager changes an internal flag on this signals in order to do not hide + // a created entity + emit beforeContextMenu(); aMenu->exec(theEvent->globalPos()); + emit afterContextMenu(); delete aMenu; } } @@ -124,48 +144,38 @@ QMenu* XGUI_ContextMenuMgr::objectBrowserMenu() const XGUI_Displayer* aDisplayer = myWorkshop->displayer(); bool hasResult = false; bool hasFeature = false; - foreach(ObjectPtr aObj, aObjects) - { - FeaturePtr aFeature = std::dynamic_pointer_cast(aObj); - ResultPtr aResult = std::dynamic_pointer_cast(aObj); - if (aResult) - hasResult = true; - if (aFeature) - hasFeature = true; - if (hasFeature && hasResult) // && hasGroup) - break; - } + bool hasParameter = false; + ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter); + //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) { - aMenu->addAction(action("EDIT_CMD")); - } else { - if (aDisplayer->isVisible(aObject)) { - if (aDisplayer->displayMode(aObject) == XGUI_Displayer::Shading) - aMenu->addAction(action("WIREFRAME_CMD")); - else - aMenu->addAction(action("SHADING_CMD")); + if (!hasFeature) { + if (aObject->isDisplayed()) { + if (aDisplayer->canBeShaded(aObject)) { + if (aDisplayer->displayMode(aObject) == XGUI_Displayer::Shading) + aMenu->addAction(action("WIREFRAME_CMD")); + else + aMenu->addAction(action("SHADING_CMD")); + } aMenu->addSeparator(); aMenu->addAction(action("HIDE_CMD")); - } else { + } else if (hasResult && (!hasParameter)) { + aMenu->addAction(action("SHOW_CMD")); + } + + ResultPartPtr aPartRes = std::dynamic_pointer_cast(aObject); + if (aPartRes) { aMenu->addAction(action("SHOW_CMD")); } - aMenu->addAction(action("SHOW_ONLY_CMD")); + + if (!(hasParameter || hasFeature)) + aMenu->addAction(action("SHOW_ONLY_CMD")); } - } 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) { + if (hasResult && (!hasParameter)) { aMenu->addAction(action("SHOW_CMD")); aMenu->addAction(action("HIDE_CMD")); aMenu->addAction(action("SHOW_ONLY_CMD")); @@ -174,11 +184,21 @@ QMenu* XGUI_ContextMenuMgr::objectBrowserMenu() const aMenu->addAction(action("WIREFRAME_CMD")); } } - if (hasFeature) + if (hasFeature || hasParameter) aMenu->addAction(action("DELETE_CMD")); } + if (myWorkshop->canChangeColor()) + aMenu->addAction(action("COLOR_CMD")); + aMenu->addSeparator(); + ModuleBase_IModule* aModule = myWorkshop->module(); + if (aModule) { + aModule->addObjectBrowserMenu(aMenu); + aMenu->addSeparator(); + } aMenu->addActions(myWorkshop->objectBrowser()->actions()); + + if (aMenu->actions().size() > 0) { return aMenu; } @@ -189,7 +209,7 @@ QMenu* XGUI_ContextMenuMgr::objectBrowserMenu() const QMenu* XGUI_ContextMenuMgr::viewerMenu() const { QMenu* aMenu = new QMenu(); - addViewerItems(aMenu); + addViewerMenu(aMenu); if (aMenu->actions().size() > 0) { return aMenu; } @@ -197,38 +217,48 @@ QMenu* XGUI_ContextMenuMgr::viewerMenu() const return 0; } -void XGUI_ContextMenuMgr::addViewerItems(QMenu* theMenu) const +void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const { - 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; - foreach(ObjectPtr aObject, aObjects) - { - ResultPtr aRes = std::dynamic_pointer_cast(aObject); - if (aRes && myWorkshop->displayer()->isVisible(aRes)) { - isVisible = true; - isShading = (myWorkshop->displayer()->displayMode(aObject) == XGUI_Displayer::Shading); - break; + bool aIsDone = false; + ModuleBase_IModule* aModule = myWorkshop->module(); + if (aModule) + aIsDone = aModule->addViewerMenu(theMenu, myActions); + + if (!aIsDone) { + XGUI_SelectionMgr* aSelMgr = myWorkshop->selector(); + QObjectPtrList aObjects = aSelMgr->selection()->selectedObjects(); + if (aObjects.size() > 0) { + bool isVisible = false; + bool isShading = false; + bool canBeShaded = false; + foreach(ObjectPtr aObject, aObjects) + { + 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")); } - if (isVisible) { - 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 (myWorkshop->displayer()->objectsCount() > 0) - theMenu->addAction(action("HIDEALL_CMD")); if (!myWorkshop->isSalomeMode()) { theMenu->addSeparator(); QMdiArea* aMDI = myWorkshop->mainWindow()->mdiArea(); @@ -237,6 +267,7 @@ void XGUI_ContextMenuMgr::addViewerItems(QMenu* theMenu) const aSubMenu->addActions(aMDI->actions()); } } + } void XGUI_ContextMenuMgr::connectObjectBrowser() const