Fix empty width support for Box inset

* InsetBox and GuiBox: Use proper empty length instead of the broken -9.99col% trick
* some slight changes to the logic of GuiBox to make sure that values are set as needed.
* lengthToWidget(): handle properly the empty length case. All the other related Qt helpers did it already, it was probably an oversight. Also set the default_unit parameter as optional (not needed in this patch actually, but I got carried away :)
* allow generating LaTeX code for an empty length, since some broken code does that.
This commit is contained in:
Jean-Marc Lasgouttes 2013-04-17 11:30:25 +02:00
parent 25ff2f8e2b
commit f04c7711b0
8 changed files with 55 additions and 50 deletions

View File

@ -29,7 +29,7 @@ adjustments are made to tex2lyx and bugs are fixed in lyx2lyx.
2013-03-22 Uwe Stöhr <uwestoehr@web.de>
* Format incremented to 468: support for \mbox and \fbox
New checkbox in the box dialog to avoid using an explicit
width.
width. An empty/missing length can be specified as "".
2013-03-19 Uwe Stöhr <uwestoehr@web.de>
* Format incremented to 467: support for iwona fonts

View File

@ -4094,8 +4094,8 @@ def revert_mbox_fbox(document):
continue
BeginLayout = find_token(document.body, "\\begin_layout Plain Layout", j)
EndLayout = find_token(document.body, "\\end_layout", BeginLayout)
# replace if width is "-999col%"
if (width == '"-999col%"'):
# replace if width is ""
if (width == '""'):
document.body[EndLayout:k + 1] = put_cmd_in_ert("}")
if document.body[i] == "\\begin_inset Box Frameless":
document.body[i:BeginLayout + 1] = put_cmd_in_ert("\\mbox{")

View File

@ -19,7 +19,6 @@
#include "LyXRC.h"
#include "support/docstream.h"
#include "support/lassert.h"
#include <sstream>
#include <iomanip>
@ -106,8 +105,7 @@ string const Length::asLatexString() const
os << val_ / 100.0 << "\\paperheight";
break;
case UNIT_NONE:
// One should not try to ouput latex code for an empty length
LASSERT(false, break);
break;
default:
os << val_ << unit_name[unit_];
break;

View File

