]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Restarting of the "create line" operation on "Return" key fixed.
authorsbh <sergey.belash@opencascade.com>
Wed, 10 Sep 2014 11:34:06 +0000 (15:34 +0400)
committersbh <sergey.belash@opencascade.com>
Wed, 10 Sep 2014 11:34:06 +0000 (15:34 +0400)
18 files changed:
src/ModuleBase/ModuleBase_ModelWidget.h
src/ModuleBase/ModuleBase_Operation.cpp
src/ModuleBase/ModuleBase_Operation.h
src/ModuleBase/ModuleBase_WidgetDoubleValue.cpp
src/ModuleBase/ModuleBase_WidgetPoint2D.cpp
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_Module.h
src/PartSet/PartSet_OperationFeatureCreate.cpp
src/PartSet/PartSet_OperationFeatureCreate.h
src/PartSet/PartSet_OperationFeatureEdit.cpp
src/PartSet/PartSet_OperationSketchBase.cpp
src/PartSet/PartSet_OperationSketchBase.h
src/XGUI/XGUI_ObjectsBrowser.cpp
src/XGUI/XGUI_OperationMgr.cpp
src/XGUI/XGUI_OperationMgr.h
src/XGUI/XGUI_PropertyPanel.cpp
src/XGUI/XGUI_PropertyPanel.h
src/XGUI/XGUI_Workshop.cpp

index bc520ffb35742870864471055bb738fa7db0c767..4b1940ad5f3961ef94ade0a56fcfbd5eda2f1ffc 100644 (file)
@@ -96,7 +96,7 @@ signals:
   /// The signal about key release on the control, that corresponds to the attribute
   /// \param theAttributeName a name of the attribute
   /// \param theEvent key release event
-  void keyReleased(const std::string& theAttributeName, QKeyEvent* theEvent);
+  void keyReleased(QKeyEvent* theEvent);
   /// The signal about the widget is lost focus
   /// \param theWidget the model base widget
   void focusOutWidget(ModuleBase_ModelWidget* theWidget);
index 91130350c2ef445d80497ab10a21c62afa667cd1..50d2478adabb7fcdbd3ce764783338a194870634 100644 (file)
@@ -173,3 +173,9 @@ bool ModuleBase_Operation::hasObject(ObjectPtr theObj) const
   }
   return false;
 }
+
+void ModuleBase_Operation::keyReleased(const int theKey)
+{
+  // Do nothing...
+}
+
index 15e157baeb079045410a2cea29d54820ee77a8c9..4fd5eff1b82ad8a9f35f8c9be72d5ae50d238c6e 100644 (file)
@@ -66,17 +66,14 @@ Q_OBJECT
   /// Stores a custom value in model.
   void storeCustomValue();
 
-  virtual void keyReleased(std::string theName, QKeyEvent* theEvent)
-  {
-  }
-  ;
-
   /// Sets the operation feature
   void setEditingFeature(FeaturePtr theFeature);
 
   /// Returns True if the current operation works with the given object (feature or result)
   virtual bool hasObject(ObjectPtr theObj) const;
 
+  virtual void keyReleased(const int theKey);
+
  public slots:
   /// Slots which listen the mode widget activation
   /// \param theWidget the model widget
