2 * \file FloatPlacement.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
9 * Full author contact details are available in file CREDITS.
14 #include "FloatPlacement.h"
15 #include "qt_helpers.h"
18 #include "BufferParams.h"
19 #include "FloatList.h"
20 #include "TextClass.h"
22 #include "insets/InsetFloat.h"
23 #include "support/lstrings.h"
28 using namespace lyx::support;
35 FloatPlacement::FloatPlacement(bool show_options, QWidget * parent)
36 : InsetParamsWidget(parent), float_list_(0)
40 connect(floatTypeCO, SIGNAL(activated(int)), this, SLOT(changedSlot()));
41 connect(topCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
42 connect(bottomCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
43 connect(pageCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
44 connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
45 connect(heredefinitelyCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
46 connect(ignoreCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
47 connect(spanCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
48 connect(sidewaysCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
50 floatTypeTitle->setVisible(show_options);
51 floatTypeCO->setVisible(show_options);
52 spanCB->setVisible(show_options);
53 sidewaysCB->setVisible(show_options);
57 docstring FloatPlacement::dialogToParams() const
59 InsetFloatParams params;
60 params.type = fromqstr(floatTypeCO->itemData(floatTypeCO->currentIndex()).toString());
61 params.placement = get(params.wide, params.sideways);
62 return from_ascii(InsetFloat::params2string(params));
66 void FloatPlacement::useWide()
72 void FloatPlacement::useSideways()
78 void FloatPlacement::set(string const & placement)
80 bool def_placement = false;
86 bool here_definitely = false;
88 if (placement.empty()) {
90 } else if (contains(placement, 'H')) {
91 here_definitely = true;
93 if (contains(placement, '!')) {
96 if (contains(placement, 't')) {
99 if (contains(placement, 'b')) {
102 if (contains(placement, 'p')) {
105 if (contains(placement, 'h')) {
110 defaultsCB->setChecked(def_placement);
111 topCB->setChecked(top);
112 bottomCB->setChecked(bottom);
113 pageCB->setChecked(page);
114 herepossiblyCB->setChecked(here);
115 ignoreCB->setChecked(force);
116 heredefinitelyCB->setChecked(here_definitely);
121 void FloatPlacement::initFloatTypeCO(FloatList const & floats)
123 if (float_list_ == &floats)
126 float_list_ = &floats;
127 floatTypeCO->clear();
128 FloatList::const_iterator it = floats.begin();
129 FloatList::const_iterator const end = floats.end();
130 for (; it != end; ++it) {
131 floatTypeCO->addItem(qt_(it->second.name()),
132 toqstr(it->second.floattype()));
137 void FloatPlacement::paramsToDialog(Inset const * inset)
139 InsetFloat const * fl = static_cast<InsetFloat const *>(inset);
140 InsetFloatParams const & params = fl->params();
142 BufferParams const & bp = fl->buffer().params();
143 initFloatTypeCO(bp.documentClass().floats());
145 int const item = floatTypeCO->findData(toqstr(params.type));
146 floatTypeCO->setCurrentIndex(item);
148 set(params.placement);
150 standardfloat_ = (params.type == "figure"
151 || params.type == "table");
154 herepossiblyCB->setChecked(false);
155 heredefinitelyCB->setChecked(false);
156 bottomCB->setChecked(false);
159 spanCB->setChecked(params.wide);
160 sidewaysCB->setChecked(params.sideways);
161 // the package rotfloat only has *-versions for figure and table
162 spanCB->setEnabled(!params.sideways || standardfloat_);
167 string const FloatPlacement::get(bool & wide, bool & sideways) const
169 wide = spanCB->isChecked();
170 sideways = sidewaysCB->isChecked();
176 string const FloatPlacement::get() const
180 if (defaultsCB->isChecked())
183 if (heredefinitelyCB->isChecked()) {
186 if (ignoreCB->isChecked()) {
189 if (topCB->isChecked()) {
192 if (bottomCB->isChecked()) {
195 if (pageCB->isChecked()) {
198 if (herepossiblyCB->isChecked()) {
206 void FloatPlacement::on_defaultsCB_stateChanged(int state)
209 if (state == Qt::Checked)
211 if (topCB->isChecked() || bottomCB->isChecked()
212 || pageCB->isChecked() || herepossiblyCB->isChecked()
213 || heredefinitelyCB->isChecked() || ignoreCB->isChecked())
218 void FloatPlacement::changedSlot()
225 void FloatPlacement::checkAllowed()
227 bool const defaults = defaultsCB->isChecked();
228 bool const ignore = topCB->isChecked() || bottomCB->isChecked()
229 || pageCB->isChecked() || herepossiblyCB->isChecked();
230 bool const heredefinitely = heredefinitelyCB->isChecked();
232 // float or document dialog?
233 if (spanCB->isVisible()) {
234 bool const span = spanCB->isChecked();
235 bool const sideways = sidewaysCB->isChecked();
236 defaultsCB->setEnabled(!sideways);
237 topCB->setEnabled(!sideways && !defaults && !heredefinitely);
238 bottomCB->setEnabled(!sideways && !defaults && !span && !heredefinitely);
239 pageCB->setEnabled(!sideways && !defaults && !heredefinitely);
240 herepossiblyCB->setEnabled(!sideways && !defaults && !span && !heredefinitely);
241 heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
242 ignoreCB->setEnabled(!sideways && !defaults && ignore && !heredefinitely);
243 spanCB->setEnabled(!sideways || standardfloat_);
245 topCB->setEnabled(!defaults && !heredefinitely);
246 bottomCB->setEnabled(!defaults && !heredefinitely);
247 pageCB->setEnabled(!defaults && !heredefinitely);
248 herepossiblyCB->setEnabled(!defaults && !heredefinitely);
249 heredefinitelyCB->setEnabled(!defaults);
250 ignoreCB->setEnabled(!defaults && ignore && !heredefinitely);
254 } // namespace frontend
257 #include "moc_FloatPlacement.cpp"