@ -126,7 +126,7 @@ void GuiBox::on_innerBoxCO_activated(int /* index */)
heightCB->setChecked(false);
heightCB->setEnabled(ibox);
// the width can only be selected for makebox or framebox
widthCB->setEnabled(itype == "makebox"
widthCB->setEnabled(itype == "makebox"
|| (outer == "Boxed" && itype == "none"));
widthCB->setChecked(itype != "none" && !widthCB->isEnabled());
// except for frameless and boxed, the width cannot be specified if
@ -175,12 +175,12 @@ void GuiBox::on_typeCO_activated(int index)
setSpecial(ibox);
}
// the width can only be selected for makebox or framebox
widthCB->setEnabled(itype == "makebox"
widthCB->setEnabled(itype == "makebox"
|| (type == "Boxed" && itype == "none"));
widthCB->setChecked(itype != "none" && !widthCB->isEnabled());
// except for frameless and boxed, the width cannot be specified if
// there is no inner box
bool const width_enabled =
bool const width_enabled =
itype != "none" || frameless || type == "Boxed";
// enable if width_enabled, except if checkbaox is active but unset
widthED->setEnabled(width_enabled || (widthCB->isEnabled() && widthCB->isChecked()));
@ -305,16 +305,18 @@ void GuiBox::paramsToDialog(Inset const * inset)
Length::UNIT const default_unit = Length::defaultUnit();
// the width can only be selected for makebox or framebox
widthCB->setEnabled(inner_type == "makebox"
|| (type == "Boxed" && !ibox && !pagebreakCB->isChecked()));
// "-999col%" is the code for no width
if ((params.width).asString() == "-999col%")
widthCB->setCheckState(Qt::Unchecked);
else {
widthCB->setEnabled(inner_type == "makebox"
|| (type == "Boxed"
&& !ibox && !pagebreakCB->isChecked()));
if (params.width.empty()) {
widthCB->setChecked(false);
lengthToWidgets(widthED, widthUnitsLC,
params.width, default_unit);
} else {
if (widthCB->isEnabled())
widthCB->setChecked(true);
lengthToWidgets(widthED, widthUnitsLC,
(params.width).asString(), default_unit);
params.width, default_unit);
QString const special = toqstr(params.special);
if (!special.isEmpty() && special != "none")
widthUnitsLC->setCurrentItem(special);
@ -325,7 +327,7 @@ void GuiBox::paramsToDialog(Inset const * inset)
lengthToWidgets(heightED, heightUnitsLC,
(params.height).asString(), default_unit);
QString const height_special = toqstr(params.height_special);
if (!height_special.isEmpty() && height_special != "none")
heightUnitsLC->setCurrentItem(height_special);
@ -369,21 +371,18 @@ docstring GuiBox::dialogToParams() const
widthUnitsLC->itemData(widthUnitsLC->currentIndex()).toString();
QString value = widthED->text();
if (widthCB->isChecked()) {
if (ids_spec_.contains(unit) && !isValidLength(fromqstr(value))) {
params.special = fromqstr(unit);
// Note: the unit is simply ignored in this case
params.width = Length(value.toDouble(), Length::IN);
} else {
params.special = "none";
params.width = Length(widgetsToLength(widthED, widthUnitsLC));
}
} else {
if (widthCB->isEnabled()) {
// use the code "-999col%" for the case that no width was selected
if (widthED->isEnabled()) {
if (ids_spec_.contains(unit) && !isValidLength(fromqstr(value))) {
params.special = fromqstr(unit);
// Note: the unit is simply ignored in this case
params.width = Length(value.toDouble(), Length::IN);
} else {
params.special = "none";
params.width = Length("-999col%");
params.width = Length(widgetsToLength(widthED, widthUnitsLC));
}
} else {
params.special = "none";
params.width = Length();
}
// the height parameter is omitted if the value

View File

@ -118,12 +118,18 @@ Length widgetsToLength(QLineEdit const * input, QComboBox const * combo)
void lengthToWidgets(QLineEdit * input, LengthCombo * combo,
Length const & len, Length::UNIT /*defaultUnit*/)
Length const & len, Length::UNIT /*defaultUnit*/)
{
combo->setCurrentItem(len.unit());
QLocale loc;
loc.setNumberOptions(QLocale::OmitGroupSeparator);
input->setText(loc.toString(Length(len).value()));
if (len.empty()) {
// no length (UNIT_NONE)
combo->setCurrentItem(Length::defaultUnit());
input->setText("");
} else {
combo->setCurrentItem(len.unit());
QLocale loc;
loc.setNumberOptions(QLocale::OmitGroupSeparator);
input->setText(loc.toString(Length(len).value()));
}
}
@ -156,7 +162,7 @@ double widgetToDouble(QLineEdit const * input)
QString const text = input->text();
if (text.isEmpty())
return 0.0;
return text.trimmed().toDouble();
}
@ -166,7 +172,7 @@ string widgetToDoubleStr(QLineEdit const * input)
QString const text = input->text();
if (text.isEmpty())
return string();
return convert<string>(text.trimmed().toDouble());
}

View File

@ -31,7 +31,7 @@ namespace lyx {
namespace support { class FileName; }
class BufferParams;
namespace frontend {
class LengthCombo;
@ -41,13 +41,17 @@ std::string widgetsToLength(QLineEdit const * input, LengthCombo const * combo);
/// method to get a Length from widgets (QComboBox)
Length widgetsToLength(QLineEdit const * input, QComboBox const * combo);
//FIXME It would be nice if defaultUnit were a default argument
/// method to set widgets from a Length
//FIXME Remove default_unit argument for the first form. FIXME Change
// all the code to remove default_unit argument when equal to the
// default.
void lengthToWidgets(QLineEdit * input, LengthCombo * combo,
Length const & len, Length::UNIT default_unit);
Length const & len,
Length::UNIT default_unit = Length::defaultUnit());
/// method to set widgets from a string
void lengthToWidgets(QLineEdit * input, LengthCombo * combo,
std::string const & len, Length::UNIT default_unit);
std::string const & len,
Length::UNIT default_unit = Length::defaultUnit());
/// method to set widgets from a docstring
void lengthToWidgets(QLineEdit * input, LengthCombo * combo,
docstring const & len, Length::UNIT default_unit);

View File

@ -162,7 +162,7 @@ void InsetBox::setButtonLabel()
bool InsetBox::hasFixedWidth() const
{
return from_ascii(params_.width.asLatexString()) != "-9.99\\columnwidth";
return !params_.width.empty();
}
@ -273,6 +273,7 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const
string width_string = params_.width.asLatexString();
bool stdwidth = false;
// FIXME: do not test explicitely values of width_string
if (params_.inner_box &&
(width_string.find("1.0\\columnwidth") != string::npos
|| width_string.find("1.0\\textwidth") != string::npos)) {
@ -316,8 +317,7 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const
os << "\\begin{framed}%\n";
break;
case Boxed:
// "-999col%" is the code for no width
if (from_ascii(width_string) != "-9.99\\columnwidth") {
if (width_string.empty()) {
os << "\\framebox";
if (!params_.inner_box) {
// Special widths, see usrguide sec. 3.5
@ -358,8 +358,7 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const
if (params_.use_parbox)
os << "\\parbox";
else if (params_.use_makebox) {
// "-999col%" is the code for no width
if (from_ascii(width_string) != "-9.99\\columnwidth") {
if (!width_string.empty()) {
os << "\\makebox";
// FIXME UNICODE
// output the width and horizontal position

View File

@ -935,9 +935,8 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags,
width_unit = "in";
width_special = "width";
} else if (latex_width.empty() && outer_type == "framebox") {
outer_type == "fbox";
width_value = "-999";
width_unit = "col%";
width_value.clear();
width_unit.clear();
width_special = "none";
}
if (use_ert) {
@ -1038,7 +1037,7 @@ void parse_box(Parser & p, ostream & os, unsigned outer_flags,
else
os << "use_makebox " << (inner_type == "makebox") << '\n';
if (outer_type == "fbox" || outer_type == "mbox")
os << "width \"-999col%\"\n";
os << "width \"\"\n";
else
os << "width \"" << width_value << width_unit << "\"\n";
os << "special \"" << width_special << "\"\n";