X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetEditor.cpp;h=5aa9aa24f8e3f11b456ad62a086e6f6e34077c93;hb=b263f22d52ccb191c4fad8f7455d9714a3024514;hp=7f77acd5a97ac1064fdfd533699a7e85dd71b4ad;hpb=7bf19255421b34594c7b0a76d0ce28166d0ce895;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetEditor.cpp b/src/ModuleBase/ModuleBase_WidgetEditor.cpp index 7f77acd5a..5aa9aa24f 100644 --- a/src/ModuleBase/ModuleBase_WidgetEditor.cpp +++ b/src/ModuleBase/ModuleBase_WidgetEditor.cpp @@ -5,7 +5,7 @@ // Author: Natalia ERMOLAEVA #include -#include +#include #include #include @@ -21,12 +21,16 @@ #include -#include +#include #include -#include +#include +#include +#include +#include +#include +#include #include #include -#include ModuleBase_WidgetEditor::ModuleBase_WidgetEditor(QWidget* theParent, const Config_WidgetAPI* theData, @@ -39,62 +43,71 @@ ModuleBase_WidgetEditor::~ModuleBase_WidgetEditor() { } -double editedValue(double theValue, bool& isDone) +void editedValue(double& outValue, QString& outText) { - QDialog aDlg; - aDlg.setWindowFlags(Qt::FramelessWindowHint); + QDialog aDlg(QApplication::desktop(), Qt::Popup/* | Qt::FramelessWindowHint*/); QHBoxLayout* aLay = new QHBoxLayout(&aDlg); - ModuleBase_Tools::zeroMargins(aLay); + aLay->setContentsMargins(2, 2, 2, 2); - QLineEdit* aEditor = new QLineEdit(QString::number(theValue), &aDlg); - aEditor->setValidator(new QDoubleValidator(aEditor)); - QObject::connect(aEditor, SIGNAL(returnPressed()), &aDlg, SLOT(accept())); - aLay->addWidget(aEditor); + ModuleBase_ParamSpinBox* aEditor = new ModuleBase_ParamSpinBox(&aDlg); + aEditor->setMinimum(0); + aEditor->setMaximum(DBL_MAX); + if (outText.isEmpty()) + aEditor->setValue(outValue); + else + aEditor->setText(outText); - QPoint aPoint = QCursor::pos(); - aDlg.move(aPoint); + aLay->addWidget(aEditor); - isDone = aDlg.exec() == QDialog::Accepted; - double aValue = theValue; - if (isDone) - aValue = aEditor->text().toDouble(); - return aValue; + aEditor->setFocus(); + aEditor->selectAll(); + QObject::connect(aEditor, SIGNAL(editingFinished()), &aDlg, SLOT(accept())); + + aDlg.move(QCursor::pos()); + aDlg.exec(); + outText = aEditor->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 + } } 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())); + //QTimer::singleShot(1, this, SLOT(showPopupEditor())); + + showPopupEditor(); + return true; } void ModuleBase_WidgetEditor::showPopupEditor() { + // 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); + + // nds: it seems, that the envents processing is not necessary anymore // White while all events will be processed - QApplication::processEvents(); + //QApplication::processEvents(); double aValue = mySpinBox->value(); - bool isDone; - aValue = editedValue(aValue, isDone); - - if (isDone) { - bool isBlocked = mySpinBox->blockSignals(true); - mySpinBox->setValue(aValue); - mySpinBox->blockSignals(isBlocked); + QString aText; + if (mySpinBox->hasVariable()) + aText = mySpinBox->text(); + + editedValue(aValue, aText); + if (aText.isEmpty()) { + ModuleBase_Tools::setSpinValue(mySpinBox, aValue); + } else { + ModuleBase_Tools::setSpinText(mySpinBox, aText); } emit valuesChanged(); emit focusOutWidget(this); } - -void ModuleBase_WidgetEditor::editFeatureValue(FeaturePtr theFeature, - const std::string theAttribute) -{ - DataPtr aData = theFeature->data(); - AttributeDoublePtr aRef = aData->real(theAttribute); - double aValue = aRef->value(); - - bool isDone; - aValue = editedValue(aValue, isDone); - if (isDone) - aRef->setValue(aValue); -}