]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #2388: Remember last user choice for all dialog boxes with a choice
authorvsv <vsv@opencascade.com>
Wed, 27 Dec 2017 13:56:49 +0000 (16:56 +0300)
committervsv <vsv@opencascade.com>
Wed, 27 Dec 2017 13:57:14 +0000 (16:57 +0300)
src/ModuleBase/ModuleBase_ChoiceCtrl.cpp
src/ModuleBase/ModuleBase_ChoiceCtrl.h
src/ModuleBase/ModuleBase_ModelWidget.h
src/ModuleBase/ModuleBase_PagedContainer.cpp
src/ModuleBase/ModuleBase_PagedContainer.h
src/ModuleBase/ModuleBase_WidgetChoice.cpp
src/ModuleBase/ModuleBase_WidgetChoice.h
src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp
src/ModuleBase/ModuleBase_WidgetMultiSelector.h
src/XGUI/XGUI_PropertyPanel.cpp
src/XGUI/XGUI_PropertyPanel.h

index 38afff3ca6c30efbff3e1c77d4778253554e7f83..67b5b6f186eb55d9b6b085ba783c921a4b63a74e 100644 (file)
@@ -132,6 +132,21 @@ void ModuleBase_ChoiceCtrl::setValue(int theVal)
   }
 }
 
+void ModuleBase_ChoiceCtrl::setValue(const QString& theVal)
+{
+  switch (myType) {
+  case RadioButtons:
+    foreach (QAbstractButton* aBtn, myButtons->buttons()) {
+      aBtn->setChecked(aBtn->toolTip() == theVal);
+    }
+    break;
+  case ComboBox:
+    myCombo->setCurrentText(theVal);
+    break;
+  }
+}
+
+
 void ModuleBase_ChoiceCtrl::setTooltip(QString theTip)
 {
   if (myType == ComboBox)
index 09530b9294ebfed2519d0d0b9dd3b1df26ceb62a..a072cd1adf070e8f557ef4968a18b13f823b042d 100644 (file)
@@ -75,6 +75,10 @@ public:
   /// \param theVal a value (from 0 to number of items)
   void setValue(int theVal);
 
+  /// Set value: text of button or item of combo box.
+  /// \param theVal a value (one of text items)
+  void setValue(const QString& theVal);
+
   /// Set tool tip for label. Used only for combo box.
   void setTooltip(QString theTip);
 
index 2e215404f25d7d713a78f515e5d1b748c1ac0c19..d2d0fd804b4d7337f486c23d3334ee329c7d43a2 100644 (file)
@@ -300,6 +300,10 @@ Q_OBJECT
   /// If not then it means that the widget do not need attribute at all.
   virtual bool usesAttribute() const { return true; }
 
+  /// It is called when user press Ok or OkPlus buttons in the parent property panel
+  /// By default this slot does nothing
+  virtual void onFeatureAccepted() {}
+
 signals:
   /// The signal about widget values are to be changed
   void beforeValuesChanged();
index b5e1aeb4dbe90d9177f00c8f93c9678ff5d55d23..27c685f8b3bfe7e3d0923ac681f292e3452816a0 100644 (file)
 #include <QVBoxLayout>
 
 
+static QMap<std::string, std::string> defaultValues;
+
 ModuleBase_PagedContainer::ModuleBase_PagedContainer(QWidget* theParent,
                                                      const Config_WidgetAPI* theData)
 : ModuleBase_ModelWidget(theParent, theData),
-  myIsFocusOnCurrentPage(false)
+  myIsFocusOnCurrentPage(false), myIsFirst(true)
 {
   // it is not obligatory to be ignored when property panel tries to activate next active widget
   // but if focus is moved to this control, it can accept it.
   myIsObligatory = false;
+  if (defaultValues.contains(myFeatureId))
+    myDefValue = defaultValues[myFeatureId];
 }
 
 ModuleBase_PagedContainer::~ModuleBase_PagedContainer()
@@ -93,10 +97,12 @@ bool ModuleBase_PagedContainer::restoreValueCustom()
     return false;
   DataPtr aData = myFeature->data();
   AttributeStringPtr aStringAttr = aData->string(attributeID());
-  QString aCaseId = QString::fromStdString(aStringAttr->value());
+  QString aCaseId = QString::fromStdString(myDefValue.empty()?
+                                           aStringAttr->value() : myDefValue);
+  myIsFirst = false;
   int idx = myCaseIds.indexOf(aCaseId);
   if (idx == -1)
-    return false;
+    idx = currentPageIndex();
   setCurrentPageIndex(idx);
   return true;
 }
