X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_ParamSpinBox.cpp;h=349eec6b69a0a08624334d1a9415c45d47d83c28;hb=eac9710846e936ad0d1e39193bb32ac7cea79492;hp=992e9dd26d1636192c32c5d6e7ea6911beca5dbc;hpb=5e0fdd82190d9afb274cb2449edb76f6b6664700;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_ParamSpinBox.cpp b/src/ModuleBase/ModuleBase_ParamSpinBox.cpp index 992e9dd26..349eec6b6 100644 --- a/src/ModuleBase/ModuleBase_ParamSpinBox.cpp +++ b/src/ModuleBase/ModuleBase_ParamSpinBox.cpp @@ -35,6 +35,15 @@ #include #include + +bool isVariableSymbol(const QChar& theChar) { + if (theChar.isLetterOrNumber()) + return true; + if (theChar == '_') + return true; + return false; +} + ModuleBase_ParamSpinBox::ModuleBase_ParamSpinBox(QWidget* theParent, int thePrecision) : QAbstractSpinBox(theParent), myPrecision(thePrecision), @@ -50,12 +59,12 @@ ModuleBase_ParamSpinBox::ModuleBase_ParamSpinBox(QWidget* theParent, int thePrec myCompleterModel = new QStringListModel(this); myCompleter->setModel(myCompleterModel); - // Use sorted model to accelerate completion (QCompleter will use binary search) - myCompleter->setModelSorting(QCompleter::CaseInsensitivelySortedModel); - myCompleter->setCaseSensitivity(Qt::CaseInsensitive); connect(myCompleter, SIGNAL(highlighted(const QString&)), this, SLOT(insertCompletion(const QString&))); + QAbstractItemView* aPopup = myCompleter->popup(); + aPopup->installEventFilter(this); + // connectSignalsAndSlots(); myEnabledBaseColor = palette().color(QPalette::Active, QPalette::Base); connect(lineEdit(), SIGNAL(textChanged(const QString&)), @@ -66,13 +75,13 @@ ModuleBase_ParamSpinBox::ModuleBase_ParamSpinBox(QWidget* theParent, int thePrec myValidator = new QDoubleValidator(this); myValidator->setLocale(locale()); myValidator->setRange(myMinimum, myMaximum); - myValidator->setDecimals(3); + myValidator->setDecimals(myPrecision); } void ModuleBase_ParamSpinBox::setCompletionList(QStringList& theList) { - theList.sort(); theList.removeDuplicates(); + theList.sort(); myCompleterModel->setStringList(theList); } @@ -200,31 +209,52 @@ bool ModuleBase_ParamSpinBox::hasVariable(const QString& theText) const return !isDouble; } +void ModuleBase_ParamSpinBox::showCompletion() +{ + myCompletePos = lineEdit()->cursorPosition(); + int aStart, aEnd; + QString aPrefix; + aPrefix = getPrefix(aStart, aEnd); + if (aPrefix.length() > 0) { + myCompleter->setCompletionPrefix(aPrefix); + myCompleter->complete(); + } +} + void ModuleBase_ParamSpinBox::keyReleaseEvent(QKeyEvent* e) { + QString aText; + switch (e->key()) { + case Qt::Key_Backspace: + showCompletion(); + break; case Qt::Key_Return: case Qt::Key_Enter: - { if (myCompleter->popup()->isVisible()) { myCompleter->popup()->hide(); myIsEquation = true; } emit textChanged(lineEdit()->text()); - return; - } - case Qt::Key_Space: - if (e->modifiers() & Qt::ControlModifier) { - myCompletePos = lineEdit()->cursorPosition(); - int aStart, aEnd; - QString aPrefix = getPrefix(aStart, aEnd); - myCompleter->setCompletionPrefix(aPrefix); - myCompleter->complete(); - } break; default: - QAbstractSpinBox::keyReleaseEvent(e); + aText = e->text(); + if (aText.length() == 1) { + QChar aChar = aText.at(0); + if (isVariableSymbol(aChar)) { + showCompletion(); + } + } + } + QAbstractSpinBox::keyReleaseEvent(e); +} + +bool ModuleBase_ParamSpinBox::eventFilter(QObject* theObj, QEvent* theEvent) +{ + if (theEvent->type() == QEvent::KeyRelease) { + keyReleaseEvent((QKeyEvent*)theEvent); } + return QAbstractSpinBox::eventFilter(theObj, theEvent); } @@ -238,7 +268,7 @@ QString ModuleBase_ParamSpinBox::getPrefix(int& theStart, int& theEnd) const if (myCompletePos > 0) { int aLastChar = myCompletePos - 1; QChar aChar = aText.at(aLastChar); - while (aChar.isLetter() || aChar.isDigit()) { + while (isVariableSymbol(aChar)) { aPrefix.prepend(aText.at(aLastChar)); aLastChar--; if (aLastChar < 0) @@ -250,7 +280,7 @@ QString ModuleBase_ParamSpinBox::getPrefix(int& theStart, int& theEnd) const if (myCompletePos < aLen) { int aLastChar = myCompletePos; QChar aChar = aText.at(aLastChar); - while (aChar.isLetter() || aChar.isDigit()) { + while (isVariableSymbol(aChar)) { aPrefix.append(aText.at(aLastChar)); aLastChar++; if (aLastChar >= aLen)