Salome HOME
Apply button accepts the focus after last control in the Property panel. Controls...
[modules/shaper.git] / src / XGUI / XGUI_PropertyPanel.cpp
index 0a9c7189e20ec4b99de9dcf091d517d7fbc0680d..3838f78868d384e056105fdf810ee01a6d28aeef 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <XGUI_PropertyPanel.h>
 #include <XGUI_ActionsMgr.h>
+#include <XGUI_OperationMgr.h>
 //#include <AppElements_Constants.h>
 #include <ModuleBase_WidgetMultiSelector.h>
 #include <ModuleBase_Tools.h>
 #include <iostream>
 #endif
 
-XGUI_PropertyPanel::XGUI_PropertyPanel(QWidget* theParent)
+XGUI_PropertyPanel::XGUI_PropertyPanel(QWidget* theParent, XGUI_OperationMgr* theMgr)
     : ModuleBase_IPropertyPanel(theParent), 
     myActiveWidget(NULL),
     myPreselectionWidget(NULL),
-    myPanelPage(NULL)
+    myPanelPage(NULL),
+    myOperationMgr(theMgr)
 {
   this->setWindowTitle(tr("Property Panel"));
   QAction* aViewAct = this->toggleViewAction();
@@ -56,6 +58,8 @@ XGUI_PropertyPanel::XGUI_PropertyPanel(QWidget* theParent)
   ModuleBase_Tools::zeroMargins(aBtnLay);
   aMainLayout->addWidget(aFrm, aPanelRow++, kPanelColumn);
 
+  myHeaderWidget = aFrm;
+
   QStringList aBtnNames;
   aBtnNames << QString(PROP_PANEL_HELP)
             << QString(PROP_PANEL_OK)
@@ -81,6 +85,22 @@ void XGUI_PropertyPanel::cleanContent()
 {
   if (myActiveWidget)
     myActiveWidget->deactivate();
+
+  /// as the widgets are deleted later, it is important that the signals
+  /// of these widgets are not processed. An example of the error is issue 986.
+  /// In the given case, the property panel is firstly filled by new widgets
+  /// of restarted operation and after that the mouse release signal come from
+  /// the widget of the previous operation (Point2d widget about mouse is released
+  /// and focus is out of this widget)
+  QList<ModuleBase_ModelWidget*>::const_iterator anIt = myWidgets.begin(),
+                                                 aLast = myWidgets.end();
+  for (; anIt != aLast; anIt++) {
+    QWidget* aWidget = *anIt;
+    if (aWidget) {
+      aWidget->blockSignals(true);
+    }
+  }
+
   myWidgets.clear();
   myPanelPage->clearPage();
   myActiveWidget = NULL;
@@ -99,19 +119,23 @@ void XGUI_PropertyPanel::setModelWidgets(const QList<ModuleBase_ModelWidget*>& t
     connect(aWidget, SIGNAL(keyReleased(QKeyEvent*)),
             this,    SIGNAL(keyReleased(QKeyEvent*)));
   }
-  ModuleBase_ModelWidget* aLastWidget = theWidgets.last();
-  if (aLastWidget) {
-    QList<QWidget*> aControls = aLastWidget->getControls();
-    if (!aControls.empty()) {
-      QWidget* aLastControl = aControls.last();
-
-      QToolButton* anOkBtn = findChild<QToolButton*>(PROP_PANEL_OK);
-      QToolButton* aCancelBtn = findChild<QToolButton*>(PROP_PANEL_CANCEL);
 
-      setTabOrder(aLastControl, anOkBtn);
-      setTabOrder(anOkBtn, aCancelBtn);
+  QWidget* aLastControl = 0;
+  QList<QWidget*> aControls;
+  for (int i = myWidgets.size()-1; i >= 0 && !aLastControl; i--)  {
+    aControls = myWidgets[i]->getControls();
+    for (int j = aControls.size()-1; j >= 0 && !aLastControl; j--)  {
+      if (aControls[j]->focusPolicy() != Qt::NoFocus)
+        aLastControl = aControls[j];
     }
   }
+  if (aLastControl) {
+    QToolButton* anOkBtn = findChild<QToolButton*>(PROP_PANEL_OK);
+    QToolButton* aCancelBtn = findChild<QToolButton*>(PROP_PANEL_CANCEL);
+
+    setTabOrder(aLastControl, anOkBtn);
+    setTabOrder(anOkBtn, aCancelBtn);
+  }
 }
 
 const QList<ModuleBase_ModelWidget*>& XGUI_PropertyPanel::modelWidgets() const
@@ -148,22 +172,18 @@ void XGUI_PropertyPanel::activateNextWidget(ModuleBase_ModelWidget* theWidget)
     activateWidget(NULL);
     return;
   }
-  ModuleBase_ModelWidget* aNextWidget = 0;
   QList<ModuleBase_ModelWidget*>::const_iterator anIt = myWidgets.begin(), aLast = myWidgets.end();
   bool isFoundWidget = false;
-  for (; anIt != aLast && !aNextWidget; anIt++) {
+  activateWindow();
+  for (; anIt != aLast; anIt++) {
     if (isFoundWidget || !theWidget) {
       if ((*anIt)->focusTo()) {
-        aNextWidget = *anIt;
+        return;
       }
     }
-    isFoundWidget = (*anIt) == theWidget;
-  }
-  // Normaly focusTo is enough to activate widget
-  // here is a special case on mouse click in the viewer
-  if(aNextWidget == NULL) {
-    activateWidget(aNextWidget);
+    isFoundWidget = isFoundWidget || (*anIt) == theWidget;
   }
+  activateWidget(NULL);
 }
 
 void XGUI_PropertyPanel::activateNextWidget()
@@ -191,9 +211,16 @@ void XGUI_PropertyPanel::activateWidget(ModuleBase_ModelWidget* theWidget)
     emit widgetActivated(theWidget);
   } else if (!isEditingMode()) {
     emit noMoreWidgets();
+    setFocusOnOkButton();
   }
 }
 
+void XGUI_PropertyPanel::setFocusOnOkButton()
+{
+  QToolButton* anOkBtn = findChild<QToolButton*>(PROP_PANEL_OK);
+  anOkBtn->setFocus();
+}
+
 void XGUI_PropertyPanel::setCancelEnabled(bool theEnabled)
 {
   QToolButton* anCancelBtn = findChild<QToolButton*>(PROP_PANEL_CANCEL);
@@ -236,3 +263,17 @@ void XGUI_PropertyPanel::setPreselectionWidget(ModuleBase_ModelWidget* theWidget
 {
   myPreselectionWidget = theWidget;
 }
+
+
+void XGUI_PropertyPanel::closeEvent(QCloseEvent* theEvent)
+{
+  ModuleBase_Operation* aOp = myOperationMgr->currentOperation();
+  if (aOp) {
+    if (myOperationMgr->canStopOperation(aOp)) {
+      myOperationMgr->abortAllOperations();
+      theEvent->accept();
+    } else 
+      theEvent->ignore();
+  } else
+    ModuleBase_IPropertyPanel::closeEvent(theEvent);
+}
\ No newline at end of file