]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #144 If an operation has valid feature after initialization by preselection...
authorsbh <sergey.belash@opencascade.com>
Wed, 24 Sep 2014 11:52:30 +0000 (15:52 +0400)
committersbh <sergey.belash@opencascade.com>
Wed, 24 Sep 2014 11:52:30 +0000 (15:52 +0400)
18 files changed:
src/Config/Config_Keywords.h
src/Config/Config_WidgetAPI.cpp
src/Config/Config_WidgetAPI.h
src/ModuleBase/ModuleBase_IOperation.h
src/ModuleBase/ModuleBase_ModelWidget.cpp
src/ModuleBase/ModuleBase_ModelWidget.h
src/ModuleBase/ModuleBase_Operation.cpp
src/ModuleBase/ModuleBase_Operation.h
src/ModuleBase/ModuleBase_WidgetFactory.cpp
src/ModuleBase/ModuleBase_WidgetFactory.h
src/ModuleBase/ModuleBase_WidgetFeature.cpp
src/PartSet/PartSet_OperationFeatureBase.cpp
src/PartSet/PartSet_OperationFeatureBase.h
src/PartSet/PartSet_OperationFeatureCreate.cpp
src/SketchPlugin/plugin-Sketch.xml
src/XGUI/XGUI_OperationMgr.cpp
src/XGUI/XGUI_OperationMgr.h
src/XGUI/XGUI_Workshop.cpp

index f8f3bd6ed959cb7b5872853390734fda5581685e..8f0fda2e19da13441d7b79493c0f884ab2d82a62 100644 (file)
@@ -49,6 +49,7 @@ const static char* FEATURE_TEXT = "title";
 const static char* FEATURE_KEYSEQUENCE = "keysequence";
 const static char* FEATURE_NESTED = "nested";
 const static char* FEATURE_INTERNAL = "internal";
+const static char* FEATURE_OBLIGATORY = "obligatory";
 // TODO: Rename
 const static char* PREVIOUS_FEATURE_PARAM = "previous_feature_param";
 const static char* ANY_WDG_TOOLTIP = FEATURE_TOOLTIP;
index 333f9219a37594c61f653bdd7b529c76dbc6d216..7d548ea245b838bda4b6a598be0a111a8252aa43 100644 (file)
@@ -12,6 +12,9 @@
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 
+#include <string>
+#include <algorithm>
+
 Config_WidgetAPI::Config_WidgetAPI(std::string theRawXml)
 {
   myDoc = xmlParseDoc(BAD_CAST theRawXml.c_str());
@@ -90,6 +93,19 @@ std::string Config_WidgetAPI::getProperty(const char* thePropName) const
   return result;
 }
 
