]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Bugfixes for focus processing in the property panel
authorsbh <sergey.belash@opencascade.com>
Wed, 11 Mar 2015 15:51:47 +0000 (18:51 +0300)
committersbh <sergey.belash@opencascade.com>
Wed, 11 Mar 2015 15:51:47 +0000 (18:51 +0300)
12 files changed:
src/ModuleBase/ModuleBase_ModelWidget.cpp
src/ModuleBase/ModuleBase_ModelWidget.h
src/ModuleBase/ModuleBase_PageBase.cpp
src/ModuleBase/ModuleBase_PageBase.h
src/ModuleBase/ModuleBase_PageGroupBox.cpp
src/ModuleBase/ModuleBase_PageWidget.cpp
src/ModuleBase/ModuleBase_WidgetFactory.cpp
src/ModuleBase/ModuleBase_WidgetToolbox.cpp
src/ModuleBase/ModuleBase_WidgetToolbox.h
src/PartSet/PartSet_WidgetSketchLabel.cpp
src/PartSet/PartSet_WidgetSketchLabel.h
src/XGUI/XGUI_PropertyPanel.cpp

index 2085e690202290fa5c6e6457f5bccaa6d4587ee5..c16c0b13f597d2911b9e6b1e35ac56d44c27d5e7 100644 (file)
@@ -20,6 +20,7 @@
 #include <QGraphicsDropShadowEffect>
 #include <QColor>
 #include <QLabel>
+#include <QFocusEvent>
 
 ModuleBase_ModelWidget::ModuleBase_ModelWidget(QWidget* theParent,
                                                const Config_WidgetAPI* theData,
@@ -150,6 +151,11 @@ bool ModuleBase_ModelWidget::eventFilter(QObject* theObject, QEvent *theEvent)
 {
   QWidget* aWidget = qobject_cast<QWidget*>(theObject);
   if (theEvent->type() == QEvent::FocusIn) {
+    #ifdef _DEBUG
+    // The following two lines are for debugging purpose only
+    QFocusEvent* aFocusEvent = dynamic_cast<QFocusEvent*>(theEvent);
+    bool isWinFocus = aFocusEvent->reason() == Qt::ActiveWindowFocusReason;
+    #endif
     if (getControls().contains(aWidget)) {
       emit focusInWidget(this);
     }
index 87112716e66df14208c74b1a0d4f988cf2f3409e..6d3437fe18c91f703c4a5087cab1539f059c60c1 100644 (file)
@@ -105,7 +105,7 @@ Q_OBJECT
   virtual void enableFocusProcessing();
 
   //! Switch On/Off highlighting of the widget
-  void setHighlighted(bool isHighlighted);
+  virtual void setHighlighted(bool isHighlighted);
 
   /// Returns the attribute name
   /// \returns the string value
index dac665edd3fbb0fd089e2c90e43ca7c14156d3b2..027150f22426c45f4538ea262119d8399c3abe91 100644 (file)
@@ -52,12 +52,12 @@ void ModuleBase_PageBase::clearPage()
 }
 
 
-void ModuleBase_PageBase::takeFocus()
+bool ModuleBase_PageBase::takeFocus()
 {
   if(myWidgetList.isEmpty())
-    return;
+    return false;
 
-  myWidgetList.first()->focusTo();
+  return myWidgetList.first()->focusTo();
 }
 
 QList<ModuleBase_ModelWidget*> ModuleBase_PageBase::modelWidgets()
index 7f8f054ca822a143c30b25beff11a25f9335224d..29e9dcd1457f55a36fd898655325ea1206e52dc8 100644 (file)
@@ -29,7 +29,7 @@ class MODULEBASE_EXPORT ModuleBase_PageBase
   void addPageWidget(ModuleBase_PageBase* theWidget);
 
   void clearPage();
-  void takeFocus();
+  bool takeFocus();
   QList<ModuleBase_ModelWidget*> modelWidgets();
   void alignToTop();
 
index f16e4d728b2ef247f4afeaf3140dad314b8003bf..1631a8726977793d1572ab557a586a6466d98953 100644 (file)
@@ -32,6 +32,8 @@ void ModuleBase_PageGroupBox::placeModelWidget(ModuleBase_ModelWidget* theWidget
   const int kCol = 0;
   const int kRow = myMainLayout->count();
   myMainLayout->addWidget(theWidget, kRow, kCol, Qt::AlignTop | Qt::AlignLeft);
+  myMainLayout->setRowStretch(kRow, 0);
+
 }
 
 void ModuleBase_PageGroupBox::placePageWidget(ModuleBase_PageBase* theWidget)
@@ -45,7 +47,8 @@ void ModuleBase_PageGroupBox::placePageWidget(ModuleBase_PageBase* theWidget)
   }
   const int kCol = 0;
   const int kRow = myMainLayout->count();
-  myMainLayout->addWidget(aWidget, kRow, kCol, Qt::AlignTop | Qt::AlignLeft);
+  myMainLayout->addWidget(aWidget, kRow, kCol);
+  myMainLayout->setRowStretch(kRow, 0);
 }
 
 QLayout* ModuleBase_PageGroupBox::pageLayout()
