]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Detach, Auxiliary and Delete actions are granted for the Sketch feature.
authornds <nds@opencascade.com>
Mon, 12 Oct 2015 13:23:28 +0000 (16:23 +0300)
committernds <nds@opencascade.com>
Mon, 12 Oct 2015 13:23:54 +0000 (16:23 +0300)
Wrong case is that the "Detach" action tried to abort all operations. This is a regression, which happens after "Abort previous operation by Edit of Parameter" (5 hours ago).

src/ModuleBase/ModuleBase_IModule.cpp
src/ModuleBase/ModuleBase_IModule.h
src/PartSet/PartSet_MenuMgr.cpp
src/PartSet/PartSet_MenuMgr.h
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_Module.h
src/XGUI/XGUI_OperationMgr.cpp
src/XGUI/XGUI_OperationMgr.h
src/XGUI/XGUI_Workshop.cpp

index e2bd9b17ef3c9f4b6eef0892a1f5f27e28fe9911..90bb8ede3ad73fa6cadf178f8d2a1d0e03b6e539 100644 (file)
@@ -101,6 +101,11 @@ QString ModuleBase_IModule::getFeatureError(const FeaturePtr& theFeature)
   return anError;
 }
 
+void ModuleBase_IModule::grantedOperationIds(ModuleBase_Operation* theOperation,
+                                             QStringList& theIds) const
+{
+}
+
 ModuleBase_Operation* ModuleBase_IModule::getNewOperation(const std::string& theFeatureId)
 {
   return new ModuleBase_OperationFeature(theFeatureId.c_str(), this);
index 301bcbe5b193719311f74a23dbd959eade6ce9dc..747dda203268c5f65ab386613c268dce9152830c 100644 (file)
@@ -188,6 +188,9 @@ class MODULEBASE_EXPORT ModuleBase_IModule : public QObject
   //! \return string value\r
   virtual QString getFeatureError(const FeaturePtr& theFeature);\r
 \r
+  /// Returns list of granted operation indices\r
+  virtual void grantedOperationIds(ModuleBase_Operation* theOperation, QStringList& theIds) const;\r
+\r
 signals:\r
   /// Signal which is emitted when operation is launched\r
   void operationLaunched();\r
index 9b82b66c3460a2bba5e43223dd5def81c76164ae..65a2f98d7ed2ad4052e5a98e137559fe2221a204 100644 (file)
@@ -312,7 +312,7 @@ void PartSet_MenuMgr::onLineDetach(QAction* theAction)
     // the active nested sketch operation should be aborted unconditionally
     // the Delete action should be additionally granted for the Sketch operation
     // in order to do not abort/commit it
-    if (!anOpMgr->canStartOperation(anOpAction->id(), isSketchOp/*granted*/))
+    if (!anOpMgr->canStartOperation(tr("Detach")))
       return; // the objects are processed but can not be deleted
 
     anOpMgr->startOperation(anOpAction);
@@ -370,7 +370,7 @@ void PartSet_MenuMgr::setAuxiliary(const bool isChecked)
     anOpAction = new ModuleBase_OperationAction(anAction->text(), myModule);
     bool isSketchOp = PartSet_SketcherMgr::isSketchOperation(anOperation);
 
-    if (!anOpMgr->canStartOperation(anOpAction->id(), isSketchOp/*granted*/))
+    if (!anOpMgr->canStartOperation(anOpAction->id()))
       return; // the objects are processed but can not be deleted
 
     anOpMgr->startOperation(anOpAction);
@@ -490,6 +490,15 @@ void PartSet_MenuMgr::activatePartSet() const
   if (isNewTransaction) aMgr->finishOperation();
 }
 
+void PartSet_MenuMgr::grantedOperationIds(ModuleBase_Operation* theOperation,
+                                          QStringList& theIds) const
+{
+  if (PartSet_SketcherMgr::isSketchOperation(theOperation)) {
+    theIds.append(tr("Detach"));
+    theIds.append(tr("Auxiliary"));
+  }
+}
+
 void PartSet_MenuMgr::onEdit(bool)
 {
   QObjectPtrList aObjects = myModule->workshop()->selection()->selectedObjects();
index 7a94a0d9c633e1d65d06433d2bd947f353c89adc..738c6f3652e8e5f0605c711920d1fd34e2a180e1 100644 (file)
@@ -15,6 +15,7 @@
 #include <QList>
 #include <QColor>
 
+class ModuleBase_Operation;
 class PartSet_Module;
 class QAction;
 class QMenu;
@@ -49,6 +50,9 @@ public:
   /// Activates a PartSet document
   void activatePartSet() const;
 
+  /// Returns list of granted operation indices
+  virtual void grantedOperationIds(ModuleBase_Operation* theOperation, QStringList& theIds) const;
+
 public slots:
   /// Processes the context menu action click
   /// \param isChecked a state of toggle if the action is checkable
index eeafedfbc3b2857d9cd427b895fcc1180db3b59e..ae090a39ed3af7ddfdf4482d28589224916ee133 100755 (executable)
@@ -438,6 +438,19 @@ QString PartSet_Module::getFeatureError(const FeaturePtr& theFeature)
   return anError;
 }
 
