1 #include "ModuleBase_ParamSpinBox.h"
3 #include <ModelAPI_Session.h>
4 #include <ModelAPI_Document.h>
5 #include <ModelAPI_ResultParameter.h>
6 #include <ModelAPI_AttributeDouble.h>
7 #include <ModelAPI_Tools.h>
14 #include <QApplication>
20 ModuleBase_ParamSpinBox::ModuleBase_ParamSpinBox(QWidget* theParent, int thePrecision)
21 : ModuleBase_DoubleSpinBox(theParent, thePrecision),
22 myAcceptVariables(true)
24 connectSignalsAndSlots();
30 ModuleBase_ParamSpinBox::~ModuleBase_ParamSpinBox()
35 \brief Perform \a steps increment/decrement steps.
37 Re-implemented to handle cases when Notebook variable
38 name is specified by the user as the widget text.
39 Otherwise, simply calls the base implementation.
41 \param steps number of increment/decrement steps
43 void ModuleBase_ParamSpinBox::stepBy(int steps)
45 if ((!myTextValue.isEmpty()) && hasVariable())
48 ModuleBase_DoubleSpinBox::stepBy(steps);
52 \brief Connect signals and slots.
54 void ModuleBase_ParamSpinBox::connectSignalsAndSlots()
56 connect(this, SIGNAL(valueChanged(const QString&)),
57 this, SLOT(onTextChanged(const QString&)));
60 void ModuleBase_ParamSpinBox::onTextChanged(const QString& text)
65 double ModuleBase_ParamSpinBox::valueFromText(const QString& theText) const
67 if (!hasVariable(theText))
68 return ModuleBase_DoubleSpinBox::valueFromText(theText);
70 // small hack: return length of the string to initiate valuesChanged signal
71 return qHash(theText);
74 QString ModuleBase_ParamSpinBox::textFromValue (double theValue) const
76 if ((!myTextValue.isEmpty()) && hasVariable(myTextValue)){
79 return ModuleBase_DoubleSpinBox::textFromValue(theValue);
83 \brief This function is used to determine whether input is valid.
84 \param str currently entered value
85 \param pos cursor position in the string
86 \return validating operation result
88 QValidator::State ModuleBase_ParamSpinBox::validate(QString& str, int& pos) const
90 // Trying to interpret the current input text as a numeric value
91 if (!hasVariable(str))
92 return ModuleBase_DoubleSpinBox::validate(str, pos);
94 QValidator::State res = QValidator::Invalid;
95 if (isAcceptVariables()) {
96 res = QValidator::Acceptable;
102 \brief This function is used to set a current value for this spinbox.
103 \param value current value
105 void ModuleBase_ParamSpinBox::setValue(const double value)
107 myTextValue = ModuleBase_DoubleSpinBox::textFromValue(value);
108 ModuleBase_DoubleSpinBox::setValue(value);
112 \brief This function is used to set a text for this spinbox.
113 \param value current value
115 void ModuleBase_ParamSpinBox::setText(const QString& value)
118 lineEdit()->setText(value);
122 \brief Enables or disables variable names in the spin box.
123 By default, variable names are enabled.
124 \param flag If true, variable names are enabled.
126 void ModuleBase_ParamSpinBox::setAcceptVariables(const bool flag)
128 myAcceptVariables = flag;
132 \brief Returns true if the spin box accepts variable names.
134 bool ModuleBase_ParamSpinBox::isAcceptVariables() const
136 return myAcceptVariables;
139 bool ModuleBase_ParamSpinBox::hasVariable() const
141 if (myTextValue.isEmpty())
143 return hasVariable(myTextValue);
146 bool ModuleBase_ParamSpinBox::hasVariable(const QString& theText) const
148 //const QString aDigitPattern = QString("[-+]?[0-9]*[%1]?[0-9]*([eE][-+]?[0-9]+)?");
150 //bool aHasDigit = false;
152 // QRegExp varNameMask(aDigitPattern.arg("."));
153 // aHasDigit = varNameMask.exactMatch(theText);
157 // QRegExp varNameMask(aDigitPattern.arg(","));
158 // aHasDigit = varNameMask.exactMatch(theText);
160 bool isDouble = false;
161 QLocale::c().toDouble(theText, &isDouble);
163 // theText.toDouble(&isDouble);
165 // QLocale aLoc; // create default locale
166 // QChar aDecPnt = aLoc.decimalPoint();
167 // if (aDecPnt == '.')
168 // isDouble = theText.contains(aDecPnt) || (!theText.contains(','));
169 // else if (aDecPnt == ',')
170 // isDouble = theText.contains(aDecPnt) || (!theText.contains('.'));
176 \brief This function is used to determine whether input is valid.
177 \return validating operation result
179 ModuleBase_ParamSpinBox::State ModuleBase_ParamSpinBox::isValid(const QString& theText,
180 double& theValue) const
182 if (hasVariable() && !findVariable(theText, theValue)) {
184 theValue = locale().toDouble(theText, &ok);
189 if (!checkRange(theValue)) {
197 \brief This function is used to check that string value lies within predefined range.
200 bool ModuleBase_ParamSpinBox::checkRange(const double theValue) const
202 return theValue >= minimum() && theValue <= maximum();
206 \brief This function is used to determine whether input is a variable name and to get its value.
207 \return status of search operation
209 bool ModuleBase_ParamSpinBox::findVariable(const QString& theName,
210 double& outValue) const
212 ResultParameterPtr aParam;
213 return ModelAPI_Tools::findVariable(theName.toStdString(), outValue, aParam);
217 \brief This function is called when the spinbox recieves key press event.
219 //void ModuleBase_ParamSpinBox::keyPressEvent(QKeyEvent* e)
221 // if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) {
222 // QWidget::keyPressEvent(e);
224 // ModuleBase_DoubleSpinBox::keyPressEvent(e);
229 \brief This function is called when the spinbox recieves show event.
231 void ModuleBase_ParamSpinBox::showEvent(QShowEvent* theEvent)
233 ModuleBase_DoubleSpinBox::showEvent(theEvent);
234 if ((!myTextValue.isEmpty()) && hasVariable(myTextValue)) {
235 setText(myTextValue);