index f49e53eea1fed66f299c38036c746a983ba82af2..d3039cac5b12dcb8988409d01083463fc4bf62a3 100644 (file)
@@ -33,6 +33,7 @@ void ModuleBase_PageWidget::placeModelWidget(ModuleBase_ModelWidget* theWidget)
   const int kCol = 0;
   const int kRow = myMainLayout->count();
   myMainLayout->addWidget(theWidget, kRow, kCol);
+  myMainLayout->setRowStretch(kRow, 0);
 }
 
 void ModuleBase_PageWidget::placePageWidget(ModuleBase_PageBase* theWidget)
@@ -46,7 +47,8 @@ void ModuleBase_PageWidget::placePageWidget(ModuleBase_PageBase* theWidget)
   }
   const int kCol = 0;
   const int kRow = myMainLayout->count();
-  myMainLayout->addWidget(aWidget, kRow, kCol);//, Qt::AlignTop | Qt::AlignLeft);
+  myMainLayout->addWidget(aWidget, kRow, kCol);
+  myMainLayout->setRowStretch(kRow, 0);
 }
 
 QLayout* ModuleBase_PageWidget::pageLayout()
index 023c728a9820d246da78e29c69444f4a470fbdb3..1731271aa941e79046335d8bc17245976d2cb71f 100644 (file)
@@ -156,7 +156,6 @@ ModuleBase_ModelWidget* ModuleBase_WidgetFactory
 
   } else if (theType == WDG_SWITCH) {
     result = new ModuleBase_WidgetSwitch(theParent, myWidgetApi, myParentId);
-    return result;
 
   } else if (theType == WDG_TOOLBOX_BOX || theType == WDG_SWITCH_CASE) {
     // Do nothing for "box" and "case"
index 616a5c357972c3468911cdf69d6017799ec64d66..c2e816e8def7cc62560d8cfba373523c5ba29d2f 100644 (file)
@@ -7,16 +7,19 @@
 
 #include <ModuleBase_WidgetToolbox.h>
 #include <ModuleBase_PageBase.h>
+#include <ModuleBase_ModelWidget.h>
 #include <ModuleBase_Tools.h>
 
 #include <ModelAPI_AttributeString.h>
 
 #include <QWidget>
+#include <Qlist>
 #include <QVBoxLayout>
 
 ModuleBase_WidgetToolbox::ModuleBase_WidgetToolbox(QWidget* theParent, const Config_WidgetAPI* theData,
                                                    const std::string& theParentId)
-: ModuleBase_ModelWidget(theParent, theData, theParentId)
+: ModuleBase_ModelWidget(theParent, theData, theParentId),
+  myIsPassFocusToCurrentPage(false)
 {
   QVBoxLayout* aMainLayout = new QVBoxLayout(this);
   ModuleBase_Tools::zeroMargins(aMainLayout);
@@ -63,15 +66,18 @@ bool ModuleBase_WidgetToolbox::restoreValue()
   bool isSignalsBlocked = myToolBox->blockSignals(true);
   myToolBox->setCurrentIndex(idx);
   myToolBox->blockSignals(isSignalsBlocked);
-  focusTo();
   return true;
 }
 
 QList<QWidget*> ModuleBase_WidgetToolbox::getControls() const
 {
-  QList<QWidget*> aList;
-  aList << myToolBox;
-  return aList;
+  QList<QWidget*> aResult;
+  int idx = myToolBox->currentIndex();
+  QList<ModuleBase_ModelWidget*> aModelWidgets = myPages[idx]->modelWidgets();
+  foreach(ModuleBase_ModelWidget* eachModelWidget, aModelWidgets) {
+    aResult << eachModelWidget->getControls();
+  }
+  return aResult;
 }
 
 bool ModuleBase_WidgetToolbox::focusTo()
@@ -79,13 +85,24 @@ bool ModuleBase_WidgetToolbox::focusTo()
   int idx = myToolBox->currentIndex();
   if (idx > myPages.count())
     return false;
-  myPages[idx]->takeFocus();
-  repaint();
-  return true;
+  return myPages[idx]->takeFocus();
+}
+
+void ModuleBase_WidgetToolbox::setHighlighted(bool)
+{
+  //page containers sould not be highlighted, do nothing
 }
 
