X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSHAPERGUI%2FSHAPERGUI.cpp;h=5b69d3593ffb8e02830a296173cbdf0abf0185bb;hb=97c06c5cd9fc736f9b5a1dacde369a9d7b5be703;hp=53c7fcbbf83d608f45ca3f0cce196a810aeb3e1e;hpb=3ca85dccb6993c137c255abd0955caa589269d10;p=modules%2Fshaper.git diff --git a/src/SHAPERGUI/SHAPERGUI.cpp b/src/SHAPERGUI/SHAPERGUI.cpp index 53c7fcbbf..5b69d3593 100644 --- a/src/SHAPERGUI/SHAPERGUI.cpp +++ b/src/SHAPERGUI/SHAPERGUI.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2019 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 "SHAPERGUI.h" @@ -34,21 +33,27 @@ #include #include #include +#include #include #include #include #include +#include + #include #include #include #include + #include +#include #include #include #include +#include #include #include @@ -83,6 +88,11 @@ SHAPERGUI_EXPORT char* getModuleVersion() } } // extern "C" + +static const QString ToolbarsSection("SHAPER_Toolbars"); +static const QString FreeCommandsParam("OutOFToolbars"); + + /** * Class for preferences management */ @@ -124,7 +134,7 @@ private: SHAPERGUI::SHAPERGUI() : LightApp_Module("SHAPER"), mySelector(0), myIsOpened(0), myPopupMgr(0), myIsInspectionVisible(false), - myInspectionPanel(0) + myInspectionPanel(0), myIsToolbarsModified(false) { myWorkshop = new XGUI_Workshop(this); connect(myWorkshop, SIGNAL(commandStatusUpdated()), @@ -133,7 +143,9 @@ SHAPERGUI::SHAPERGUI() myProxyViewer = new SHAPERGUI_SalomeViewer(this); ModuleBase_Preferences::setResourceMgr(application()->resourceMgr()); - ModuleBase_Preferences::loadCustomProps(); + + // It will be called in XGUI_Workshop::startApplication + // ModuleBase_Preferences::loadCustomProps(); } //****************************************************** @@ -175,12 +187,32 @@ void SHAPERGUI::initialize(CAM_Application* theApp) // Define Edit toolbars command aId = getNextCommandId(); - myActionsList.append(aId); + //myActionsList.append(aId); Do not use it for editing of toolbars aTip = tr("Edit toolbars of the module"); - QAction* aAction = createAction(aId, aTip, QIcon(), tr("Edit toolbars..."), - aTip, QKeySequence(), aDesk, false, this, SLOT(onEditToolbars())); + QAction* aAction = createAction(aId, aTip, QIcon(":pictures/configure_toolbars.png"), + tr("Edit toolbars..."), aTip, QKeySequence(), aDesk, false, this, SLOT(onEditToolbars())); int aEditMenu = createMenu(tr("MEN_DESK_EDIT"), -1, -1, 30); int aEditItem = createMenu(aId, aEditMenu); + + // Initialize viewer proxy if OCC viewer is already exist + ViewManagerList aOCCViewManagers; + application()->viewManagers(OCCViewer_Viewer::Type(), aOCCViewManagers); + if (aOCCViewManagers.size() > 0) { + SUIT_ViewManager* aMgr = aOCCViewManagers.first(); + SUIT_ViewWindow* aWnd = aMgr->getActiveView(); + if (aWnd) { + OCCViewer_ViewWindow* aOccWnd = static_cast(aWnd); + OCCViewer_ViewPort3d* aViewPort = aOccWnd->getViewPort(); + if (aViewPort) { + XGUI_ViewerProxy* aViewer = myWorkshop->viewer(); + aViewPort->installEventFilter(aViewer); + Handle(V3d_View) aView = aViewPort->getView(); + aViewer->SetScale(aView, aView->Camera()->Scale()); + // We can not create selector here because other modules will be deactivated later + //onViewManagerAdded(aMgr); + } + } + } } //****************************************************** @@ -202,7 +234,7 @@ void SHAPERGUI::viewManagers(QStringList& theList) const //void SHAPERGUI::connectToStudy(CAM_Study* theStudy) //{ // // if there are created viewer managers, we should try to create viewer -// // selector and initialize viewer with it. It sets interactive contect to the +// // selector and initialize viewer with it. It sets interactive context to the // // proxy viewer. If study is opened, CAM application calls this method before the open() // // of data model // // the SHAPER data model is specific and during open(load) redisplay signals are flushed, so @@ -223,6 +255,8 @@ void SHAPERGUI::viewManagers(QStringList& theList) const bool SHAPERGUI::activateModule(SUIT_Study* theStudy) { bool isDone = LightApp_Module::activateModule(theStudy); + loadToolbarsConfig(); + SHAPERGUI_DataModel* aDataModel = dynamic_cast(dataModel()); aDataModel->initRootObject(); @@ -251,10 +285,10 @@ bool SHAPERGUI::activateModule(SUIT_Study* theStudy) ViewManagerList OCCViewManagers; application()->viewManagers(OCCViewer_Viewer::Type(), OCCViewManagers); if (OCCViewManagers.size() > 0) { - mySelector = createSelector(OCCViewManagers.first()); + onViewManagerAdded(OCCViewManagers.first()); } } - // it should be pefromed after the selector creation in order to have AISContext + // it should be performed after the selector creation in order to have AISContext myWorkshop->activateModule(); //action(myEraseAll)->setEnabled(false); @@ -312,7 +346,7 @@ bool SHAPERGUI::activateModule(SUIT_Study* theStudy) } myProxyViewer->activateViewer(true); - // Postrrocessing for LoadScriptId to remove created(if it was created) SALOME Object Browser + // Post-processing for LoadScriptId to remove created(if it was created) SALOME Object Browser connect(getApp()->action(LightApp_Application::UserID+1), SIGNAL(triggered(bool)), this, SLOT(onScriptLoaded())); @@ -332,6 +366,8 @@ bool SHAPERGUI::activateModule(SUIT_Study* theStudy) //****************************************************** bool SHAPERGUI::deactivateModule(SUIT_Study* theStudy) { + saveToolbarsConfig(); + myProxyViewer->activateViewer(false); setMenuShown(false); setToolShown(false); @@ -376,7 +412,7 @@ bool SHAPERGUI::deactivateModule(SUIT_Study* theStudy) aResMgr->setValue("Study", "store_positions", myIsStorePositions); getApp()->setEditEnabled(myIsEditEnabled); - // Postrrocessing for LoadScriptId to remove created(if it was created) SALOME Object Browser + // Post-processing for LoadScriptId to remove created(if it was created) SALOME Object Browser disconnect(getApp()->action(LightApp_Application::UserID+1), SIGNAL(triggered(bool)), this, SLOT(onScriptLoaded())); @@ -390,7 +426,6 @@ bool SHAPERGUI::deactivateModule(SUIT_Study* theStudy) connect(getApp()->action(LightApp_Application::FileSaveAsId), SIGNAL(triggered(bool)), getApp(), SLOT(onSaveAsDoc())); - return LightApp_Module::deactivateModule(theStudy); } @@ -414,8 +449,16 @@ void SHAPERGUI::onViewManagerRemoved(SUIT_ViewManager* theMgr) if (mySelector->viewer() == aViewer) { XGUI_Displayer* aDisp = myWorkshop->displayer(); QObjectPtrList aObjects = aDisp->displayedObjects(); - foreach(ObjectPtr aObj, aObjects) + ResultPtr aRes; + foreach(ObjectPtr aObj, aObjects) { aObj->setDisplayed(false); + aRes = std::dynamic_pointer_cast(aObj); + if (aRes.get()) { + while (aRes = ModelAPI_Tools::bodyOwner(aRes)) { + aRes->setDisplayed(false); + } + } + } Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); myProxyViewer->setSelector(0); delete mySelector; @@ -749,6 +792,49 @@ void SHAPERGUI::createPreferences() ModuleBase_Preferences::VIEWER_SECTION, "point-selection-sensitivity"); pref->addItem(tr("Edge"), sensitivityGroup, SUIT_PreferenceMgr::DblSpin, ModuleBase_Preferences::VIEWER_SECTION, "edge-selection-sensitivity"); + + int highlightGroup = pref->addItem(tr("Additional highlighting"), viewTab); + pref->setItemProperty("columns", 2, highlightGroup); + pref->addItem(tr("In 3d mode"), highlightGroup, + SUIT_PreferenceMgr::Bool, ModuleBase_Preferences::VIEWER_SECTION, "highlighting-3d"); + pref->addItem(tr("In 2d mode"), highlightGroup, + SUIT_PreferenceMgr::Bool, ModuleBase_Preferences::VIEWER_SECTION, "highlighting-2d"); + + int colorScaleGroup = pref->addItem(tr("Color scale"), viewTab); + pref->setItemProperty("columns", 4, colorScaleGroup); + int aItem = aMgr.addPreference(tr("X position"), colorScaleGroup, + SUIT_PreferenceMgr::Double, ModuleBase_Preferences::VIEWER_SECTION, "scalar_bar_x_position"); + pref->setItemProperty("min", 0, aItem); + pref->setItemProperty("max", 1, aItem); + + aItem = aMgr.addPreference(tr("Y position"), colorScaleGroup, + SUIT_PreferenceMgr::Double, ModuleBase_Preferences::VIEWER_SECTION, "scalar_bar_y_position"); + pref->setItemProperty("min", 0, aItem); + pref->setItemProperty("max", 1, aItem); + + aItem = aMgr.addPreference(tr("Width"), colorScaleGroup, + SUIT_PreferenceMgr::Double, ModuleBase_Preferences::VIEWER_SECTION, "scalar_bar_width"); + pref->setItemProperty("min", 0, aItem); + pref->setItemProperty("max", 1, aItem); + + aItem = aMgr.addPreference(tr("Height"), colorScaleGroup, + SUIT_PreferenceMgr::Double, ModuleBase_Preferences::VIEWER_SECTION, "scalar_bar_height"); + pref->setItemProperty("min", 0, aItem); + pref->setItemProperty("max", 1, aItem); + + aItem = aMgr.addPreference(tr("Intervals number"), colorScaleGroup, + SUIT_PreferenceMgr::Integer, ModuleBase_Preferences::VIEWER_SECTION, "scalar_bar_nb_intervals"); + pref->setItemProperty("min", 0, aItem); + pref->setItemProperty("max", 100, aItem); + + aItem = aMgr.addPreference(tr("Text height"), colorScaleGroup, + SUIT_PreferenceMgr::Integer, ModuleBase_Preferences::VIEWER_SECTION, "scalar_bar_text_height"); + pref->setItemProperty("min", 0, aItem); + pref->setItemProperty("max", 100, aItem); + + aItem = aMgr.addPreference(tr("Text color"), colorScaleGroup, + SUIT_PreferenceMgr::Color, ModuleBase_Preferences::VIEWER_SECTION, "scalar_bar_text_color"); + pref->retrieve(); } @@ -815,7 +901,10 @@ void SHAPERGUI::onEditToolbars() { SHAPERGUI_ToolbarsDlg aDlg(this); if (aDlg.exec() == QDialog::Accepted) { - updateToolbars(aDlg.result()); + if (aDlg.isReset()) + resetToolbars(); + else + updateToolbars(aDlg.result()); } } @@ -838,6 +927,10 @@ int SHAPERGUI::getNextCommandId() const void SHAPERGUI::updateToolbars(const QMap& theNewToolbars) { + // Store default toolbars + if (myDefaultToolbars.size() == 0) + myDefaultToolbars = myToolbars; + QtxActionToolMgr* aMgr = toolMgr(); QStringList aToolbars = theNewToolbars.keys(); QIntList aCommands, aOldCmd; @@ -855,7 +948,7 @@ void SHAPERGUI::updateToolbars(const QMap& theNewToolbars) aToolbarId = aMgr->createToolBar(aName); } int aPos = 0; - foreach (int aCmd, aCommands) { + foreach(int aCmd, aCommands) { // Find action if (aCmd == -1) aAction = separator(); @@ -887,11 +980,164 @@ void SHAPERGUI::updateToolbars(const QMap& theNewToolbars) } // Remove extra toolbars aToolbars = myToolbars.keys(); - QToolBar* aToolbar = 0; - QList aActionList; foreach(QString aName, aToolbars) { aMgr->removeToolBar(aName); } // Set new toolbars structure myToolbars = theNewToolbars; + myIsToolbarsModified = true; +} + +void SHAPERGUI::saveToolbarsConfig() +{ + if (!myIsToolbarsModified) + return; + // Save toolbars configuration into map + QMap aToolbarsConfig; + QtxActionToolMgr* aMgr = toolMgr(); + QStringList aToolbars = myToolbars.keys(); + QIntList aActionsIds; + foreach(QString aName, aToolbars) { + aActionsIds = myToolbars[aName]; + QStringList aContent; + foreach(int aId, aActionsIds) { + if (aId == -1) + aContent.append(""); + else + aContent.append(action(aId)->data().toString()); + } + aToolbarsConfig[aName] = aContent; + } + // Store the configuration into resources + SUIT_ResourceMgr* aResMgr = application()->resourceMgr(); + QStringList aNames = aToolbarsConfig.keys(); + QStringList aValues; + foreach(QString aToolbar, aNames) { + aResMgr->setValue(ToolbarsSection, aToolbar, aToolbarsConfig[aToolbar].join(",")); + } + // Remove obsolete parameters from resources + QStringList aOldParams = aResMgr->parameters(ToolbarsSection); + foreach(QString aName, aOldParams) { + if (!aToolbars.contains(aName)) + aResMgr->remove(ToolbarsSection, aName); + } + // Store current list of free commands + QIntList aFreeCommands = getFreeCommands(); + QStringList aFreeList; + foreach(int aId, aFreeCommands) { + aFreeList.append(action(aId)->data().toString()); + } + if (aFreeList.size() > 0) + aResMgr->setValue(ToolbarsSection, FreeCommandsParam, aFreeList.join(",")); + + myIsToolbarsModified = false; +} + +void SHAPERGUI::loadToolbarsConfig() +{ + SUIT_ResourceMgr* aResMgr = application()->resourceMgr(); + QStringList aToolbarNames = aResMgr->parameters(ToolbarsSection); + if (aToolbarNames.size() == 0) + return; + + // Create commands map + QMap aCommandsMap; + QString aCmdIdStr; + foreach(int aId, myActionsList) { + aCmdIdStr = action(aId)->data().toString(); + aCommandsMap[aCmdIdStr] = aId; + } + + // Create new toolbars structure + QMap aToolbars; + QStringList aCommands; + QIntList aKnownCommands; + QList aActions; + foreach(QString aName, aToolbarNames) { + aCommands = aResMgr->stringValue(ToolbarsSection, aName).split(","); + if (aName == FreeCommandsParam) { + // The value is a list of free commands + foreach(QString aCommand, aCommands) { + aKnownCommands.append(aCommandsMap[aCommand]); + } + } + else { + aToolbars[aName] = QIntList(); + if (aCommands.size() > 0) { + foreach(QString aCommand, aCommands) { + if (aCommand.isEmpty()) + aToolbars[aName].append(-1); + else if (aCommandsMap.contains(aCommand)) { + int aId = aCommandsMap[aCommand]; + aToolbars[aName].append(aId); + aKnownCommands.append(aId); + } + } + } + } + } + // Find new and obsolete commands + QIntList aNewCommands = myActionsList; + foreach(int aId, myActionsList) { + if (aKnownCommands.contains(aId)) { + aKnownCommands.removeAll(aId); + aNewCommands.removeAll(aId); + } + } + if (aNewCommands.size() > 0) { + // Add new commands to toolbars structure + QStringList aKeys = myToolbars.keys(); + foreach(int aNewId, aNewCommands) { + foreach(QString aName, aKeys) { + if (myToolbars[aName].contains(aNewId)) { + if (!aToolbars.contains(aName)) { + aToolbars[aName] = QIntList(); + } + aToolbars[aName].append(aNewId); + } + } + } + } + if (aKnownCommands.size() > 0) { + // Remove obsolete commands from the toolbars structure + QStringList aKeys = aToolbars.keys(); + foreach(int aOldId, aKnownCommands) { + foreach(QString aName, aKeys) { + if (aToolbars[aName].contains(aOldId)) { + aToolbars[aName].removeAll(aOldId); + if (aToolbars[aName].size() == 0) + aToolbars.remove(aName); + } + } + } + } + updateToolbars(aToolbars); + myIsToolbarsModified = false; +} + + +QIntList SHAPERGUI::getFreeCommands() const +{ + QIntList aFreeCommands; + QtxActionToolMgr* aMgr = toolMgr(); + QAction* anAction; + int aId; + QMap::const_iterator aIt; + QIntList aShaperActions = shaperActions(); + foreach(int aCmd, aShaperActions) { + anAction = action(aCmd); + aId = aMgr->actionId(anAction); + if (!aMgr->containsAction(aId)) + aFreeCommands.append(aCmd); + } + return aFreeCommands; +} + +void SHAPERGUI::resetToolbars() +{ + if (!myDefaultToolbars.isEmpty()) + updateToolbars(myDefaultToolbars); + myIsToolbarsModified = false; + SUIT_ResourceMgr* aResMgr = application()->resourceMgr(); + aResMgr->remove(ToolbarsSection); }