+void PartSet_Module::grantedOperationIds(ModuleBase_Operation* theOperation,
+                                         QStringList& theIds) const
+{
+  myMenuMgr->grantedOperationIds(theOperation, theIds);
+
+  if (PartSet_SketcherMgr::isSketchOperation(theOperation)) {
+    XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(workshop());
+    XGUI_Workshop* aWorkshop = aConnector->workshop();
+
+    theIds.append(aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text());
+  }
+}
+
 void PartSet_Module::activeSelectionModes(QIntList& theModes)
 {
   theModes.clear();
@@ -696,7 +709,7 @@ bool PartSet_Module::deleteObjects()
     // the active nested sketch operation should be aborted unconditionally
     // the Delete action should be additionally granted for the Sketch operation
     // in order to do not abort/commit it
-    if (!anOpMgr->canStartOperation(anOpAction->id(), isSketchOp/*granted*/))
+    if (!anOpMgr->canStartOperation(anOpAction->id()))
       return true; // the objects are processed but can not be deleted
 
     anOpMgr->startOperation(anOpAction);
index a475b5f657a5fd47ce73ef4c3133de788db89d1e..6f79f809283059866917d0d294430681e317cf8e 100644 (file)
@@ -200,6 +200,9 @@ public:
   //! \return string value
   virtual QString getFeatureError(const FeaturePtr& theFeature);
 
+  /// Returns list of granted operation indices
+  virtual void grantedOperationIds(ModuleBase_Operation* theOperation, QStringList& theIds) const;
+
 public slots:
   /// SLOT, that is called by no more widget signal emitted by property panel
   /// Set a specific flag to restart the sketcher operation
index 8cf826404cc2daf701f87c03f6b84c349c7ed537..92db976896a2a3391855ef5a4c023c2066166f4f 100644 (file)
@@ -302,15 +302,9 @@ bool XGUI_OperationMgr::isGrantedOperation(const QString& theId)
   ModuleBase_Operation* aPreviousOperation = 0;
   while (anIt.hasPrevious()) {
     ModuleBase_Operation* anOp = anIt.previous();
-    if (anOp->id() == theId) {
-      if (anIt.hasPrevious())
-        aPreviousOperation = anIt.previous();
-      break;
-    }
+    if (anOp)
+      isGranted = anOp->isGranted(theId);
   }
-  if (aPreviousOperation)
-    isGranted = aPreviousOperation->isGranted(theId);
-
   return isGranted;
 }
 
@@ -326,12 +320,12 @@ void XGUI_OperationMgr::setCurrentFeature(const FeaturePtr& theFeature)
     aMgr->finishOperation();
 }
 
-bool XGUI_OperationMgr::canStartOperation(const QString& theId, const bool isAdditionallyGranted)
+bool XGUI_OperationMgr::canStartOperation(const QString& theId)
 {
   bool aCanStart = true;
   ModuleBase_Operation* aCurrentOp = currentOperation();
   if (aCurrentOp) {
-    bool aGranted = aCurrentOp->isGranted(theId) || isAdditionallyGranted;
+    bool aGranted = aCurrentOp->isGranted(theId);
     // the started operation is granted for the current one,
     // e.g. current - Sketch, started - Line
     if (aGranted) {
index 052aa86b5c9cd20e968337d7094251f750cdf298..66e14f732b9e20c597dca92393f88769d946de2c 100644 (file)
@@ -90,8 +90,7 @@ Q_OBJECT
   /// Returns whether the operation can be started. Check if there is already started operation and
   /// the granted parameter of the launched operation
   /// \param theId id of the operation which is going to start
-  /// \param isAdditionallyGranted a boolean flag whether the id operation is granted in the previous one
-  bool canStartOperation(const QString& theId, const bool isAdditionallyGranted = false);
+  bool canStartOperation(const QString& theId);
 
   /// Aborts the parameter operation if it is current, else abort operations from the stack
   /// of operations until the operation is found. All operations upper the parameter one are
index 6e98038dc437b8874881baa183009ac5377b04c2..70257c785a89a3b4007b7a5cbae50d3f7baf5058 100644 (file)
@@ -553,6 +553,10 @@ void XGUI_Workshop::setGrantedFeatures(ModuleBase_Operation* theOperation)
   else
     aGrantedIds = myActionsMgr->nestedCommands(theOperation->id());
 
+  ModuleBase_IModule* aModule = module();
+  if (aModule)
+    aModule->grantedOperationIds(theOperation, aGrantedIds);
+
   aFOperation->setGrantedOperationIds(aGrantedIds);
 }