+void ModuleBase_WidgetToolbox::enableFocusProcessing()
+{
+  myIsPassFocusToCurrentPage = true;
+}
+
+
 void ModuleBase_WidgetToolbox::activateCustom()
 {
+  // activate current page
+  focusTo();
 }
 
 bool ModuleBase_WidgetToolbox::storeValueCustom() const
@@ -103,5 +120,5 @@ bool ModuleBase_WidgetToolbox::storeValueCustom() const
 void ModuleBase_WidgetToolbox::onPageChanged()
 {
   storeValue();
-  focusTo();
+  if (myIsPassFocusToCurrentPage) focusTo();
 }
index 2e106a720903b35294ad6a48600260e28b3ca633..21ab5a2c28dd9a209fb40f2fe03be2b84fe15195 100644 (file)
@@ -25,6 +25,8 @@ class ModuleBase_WidgetToolbox : public ModuleBase_ModelWidget
   virtual bool restoreValue();
   virtual QList<QWidget*> getControls() const;
   virtual bool focusTo();
+  virtual void setHighlighted(bool isHighlighted);
+  virtual void enableFocusProcessing();
 
   int addPage(ModuleBase_PageBase* theWidget,
               const QString& theName, const QString& theCaseId);
@@ -37,6 +39,7 @@ class ModuleBase_WidgetToolbox : public ModuleBase_ModelWidget
   void onPageChanged();
 
  private:
+  bool myIsPassFocusToCurrentPage;
   QToolBox* myToolBox;
   QStringList myCaseIds;
   QList<ModuleBase_PageBase*> myPages;
index 1a20133b41d30f23f6d306a6def256f63a7057ca..96435f627a95826200c5ed20017793ba04989e46 100644 (file)
@@ -74,7 +74,9 @@ PartSet_WidgetSketchLabel::~PartSet_WidgetSketchLabel()
 
 QList<QWidget*> PartSet_WidgetSketchLabel::getControls() const
 {
-  return QList<QWidget*>();
+  QList<QWidget*> aResult;
+  aResult << myLabel;
+  return aResult;
 }
 
 void PartSet_WidgetSketchLabel::onPlaneSelected()
@@ -134,6 +136,17 @@ std::shared_ptr<GeomAPI_Pln> PartSet_WidgetSketchLabel::plane() const
 
 }
 
