From 9e16608867f72e417b04267d080fed28802e92a4 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Wed, 20 May 2015 19:12:23 +0200 Subject: [PATCH] Fix problems with immediate apply and length validators Fixes bugs #7022 and #7599. --- src/frontends/qt4/GuiParagraph.cpp | 9 +++++++-- src/frontends/qt4/GuiTabular.cpp | 9 ++++++--- src/frontends/qt4/InsetParamsDialog.cpp | 3 ++- src/frontends/qt4/Validator.cpp | 23 +++++++++++++++++++---- src/frontends/qt4/Validator.h | 2 ++ 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/frontends/qt4/GuiParagraph.cpp b/src/frontends/qt4/GuiParagraph.cpp index 6a0248ad2c..1bc22488a9 100644 --- a/src/frontends/qt4/GuiParagraph.cpp +++ b/src/frontends/qt4/GuiParagraph.cpp @@ -72,7 +72,9 @@ GuiParagraph::GuiParagraph(GuiView & lv) #endif on_synchronizedViewCB_toggled(); - linespacingValue->setValidator(new QDoubleValidator(linespacingValue)); + QDoubleValidator * val = new QDoubleValidator(linespacingValue); + val->setNotation(QDoubleValidator::StandardNotation); + linespacingValue->setValidator(val); labelWidth->setWhatsThis(qt_( "As described in the User Guide, the width of" @@ -164,7 +166,10 @@ void GuiParagraph::on_synchronizedViewCB_toggled() void GuiParagraph::changed() { - if (synchronizedViewCB->isChecked()) + QLocale loc; + if (synchronizedViewCB->isChecked() + && !linespacingValue->text().endsWith(loc.decimalPoint()) + && linespacingValue->hasAcceptableInput()) on_applyPB_clicked(); } diff --git a/src/frontends/qt4/GuiTabular.cpp b/src/frontends/qt4/GuiTabular.cpp index 8f1118bc23..58dcd597a1 100644 --- a/src/frontends/qt4/GuiTabular.cpp +++ b/src/frontends/qt4/GuiTabular.cpp @@ -751,7 +751,8 @@ void GuiTabular::paramsToDialog(Inset const * inset) // Set width and alignment Length const tabwidth = tabular.tabularWidth(); - if (tabwidth.zero()) + if (tabwidth.zero() + && !(tabularWidthED->hasFocus() && tabularWidthED->text() == "0")) tabularWidthED->clear(); else lengthToWidgets(tabularWidthED, tabularWidthUnitLC, @@ -769,7 +770,8 @@ void GuiTabular::paramsToDialog(Inset const * inset) pwidth = getColumnPWidth(tabular, cell); } string colwidth; - if (pwidth.zero()) + if (pwidth.zero() + && !(columnWidthED->hasFocus() && columnWidthED->text() == "0")) columnWidthED->clear(); else { colwidth = pwidth.asString(); @@ -780,7 +782,8 @@ void GuiTabular::paramsToDialog(Inset const * inset) if (multirow) mroffset = getMROffset(tabular, cell); string offset; - if (mroffset.zero()) + if (mroffset.zero() + && !(multirowOffsetED->hasFocus() && multirowOffsetED->text() == "0")) multirowOffsetED->clear(); else { offset = mroffset.asString(); diff --git a/src/frontends/qt4/InsetParamsDialog.cpp b/src/frontends/qt4/InsetParamsDialog.cpp index 9777d5951f..41b4bfa09c 100644 --- a/src/frontends/qt4/InsetParamsDialog.cpp +++ b/src/frontends/qt4/InsetParamsDialog.cpp @@ -192,7 +192,8 @@ void InsetParamsDialog::onWidget_changed() { d->changed_ = true; docstring const argument = checkWidgets(immediateApplyCB->isChecked()); - if (immediateApplyCB->isChecked()) + if (immediateApplyCB->isChecked() + && d->widget_->checkWidgets(buffer().isReadonly())) dispatch(FuncRequest(LFUN_INSET_MODIFY, argument)); } diff --git a/src/frontends/qt4/Validator.cpp b/src/frontends/qt4/Validator.cpp index 4e363ac8c2..6d0ffc0175 100644 --- a/src/frontends/qt4/Validator.cpp +++ b/src/frontends/qt4/Validator.cpp @@ -34,7 +34,7 @@ namespace frontend { LengthValidator::LengthValidator(QWidget * parent) : QValidator(parent), - no_bottom_(true), glue_length_(false) + no_bottom_(true), glue_length_(false), unsigned_(false) {} @@ -42,20 +42,29 @@ QValidator::State LengthValidator::validate(QString & qtext, int &) const { QLocale loc; bool ok; - loc.toDouble(qtext.trimmed(), &ok); + double d = loc.toDouble(qtext.trimmed(), &ok); + // QLocale::toDouble accepts something like "1." + // We don't. + bool dp = qtext.endsWith(loc.decimalPoint()); if (!ok) { // Fall back to C QLocale c(QLocale::C); - c.toDouble(qtext.trimmed(), &ok); + d = c.toDouble(qtext.trimmed(), &ok); + dp = qtext.endsWith(c.decimalPoint()); } - if (qtext.isEmpty() || ok) + if (ok && unsigned_ && d < 0) + return QValidator::Invalid; + + if (qtext.isEmpty() || (ok && !dp)) return QValidator::Acceptable; string const text = fromqstr(qtext); if (glue_length_) { GlueLength gl; + if (unsigned_ && gl.len().value() < 0) + return QValidator::Invalid; return (isValidGlueLength(text, &gl)) ? QValidator::Acceptable : QValidator::Intermediate; } @@ -68,6 +77,9 @@ QValidator::State LengthValidator::validate(QString & qtext, int &) const if (no_bottom_) return QValidator::Acceptable; + if (unsigned_ && l.value() < 0) + return QValidator::Invalid; + return b_.inPixels(100) <= l.inPixels(100) ? QValidator::Acceptable : QValidator::Intermediate; } @@ -92,6 +104,7 @@ LengthValidator * unsignedLengthValidator(QLineEdit * ed) { LengthValidator * v = new LengthValidator(ed); v->setBottom(Length()); + v->setUnsigned(true); return v; } @@ -100,6 +113,7 @@ LengthValidator * unsignedGlueLengthValidator(QLineEdit * ed) { LengthValidator * v = new LengthValidator(ed); v->setBottom(GlueLength()); + v->setUnsigned(true); return v; } @@ -122,6 +136,7 @@ LengthAutoValidator * unsignedLengthAutoValidator(QLineEdit * ed, QString const { LengthAutoValidator * v = new LengthAutoValidator(ed, autotext); v->setBottom(Length()); + v->setUnsigned(true); return v; } diff --git a/src/frontends/qt4/Validator.h b/src/frontends/qt4/Validator.h index 0c4dbde632..22e8d484d3 100644 --- a/src/frontends/qt4/Validator.h +++ b/src/frontends/qt4/Validator.h @@ -62,6 +62,7 @@ public: void setBottom(Length const &); void setBottom(GlueLength const &); Length bottom() const { return b_; } + void setUnsigned(bool const u) { unsigned_ = u; } //@} private: @@ -69,6 +70,7 @@ private: GlueLength g_; bool no_bottom_; bool glue_length_; + bool unsigned_; }; -- 2.39.2