X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetEditor.cpp;h=3adc21b0d452e653b5a0c32ed4665bdfb3caca70;hb=397bec888031ab3d5d0578d3094e01f9a052222f;hp=334c50492d4eff3a9bbeb042f8eb1fc206517318;hpb=c24c2f94491145b9c2cbd0be6c6bc3d157bca9bb;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetEditor.cpp b/src/ModuleBase/ModuleBase_WidgetEditor.cpp index 334c50492..3adc21b0d 100644 --- a/src/ModuleBase/ModuleBase_WidgetEditor.cpp +++ b/src/ModuleBase/ModuleBase_WidgetEditor.cpp @@ -33,9 +33,9 @@ #include ModuleBase_WidgetEditor::ModuleBase_WidgetEditor(QWidget* theParent, - const Config_WidgetAPI* theData, - const std::string& theParentId) - : ModuleBase_WidgetDoubleValue(theParent, theData, theParentId) + const Config_WidgetAPI* theData) +: ModuleBase_WidgetDoubleValue(theParent, theData), + myXPosition(-1), myYPosition(-1) { } @@ -43,8 +43,10 @@ ModuleBase_WidgetEditor::~ModuleBase_WidgetEditor() { } -void ModuleBase_WidgetEditor::editedValue(double& outValue, QString& outText) +bool ModuleBase_WidgetEditor::editedValue(double& outValue, QString& outText) { + bool isValueAccepted = false; + QDialog aDlg(QApplication::desktop(), Qt::FramelessWindowHint); QHBoxLayout* aLay = new QHBoxLayout(&aDlg); aLay->setContentsMargins(2, 2, 2, 2); @@ -61,40 +63,42 @@ void ModuleBase_WidgetEditor::editedValue(double& outValue, QString& outText) aLay->addWidget(anEditor); - anEditor->setFocus(); + ModuleBase_Tools::setFocus(anEditor, "ModuleBase_WidgetEditor::editedValue"); anEditor->selectAll(); - QObject::connect(anEditor, SIGNAL(editingFinished()), &aDlg, SLOT(accept())); - - aDlg.move(QCursor::pos()); - aDlg.exec(); - outText = anEditor->text(); - bool isDouble; - double aValue = outText.toDouble(&isDouble); - if (isDouble) { - outValue = aValue; - outText = ""; // return empty string, if it's can be converted to a double + QObject::connect(anEditor, SIGNAL(enterReleased()), &aDlg, SLOT(accept())); + + QPoint aPoint = QCursor::pos(); + if (myXPosition >= 0 && myYPosition >= 0) + aPoint = QPoint(myXPosition, myYPosition); + + aDlg.move(aPoint); + isValueAccepted = aDlg.exec() == QDialog::Accepted; + if (isValueAccepted) { + outText = anEditor->text(); + bool isDouble; + double aValue = outText.toDouble(&isDouble); + if (isDouble) { + outValue = aValue; + outText = ""; // return empty string, if it's can be converted to a double + } } + return isValueAccepted; } bool ModuleBase_WidgetEditor::focusTo() { - // nds: it seems, that the timer is not necessary anymore - - // We can not launch here modal process for value editing because - // it can be called on other focusOutWidget event and will block it - //QTimer::singleShot(1, this, SLOT(showPopupEditor())); - showPopupEditor(); - return true; } -void ModuleBase_WidgetEditor::showPopupEditor() +bool ModuleBase_WidgetEditor::showPopupEditor(const bool theSendSignals) { + bool isValueAccepted = false; // we need to emit the focus in event manually in order to save the widget as an active // in the property panel before the mouse leave event happens in the viewer. The module // ask an active widget and change the feature visualization if the widget is not the current one. - emit focusInWidget(this); + if (theSendSignals) + emit focusInWidget(this); // nds: it seems, that the envents processing is not necessary anymore // White while all events will be processed @@ -104,14 +108,31 @@ void ModuleBase_WidgetEditor::showPopupEditor() if (mySpinBox->hasVariable()) aText = mySpinBox->text(); - editedValue(aValue, aText); - if (aText.isEmpty()) { - ModuleBase_Tools::setSpinValue(mySpinBox, aValue); - } else { - ModuleBase_Tools::setSpinText(mySpinBox, aText); + isValueAccepted = editedValue(aValue, aText); + if (isValueAccepted) { + if (aText.isEmpty()) { + ModuleBase_Tools::setSpinValue(mySpinBox, aValue); + } else { + ModuleBase_Tools::setSpinText(mySpinBox, aText); + } + if (theSendSignals) { + emit valuesChanged(); + // the focus leaves the control automatically by the Enter/Esc event + // it is processed in operation manager + //emit focusOutWidget(this); + } + else + storeValue(); } - emit valuesChanged(); - // the focus leaves the control automatically by the Enter/Esc event - // it is processed in operation manager - //emit focusOutWidget(this); + + if (theSendSignals && !myIsEditing) + emit enterClicked(this); + + return isValueAccepted; +} + +void ModuleBase_WidgetEditor::setCursorPosition(const int theX, const int theY) +{ + myXPosition = theX; + myYPosition = theY; }