X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=9d3a7bbea2ea508924cf4370ed22eb3f17fff6b4;hb=88c4a5c85a8d2cfab598c69882b9ceae15507123;hp=de866856ddeaec1e17c6b98c9961a8f6661b6585;hpb=217adf72bd5c1efbd9228fcbab264f205fc3b97f;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index de866856d..9d3a7bbea 100755 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -41,6 +41,7 @@ #include "XGUI_PropertyDialog.h" #include "XGUI_SalomeConnector.h" #include "XGUI_Selection.h" +#include "XGUI_SelectionActivate.h" #include "XGUI_SelectionMgr.h" #include "XGUI_Tools.h" #include "XGUI_ViewerProxy.h" @@ -100,6 +101,7 @@ #include #include #include +#include #include #include @@ -157,7 +159,6 @@ static Handle(VInspector_CallBack) MyVCallBack; #include #endif -//#define DEBUG_FACES_PANEL //#define DEBUG_WITH_MESSAGE_REPORT QString XGUI_Workshop::MOVE_TO_END_COMMAND = QObject::tr("Move to the end"); @@ -184,6 +185,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) ModuleBase_IWorkshop* aWorkshop = moduleConnector(); // Has to be defined first in order to get errors and messages from other components myEventsListener = new XGUI_WorkshopListener(aWorkshop); + mySelectionActivate = new XGUI_SelectionActivate(aWorkshop); SUIT_ResourceMgr* aResMgr = ModuleBase_Preferences::resourceMgr(); #ifndef HAVE_SALOME @@ -315,6 +317,9 @@ void XGUI_Workshop::startApplication() #ifdef _DEBUG Config_PropManager::registerProp("Plugins", "create_part_by_start", "Create Part by Start", Config_Prop::Boolean, "false"); + + Config_PropManager::registerProp("Plugins", "show_hide_faces", "Show Hide Faces (on the right)", + Config_Prop::Boolean, "false"); #endif registerValidators(); @@ -347,7 +352,7 @@ void XGUI_Workshop::startApplication() //****************************************************** void XGUI_Workshop::activateModule() { - myModule->activateSelectionFilters(); + selectionActivate()->updateSelectionFilters(); connect(myDisplayer, SIGNAL(objectDisplayed(ObjectPtr, AISObjectPtr)), myModule, SLOT(onObjectDisplayed(ObjectPtr, AISObjectPtr))); @@ -366,10 +371,8 @@ void XGUI_Workshop::activateModule() //****************************************************** void XGUI_Workshop::deactivateModule() { - myModule->deactivateSelectionFilters(); - // remove internal displayer filter - displayer()->deactivateSelectionFilters(); + displayer()->deactivateSelectionFilters(false); disconnect(myDisplayer, SIGNAL(objectDisplayed(ObjectPtr, AISObjectPtr)), myModule, SLOT(onObjectDisplayed(ObjectPtr, AISObjectPtr))); @@ -379,17 +382,10 @@ void XGUI_Workshop::deactivateModule() XGUI_Displayer* aDisplayer = displayer(); QObjectPtrList aDisplayed = aDisplayer->displayedObjects(); aDisplayer->deactivateObjects(aDisplayed, true); - Handle(AIS_InteractiveContext) aContext = viewer()->AISContext(); - Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(aDisplayer->getTrihedron()); - /// deactivate trihedron in selection modes - TColStd_ListOfInteger aTColModes; - aContext->ActivatedModes(aTrihedron, aTColModes); - TColStd_ListIteratorOfListOfInteger itr( aTColModes ); - for (; itr.More(); itr.Next() ) { - Standard_Integer aMode = itr.Value(); - aContext->Deactivate(aTrihedron, aMode); - } + selectionActivate()->deactivateTrihedronInSelectionModes(); + #ifdef BEFORE_TRIHEDRON_PATCH + //Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(aDisplayer->getTrihedron()); /// Trihedron problem: objects stayed in the viewer, should be removed manually /// otherwise in SALOME happens crash by HideAll in the viewer aContext->Remove(aTrihedron->Position(), true); @@ -550,7 +546,7 @@ void XGUI_Workshop::onPreviewActionClicked() void XGUI_Workshop::deactivateActiveObject(const ObjectPtr& theObject, const bool theUpdateViewer) { if (!myModule->canActivateSelection(theObject)) { - if (myDisplayer->isActive(theObject)) { + if (selectionActivate()->isActive(theObject)) { QObjectPtrList anObjects; anObjects.append(theObject); myDisplayer->deactivateObjects(anObjects, theUpdateViewer); @@ -690,6 +686,12 @@ void XGUI_Workshop::connectToPropertyPanel(const bool isToConnect) } } +//****************************************************** +void XGUI_Workshop::selectionFilters(SelectMgr_ListOfFilter& theSelectionFilters) +{ + module()->selectionFilters(theSelectionFilters); +} + //****************************************************** void XGUI_Workshop::onOperationResumed(ModuleBase_Operation* theOperation) { @@ -704,7 +706,6 @@ void XGUI_Workshop::onOperationResumed(ModuleBase_Operation* theOperation) myModule->operationResumed(theOperation); } - //****************************************************** void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) { @@ -729,14 +730,14 @@ void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) QObjectPtrList anObjects; FeaturePtr aFeature = aFOperation->feature(); if (aFeature.get()) { // feature may be not created (plugin load fail) - if (myDisplayer->isVisible(aFeature) && !myDisplayer->isActive(aFeature)) + if (myDisplayer->isVisible(aFeature) && !selectionActivate()->isActive(aFeature)) anObjects.append(aFeature); std::list aResults; ModelAPI_Tools::allResults(aFeature, aResults); std::list::const_iterator aIt; for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { ResultPtr anObject = *aIt; - if (myDisplayer->isVisible(anObject) && !myDisplayer->isActive(anObject)) { + if (myDisplayer->isVisible(anObject) && !selectionActivate()->isActive(anObject)) { anObjects.append(anObject); } } @@ -1022,64 +1023,63 @@ bool XGUI_Workshop::onSaveAs() //****************************************************** void XGUI_Workshop::onUndo(int theTimes) { - ModuleBase_ModelWidget* anActiveWidget = myOperationMgr->activeWidget(); - if (anActiveWidget && anActiveWidget->processAction(ActionUndo)) - return; - - objectBrowser()->treeView()->setCurrentIndex(QModelIndex()); - SessionPtr aMgr = ModelAPI_Session::get(); - std::list aUndoList = aMgr->undoList(); - if (aMgr->isOperation()) { - /// this is important for nested operations - /// when sketch operation is active, this condition is false and - /// the sketch operation is not aborted - operationMgr()->onAbortOperation(); - } - std::list::const_iterator aIt = aUndoList.cbegin(); - for (int i = 0; (i < theTimes) && (aIt != aUndoList.cend()); ++i, ++aIt) { - aMgr->undo(); - if (QString((*aIt).c_str()) == MOVE_TO_END_COMMAND) - myObjectBrowser->rebuildDataTree(); - } - - operationMgr()->updateApplyOfOperations(); - updateCommandStatus(); + processUndoRedo(ActionUndo, theTimes); } //****************************************************** void XGUI_Workshop::onRedo(int theTimes) { - ModuleBase_ModelWidget* anActiveWidget = myOperationMgr->activeWidget(); - if (anActiveWidget && anActiveWidget->processAction(ActionRedo)) - return; + processUndoRedo(ActionRedo, theTimes); +} +//****************************************************** +void XGUI_Workshop::processUndoRedo(const ModuleBase_ActionType theActionType, int theTimes) +{ + ModuleBase_ModelWidget* anActiveWidget = myOperationMgr->activeWidget(); + if (anActiveWidget) { + ActionIntParamPtr aParam(new ModuleBase_ActionIntParameter(theTimes)); + if (anActiveWidget->processAction(theActionType, aParam)) + return; + } // the viewer update should be blocked in order to avoid the features blinking. For the created // feature a results are created, the flush of the created signal caused the viewer redisplay for // each created result. After a redisplay signal is flushed. So, the viewer update is blocked // until redo of all possible objects happens bool isUpdateEnabled = myDisplayer->enableUpdateViewer(false); - objectBrowser()->treeView()->setCurrentIndex(QModelIndex()); SessionPtr aMgr = ModelAPI_Session::get(); - std::list aRedoList = aMgr->redoList(); if (aMgr->isOperation()) { + XGUI_OperationMgr* aOpMgr = operationMgr(); /// this is important for nested operations /// when sketch operation is active, this condition is false and /// the sketch operation is not aborted - operationMgr()->onAbortOperation(); + if (aOpMgr->canStopOperation(aOpMgr->currentOperation())) + aOpMgr->abortOperation(aOpMgr->currentOperation()); + else + return; } - std::list::const_iterator aIt = aRedoList.cbegin(); - for (int i = 0; (i < theTimes) && (aIt != aRedoList.cend()); ++i, ++aIt) { - aMgr->redo(); + objectBrowser()->treeView()->setCurrentIndex(QModelIndex()); + std::list anActionList = theActionType == ActionUndo ? aMgr->undoList() + : aMgr->redoList(); + std::list::const_iterator aIt = anActionList.cbegin(); + for (int i = 0; (i < theTimes) && (aIt != anActionList.cend()); ++i, ++aIt) { + if (theActionType == ActionUndo) + aMgr->undo(); + else + aMgr->redo(); + if (QString((*aIt).c_str()) == MOVE_TO_END_COMMAND) myObjectBrowser->rebuildDataTree(); } operationMgr()->updateApplyOfOperations(); + facesPanel()->reset(true); updateCommandStatus(); // unblock the viewer update functionality and make update on purpose - myDisplayer->enableUpdateViewer(isUpdateEnabled); - myDisplayer->updateViewer(); + if (theActionType == ActionRedo) { + myDisplayer->enableUpdateViewer(isUpdateEnabled); + myDisplayer->updateViewer(); + } } //****************************************************** @@ -1263,12 +1263,21 @@ void XGUI_Workshop::updateCommandStatus() //****************************************************** void XGUI_Workshop::updateHistory() { - std::list aUndoList = ModelAPI_Session::get()->undoList(); - QList aUndoRes = processHistoryList(aUndoList); - emit updateUndoHistory(aUndoRes); + bool isActionEnabled = false; + ModuleBase_ModelWidget* anActiveWidget = myOperationMgr->activeWidget(); + QList aUndoRes; + QList aRedoRes; + if (anActiveWidget && anActiveWidget->canProcessAction(ActionUndo, isActionEnabled)) { + aUndoRes = anActiveWidget->actionsList(ActionUndo); + aRedoRes = anActiveWidget->actionsList(ActionRedo); + } else { + std::list aUndoList = ModelAPI_Session::get()->undoList(); + aUndoRes = processHistoryList(aUndoList); - std::list aRedoList = ModelAPI_Session::get()->redoList(); - QList aRedoRes = processHistoryList(aRedoList); + std::list aRedoList = ModelAPI_Session::get()->redoList(); + aRedoRes = processHistoryList(aRedoList); + } + emit updateUndoHistory(aUndoRes); emit updateRedoHistory(aRedoRes); } @@ -1327,19 +1336,26 @@ void XGUI_Workshop::createDockWidgets() myFacesPanel); hidePanel(myFacesPanel); ///addDockWidget(Qt::RightDockWidgetArea, myFacesPanel); - showPanel(myFacesPanel); +#ifdef _DEBUG + bool aShowOnTheRight = Config_PropManager::boolean("Plugins", "show_hide_faces"); + if (aShowOnTheRight) { + aDesktop->addDockWidget(Qt::RightDockWidgetArea, myFacesPanel); + showPanel(myFacesPanel); + } #endif - hideObjectBrowser(); -#ifdef DEBUG_FACES_PANEL -#else #ifndef HAVE_SALOME +#ifdef _DEBUG + if (!aShowOnTheRight) + { +#endif // _DEBUG aDesktop->tabifyDockWidget(myFacesPanel, aObjDock); -#endif -#endif +#ifdef _DEBUG + } +#endif // _DEBUG + +#endif // HAVE_SALOME aDesktop->tabifyDockWidget(aObjDock, myPropertyPanel); myPropertyPanel->installEventFilter(myOperationMgr); @@ -1472,15 +1488,8 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) viewer()->eraseAll(); #endif updateCommandStatus(); -#ifndef WIN32 - // Necessary for update icons in ObjectBrowser on Linux - QModelIndexList aIndexes = mySelector->selection()->selectedIndexes(); - foreach (QModelIndex aIdx, aIndexes) { - if (aIdx.column() == 0) { - myObjectBrowser->treeView()->update(aIdx); - } - } -#endif + // Necessary for update icons in ObjectBrowser on Linux + myObjectBrowser->updateAllIndexes(); } else if (theId == "SELECT_VERTEX_CMD") { setViewerSelectionMode(TopAbs_VERTEX); } else if (theId == "SELECT_EDGE_CMD") { @@ -1524,7 +1533,7 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) #ifdef DEBUG_WITH_MESSAGE_REPORT Handle(Message_Report) aContextReport = aContext->GetReport(); - aContextReport->SetActive (Standard_True); + aContext->SetReportActive (Standard_True); aContextReport->SetLimit (1000); if (!aContextReport.IsNull()) aParameters.Append(aContextReport); @@ -1568,10 +1577,6 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) //************************************************************** void XGUI_Workshop::setViewerSelectionMode(int theMode) { - XGUI_ActiveControlSelector* anActiveSelector = activeControlMgr()->activeSelector(); - if (anActiveSelector && anActiveSelector->getType() == XGUI_FacesPanelSelector::Type()) - facesPanel()->setActivePanel(false); - if (theMode == -1) myViewerSelMode.clear(); else { @@ -1580,7 +1585,7 @@ void XGUI_Workshop::setViewerSelectionMode(int theMode) else myViewerSelMode.append(theMode); } - activateObjectsSelection(myDisplayer->displayedObjects()); + selectionActivate()->updateSelectionModes(); } //************************************************************** @@ -1590,7 +1595,7 @@ void XGUI_Workshop::activateObjectsSelection(const QObjectPtrList& theList) module()->activeSelectionModes(aModes); if (aModes.isEmpty() && (myViewerSelMode.length() > 0)) aModes.append(myViewerSelMode); - myDisplayer->activateObjects(aModes, theList); + selectionActivate()->activateObjects(aModes, theList); } //************************************************************** @@ -1619,8 +1624,8 @@ bool XGUI_Workshop::prepareForDisplay(const std::set& theObjects) con // find hidden objects in faces panel std::set aHiddenObjects; QStringList aHiddenObjectNames; - for (std::set::const_iterator anObjectsIt = theObjects.begin(); - anObjectsIt != theObjects.end(); anObjectsIt++) { + for (std::set::const_iterator anObjectsIt = anAllProcessedObjects.begin(); + anObjectsIt != anAllProcessedObjects.end(); anObjectsIt++) { if (!facesPanel()->isObjectHiddenByPanel(*anObjectsIt)) continue; aHiddenObjects.insert(*anObjectsIt); @@ -1632,7 +1637,7 @@ bool XGUI_Workshop::prepareForDisplay(const std::set& theObjects) con int anAnswer = QMessageBox::question( desktop(), tr("Show object"), tr("'%1'\n are hidden by %2:\nRemove objects from the panel to be displayed?") - .arg(aHiddenObjectNames.join(',').arg(facesPanel()->windowTitle()), + .arg(aHiddenObjectNames.join(',')).arg(facesPanel()->windowTitle(), QMessageBox::Yes | QMessageBox::No, QMessageBox::No)); bool aToBeDisplayed = anAnswer == QMessageBox::Yes; @@ -2359,15 +2364,7 @@ void XGUI_Workshop::showObjects(const QObjectPtrList& theList, bool isVisible) aObj->setDisplayed(isVisible); } Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); -#ifndef WIN32 - // Necessary for update icons in ObjectBrowser on Linux - QModelIndexList aIndexes = mySelector->selection()->selectedIndexes(); - foreach (QModelIndex aIdx, aIndexes) { - if (aIdx.column() == 0) { - myObjectBrowser->treeView()->update(aIdx); - } - } -#endif + myObjectBrowser->updateAllIndexes(); } //************************************************************** @@ -2401,15 +2398,9 @@ void XGUI_Workshop::showOnlyObjects(const QObjectPtrList& theList) aObj->setDisplayed(true); } Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); -#ifndef WIN32 + // Necessary for update icons in ObjectBrowser on Linux - QModelIndexList aIndexes = mySelector->selection()->selectedIndexes(); - foreach (QModelIndex aIdx, aIndexes) { - if (aIdx.column() == 0) { - myObjectBrowser->treeView()->update(aIdx); - } - } -#endif + myObjectBrowser->updateAllIndexes(); } //************************************************************** @@ -2535,6 +2526,7 @@ void XGUI_Workshop::setStatusBarMessage(const QString& theMessage) #endif } +#ifdef HAVE_SALOME //****************************************************** void XGUI_Workshop::synchronizeViewer() { @@ -2572,6 +2564,7 @@ void XGUI_Workshop::synchronizeGroupInViewer(const DocumentPtr& theDoc, if (theUpdateViewer) myDisplayer->updateViewer(); } +#endif //****************************************************** void XGUI_Workshop::highlightResults(const QObjectPtrList& theObjects) @@ -2637,7 +2630,9 @@ void XGUI_Workshop::insertFeatureFolder() SessionPtr aMgr = ModelAPI_Session::get(); DocumentPtr aDoc = aMgr->activeDocument(); - aMgr->startOperation(); + QString aDescription = contextMenuMgr()->action("INSERT_FOLDER_CMD")->text(); + + aMgr->startOperation(aDescription.toStdString()); aDoc->addFolder(aFeature); aMgr->finishOperation(); } @@ -2657,7 +2652,10 @@ void XGUI_Workshop::insertToFolder(bool isBefore) if (!aFolder.get()) return; - aMgr->startOperation(); + QString aDescription = contextMenuMgr()->action( + isBefore ? "ADD_TO_FOLDER_BEFORE_CMD" : "ADD_TO_FOLDER_AFTER_CMD")->text(); + + aMgr->startOperation(aDescription.toStdString()); aDoc->moveToFolder(aFeatures, aFolder); aMgr->finishOperation(); } @@ -2671,7 +2669,11 @@ void XGUI_Workshop::moveOutFolder(bool isBefore) SessionPtr aMgr = ModelAPI_Session::get(); DocumentPtr aDoc = aMgr->activeDocument(); - aMgr->startOperation(); + + QString aDescription = contextMenuMgr()->action( + isBefore ? "ADD_OUT_FOLDER_BEFORE_CMD" : "ADD_OUT_FOLDER_AFTER_CMD")->text(); + + aMgr->startOperation(aDescription.toStdString()); aDoc->removeFromFolder(aFeatures, isBefore); aMgr->finishOperation(); }