index f98bf3dcf9cf25814c82e053d8989f5f6b667d8a..35641c2a50e8e6ba0ef8dd452465fa239db6b1bb 100644 (file)
@@ -122,10 +122,11 @@ bool ModuleBase_WidgetDoubleValue::eventFilter(QObject *theObject, QEvent *theEv
   if (theObject == mySpinBox) {
     if (theEvent->type() == QEvent::KeyRelease) {
       QKeyEvent* aKeyEvent = (QKeyEvent*) theEvent;
-      if (aKeyEvent && aKeyEvent->key() == Qt::Key_Return) {
+      if (aKeyEvent && (aKeyEvent->key() == Qt::Key_Return ||
+                        aKeyEvent->key() == Qt::Key_Enter)) {
         emit focusOutWidget(this);
       }
-      emit keyReleased(attributeID(), (QKeyEvent*) theEvent);
+      emit keyReleased((QKeyEvent*) theEvent);
       return true;
     }
   }
index 5e447ef1deeeaa74f9fd8cc17ccc4dba815d6e4a..881a6486d6437e3696ce2e271e86fc1170210fb2 100644 (file)
@@ -36,7 +36,7 @@ ModuleBase_WidgetPoint2D::ModuleBase_WidgetPoint2D(QWidget* theParent,
   myGroupBox = new QGroupBox(QString::fromStdString(theData->getProperty(CONTAINER_PAGE_NAME)),
                              theParent);
   QGridLayout* aGroupLay = new QGridLayout(myGroupBox);
-  aGroupLay->setContentsMargins(0, 0, 0, 0);
+  aGroupLay->setContentsMargins(2, 0, 2, 0);
   aGroupLay->setColumnStretch(1, 1);
   {
     QLabel* aLabel = new QLabel(myGroupBox);
@@ -149,10 +149,11 @@ bool ModuleBase_WidgetPoint2D::eventFilter(QObject *theObject, QEvent *theEvent)
   if (theObject == myXSpin || theObject == myYSpin) {
     if (theEvent->type() == QEvent::KeyRelease) {
       QKeyEvent* aKeyEvent = (QKeyEvent*) theEvent;
-      if (aKeyEvent && aKeyEvent->key() == Qt::Key_Return) {
+      if (aKeyEvent && (aKeyEvent->key() == Qt::Key_Return ||
+                        aKeyEvent->key() == Qt::Key_Enter)) {
         emit focusOutWidget(this);
       }
-      emit keyReleased(attributeID(), (QKeyEvent*) theEvent);
+      emit keyReleased((QKeyEvent*) theEvent);
       return true;
     }
   }
index 993d467577ebcdba596dbb8499f0e7a071c1756f..cf2bcbc7c3bcc2c5acaddfebbfd7a7d2d051d236 100644 (file)
@@ -286,15 +286,12 @@ void PartSet_Module::onFitAllView()
   myWorkshop->viewer()->fitAll();
 }
 
-void PartSet_Module::onLaunchOperation(std::string theName, ObjectPtr theObject)
+void PartSet_Module::onRestartOperation(std::string theName, ObjectPtr theObject)
 {
   FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
-  if (!aFeature) {
-    qDebug("Warning! Restart operation without feature!");
-    return;
-  }
-  ModuleBase_Operation* anOperation = createOperation(theName.c_str(),
-                                                      aFeature ? aFeature->getKind() : "");
+
+  std::string aKind = aFeature ? aFeature->getKind() : "";
+  ModuleBase_Operation* anOperation = createOperation(theName, aKind);
   PartSet_OperationSketchBase* aPreviewOp = dynamic_cast<PartSet_OperationSketchBase*>(anOperation);
   if (aPreviewOp) {
     XGUI_Selection* aSelection = myWorkshop->selector()->selection();
@@ -303,7 +300,7 @@ void PartSet_Module::onLaunchOperation(std::string theName, ObjectPtr theObject)
     std::list<ModuleBase_ViewerPrs> aHighlighted = aSelection->getHighlighted();
     aPreviewOp->initFeature(aFeature);
     aPreviewOp->initSelection(aSelected, aHighlighted);
-  } else {
+  } else if (aFeature) {
     anOperation->setEditingFeature(aFeature);
     //Deactivate result of current feature in order to avoid its selection
     XGUI_Displayer* aDisplayer = myWorkshop->displayer();
@@ -415,14 +412,16 @@ ModuleBase_Operation* PartSet_Module::createOperation(const std::string& theCmdI
     ModuleBase_Operation* aCurOperation = myWorkshop->operationMgr()->currentOperation();
     FeaturePtr aSketch;
     PartSet_OperationSketchBase* aPrevOp = dynamic_cast<PartSet_OperationSketchBase*>(aCurOperation);
-    if (aPrevOp)
+    if (aPrevOp) {
       aSketch = aPrevOp->sketch();
-    if (PartSet_OperationFeatureCreate::canProcessKind(theCmdId))
+    }
+    if (PartSet_OperationFeatureCreate::canProcessKind(theCmdId)) {
       anOperation = new PartSet_OperationFeatureCreate(theCmdId.c_str(), this, aSketch);
-    else if (theCmdId == PartSet_OperationFeatureEditMulti::Type())
+    } else if (theCmdId == PartSet_OperationFeatureEditMulti::Type()) {
       anOperation = new PartSet_OperationFeatureEditMulti(theCmdId.c_str(), this, aSketch);
-    else if (theCmdId == PartSet_OperationFeatureEdit::Type())
+    } else if (theCmdId == PartSet_OperationFeatureEdit::Type()) {
       anOperation = new PartSet_OperationFeatureEdit(theCmdId.c_str(), this, aSketch);
+    }
   }
 
   if (!anOperation) {
@@ -455,8 +454,8 @@ ModuleBase_Operation* PartSet_Module::createOperation(const std::string& theCmdI
   if (aPreviewOp) {
     connect(aPreviewOp, SIGNAL(featureConstructed(ObjectPtr, int)), this,
             SLOT(onFeatureConstructed(ObjectPtr, int)));
-    connect(aPreviewOp, SIGNAL(launchOperation(std::string, ObjectPtr)), this,
-            SLOT(onLaunchOperation(std::string, ObjectPtr)));
+    connect(aPreviewOp, SIGNAL(restartRequired(std::string, ObjectPtr)), this,
+            SLOT(onRestartOperation(std::string, ObjectPtr)));
     connect(aPreviewOp, SIGNAL(multiSelectionEnabled(bool)), this,
             SLOT(onMultiSelectionEnabled(bool)));
 
@@ -588,7 +587,7 @@ void PartSet_Module::editFeature(FeaturePtr theFeature)
   //}
 
   //if (aFeature) {
-  onLaunchOperation(theFeature->getKind(), theFeature);
+  onRestartOperation(theFeature->getKind(), theFeature);
   updateCurrentPreview(theFeature->getKind());
   //}
 //  }
index 797e55c74b01432a3ea254783684144351ebd1e9..39ee6a763a40fc68d16900c91a1ed8b3e1c5da82 100644 (file)
@@ -112,7 +112,7 @@ Q_OBJECT
   /// SLOT, to fit all current viewer
   void onFitAllView();
 
-  void onLaunchOperation(std::string theName, ObjectPtr theFeature);
+  void onRestartOperation(std::string theName, ObjectPtr theFeature);
 
   /// SLOT, to switch on/off the multi selection in the viewer
   /// \param theEnabled the enabled state
index 6a405901a8ae558c41676590daa307bede32c862..c56fe194f2f620a23f2dd8958f5db93db87b3975 100644 (file)
@@ -167,16 +167,6 @@ void PartSet_OperationFeatureCreate::mouseMoved(QMouseEvent* theEvent, Handle(V3
   }
 }
 
-void PartSet_OperationFeatureCreate::keyReleased(std::string theName, QKeyEvent* theEvent)
-{
-  int aKeyType = theEvent->key();
-  // the second point should be activated by any modification in the property panel
-  if (!theName.empty()) {
-    //setPointSelectionMode(myFeaturePrs->getNextMode(theName), false);
-  }
-  keyReleased(theEvent->key());
-}
-
 void PartSet_OperationFeatureCreate::onWidgetActivated(ModuleBase_ModelWidget* theWidget)
 {
   myActiveWidget = theWidget;
@@ -201,10 +191,11 @@ void PartSet_OperationFeatureCreate::onWidgetActivated(ModuleBase_ModelWidget* t
 void PartSet_OperationFeatureCreate::keyReleased(const int theKey)
 {
   switch (theKey) {
-    case Qt::Key_Return: {
+    case Qt::Key_Return:
+    case Qt::Key_Enter: {
       if (commit()) {
         // it start a new line creation at a free point
-        restartOperation(feature()->getKind(), FeaturePtr());
+        restartOperation(feature()->getKind());
       }
     }
       break;
@@ -213,6 +204,7 @@ void PartSet_OperationFeatureCreate::keyReleased(const int theKey)
         abort();
       }
     }
+      break;
     default:
       break;
   }
index a6e3aa8771c80fc2691f4da2440609eaa8f2d944..730ab7aa69e43c584506f3d06c1f51bee0a8c44e 100644 (file)
@@ -73,8 +73,6 @@ Q_OBJECT
   /// \param theKey a key value
   virtual void keyReleased(const int theKey);
 
-  virtual void keyReleased(std::string theName, QKeyEvent* theEvent);
-
  public slots:
   /// Slots which listen the mode widget activation
   /// \param theWidget the model widget
index 4d3edb9e917ea7362bed23aa90faa4e73151ff67..2bbc2229ed238733be0ff0aab80666cd4f6d2921 100644 (file)
@@ -163,7 +163,7 @@ void PartSet_OperationFeatureEdit::mouseDoubleClick(
 
 void PartSet_OperationFeatureEdit::keyReleased(const int theKey)
 {
-  if (theKey == Qt::Key_Return) {
+  if (theKey == Qt::Key_Return || theKey == Qt::Key_Enter) {
     commit();
   } else
     PartSet_OperationSketchBase::keyReleased(theKey);
index 9272c8c9e6c8dd48dc84c8e59c51b20d6b6df01e..93c1818e14e90c845273844a8c7fc59bd2847637 100644 (file)
@@ -103,8 +103,10 @@ void PartSet_OperationSketchBase::keyReleased(const int theKey)
       bool toAbort = true;
       if (isModified()) {
         int anAnswer = QMessageBox::question(
-            qApp->activeWindow(), tr("Cancel operation"),
-            tr("Operation %1 will be cancelled. Continue?").arg(id()), QMessageBox::Yes,
+            qApp->activeWindow(),
+            tr("Cancel operation"),
+            tr("Do you want to cancel %1 operation?").arg(id()),
+            QMessageBox::Yes,
             QMessageBox::No);
         toAbort = (anAnswer == QMessageBox::Yes);
       }
@@ -117,11 +119,6 @@ void PartSet_OperationSketchBase::keyReleased(const int theKey)
   }
 }
 
-void PartSet_OperationSketchBase::keyReleased(std::string theName, QKeyEvent* theEvent)
-{
-  keyReleased(theEvent->key());
-}
-
 void PartSet_OperationSketchBase::restartOperation(const std::string& theType, ObjectPtr theFeature)
 {
   FeaturePtr aFeature = ModelAPI_Feature::feature(theFeature);
@@ -129,10 +126,10 @@ void PartSet_OperationSketchBase::restartOperation(const std::string& theType, O
     QStringList aNested = this->nestedFeatures();
     if (!aNested.isEmpty()) {
       if (aNested.contains(QString(aFeature->getKind().c_str()))) 
-        emit launchOperation(theType, theFeature);
+        emit restartRequired(theType, theFeature);
       else
         return;
     }
   }
-  emit launchOperation(theType, theFeature);
+  emit restartRequired(theType, theFeature);
 }
index 66e3cd0047fed1a9d9c7e956689c5f69c6f826d0..e2e992dd7cdb846590e1e2ab21c1bf5d978576d1 100644 (file)
@@ -118,8 +118,6 @@ Q_OBJECT
   /// \param theKey a key value
   virtual void keyReleased(const int theKey);
 
-  virtual void keyReleased(std::string theName, QKeyEvent* theEvent);
-
   /// Emits a signal about the operation start. This signal has an information about the feature.
   /// If the provided feature is empty, the current operation feature is used.
   /// \param theType a type of an operation started
@@ -130,7 +128,7 @@ signals:
   /// signal about the request to launch operation
   /// theName the operation name
   /// theFeature the operation argument
-  void launchOperation(std::string theName, ObjectPtr theFeature);
+  void restartRequired(std::string theName, ObjectPtr theFeature);
 
   /// Signal about the feature construing is finished
   /// \param theFeature the result feature
index 12d0dd6a74a9bf279823c0871914e8eff4249517..af509801a0b3cc8a9ffe7c13de1549ba6edff07b 100644 (file)
@@ -203,7 +203,8 @@ bool XGUI_ObjectsBrowser::eventFilter(QObject* obj, QEvent* theEvent)
       } else if (theEvent->type() == QEvent::KeyRelease) {
         QKeyEvent* aEvent = (QKeyEvent*) theEvent;
         switch (aEvent->key()) {
-          case Qt::Key_Return:  // Accept current input
+          case Qt::Key_Return:
+          case Qt::Key_Enter:  // Accept current input
             closeDocNameEditing(true);
             break;
           case Qt::Key_Escape:  // Cancel the input
index 53f324b40362976fcd209799b4ee63a346e70b32..d10689f04bcc13445a3a0c2c99352f94672ba222 100644 (file)
@@ -104,7 +104,7 @@ bool XGUI_OperationMgr::eventFilter(QObject *theObject, QEvent *theEvent)
     if (aKeyEvent && aKeyEvent->key() == Qt::Key_Escape) {
       // TODO: this is Escape button processing when the property panel has empty content,
       // but the operation should be stopped by the Enter has been clicked
-      onKeyReleased("", aKeyEvent);
+      onKeyReleased(aKeyEvent);
       return true;
     }
   }
@@ -206,11 +206,11 @@ void XGUI_OperationMgr::onOperationStopped()
   }
 }
 
-void XGUI_OperationMgr::onKeyReleased(const std::string& theName, QKeyEvent* theEvent)
+void XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent)
 {
   ModuleBase_Operation* anOperation = currentOperation();
   if (anOperation)
-    anOperation->keyReleased(theName, theEvent);
+    anOperation->keyReleased(theEvent->key());
 }
 
 void XGUI_OperationMgr::onWidgetActivated(ModuleBase_ModelWidget* theWidget)
index f363da6b5203f3e0e91d31481098f072bd6f36c0..5dbd3cbcebe52c8ece8b9dee3f63df6ae43766c9 100644 (file)
@@ -104,7 +104,7 @@ signals:
   /// SLOT, that is called by the key in the property panel is clicked.
   /// \param theName the attribute name
   /// \param theEvent the mouse event
-  void onKeyReleased(const std::string& theName, QKeyEvent* theEvent);
+  void onKeyReleased(QKeyEvent* theEvent);
 
   /// SLOT, that reacts to the widget activation
   /// \param theWidget an activated widget
index 9a6e9500c288f99d491a27974764bed34656301b..d6b88d19c9171e29cb6d9f754b1c3532f6e52a84 100644 (file)
@@ -79,40 +79,40 @@ void XGUI_PropertyPanel::cleanContent()
 void XGUI_PropertyPanel::setModelWidgets(const QList<ModuleBase_ModelWidget*>& theWidgets)
 {
   myWidgets = theWidgets;
+  if (theWidgets.empty()) return;
 
-  if (!theWidgets.empty()) {
-    QList<ModuleBase_ModelWidget*>::const_iterator anIt = theWidgets.begin(), aLast =
-        theWidgets.end();
-    for (; anIt != aLast; anIt++) {
-      connect(*anIt, SIGNAL(keyReleased(const std::string&, QKeyEvent*)), this,
-              SIGNAL(keyReleased(const std::string&, QKeyEvent*)));
+  QList<ModuleBase_ModelWidget*>::const_iterator anIt = theWidgets.begin(), aLast =
+      theWidgets.end();
+  for (; anIt != aLast; anIt++) {
+    //TODO(sbh): Think how to connect prop panle hotkeys and operations mgr
+    connect(*anIt, SIGNAL(keyReleased(QKeyEvent*)), this,
+            SIGNAL(keyReleased(QKeyEvent*)));
 
-      connect(*anIt, SIGNAL(focusOutWidget(ModuleBase_ModelWidget*)), this,
-              SLOT(onActivateNextWidget(ModuleBase_ModelWidget*)));
+    connect(*anIt, SIGNAL(focusOutWidget(ModuleBase_ModelWidget*)), this,
+            SLOT(onActivateNextWidget(ModuleBase_ModelWidget*)));
 
-      //connect(*anIt, SIGNAL(activated(ModuleBase_ModelWidget*)),
-      //        this, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)));
+    //connect(*anIt, SIGNAL(activated(ModuleBase_ModelWidget*)),
+    //        this, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)));
 
-      ModuleBase_WidgetPoint2D* aPointWidget = dynamic_cast<ModuleBase_WidgetPoint2D*>(*anIt);
-      if (aPointWidget)
-        connect(aPointWidget, SIGNAL(storedPoint2D(ObjectPtr, const std::string&)), this,
-                SIGNAL(storedPoint2D(ObjectPtr, const std::string&)));
-    }
-    ModuleBase_ModelWidget* aLastWidget = theWidgets.last();
-    if (aLastWidget) {
-      QList<QWidget*> aControls = aLastWidget->getControls();
-      if (!aControls.empty()) {
-        QWidget* aLastControl = aControls.last();
+    ModuleBase_WidgetPoint2D* aPointWidget = dynamic_cast<ModuleBase_WidgetPoint2D*>(*anIt);
+    if (aPointWidget)
+      connect(aPointWidget, SIGNAL(storedPoint2D(ObjectPtr, const std::string&)), this,
+              SIGNAL(storedPoint2D(ObjectPtr, const std::string&)));
+  }
+  ModuleBase_ModelWidget* aLastWidget = theWidgets.last();
+  if (aLastWidget) {
+    QList<QWidget*> aControls = aLastWidget->getControls();
+    if (!aControls.empty()) {
+      QWidget* aLastControl = aControls.last();
 
-        QPushButton* anOkBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_OK);
-        QPushButton* aCancelBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_CANCEL);
+      QPushButton* anOkBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_OK);
+      QPushButton* aCancelBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_CANCEL);
 
-        setTabOrder(aLastControl, anOkBtn);
-        setTabOrder(anOkBtn, aCancelBtn);
-      }
+      setTabOrder(aLastControl, anOkBtn);
+      setTabOrder(anOkBtn, aCancelBtn);
     }
-    onActivateNextWidget(0);
   }
+  onActivateNextWidget(NULL);
 }
 
 const QList<ModuleBase_ModelWidget*>& XGUI_PropertyPanel::modelWidgets() const
@@ -127,9 +127,10 @@ bool XGUI_PropertyPanel::eventFilter(QObject *theObject, QEvent *theEvent)
   if (theObject == anOkBtn || theObject == aCancelBtn) {
     if (theEvent->type() == QEvent::KeyRelease) {
       QKeyEvent* aKeyEvent = (QKeyEvent*) theEvent;
-      if (aKeyEvent && aKeyEvent->key() == Qt::Key_Return) {
+      if (aKeyEvent && (aKeyEvent->key() == Qt::Key_Return ||
+                        aKeyEvent->key() == Qt::Key_Enter)) {
         // TODO: this is enter button processing when the focus is on "Apply" or "Cancel" buttons
-        emit keyReleased("", (QKeyEvent*) theEvent);
+        //emit keyReleased("", (QKeyEvent*) theEvent);
         return true;
       }
     }
index 7331bc53136ecdec2a184c985c090f6ec397408d..d6ff28170106dca9d63e71dca0c6207f49646826 100644 (file)
@@ -44,9 +44,8 @@ Q_OBJECT
 
 signals:
   /// The signal about key release on the control, that corresponds to the attribute
-  /// \param theAttributeName a name of the attribute
   /// \param theEvent key release event
-  void keyReleased(const std::string& theAttributeName, QKeyEvent* theEvent);
+  void keyReleased(QKeyEvent* theEvent);
   /// The signal about the widget activation
   /// \param theWidget the activated widget
   void widgetActivated(ModuleBase_ModelWidget* theWidget);
index fec644039bdd94d6cdf17f3becf425bfc5402230..4df53a8f9e43f9d61e074cf9d89050aa22f045dc 100644 (file)
@@ -861,9 +861,9 @@ void XGUI_Workshop::createDockWidgets()
   connect(aOkBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onCommitOperation()));
   QPushButton* aCancelBtn = myPropertyPanel->findChild<QPushButton*>(XGUI::PROP_PANEL_CANCEL);
   connect(aCancelBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onAbortOperation()));
-
-  connect(myPropertyPanel, SIGNAL(keyReleased(const std::string&, QKeyEvent*)), myOperationMgr,
-          SLOT(onKeyReleased(const std::string&, QKeyEvent*)));
+//TODO(sbh): KeyReleasedProblem
+  connect(myPropertyPanel, SIGNAL(keyReleased(QKeyEvent*)), myOperationMgr,
+          SLOT(onKeyReleased(QKeyEvent*)));
 
   connect(myPropertyPanel, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)), myOperationMgr,
           SLOT(onWidgetActivated(ModuleBase_ModelWidget*)));