@@ -113,9 +119,19 @@ bool ModuleBase_PagedContainer::storeValueCustom()
   if(!myFeature)
     return false;
   DataPtr aData = myFeature->data();
+
   AttributeStringPtr aStringAttr = aData->string(attributeID());
-  QString aWidgetValue = myCaseIds.at(currentPageIndex());
-  aStringAttr->setValue(aWidgetValue.toStdString());
+  std::string aWidgetValue;
+  if (myIsFirst)
+    aWidgetValue = myDefValue.empty()?
+        myCaseIds.at(currentPageIndex()).toStdString() : myDefValue;
+  else
+    aWidgetValue = myCaseIds.at(currentPageIndex()).toStdString();
+  myDefValue = aWidgetValue;
+  aStringAttr->setValue(aWidgetValue);
+
+  myIsFirst = false;
+
   updateObject(myFeature); // for preview
   return true;
 }
@@ -132,4 +148,8 @@ void ModuleBase_PagedContainer::onPageChanged()
     focusTo();
 }
 
+void ModuleBase_PagedContainer::onFeatureAccepted()
+{
+  defaultValues[myFeatureId] = myDefValue;
+}
 
index 2a731b18c140da04e09285de2c2db1605ca15841..cd525cdbae742e9ed63a48fdcf3f1d604482737c 100644 (file)
@@ -62,6 +62,9 @@ class MODULEBASE_EXPORT ModuleBase_PagedContainer : public ModuleBase_ModelWidge
   /// Redefinition of virtual function
   virtual void enableFocusProcessing();
 
+  /// The slot is called when user press Ok or OkPlus buttons in the parent property panel
+  virtual void onFeatureAccepted();
+
  protected:
    /// Returns index of current page
   virtual int currentPageIndex() const = 0;
@@ -86,7 +89,8 @@ class MODULEBASE_EXPORT ModuleBase_PagedContainer : public ModuleBase_ModelWidge
   bool myIsFocusOnCurrentPage;
   QStringList myCaseIds;
   QList<ModuleBase_PageBase*> myPages;
-
+  bool myIsFirst;
+  std::string myDefValue;
 };
 
 #endif /* MODULEBASE_PAGEDCONTAINER_H_ */
index 555fbf78b4c1eaeff123f96ba8d784aa0f086653..9d48799b68ab0713ec6e64934d134ad6d54f8870 100644 (file)
 #include <QRadioButton>
 #include <QToolButton>
 
+static QMap<std::string, int> defaultValues;
+
 ModuleBase_WidgetChoice::ModuleBase_WidgetChoice(QWidget* theParent,
                                                  const Config_WidgetAPI* theData)
-: ModuleBase_ModelWidget(theParent, theData)//, myCombo(0), myButtons(0)
+: ModuleBase_ModelWidget(theParent, theData), myIsFirst(true)
 {
+  myHasValue = defaultValues.contains(myFeatureId);
+  if (myHasValue)
+    myDefValue = defaultValues[myFeatureId];
+  else
+    myDefValue = 0;
+
   QString aLabelText = translate(theData->widgetLabel());
   QString aLabelIcon = QString::fromStdString(theData->widgetIcon());
   std::string aTypes = theData->getProperty("string_list");
@@ -94,7 +102,16 @@ bool ModuleBase_WidgetChoice::storeValueCustom()
   DataPtr aData = myFeature->data();
   std::shared_ptr<ModelAPI_AttributeInteger> aIntAttr = aData->integer(attributeID());
 
-  aIntAttr->setValue(myChoiceCtrl->value());
+  int aCase = 0;
+  if (myIsFirst)
+    aCase = myHasValue? myDefValue : myChoiceCtrl->value();
+  else
+    aCase = myChoiceCtrl->value();
+
+  aIntAttr->setValue(aCase);
+  myDefValue = aCase;
+  myIsFirst = false;
+
   updateObject(myFeature);
   return true;
 }
@@ -125,6 +142,8 @@ bool ModuleBase_WidgetChoice::restoreValueCustom()
     }
     myChoiceCtrl->blockSignals(isBlocked);
     emit itemSelected(this, aIntAttr->value());
