Fix LaTeX length export of big numbers, part 2 (bug #9416)

LaTeX lengths must not use scientific notation, since the + sign has a
different meaning (glue lengths). This is the GUI part of bug 9416,
on top of part 1 [59e4d16ab/lyxgit].
This commit is contained in:
Juergen Spitzmueller 2015-05-20 09:35:57 +02:00
parent 2ac45cc4d2
commit 8b86af7298
3 changed files with 36 additions and 21 deletions

View File

@ -28,6 +28,7 @@
#include <iomanip> #include <iomanip>
using namespace std; using namespace std;
using namespace lyx::support;
namespace lyx { namespace lyx {
@ -65,7 +66,7 @@ string const Length::asString() const
{ {
ostringstream os; ostringstream os;
if (unit_ != UNIT_NONE) if (unit_ != UNIT_NONE)
os << val_ << unit_name[unit_]; // setw? os << formatFPNumber(val_) << unit_name[unit_]; // setw?
return os.str(); return os.str();
} }
@ -74,7 +75,7 @@ docstring const Length::asDocstring() const
{ {
odocstringstream os; odocstringstream os;
if (unit_ != UNIT_NONE) if (unit_ != UNIT_NONE)
os << val_ << unit_name[unit_]; // setw? os << formatFPNumber(val_) << unit_name[unit_]; // setw?
return os.str(); return os.str();
} }
@ -86,27 +87,27 @@ string const Length::asLatexString() const
// LaTeX (bug 9416) // LaTeX (bug 9416)
switch (unit_) { switch (unit_) {
case PTW: case PTW:
os << support::formatFPNumber(val_ / 100.0) << "\\textwidth"; os << formatFPNumber(val_ / 100.0) << "\\textwidth";
break; break;
case PCW: case PCW:
os << support::formatFPNumber(val_ / 100.0) << "\\columnwidth"; os << formatFPNumber(val_ / 100.0) << "\\columnwidth";
break; break;
case PPW: case PPW:
os << support::formatFPNumber(val_ / 100.0) << "\\paperwidth"; os << formatFPNumber(val_ / 100.0) << "\\paperwidth";
break; break;
case PLW: case PLW:
os << support::formatFPNumber(val_ / 100.0) << "\\linewidth"; os << formatFPNumber(val_ / 100.0) << "\\linewidth";
break; break;
case PTH: case PTH:
os << support::formatFPNumber(val_ / 100.0) << "\\textheight"; os << formatFPNumber(val_ / 100.0) << "\\textheight";
break; break;
case PPH: case PPH:
os << support::formatFPNumber(val_ / 100.0) << "\\paperheight"; os << formatFPNumber(val_ / 100.0) << "\\paperheight";
break; break;
case UNIT_NONE: case UNIT_NONE:
break; break;
default: default:
os << support::formatFPNumber(val_) << unit_name[unit_]; os << formatFPNumber(val_) << unit_name[unit_];
break; break;
} }
return os.str(); return os.str();
@ -121,7 +122,7 @@ string const Length::asHTMLString() const
case BP: case BP:
case DD: case DD:
// close enough // close enough
os << val_ << "pt"; os << formatFPNumber(val_) << "pt";
break; break;
case MM: case MM:
case CM: case CM:
@ -129,13 +130,13 @@ string const Length::asHTMLString() const
case IN: case IN:
case EX: case EX:
case EM: case EM:
os << val_ << unit_name[unit_]; os << formatFPNumber(val_) << unit_name[unit_];
break; break;
case CC: case CC:
os << val_/12.0 << "pt"; os << formatFPNumber(val_ / 12.0) << "pt";
break; break;
case MU: case MU:
os << val_/18.0 << "em"; os << formatFPNumber(val_ / 18.0) << "em";
break; break;
case PTW: case PTW:
case PPW: case PPW:
@ -145,7 +146,7 @@ string const Length::asHTMLString() const
case PPH: case PPH:
// what it's a percentage of probably won't make sense for HTML, // what it's a percentage of probably won't make sense for HTML,
// so we'll assume people have chosen these appropriately // so we'll assume people have chosen these appropriately
os << val_ << '%'; os << formatFPNumber(val_) << '%';
break; break;
case SP: case SP:
case UNIT_NONE: case UNIT_NONE:
@ -377,7 +378,7 @@ string const GlueLength::asString() const
ostringstream buffer; ostringstream buffer;
buffer << len_.value(); buffer << formatFPNumber(len_.value());
if (plus_.zero() && minus_.zero()) { if (plus_.zero() && minus_.zero()) {
buffer << unit_name[len_.unit()]; buffer << unit_name[len_.unit()];
@ -388,7 +389,7 @@ string const GlueLength::asString() const
if (minus_.zero()) { if (minus_.zero()) {
if (len_.unit() != plus_.unit()) if (len_.unit() != plus_.unit())
buffer << unit_name[len_.unit()]; buffer << unit_name[len_.unit()];
buffer << '+' << plus_.value(); buffer << '+' << formatFPNumber(plus_.value());
buffer << unit_name[plus_.unit()]; buffer << unit_name[plus_.unit()];
return buffer.str(); return buffer.str();
} }
@ -397,7 +398,7 @@ string const GlueLength::asString() const
if (plus_.zero()) { if (plus_.zero()) {
if (len_.unit() != minus_.unit()) if (len_.unit() != minus_.unit())
buffer << unit_name[len_.unit()]; buffer << unit_name[len_.unit()];
buffer << '-' << minus_.value(); buffer << '-' << formatFPNumber(minus_.value());
buffer << unit_name[minus_.unit()]; buffer << unit_name[minus_.unit()];
return buffer.str(); return buffer.str();
} }
@ -408,7 +409,7 @@ string const GlueLength::asString() const
if (minus_ == plus_) { if (minus_ == plus_) {
if (len_.unit() != minus_.unit()) if (len_.unit() != minus_.unit())
buffer << unit_name[len_.unit()]; buffer << unit_name[len_.unit()];
buffer << "+-" << minus_.value(); buffer << "+-" << formatFPNumber(minus_.value());
buffer << unit_name[minus_.unit()]; buffer << unit_name[minus_.unit()];
return buffer.str(); return buffer.str();
} }
@ -416,8 +417,8 @@ string const GlueLength::asString() const
// this is so rare a case, why bother minimising units ? // this is so rare a case, why bother minimising units ?
buffer << unit_name[len_.unit()]; buffer << unit_name[len_.unit()];
buffer << '+' << plus_.value() << unit_name[plus_.unit()]; buffer << '+' << formatFPNumber(plus_.value()) << unit_name[plus_.unit()];
buffer << '-' << minus_.value() << unit_name[minus_.unit()]; buffer << '-' << formatFPNumber(minus_.value()) << unit_name[minus_.unit()];
return buffer.str(); return buffer.str();
} }

View File

@ -145,7 +145,7 @@ void lengthToWidgets(QLineEdit * input, LengthCombo * combo,
combo->setCurrentItem(len.unit()); combo->setCurrentItem(len.unit());
QLocale loc; QLocale loc;
loc.setNumberOptions(QLocale::OmitGroupSeparator); loc.setNumberOptions(QLocale::OmitGroupSeparator);
input->setText(loc.toString(Length(len).value())); input->setText(formatLocFPNumber(Length(len).value()));
} }
} }
@ -204,6 +204,15 @@ void doubleToWidget(QLineEdit * input, string const & value, char f, int prec)
} }
QString formatLocFPNumber(double d)
{
QString result = toqstr(formatFPNumber(d));
QLocale loc;
result.replace('.', loc.decimalPoint());
return result;
}
void setValid(QWidget * widget, bool valid) void setValid(QWidget * widget, bool valid)
{ {
if (valid) { if (valid) {

View File

@ -67,6 +67,11 @@ void doubleToWidget(QLineEdit * input, double const & value,
/// method to set a (localized) double value in a widget (QLineEdit) /// method to set a (localized) double value in a widget (QLineEdit)
void doubleToWidget(QLineEdit * input, std::string const & value, void doubleToWidget(QLineEdit * input, std::string const & value,
char f = 'g', int prec = 6); char f = 'g', int prec = 6);
/**
* method to format localized floating point numbers without
* ever using scientific notation
*/
QString formatLocFPNumber(double d);
/// colors a widget red if invalid /// colors a widget red if invalid
void setValid(QWidget * widget, bool valid); void setValid(QWidget * widget, bool valid);