X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetEditor.cpp;h=3adc21b0d452e653b5a0c32ed4665bdfb3caca70;hb=397bec888031ab3d5d0578d3094e01f9a052222f;hp=1e00eb180ea7e65e3ce0d5edad56e11130403f59;hpb=11496be069750941ff9cbcef21088a56bfd32cdf;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetEditor.cpp b/src/ModuleBase/ModuleBase_WidgetEditor.cpp index 1e00eb180..3adc21b0d 100644 --- a/src/ModuleBase/ModuleBase_WidgetEditor.cpp +++ b/src/ModuleBase/ModuleBase_WidgetEditor.cpp @@ -1,14 +1,18 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + // File: ModuleBase_WidgetEditor.cpp // Created: 25 Apr 2014 // Author: Natalia ERMOLAEVA #include +#include +#include #include #include #include -#include +#include #include #include @@ -17,76 +21,118 @@ #include -#include +#include #include -#include +#include +#include +#include +#include +#include +#include #include #include -#include ModuleBase_WidgetEditor::ModuleBase_WidgetEditor(QWidget* theParent, const Config_WidgetAPI* theData) -: ModuleBase_WidgetDoubleValue(theParent, theData) +: ModuleBase_WidgetDoubleValue(theParent, theData), + myXPosition(-1), myYPosition(-1) { } -ModuleBase_WidgetEditor::ModuleBase_WidgetEditor(QWidget* theParent, const std::string& theAttribute) -: ModuleBase_WidgetDoubleValue(theParent, 0) -{ - setAttributeID(theAttribute); -} - ModuleBase_WidgetEditor::~ModuleBase_WidgetEditor() { } -double editedValue(double theValue, bool& isDone) +bool ModuleBase_WidgetEditor::editedValue(double& outValue, QString& outText) { - QDialog aDlg; - aDlg.setWindowFlags(Qt::FramelessWindowHint); + bool isValueAccepted = false; + + QDialog aDlg(QApplication::desktop(), Qt::FramelessWindowHint); QHBoxLayout* aLay = new QHBoxLayout(&aDlg); - aLay->setContentsMargins(0,0,0,0); + aLay->setContentsMargins(2, 2, 2, 2); + + ModuleBase_ParamSpinBox* anEditor = new ModuleBase_ParamSpinBox(&aDlg); + anEditor->enableKeyPressEvent(true); + + anEditor->setMinimum(0); + anEditor->setMaximum(DBL_MAX); + if (outText.isEmpty()) + anEditor->setValue(outValue); + else + anEditor->setText(outText); - QLineEdit* aEditor = new QLineEdit(QString::number(theValue), &aDlg); - aEditor->setValidator(new QDoubleValidator(aEditor)); - QObject::connect(aEditor, SIGNAL(returnPressed()), &aDlg, SLOT(accept())); - aLay->addWidget(aEditor); + aLay->addWidget(anEditor); + + ModuleBase_Tools::setFocus(anEditor, "ModuleBase_WidgetEditor::editedValue"); + anEditor->selectAll(); + QObject::connect(anEditor, SIGNAL(enterReleased()), &aDlg, SLOT(accept())); QPoint aPoint = QCursor::pos(); - aDlg.move(aPoint); + if (myXPosition >= 0 && myYPosition >= 0) + aPoint = QPoint(myXPosition, myYPosition); - isDone = aDlg.exec() == QDialog::Accepted; - double aValue = theValue; - if (isDone) - aValue = aEditor->text().toDouble(); - return aValue; + 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() { - double aValue = mySpinBox->value(); - bool isDone; - aValue = editedValue(aValue, isDone); + showPopupEditor(); + return true; +} - if (isDone) { - bool isBlocked = mySpinBox->blockSignals(true); - mySpinBox->setValue(aValue); - mySpinBox->blockSignals(isBlocked); +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. + if (theSendSignals) + emit focusInWidget(this); + + // nds: it seems, that the envents processing is not necessary anymore + // White while all events will be processed + //QApplication::processEvents(); + double aValue = mySpinBox->value(); + QString aText; + if (mySpinBox->hasVariable()) + aText = mySpinBox->text(); + + 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(); - emit focusOutWidget(this); - return false; + if (theSendSignals && !myIsEditing) + emit enterClicked(this); + + return isValueAccepted; } -void ModuleBase_WidgetEditor::editFeatureValue(FeaturePtr theFeature, const std::string theAttribute) +void ModuleBase_WidgetEditor::setCursorPosition(const int theX, const int theY) { - DataPtr aData = theFeature->data(); - AttributeDoublePtr aRef = aData->real(theAttribute); - double aValue = aRef->value(); - - bool isDone; - aValue = editedValue(aValue, isDone); - if (isDone) - aRef->setValue(aValue); + myXPosition = theX; + myYPosition = theY; }