X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FFloatPlacement.cpp;h=59bdf62ec83a87ab6c4950fd003f7ae5e009a72d;hb=161f7b7f62cb33dab681add6c5b5b68a887e2ea1;hp=c40b3b2ec7b1e80e5dc568216c8c2286a05db566;hpb=bbda43a4006e170a19eaec94ae2a4b284ae1f7c4;p=lyx.git diff --git a/src/frontends/qt4/FloatPlacement.cpp b/src/frontends/qt4/FloatPlacement.cpp index c40b3b2ec7..59bdf62ec8 100644 --- a/src/frontends/qt4/FloatPlacement.cpp +++ b/src/frontends/qt4/FloatPlacement.cpp @@ -17,10 +17,13 @@ #include "Buffer.h" #include "BufferParams.h" #include "FloatList.h" +#include "TextClass.h" #include "insets/InsetFloat.h" #include "support/lstrings.h" +#include + using namespace std; using namespace lyx::support; @@ -30,7 +33,8 @@ namespace lyx { namespace frontend { FloatPlacement::FloatPlacement(bool show_options, QWidget * parent) - : InsetParamsWidget(parent), float_list_(0) + : InsetParamsWidget(parent), standardfloat_ (true), + allows_wide_(true), allows_sideways_(true), float_list_(0) { setupUi(this); @@ -44,6 +48,8 @@ FloatPlacement::FloatPlacement(bool show_options, QWidget * parent) connect(spanCB, SIGNAL(clicked()), this, SLOT(changedSlot())); connect(sidewaysCB, SIGNAL(clicked()), this, SLOT(changedSlot())); + floatTypeTitle->setVisible(show_options); + floatTypeCO->setVisible(show_options); spanCB->setVisible(show_options); sidewaysCB->setVisible(show_options); } @@ -70,6 +76,12 @@ void FloatPlacement::useSideways() } +bool FloatPlacement::possiblePlacement(char const & p) const +{ + return !spanCB->isVisible() || contains(allowed_placement_, p); +} + + void FloatPlacement::set(string const & placement) { bool def_placement = false; @@ -82,22 +94,22 @@ void FloatPlacement::set(string const & placement) if (placement.empty()) { def_placement = true; - } else if (contains(placement, 'H')) { + } else if (contains(placement, 'H') && possiblePlacement('H')) { here_definitely = true; } else { - if (contains(placement, '!')) { + if (contains(placement, '!') && possiblePlacement('!')) { force = true; } - if (contains(placement, 't')) { + if (contains(placement, 't') && possiblePlacement('t')) { top = true; } - if (contains(placement, 'b')) { + if (contains(placement, 'b') && possiblePlacement('b')) { bottom = true; } - if (contains(placement, 'p')) { + if (contains(placement, 'p') && possiblePlacement('p')) { page = true; } - if (contains(placement, 'h')) { + if (contains(placement, 'h') && possiblePlacement('h')) { here = true; } } @@ -124,7 +136,7 @@ void FloatPlacement::initFloatTypeCO(FloatList const & floats) FloatList::const_iterator const end = floats.end(); for (; it != end; ++it) { floatTypeCO->addItem(qt_(it->second.name()), - toqstr(it->second.type())); + toqstr(it->second.floattype())); } } @@ -135,11 +147,16 @@ void FloatPlacement::paramsToDialog(Inset const * inset) InsetFloatParams const & params = fl->params(); BufferParams const & bp = fl->buffer().params(); - initFloatTypeCO(bp.documentClass().floats()); + FloatList const & floats = bp.documentClass().floats(); + initFloatTypeCO(floats); int const item = floatTypeCO->findData(toqstr(params.type)); floatTypeCO->setCurrentIndex(item); + allowed_placement_ = floats.allowedPlacement(params.type); + allows_sideways_ = floats.allowsSideways(params.type); + allows_wide_ = floats.allowsWide(params.type); + set(params.placement); standardfloat_ = (params.type == "figure" @@ -151,10 +168,9 @@ void FloatPlacement::paramsToDialog(Inset const * inset) bottomCB->setChecked(false); } - spanCB->setChecked(params.wide); - sidewaysCB->setChecked(params.sideways); - // the package rotfloat only has *-versions for figure and table - spanCB->setEnabled(!params.sideways || standardfloat_); + spanCB->setChecked(params.wide && allows_wide_); + sidewaysCB->setChecked(params.sideways && allows_sideways_); + checkAllowed(); } @@ -217,7 +233,7 @@ void FloatPlacement::changedSlot() } -void FloatPlacement::checkAllowed() +void FloatPlacement::checkAllowed() const { bool const defaults = defaultsCB->isChecked(); bool const ignore = topCB->isChecked() || bottomCB->isChecked() @@ -228,14 +244,36 @@ void FloatPlacement::checkAllowed() if (spanCB->isVisible()) { bool const span = spanCB->isChecked(); bool const sideways = sidewaysCB->isChecked(); - defaultsCB->setEnabled(!sideways); - topCB->setEnabled(!sideways && !defaults && !heredefinitely); - bottomCB->setEnabled(!sideways && !defaults && !span && !heredefinitely); - pageCB->setEnabled(!sideways && !defaults && !heredefinitely); - herepossiblyCB->setEnabled(!sideways && !defaults && !span && !heredefinitely); - heredefinitelyCB->setEnabled(!sideways && !defaults && !span); - ignoreCB->setEnabled(!sideways && !defaults && ignore && !heredefinitely); - spanCB->setEnabled(!sideways || standardfloat_); + topCB->setEnabled(!sideways && !defaults && !heredefinitely + && contains(allowed_placement_, 't')); + bottomCB->setEnabled(!sideways && !defaults && !span && !heredefinitely + && contains(allowed_placement_, 'b')); + pageCB->setEnabled(!sideways && !defaults && !heredefinitely + && contains(allowed_placement_, 'p')); + if (!pageCB->isChecked()) + pageCB->setChecked(sideways && contains(allowed_placement_, 'p')); + herepossiblyCB->setEnabled(!defaults && !span && !heredefinitely + && contains(allowed_placement_, 'h')); + heredefinitelyCB->setEnabled(!defaults && !span + && contains(allowed_placement_, 'H')); + ignoreCB->setEnabled(!defaults && ignore && !heredefinitely + && contains(allowed_placement_, '!')); + // handle special case with sideways + if ((!herepossiblyCB->isChecked() && sideways) || (span && sideways)) + ignoreCB->setEnabled(false); + // when disabled the options must be unchecked to avoid strange LaTeX export + // don't do it for pageCB because this case is handled with sideways + if (ignoreCB->isChecked() && !ignoreCB->isEnabled()) + ignoreCB->setChecked(false); + if (herepossiblyCB->isChecked() && !herepossiblyCB->isEnabled()) + herepossiblyCB->setChecked(false); + if (topCB->isChecked() && !topCB->isEnabled()) + topCB->setChecked(false); + if (bottomCB->isChecked() && !bottomCB->isEnabled()) + bottomCB->setChecked(false); + spanCB->setEnabled(allows_wide_ && (!sideways || standardfloat_)); + sidewaysCB->setEnabled(allows_sideways_); + defaultsCB->setEnabled(!(sideways && span)); } else { topCB->setEnabled(!defaults && !heredefinitely); bottomCB->setEnabled(!defaults && !heredefinitely); @@ -246,6 +284,21 @@ void FloatPlacement::checkAllowed() } } + +bool FloatPlacement::checkWidgets(bool readonly) const +{ + if (readonly) { + floatTypeCO->setEnabled(false); + defaultsCB->setEnabled(false); + options->setEnabled(false); + spanCB->setEnabled(false); + sidewaysCB->setEnabled(false); + } else + checkAllowed(); + + return InsetParamsWidget::checkWidgets(); +} + } // namespace frontend } // namespace lyx