+bool PartSet_WidgetSketchLabel::focusTo()
+{
+  myLabel->setFocus();
+  return true;
+}
+
+void PartSet_WidgetSketchLabel::enableFocusProcessing()
+{
+  myLabel->installEventFilter(this);
+}
+
 void PartSet_WidgetSketchLabel::activateCustom()
 {
   std::shared_ptr<GeomAPI_Pln> aPlane = plane();
index 1189dd2286ce32c64c8699f6793b89a27fdb7246..9da513f5d2a3bc2527cf0eebc9b3693d5627716b 100644 (file)
@@ -71,7 +71,9 @@ Q_OBJECT
   std::shared_ptr<GeomAPI_Pln> plane() const;
 
   /// This control accepts focus
-  virtual bool focusTo() { return true; }
+  virtual bool focusTo();
+  virtual void setHighlighted(bool) { /*do nothing*/ };
+  virtual void enableFocusProcessing();
 
 signals:
   /// Signal on plane selection
index 0e5fcdf6008302f0de157cacc66a63239eea714c..26ea5d021e587ad4a7a5820c1b3373a5e38bdb2f 100644 (file)
@@ -90,13 +90,13 @@ void XGUI_PropertyPanel::setModelWidgets(const QList<ModuleBase_ModelWidget*>& t
 {
   myWidgets = theWidgets;
   if (theWidgets.empty()) return;
-  QList<ModuleBase_ModelWidget*>::const_iterator anIt = theWidgets.begin();
-  for (; anIt != theWidgets.end(); anIt++) {
-    connect(*anIt, SIGNAL(keyReleased(QKeyEvent*)), this, SIGNAL(keyReleased(QKeyEvent*)));
-    connect(*anIt, SIGNAL(focusOutWidget(ModuleBase_ModelWidget*)),
-            this,  SLOT(activateNextWidget(ModuleBase_ModelWidget*)));
-    connect(*anIt, SIGNAL(focusInWidget(ModuleBase_ModelWidget*)),
-            this,  SLOT(activateWidget(ModuleBase_ModelWidget*)));
+  foreach (ModuleBase_ModelWidget* aWidget, theWidgets) {
+    connect(aWidget, SIGNAL(focusInWidget(ModuleBase_ModelWidget*)),
+            this,    SLOT(activateWidget(ModuleBase_ModelWidget*)));
+    connect(aWidget, SIGNAL(focusOutWidget(ModuleBase_ModelWidget*)),
+            this,    SLOT(activateNextWidget(ModuleBase_ModelWidget*)));
+    connect(aWidget, SIGNAL(keyReleased(QKeyEvent*)),
+            this,    SIGNAL(keyReleased(QKeyEvent*)));
   }
   ModuleBase_ModelWidget* aLastWidget = theWidgets.last();
   if (aLastWidget) {
@@ -159,9 +159,9 @@ void XGUI_PropertyPanel::activateNextWidget(ModuleBase_ModelWidget* theWidget)
   }
   // Normaly focusTo is enough to activate widget
   // here is a special case on mouse click in the viewer
-  //if(aNextWidget == NULL) {
+  if(aNextWidget == NULL) {
     activateWidget(aNextWidget);
-  //}
+  }
 }
 
 void XGUI_PropertyPanel::activateNextWidget()
@@ -172,23 +172,24 @@ void XGUI_PropertyPanel::activateNextWidget()
 void XGUI_PropertyPanel::activateWidget(ModuleBase_ModelWidget* theWidget)
 {
   // Avoid activation of already actve widget. It could happen on focusIn event many times
-  if (theWidget == myActiveWidget)
+  if (theWidget == myActiveWidget) {
     return;
+  }
   if(myActiveWidget) {
     myActiveWidget->deactivate();
     myActiveWidget->setHighlighted(false);
   }
   if(theWidget) {
-    if (theWidget)
-      emit beforeWidgetActivated(theWidget);
-    theWidget->activate();
+    emit beforeWidgetActivated(theWidget);
     theWidget->setHighlighted(true);
+    theWidget->activate();
   }
   myActiveWidget = theWidget;
-  if (myActiveWidget)
+  if (myActiveWidget) {
     emit widgetActivated(theWidget);
-  else if (!isEditingMode())
+  } else if (!isEditingMode()) {
     emit noMoreWidgets();
+  }
 }
 
 void XGUI_PropertyPanel::setCancelEnabled(bool theEnabled)