+    myDefValue = aIntAttr->value();
+    myIsFirst = false;
   }
   return true;
 }
@@ -155,3 +174,8 @@ void ModuleBase_WidgetChoice::onCurrentIndexChanged(int theIndex)
 
   emit itemSelected(this, theIndex);
 }
+
+void ModuleBase_WidgetChoice::onFeatureAccepted()
+{
+  defaultValues[myFeatureId] = myDefValue;
+}
index de5b0e5657878a9aa15fbc33a58f8d11cb211253..dedec5978840d357fa56ac0642bbcad4866d23d7 100644 (file)
@@ -71,6 +71,9 @@ Q_OBJECT
   /// \return the title value
   QString getPropertyPanelTitle(int theIndex);
 
+  /// The slot is called when user press Ok or OkPlus buttons in the parent property panel
+  virtual void onFeatureAccepted();
+
 signals:
   /// Segnal about selected item
   /// \param theWidget selected widget
@@ -89,17 +92,15 @@ private slots:
   void onCurrentIndexChanged(int theIndex);
 
 private:
-  /// The label
-  //QLabel* myLabel;
-
-  /// The control
-  //QComboBox* myCombo;
-  //QButtonGroup* myButtons;
   ModuleBase_ChoiceCtrl* myChoiceCtrl;
 
   // XML definition of titles
   QStringList myButtonTitles;
   std::string myStringListAttribute;
+
+  bool myIsFirst;
+  int myDefValue;
+  bool myHasValue;
 };
 
 #endif
index 48df5b61bb2a5110692ae7320075bb9bae2fcb3a..a13bdf1d04aa89dced3c5d099b9e53f3370d2620 100755 (executable)
@@ -97,13 +97,17 @@ QStringList getIconsList(const QStringList& theNames)
   return aIcons;
 }
 
+/// Stores default values of selected option (selection mode)
+/// It is used only in case if myTypeCtrl is used
+static QMap<std::string, std::string> defaultValues;
 
 
 ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParent,
                                                                ModuleBase_IWorkshop* theWorkshop,
                                                                const Config_WidgetAPI* theData)
 : ModuleBase_WidgetSelector(theParent, theWorkshop, theData),
-  myIsSetSelectionBlocked(false), myCurrentHistoryIndex(-1)
+  myIsSetSelectionBlocked(false), myCurrentHistoryIndex(-1),
+  myIsFirst(true)
 {
   std::string aPropertyTypes = theData->getProperty("type_choice");
   QString aTypesStr = aPropertyTypes.c_str();
@@ -118,6 +122,7 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen
   myTypeCtrl->setLabel(tr("Type"));
   myTypeCtrl->setValue(0);
   aMainLay->addWidget(myTypeCtrl, 0, 0, 1, 2);
+  myDefMode = myShapeTypes.first().toStdString();
 
   // There is no sense to parameterize list of types while we can not parameterize selection mode
   // if the xml definition contains one type, the controls to select a type should not be shown
@@ -154,6 +159,12 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen
   connect(myTypeCtrl, SIGNAL(valueChanged(int)), this, SLOT(onSelectionTypeChanged()));
 
   myIsNeutralPointClear = theData->getBooleanAttribute("clear_in_neutral_point", true);
+  if (myShapeTypes.size() > 1 || myIsUseChoice) {
+    if (defaultValues.contains(myFeatureId)) {
+      myDefMode = defaultValues[myFeatureId];
+      myTypeCtrl->setValue(myDefMode.c_str());
+    }
+  }
 }
 
 ModuleBase_WidgetMultiSelector::~ModuleBase_WidgetMultiSelector()
@@ -205,7 +216,13 @@ bool ModuleBase_WidgetMultiSelector::storeValueCustom()
   std::string aType = anAttribute->attributeType();
   if (aType == ModelAPI_AttributeSelectionList::typeId()) {
     AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
-    aSelectionListAttr->setSelectionType(myTypeCtrl->textValue().toStdString());
+
+    std::string aMode = myTypeCtrl->textValue().toStdString();
+    if (myTypeCtrl->isVisible() && myIsFirst && (!myDefMode.empty()))
+      aMode = myDefMode;
+
+    aSelectionListAttr->setSelectionType(aMode);
+    myIsFirst = false;
   }
   return true;
 }
@@ -223,8 +240,11 @@ bool ModuleBase_WidgetMultiSelector::restoreValueCustom()
     AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
     // Restore shape type
     std::string aSelectionType = aSelectionListAttr->selectionType().c_str();
