X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiBox.cpp;h=087f8663a64c36e337f878d83bacda1dbba102ce;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=fb8d1618105938b21b70ba436d3ec087eed915b2;hpb=3069acd6de0bf520196fcd0f0a5fce59c90a7920;p=lyx.git diff --git a/src/frontends/qt4/GuiBox.cpp b/src/frontends/qt4/GuiBox.cpp index fb8d161810..087f8663a6 100644 --- a/src/frontends/qt4/GuiBox.cpp +++ b/src/frontends/qt4/GuiBox.cpp @@ -3,9 +3,9 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Jürgen Vigna (Minipage stuff) + * \author Jürgen Vigna (Minipage stuff) * \author Martin Vermeer - * \author Jürgen Spitzmüller + * \author Jürgen Spitzmüller * * Full author contact details are available in file CREDITS. */ @@ -17,7 +17,6 @@ #include "FuncRequest.h" #include "LengthCombo.h" #include "Length.h" -#include "LyXRC.h" // to set the default length values #include "qt_helpers.h" #include "Validator.h" @@ -30,6 +29,10 @@ #include #include +#ifdef IN +#undef IN +#endif + using namespace std; @@ -58,14 +61,14 @@ static QStringList boxGuiNames() static QStringList boxGuiSpecialLengthIds() { - return QStringList() << "none" << "height" << "depth" + return QStringList() << "height" << "depth" << "totalheight" << "width"; } static QStringList boxGuiSpecialLengthNames() { - return QStringList() << qt_("None") << qt_("Height") << qt_("Depth") + return QStringList() << qt_("Height") << qt_("Depth") << qt_("Total Height") << qt_("Width"); } @@ -85,8 +88,8 @@ GuiBox::GuiBox(GuiView & lv) // width needs different handling ids_spec_ = boxGuiSpecialLengthIds(); gui_names_spec_ = boxGuiSpecialLengthNames(); - foreach (QString const & str, gui_names_spec_) - heightUnitsLC->addItem(str); + for (int i = 0; i != ids_spec_.size(); ++i) + heightUnitsLC->addItem(gui_names_spec_[i], ids_spec_[i]); connect(restorePB, SIGNAL(clicked()), this, SLOT(slotRestore())); connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK())); @@ -157,10 +160,9 @@ void GuiBox::innerBoxChanged(QString const & str) ialignCO->setEnabled(ibox); halignCO->setEnabled(!ibox); heightCB->setEnabled(ibox); - if (heightCB->checkState() == Qt::Checked && ibox) { - heightED->setEnabled(true); - heightUnitsLC->setEnabled(true); - } + pagebreakCB->setEnabled(!ibox && typeCO->currentIndex() == 1); + heightED->setEnabled(heightCB->checkState() == Qt::Checked && ibox); + heightUnitsLC->setEnabled(heightCB->checkState() == Qt::Checked && ibox); setSpecial(ibox); } @@ -173,14 +175,18 @@ void GuiBox::typeChanged(int index) ialignCO->setEnabled(true); halignCO->setEnabled(false); heightCB->setEnabled(true); - heightED->setEnabled(true); - heightUnitsLC->setEnabled(true); + heightED->setEnabled(heightCB->checkState() == Qt::Checked); + heightUnitsLC->setEnabled(heightCB->checkState() == Qt::Checked); setSpecial(true); } if (index != 1) pagebreakCB->setChecked(false); - pagebreakCB->setEnabled(index == 1); int itype = innerBoxCO->currentIndex(); + if (innerBoxCO->count() == 2) + ++itype; + pagebreakCB->setEnabled(index == 1 && itype == 0); + widthED->setEnabled(index != 5); + widthUnitsLC->setEnabled(index != 5); setInnerType(frameless, itype); } @@ -192,10 +198,7 @@ void GuiBox::restoreClicked() widthUnitsLC->setCurrentItem(Length::PCW); heightCB->setCheckState(Qt::Checked); heightED->setText("1"); - for (int i = 0; i != heightUnitsLC->count(); ++i) { - if (heightUnitsLC->itemText(i) == qt_("Total Height")) - heightUnitsLC->setCurrentItem(i); - } + heightUnitsLC->setCurrentItem("totalheight"); } @@ -203,6 +206,8 @@ void GuiBox::pagebreakClicked() { bool pbreak = (pagebreakCB->checkState() == Qt::Checked); innerBoxCO->setEnabled(!pbreak); + widthED->setEnabled(!pbreak); + widthUnitsLC->setEnabled(!pbreak); if (pbreak) { valignCO->setEnabled(false); ialignCO->setEnabled(false); @@ -228,7 +233,7 @@ void GuiBox::updateContents() pagebreakCB->setChecked(false); } - pagebreakCB->setEnabled(type == "Boxed"); + pagebreakCB->setEnabled(type == "Boxed" && !params_.inner_box); for (int i = 0; i != gui_names_.size(); ++i) { if (type == ids_[i]) @@ -259,43 +264,24 @@ void GuiBox::updateContents() halignCO->setEnabled(!ibox); setSpecial(ibox); - Length::UNIT default_unit = - (lyxrc.default_papersize > 3) ? Length::CM : Length::IN; + Length::UNIT const default_unit = Length::defaultUnit(); lengthToWidgets(widthED, widthUnitsLC, (params_.width).asString(), default_unit); QString const special = toqstr(params_.special); - if (!special.isEmpty() && special != "none") { - QString spc; - for (int i = 0; i != gui_names_spec_.size(); ++i) { - if (special == ids_spec_[i]) - spc = gui_names_spec_[i]; - } - for (int i = 0; i != widthUnitsLC->count(); ++i) { - if (widthUnitsLC->itemText(i) == spc) - widthUnitsLC->setCurrentIndex(i); - } - } + if (!special.isEmpty() && special != "none") + widthUnitsLC->setCurrentItem(special); lengthToWidgets(heightED, heightUnitsLC, (params_.height).asString(), default_unit); QString const height_special = toqstr(params_.height_special); - if (!height_special.isEmpty() && height_special != "none") { - QString hspc; - for (int i = 0; i != gui_names_spec_.size(); ++i) { - if (height_special == ids_spec_[i]) - hspc = gui_names_spec_[i]; - } - for (int i = 0; i != heightUnitsLC->count(); ++i) { - if (heightUnitsLC->itemText(i) == hspc) - heightUnitsLC->setCurrentIndex(i); - } - } - // set no optional height when the value is the default "1\height" + if (!height_special.isEmpty() && height_special != "none") + heightUnitsLC->setCurrentItem(height_special); + // set no optional height if the value is the default "1\height" // (special units like \height are handled as "in", - if (height_special == "totalheight" && params_.height == Length("1in")) + if (height_special == "totalheight" && params_.height == Length("1in")) heightCB->setCheckState(Qt::Unchecked); else heightCB->setCheckState(Qt::Checked); @@ -306,121 +292,78 @@ void GuiBox::updateContents() void GuiBox::applyView() { - bool pagebreak = pagebreakCB->isChecked(); + bool pagebreak = + pagebreakCB->isEnabled() && pagebreakCB->isChecked(); if (pagebreak) params_.type = "Framed"; else params_.type = fromqstr(ids_[typeCO->currentIndex()]); - params_.inner_box = (!pagebreak && innerBoxCO->currentText() != qt_("None")); - params_.use_parbox = (!pagebreak && innerBoxCO->currentText() == qt_("Parbox")); + params_.inner_box = + (!pagebreak && innerBoxCO->currentText() != qt_("None")); + params_.use_parbox = + (!pagebreak && innerBoxCO->currentText() == qt_("Parbox")); params_.pos = "tcb"[valignCO->currentIndex()]; params_.inner_pos = "tcbs"[ialignCO->currentIndex()]; params_.hor_pos = "lcrs"[halignCO->currentIndex()]; - int i = 0; - bool spec = false; - QString special = widthUnitsLC->currentText(); + QString unit = + widthUnitsLC->itemData(widthUnitsLC->currentIndex()).toString(); QString value = widthED->text(); - if (special == qt_("Height")) { - i = 1; - spec = true; - } else if (special == qt_("Depth")) { - i = 2; - spec = true; - } else if (special == qt_("Total Height")) { - i = 3; - spec = true; - } else if (special == qt_("Width")) { - i = 4; - spec = true; - } - // the user might insert a non-special value in the line edit - if (isValidLength(fromqstr(value))) { - i = 0; - spec = false; - } - params_.special = fromqstr(ids_spec_[i]); - - string width; - if (spec) { - width = fromqstr(value); - // beware: bogosity! the unit is simply ignored in this case - width += "in"; + 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 { - width = widgetsToLength(widthED, widthUnitsLC); - } - - params_.width = Length(width); - - i = 0; - spec = false; - special = heightUnitsLC->currentText(); - value = heightED->text(); - if (special == qt_("Height")) { - i = 1; - spec = true; - } else if (special == qt_("Depth")) { - i = 2; - spec = true; - } else if (special == qt_("Total Height")) { - i = 3; - spec = true; - } else if (special == qt_("Width")) { - i = 4; - spec = true; + params_.special = "none"; + params_.width = Length(widgetsToLength(widthED, widthUnitsLC)); } - // the user might insert a non-special value in the line edit - if (isValidLength(fromqstr(value))) { - i = 0; - spec = false; - } - params_.height_special = fromqstr(ids_spec_[i]); - - string height; - if (spec && !isValidLength(fromqstr(heightED->text()))) { - height = fromqstr(value); - // beware: bogosity! the unit is simply ignored in this case - height += "in"; - } else - height = widgetsToLength(heightED, heightUnitsLC); - // the height parameter is omitted in InsetBox.cpp when the value + // the height parameter is omitted if the value // is "1in" and "Total Height" is used as unit. - // 1in + "Total Height" means "1\height" which is the LaTeX default when - // no height is given - if (heightCB->checkState() == Qt::Checked) - params_.height = Length(height); - else { + // 1in + "Total Height" means "1\height" which is the LaTeX default + // if no height is given + if (heightCB->checkState() == Qt::Unchecked) { params_.height = Length("1in"); - params_.height_special = fromqstr(ids_spec_[3]); + params_.height_special = "totalheight"; + } else { + unit = heightUnitsLC->itemData(heightUnitsLC->currentIndex()).toString(); + value = heightED->text(); + if (ids_spec_.contains(unit) && !isValidLength(fromqstr(value))) { + params_.height_special = fromqstr(unit); + // Note: the unit is simply ignored in this case + params_.height = Length(value.toDouble(), Length::IN); + } else { + params_.height_special = "none"; + params_.height = + Length(widgetsToLength(heightED, heightUnitsLC)); + } } } void GuiBox::setSpecial(bool ibox) { - // FIXME: Needed? Already done in the constructor - ids_spec_ = boxGuiSpecialLengthIds(); - gui_names_spec_ = boxGuiSpecialLengthNames(); + QString const last_item = + widthUnitsLC->itemData(heightUnitsLC->currentIndex()).toString(); // check if the widget contains the special units - int count = widthUnitsLC->count(); - bool has_special = false; - for (int i = 0; i != count; ++i) - if (widthUnitsLC->itemText(i).contains(qt_("Total Height")) > 0) - has_special = true; + bool const has_special = (widthUnitsLC->findData("totalheight") != -1); // insert 'em if needed... if (!ibox && !has_special) { - for (int i = 1; i < gui_names_spec_.size(); ++i) - widthUnitsLC->addItem(gui_names_spec_[i]); + for (int i = 1; i < ids_spec_.size(); ++i) + widthUnitsLC->addItem(gui_names_spec_[i], ids_spec_[i]); // ... or remove 'em if needed } else if (ibox && has_special) { - widthUnitsLC->clear(); - for (int i = 0; i != num_units; ++i) - widthUnitsLC->addItem(qt_(unit_name_gui[i])); + for (int i = 1; i < ids_spec_.size(); ++i) { + int n = widthUnitsLC->findData(ids_spec_[i]); + if (n != -1) + widthUnitsLC->removeItem(n); + } } + // restore selected text, if possible + widthUnitsLC->setCurrentItem(last_item); } @@ -437,8 +380,6 @@ void GuiBox::setInnerType(bool frameless, int i) else innerBoxCO->setCurrentIndex(i); } else { - if (innerBoxCO->count() == 2) - ++i; innerBoxCO->clear(); innerBoxCO->addItem(qt_("None")); innerBoxCO->addItem(qt_("Parbox")); @@ -451,7 +392,6 @@ bool GuiBox::initialiseParams(string const & data) { InsetBox::string2params(data, params_); return true; - } @@ -474,4 +414,4 @@ Dialog * createGuiBox(GuiView & lv) { return new GuiBox(lv); } } // namespace lyx -#include "GuiBox_moc.cpp" +#include "moc_GuiBox.cpp"