+bool Config_WidgetAPI::getBooleanAttribute(const char* theAttributeName, bool theDefault) const
+{
+  std::string prop = getProperty(theAttributeName);
+  std::transform(prop.begin(), prop.end(), prop.begin(), ::tolower);
+  bool result = theDefault;
+  if (prop == "true" || prop == "1") {
+    result = true;
+  } else if (prop == "false" || prop == "0") {
+    result = false;
+  }
+  return result;
+}
+
 std::string Config_WidgetAPI::widgetId() const
 {
   return getProperty(_ID);
index 02131a2debd86ef7c9d8867c873676be6b6820fe..44349fc418ec38d2d352966856b635f841e6f174 100644 (file)
@@ -41,6 +41,14 @@ class CONFIG_EXPORT Config_WidgetAPI
 
   std::string getProperty(const char* thePropName) const;
 
+  /// Checks if the XML representation of widget has given attribute,
+  /// if yes - returns it's bool value, if no, or if the value can not
+  /// be converted to bool - returns theDefault.
+  /// \param theAttributeName attribute to check
+  /// \param theDefault default value on bad data
+  /// \return the boolean result
+  bool getBooleanAttribute(const char* theAttributeName, bool theDefault) const;
+
   bool isComputedDefault() const;
 
  protected:
index 28822efa51b9cda21a4ed3a221641271020d7c69..bc10a14c4e0dc3d29d5f80e53ce9f37f36fb2908 100644 (file)
@@ -66,11 +66,10 @@ Q_OBJECT
   virtual bool isGranted() const  { return false; }
 
   /**
-  * Must return True if the given opertation can be launched as nested to current one.
-  * By default it returns false and it has to be redefined for operations which expect
-  * launching of nested operations
+  * Must return True if the operation's feature is valid.
+  * Since IOperation does not have any feature returns false.
   */
-  virtual bool isValid(ModuleBase_IOperation* theOperation) const { return false; }
+  virtual bool isValid() const { return false; }
 
   /// Sets a list of model widgets, according to the operation feature xml definition
   /// \param theXmlRepresentation an xml feature definition
index c6670f24ae1647f8b8476dd2a088077c72d9833e..f3da462d45ad1bd06f9fc6915ce6c0c7a5c6383e 100644 (file)
@@ -8,7 +8,8 @@
 #include <ModelAPI_Attribute.h>
 #include <ModelAPI_Events.h>
 
-#include "Config_WidgetAPI.h"
+#include <Config_Keywords.h>
+#include <Config_WidgetAPI.h>
 
 #include <Events_Loop.h>
 
@@ -21,6 +22,7 @@ ModuleBase_ModelWidget::ModuleBase_ModelWidget(QObject* theParent, const Config_
       myParentId(theParentId)
 {
   myIsComputedDefault = false;
+  myIsObligatory = theData ? theData->getBooleanAttribute(FEATURE_OBLIGATORY, true) : true;
   myAttributeID = theData ? theData->widgetId() : "";
 }
 
@@ -29,6 +31,16 @@ bool ModuleBase_ModelWidget::isInitialized(ObjectPtr theObject) const
   return theObject->data()->attribute(attributeID())->isInitialized();
 }
 
+void ModuleBase_ModelWidget::enableFocusProcessing()
+{
+  QList<QWidget*> aMyControls = getControls();
+  foreach(QWidget*  eachControl, aMyControls) {
+    if(!myFocusInWidgets.contains(eachControl)) {
+      enableFocusProcessing(eachControl);
+    }
+  }
+}
+
 bool ModuleBase_ModelWidget::focusTo()
 {
   QList<QWidget*> aControls = getControls();
@@ -43,6 +55,7 @@ bool ModuleBase_ModelWidget::focusTo()
   return true;
 }
 
+
 void ModuleBase_ModelWidget::updateObject(ObjectPtr theObj) const
 {
   Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
@@ -50,7 +63,7 @@ void ModuleBase_ModelWidget::updateObject(ObjectPtr theObj) const
   ModelAPI_EventCreator::get()->sendUpdated(theObj, anEvent);
 }
 
-void ModuleBase_ModelWidget::processFocus(QWidget* theWidget)
+void ModuleBase_ModelWidget::enableFocusProcessing(QWidget* theWidget)
 {
   theWidget->setFocusPolicy(Qt::StrongFocus);
   theWidget->installEventFilter(this);
@@ -60,11 +73,10 @@ void ModuleBase_ModelWidget::processFocus(QWidget* theWidget)
 bool ModuleBase_ModelWidget::eventFilter(QObject* theObject, QEvent *theEvent)
 {
   QWidget* aWidget = dynamic_cast<QWidget*>(theObject);
-  if (theEvent->type() == QEvent::FocusIn && myFocusInWidgets.contains(aWidget)) {
+  if (theEvent->type() == QEvent::MouseButtonRelease && 
+      myFocusInWidgets.contains(aWidget)) {
     emit focusInWidget(this);
-    return true;
-  } else {
-    // pass the event on to the parent class
-    return QObject::eventFilter(theObject, theEvent);
-  }
+  } 
+  // pass the event on to the parent class
+  return QObject::eventFilter(theObject, theEvent);
 }
index 968f5960ce72bb7fc891563b8839712009d4dc83..91b9738546d4e3e55c299ba48f7041c368604c44 100644 (file)
@@ -52,10 +52,13 @@ Q_OBJECT
   /// \return the boolean result
   bool isInitialized(ObjectPtr theObject) const;
 
-  bool isComputedDefault()
-  {
-    return myIsComputedDefault;
-  }
+  /// Returns true, if default value of the widget should be computed
+  /// on operation's execute, like radius for circle's constraint (can not be zero)
+  bool isComputedDefault() { return myIsComputedDefault; }
+
+  /// Returns false for non-obligatory widgets which are
+  /// valid even if they are not initialized
+  bool isObligatory() { return myIsObligatory; }
 
   /// Saves the internal parameters to the given feature
   /// \param theObject a model feature to be changed
@@ -63,6 +66,7 @@ Q_OBJECT
 
   virtual bool restoreValue() = 0;
 
+  void enableFocusProcessing();
   /// Set focus to the first control of the current widget. The focus policy of the control is checked.
   /// If the widget has the NonFocus focus policy, it is skipped.
   /// \return the state whether the widget can accept the focus
@@ -125,14 +129,18 @@ signals:
 
   void updateObject(ObjectPtr theObj) const;
 
+ private:
   /// Let the widget process FocusIn events
-  void processFocus(QWidget* theWidget);
+  void enableFocusProcessing(QWidget* theWidget);
 
-  std::string myAttributeID;  /// the attribute name of the model feature
+ protected:
+  std::string myAttributeID; /// the attribute name of the model feature
   std::string myParentId;    /// name of parent
   FeaturePtr myFeature;
 
-  bool myIsComputedDefault;
+    bool myIsComputedDefault; /// Value should be computed on execute,
+                              /// like radius for circle's constraint (can not be zero)
+    bool myIsObligatory;      /// Non-obligatory widget is valid even if it is not initialized
 
  private:
    /// Contains a list of widgets that may accept focus
index 9b24d742d722f407fd27ae9c99fc0a1b7e056f70..fd0724f287ef8e32fbeb2045f18e0961f75beae3 100644 (file)
@@ -44,6 +44,16 @@ FeaturePtr ModuleBase_Operation::feature() const
   return myFeature;
 }
 
+bool ModuleBase_Operation::isValid() const
+{
+  if (!myFeature)
+    return true; // rename operation
+  //Get validators for the Id
+  SessionPtr aMgr = ModelAPI_Session::get();
+  ModelAPI_ValidatorsFactory* aFactory = aMgr->validators();
+  return aFactory->validate(myFeature);
+}
+
 bool ModuleBase_Operation::isNestedOperationsEnabled() const
 {
   return true;
index 0a5e1a54db084bdc52072512f008d0368a5427d8..8e36a770463e439e5905ba01eea507fe27937502 100644 (file)
@@ -11,7 +11,7 @@
 #include <ModuleBase.h>
 #include <ModuleBase_IOperation.h>
 
-#include "ModelAPI_Feature.h"
+#include <ModelAPI_Feature.h>
 
 #include <QObject>
 #include <QString>
@@ -57,6 +57,9 @@ Q_OBJECT
   /// \return the feature
   FeaturePtr feature() const;
 
+  /// Returns true is feature of operation is valid.
+  virtual bool isValid() const;
+
   /// Returns whether the nested operations are enabled.
   /// The state can depend on the operation current state.
   /// \return enabled state
index 90886145f12e9b8e18b2f1b6c9ca5e8b96df6eeb..1063cfa9acf272b0d1bc6fc1c2e7001ce718b90a 100644 (file)
@@ -67,7 +67,7 @@ void ModuleBase_WidgetFactory::createWidget(QWidget* theParent)
     //Create a widget (doublevalue, groupbox, toolbox, etc.
     QWidget* aWidget = createWidgetByType(aWdgType, theParent);
     if (aWidget) {
-      if (!isInternalWidget(aWdgType)) {
+      if (!myWidgetApi->getBooleanAttribute(FEATURE_INTERNAL, false)) {
         aWidgetLay->addWidget(aWidget);
       } else {
         aWidget->setVisible(false);
@@ -264,17 +264,6 @@ QWidget* ModuleBase_WidgetFactory::choiceControl(QWidget* theParent)
   return aChoiceWgt->getControl();
 }
 
-bool ModuleBase_WidgetFactory::isInternalWidget(const std::string& theType)
-{
-  std::string prop = myWidgetApi->getProperty(FEATURE_INTERNAL);
-
-  std::transform(prop.begin(), prop.end(), prop.begin(), ::tolower);
-  if (prop.empty() || prop == "false" || prop == "0") {
-    return false;
-  }
-  return true;
-}
-
 QString ModuleBase_WidgetFactory::qs(const std::string& theStdString) const
 {
   return QString::fromStdString(theStdString);
index 320e88f95ccd602e6dc2aef3d42ec4491a1a3944..6ea4debf31035e2c1bfae2b586f509b5f574bfab 100644 (file)
@@ -49,11 +49,6 @@ class MODULEBASE_EXPORT ModuleBase_WidgetFactory
   QWidget* fileSelectorControl(QWidget* theParent);
   QWidget* choiceControl(QWidget* theParent);
 
-  /// Check whether the XML definition for the given type contains internal property
-  /// \param theType the widget type
-  /// \return the boolean result
-  bool isInternalWidget(const std::string& theType);
-
   QString qs(const std::string& theStdString) const;
 
  private:
index 22b6c316f48f1435c13d2a3a143468105f7eda11..4269711c8a3d15eea287901016083d28857aadf5 100644 (file)
@@ -43,7 +43,6 @@ ModuleBase_WidgetFeature::ModuleBase_WidgetFeature(QWidget* theParent,
   QString anObjName = QString::fromStdString(attributeID());
   myEditor->setObjectName(anObjName);
   myEditor->setReadOnly(true);
-  processFocus(myEditor);
   aControlLay->addWidget(myEditor);
 
   QString aTTip = QString::fromStdString(theData->widgetTooltip());
index 0363a3eaedd4cb4c962469b6fd8b00aba863b8a1..e369667bbdc1a396791a87befb34e52e1fff88a3 100644 (file)
@@ -116,6 +116,18 @@ void PartSet_OperationFeatureBase::mouseReleased(QMouseEvent* theEvent, Handle(V
 void PartSet_OperationFeatureBase::onWidgetActivated(ModuleBase_ModelWidget* theWidget)
 {
   myActiveWidget = theWidget;
+  activateByPreselection();
+  if (myInitFeature && myActiveWidget) {
+    ModuleBase_WidgetPoint2D* aWgt = dynamic_cast<ModuleBase_WidgetPoint2D*>(myActiveWidget);
+    if (aWgt && aWgt->initFromPrevious(myInitFeature)) {
+      myInitFeature = FeaturePtr();
+      emit activateNextWidget(myActiveWidget);
+    }
+  }
+}
+
+void PartSet_OperationFeatureBase::activateByPreselection()
+{
   if ((myPreSelection.size() > 0) && myActiveWidget) {
     const ModuleBase_ViewerPrs& aPrs = myPreSelection.front();
     ModuleBase_WidgetValueFeature aValue;
@@ -124,12 +136,9 @@ void PartSet_OperationFeatureBase::onWidgetActivated(ModuleBase_ModelWidget* the
       myPreSelection.remove(aPrs);
       emit activateNextWidget(myActiveWidget);
     }
-  }
-  if (myInitFeature && myActiveWidget) {
-    ModuleBase_WidgetPoint2D* aWgt = dynamic_cast<ModuleBase_WidgetPoint2D*>(myActiveWidget);
-    if (aWgt && aWgt->initFromPrevious(myInitFeature)) {
-      myInitFeature = FeaturePtr();
-      emit activateNextWidget(myActiveWidget);
+    // If preselection is enough to make a valid feature - apply it immediately
+    if(isValid()) {
+      commit();
     }
   }
 }
index 34548056b002b3818f41ac3997d92c13a78f7149..5a0c66bf0fbcd6e22d0f3d47666c61c41c3c31f9 100644 (file)
@@ -62,6 +62,8 @@ Q_OBJECT
   virtual void onWidgetActivated(ModuleBase_ModelWidget* theWidget);
 
  protected:
+  ///
+ void activateByPreselection();
   /// Set value to the active widget
   /// \param theFeature the feature
   /// \param theX the horizontal coordinate
index 845efd6a13858577047b02137cdf22aba6946edb..2fd670acecfb825d9335cf9dd15d38ccac1a155e 100644 (file)
@@ -160,8 +160,6 @@ void PartSet_OperationFeatureCreate::activateNextToCurrentWidget()
 void PartSet_OperationFeatureCreate::startOperation()
 {
   PartSet_OperationSketchBase::startOperation();
-  //setPointSelectionMode(!myInitFeature ? SM_FirstPoint : SM_SecondPoint);
-
   emit multiSelectionEnabled(false);
 }
 
index 04a99179e35405f7844edbd0aef9670dcfccca2e..72b96c18b9b062975da571a8bfb12973bea3df91 100644 (file)
@@ -39,7 +39,7 @@
           <validator id="SketchPlugin_ResultLine"/>
           <validator id="SketchPlugin_DistanceAttr" parameters="ConstraintEntityA"/>
         </feature_or_attribute_selector>
-        <point_selector id="ConstraintFlyoutValuePnt" internal="1"/>
+        <point_selector id="ConstraintFlyoutValuePnt" internal="1" obligatory="0"/>
         <doublevalue_editor label="Value" tooltip="Constraint value" id="ConstraintValue" default="computed"/>
         <validator id="PartSet_DistanceValidator"/>
       </feature>
@@ -49,7 +49,7 @@
         <feature_selector id="ConstraintEntityA" label="Line" tooltip="Select an line in the viewer">
           <validator id="SketchPlugin_ResultLine"/>
         </feature_selector>
-        <point_selector id="ConstraintFlyoutValuePnt" internal="1"/>
+        <point_selector id="ConstraintFlyoutValuePnt" internal="1" obligatory="0"/>
         <doublevalue_editor label="Value" tooltip="Constraint value" id="ConstraintValue" default="computed"/>
         <validator id="PartSet_LengthValidator"/> 
       </feature>
@@ -59,7 +59,7 @@
         <feature_selector id="ConstraintEntityA" label="Circle or Arc" tooltip="Select a circle or an arc in the viewer">
           <validator id="SketchPlugin_ResultArc"/>
         </feature_selector>
-        <point_selector id="ConstraintFlyoutValuePnt" internal="1"/>
+        <point_selector id="ConstraintFlyoutValuePnt" internal="1" obligatory="0"/>
         <doublevalue_editor label="Value" tooltip="Constraint value" id="ConstraintValue" default="computed"/>
         <validator id="PartSet_RadiusValidator"/>
       </feature>
@@ -73,7 +73,7 @@
           <validator id="SketchPlugin_ResultLine"/>
           <validator id="SketchPlugin_DifferentObjects"/>
         </feature_selector>
-        <point_selector id="ConstraintFlyoutValuePnt" internal="1"/>
+        <point_selector id="ConstraintFlyoutValuePnt" internal="1" obligatory="0"/>
         <validator id="PartSet_ParallelValidator"/>
       </feature>
       
index aa677172b91c507b175f94f58930dde2b4efeeea..4220b3bd03e6be6c402f854548f9bd244d83d7ac 100644 (file)
@@ -5,8 +5,6 @@
 #include "XGUI_OperationMgr.h"
 
 #include "ModuleBase_Operation.h"
-#include <ModelAPI_Validator.h>
-#include <ModelAPI_FeatureValidator.h>
 
 #include <QMessageBox>
 #include <QApplication>
@@ -110,33 +108,20 @@ bool XGUI_OperationMgr::abortAllOperations()
   return result;
 }
 
-bool XGUI_OperationMgr::validateOperation(ModuleBase_Operation* theOperation)
-{
-  if (!theOperation)
-    return false;
-  //Get operation feature to validate
-  FeaturePtr aFeature = theOperation->feature();
-  if (!aFeature) return true; // rename operation
-  //Get validators for the Id
-  SessionPtr aMgr = ModelAPI_Session::get();
-  ModelAPI_ValidatorsFactory* aFactory = aMgr->validators();
-
-  bool isValid = aFactory->validate(aFeature);
-  emit operationValidated(isValid);
-  return isValid;
-}
-
 void XGUI_OperationMgr::onValidateOperation()
 {
   if (!hasOperation())
     return;
   ModuleBase_Operation* anOperation = currentOperation();
-  validateOperation(currentOperation());
+  if(anOperation) {
+    bool isValid = anOperation->isValid();
+    emit operationValidated(isValid);
+  }
 }
 
 bool XGUI_OperationMgr::commitOperation()
 {
-  if (validateOperation(currentOperation())) {
+  if (hasOperation() && currentOperation()->isValid()) {
     onCommitOperation();
     return true;
   }
@@ -150,20 +135,19 @@ void XGUI_OperationMgr::resumeOperation(ModuleBase_Operation* theOperation)
 
 bool XGUI_OperationMgr::canStartOperation(ModuleBase_Operation* theOperation)
 {
-  bool aCanStart = true;
+  return true;
+  /*bool aCanStart = true;
   ModuleBase_Operation* aCurrentOp = currentOperation();
   if (aCurrentOp) {
     if (!theOperation->isGranted()) {
-      if (!aCurrentOp->isValid(theOperation)) {
-        if (canAbortOperation()) {
-          aCurrentOp->abort();
-        } else {
-          aCanStart = false;
-        }
+      if (canAbortOperation()) {
+        aCurrentOp->abort();
+      } else {
+        aCanStart = false;
       }
     }
   }
-  return aCanStart;
+  return aCanStart;*/
 }
 
 
index e43485b5c392a0a850267cea3a1107a6b26ea2d5..b028731a4f3319cd6d89abf311be15ee08181d06 100644 (file)
@@ -89,10 +89,6 @@ signals:
   /// \return the state whether the operation is resumed
   void resumeOperation(ModuleBase_Operation* theOperation);
 
-  /// Checks if given operation is Valid, if so sends operationValidated signal
-  /// \param theOperation to be validated
-  /// \return validation state (true means valid)
-  bool validateOperation(ModuleBase_Operation* theOperation);
   /// Returns whether the operation can be started. Check if there is already started operation and
   /// the granted parameter of the launched operation
   /// \param theOperation an operation to check
index 25866c87cd26bb6216df220c51dbd62c819548de..8ed2acfcefc2ab9561cebff457d25a8da387c449 100644 (file)
@@ -495,6 +495,7 @@ void XGUI_Workshop::onOperationStarted()
     for (; anIt != aLast; anIt++) {
       aWidget = *anIt;
       aWidget->setFeature(aOperation->feature());
+      aWidget->enableFocusProcessing();
       QObject::connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onWidgetValuesChanged()));
       // Init default values
       if (!aOperation->isEditOperation() && !aWidget->isComputedDefault()) {