-    if (!aSelectionType.empty())
+    if (!aSelectionType.empty()) {
       setCurrentShapeType(ModuleBase_Tools::shapeType(aSelectionType.c_str()));
+      myDefMode = aSelectionType;
+      myIsFirst = false;
+    }
   }
   updateSelectionList();
   return true;
@@ -965,4 +985,10 @@ QList<ActionInfo>
     }
   }
   return aList;
-}
\ No newline at end of file
+}
+
+
+void ModuleBase_WidgetMultiSelector::onFeatureAccepted()
+{
+  defaultValues[myFeatureId] = myDefMode;
+}
index be8bfee91b49e97f17b64547ae34905ea152ba91..221ba0e6b36f782818276f7af2c03b34ff4e2a15 100755 (executable)
@@ -111,6 +111,9 @@ class MODULEBASE_EXPORT ModuleBase_WidgetMultiSelector : public ModuleBase_Widge
   /// \param theActionType type of action. It can be ActionUndo or ActionRedo.
   virtual QList<ActionInfo> actionsList(ModuleBase_ActionType theActionType) const;
 
+  /// The slot is called when user press Ok or OkPlus buttons in the parent property panel
+  virtual void onFeatureAccepted();
+
 public slots:
   /// Slot is called on selection type changed
   void onSelectionTypeChanged();
@@ -239,6 +242,9 @@ protected:
 
   /// Position in a container of selected values
   int myCurrentHistoryIndex;
+
+  bool myIsFirst;
+  std::string myDefMode;
 };
 
 #endif /* MODULEBASE_WIDGETFILESELECTOR_H_ */
index 5d287669ffb6cf4794a1ff28c6ad5fcd7a3e0197..bc172e5f99a654e26c5cae7a5f0eb64d41469d31 100755 (executable)
@@ -167,7 +167,8 @@ void XGUI_PropertyPanel::cleanContent()
 void XGUI_PropertyPanel::setModelWidgets(const QList<ModuleBase_ModelWidget*>& theWidgets)
 {
   myWidgets = theWidgets;
-  if (theWidgets.empty()) return;
+  if (theWidgets.empty())
+    return;
   foreach (ModuleBase_ModelWidget* aWidget, theWidgets) {
     connect(aWidget, SIGNAL(focusInWidget(ModuleBase_ModelWidget*)),
             this,    SLOT(onFocusInWidget(ModuleBase_ModelWidget*)));
@@ -177,7 +178,6 @@ void XGUI_PropertyPanel::setModelWidgets(const QList<ModuleBase_ModelWidget*>& t
             this,    SIGNAL(keyReleased(QObject*, QKeyEvent*)));
     connect(aWidget, SIGNAL(enterClicked(QObject*)),
             this,    SIGNAL(enterClicked(QObject*)));
-
   }
 }
 
@@ -564,8 +564,20 @@ void XGUI_PropertyPanel::setupActions(XGUI_ActionsMgr* theMgr)
     QAction* anAct = theMgr->operationStateAction(aActionIds.at(i));
     aBtn->setDefaultAction(anAct);
   }
+  QToolButton* aBtn = findButton(PROP_PANEL_OK);
+  connect(aBtn->defaultAction(), SIGNAL(triggered(bool)), this, SLOT(onAcceptData()));
+  aBtn = findButton(PROP_PANEL_OK_PLUS);
+  connect(aBtn->defaultAction(), SIGNAL(triggered(bool)), this, SLOT(onAcceptData()));
 }
 
+void XGUI_PropertyPanel::onAcceptData()
+{
+  foreach (ModuleBase_ModelWidget* aWidget, myWidgets) {
+    aWidget->onFeatureAccepted();
+  }
+}
+
+
 ModuleBase_ModelWidget* XGUI_PropertyPanel::preselectionWidget() const
 {
   return myPreselectionWidget;
index 5b1a68b88c16daf6e677081aa03da9cd2c557acc..21971af119346268c031c93a49def00500f6dc46 100644 (file)
@@ -160,6 +160,8 @@ public slots:
   /// \param theWidget the current widget
   void onActivateNextWidget(ModuleBase_ModelWidget* theWidget);
 
+  void onAcceptData();
+
 signals:
   /// The signal is emitted if the enter is clicked in the control of the widget
   /// \param theObject a sender of the event