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 \class ModuleBase_ParamSpinBox
26 Constructs a spin box with 0.0 as minimum value and 99.99 as maximum value,
27 a step value of 1.0 and a precision of 2 decimal places.
28 The value is initially set to 0.00.
30 \param parent parent object
32 ModuleBase_ParamSpinBox::ModuleBase_ParamSpinBox(QWidget* theParent, int thePrecision)
33 : ModuleBase_DoubleSpinBox(theParent, thePrecision),
34 myAcceptVariables(true)
36 connectSignalsAndSlots();
42 ModuleBase_ParamSpinBox::~ModuleBase_ParamSpinBox()
47 \brief Perform \a steps increment/decrement steps.
49 Re-implemented to handle cases when Notebook variable
50 name is specified by the user as the widget text.
51 Otherwise, simply calls the base implementation.
53 \param steps number of increment/decrement steps
55 void ModuleBase_ParamSpinBox::stepBy(int steps)
57 if ((!myTextValue.isEmpty()) && hasVariable())
60 ModuleBase_DoubleSpinBox::stepBy(steps);
64 \brief Connect signals and slots.
66 void ModuleBase_ParamSpinBox::connectSignalsAndSlots()
68 connect(this, SIGNAL(valueChanged(const QString&)),
69 this, SLOT(onTextChanged(const QString&)));
73 \brief This function is called when value is changed.
75 void ModuleBase_ParamSpinBox::onTextChanged(const QString& text)
81 \brief Interpret text entered by the user as a value.
82 \param text text entered by the user
86 double ModuleBase_ParamSpinBox::valueFromText(const QString& theText) const
88 if (!hasVariable(theText)) {
89 return ModuleBase_DoubleSpinBox::valueFromText(theText);
91 // small hack: return length of the string to initiate valuesChanged signal
92 return qHash(theText);
95 QString ModuleBase_ParamSpinBox::textFromValue (double theValue) const
97 if ((!myTextValue.isEmpty()) && hasVariable(myTextValue)){
100 return ModuleBase_DoubleSpinBox::textFromValue(theValue);
104 \brief This function is used to determine whether input is valid.
105 \param str currently entered value
106 \param pos cursor position in the string
107 \return validating operation result
109 QValidator::State ModuleBase_ParamSpinBox::validate(QString& str, int& pos) const
111 // Trying to interpret the current input text as a numeric value
112 if (!hasVariable(str))
113 return ModuleBase_DoubleSpinBox::validate(str, pos);
115 QValidator::State res = QValidator::Invalid;
116 if (isAcceptVariables()) {
117 res = QValidator::Acceptable;
123 \brief This function is used to set a current value for this spinbox.
124 \param value current value
126 void ModuleBase_ParamSpinBox::setValue(const double value)
128 myTextValue = ModuleBase_DoubleSpinBox::textFromValue(value);
129 ModuleBase_DoubleSpinBox::setValue(value);
133 \brief This function is used to set a text for this spinbox.
134 \param value current value
136 void ModuleBase_ParamSpinBox::setText(const QString& value)
139 lineEdit()->setText(value);
143 \brief Enables or disables variable names in the spin box.
144 By default, variable names are enabled.
145 \param flag If true, variable names are enabled.
147 void ModuleBase_ParamSpinBox::setAcceptVariables(const bool flag)
149 myAcceptVariables = flag;
153 \brief Returns true if the spin box accepts variable names.
155 bool ModuleBase_ParamSpinBox::isAcceptVariables() const
157 return myAcceptVariables;
160 bool ModuleBase_ParamSpinBox::hasVariable() const
162 if (myTextValue.isEmpty())
164 return hasVariable(myTextValue);
167 bool ModuleBase_ParamSpinBox::hasVariable(const QString& theText) const
169 //const QString aDigitPattern = QString("[-+]?[0-9]*[%1]?[0-9]*([eE][-+]?[0-9]+)?");
171 //bool aHasDigit = false;
173 // QRegExp varNameMask(aDigitPattern.arg("."));
174 // aHasDigit = varNameMask.exactMatch(theText);
178 // QRegExp varNameMask(aDigitPattern.arg(","));
179 // aHasDigit = varNameMask.exactMatch(theText);
181 bool aHasDigit = false;
182 theText.toDouble(&aHasDigit);
184 QLocale aLoc; // create default locale
185 QChar aDecPnt = aLoc.decimalPoint();
187 aHasDigit = theText.contains(aDecPnt) || (!theText.contains(','));
188 else if (aDecPnt == ',')
189 aHasDigit = theText.contains(aDecPnt) || (!theText.contains('.'));
196 \brief This function is used to determine whether input is valid.
197 \return validating operation result
199 ModuleBase_ParamSpinBox::State ModuleBase_ParamSpinBox::isValid(const QString& theText,
200 double& theValue) const
202 if (hasVariable() && !findVariable(theText, theValue)) {
204 theValue = locale().toDouble(theText, &ok);
209 if (!checkRange(theValue)) {
217 \brief This function is used to check that string value lies within predefined range.
220 bool ModuleBase_ParamSpinBox::checkRange(const double theValue) const
222 return theValue >= minimum() && theValue <= maximum();
226 \brief This function is used to determine whether input is a variable name and to get its value.
227 \return status of search operation
229 bool ModuleBase_ParamSpinBox::findVariable(const QString& theName,
230 double& outValue) const
232 ResultParameterPtr aParam;
233 return ModelAPI_Tools::findVariable(theName.toStdString(), outValue, aParam);
237 \brief This function is called when the spinbox recieves key press event.
239 //void ModuleBase_ParamSpinBox::keyPressEvent(QKeyEvent* e)
241 // if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) {
242 // QWidget::keyPressEvent(e);
244 // ModuleBase_DoubleSpinBox::keyPressEvent(e);
249 \brief This function is called when the spinbox recieves show event.
251 void ModuleBase_ParamSpinBox::showEvent(QShowEvent* theEvent)
253 ModuleBase_DoubleSpinBox::showEvent(theEvent);
254 if ((!myTextValue.isEmpty()) && hasVariable(myTextValue)) {
255 setText(myTextValue);