2 * \file FloatPlacement.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * \author Jürgen Spitzmüller
10 * Full author contact details are available in file CREDITS.
15 #include "FloatPlacement.h"
16 #include "qt_helpers.h"
19 #include "BufferParams.h"
20 #include "FloatList.h"
21 #include "TextClass.h"
23 #include "insets/InsetFloat.h"
24 #include "support/lstrings.h"
29 using namespace lyx::support;
36 FloatPlacement::FloatPlacement(bool show_options, QWidget * parent)
37 : InsetParamsWidget(parent), standardfloat_(true),
38 allows_wide_(true), allows_sideways_(true), float_list_(nullptr)
42 connect(floatTypeCO, SIGNAL(activated(int)), this, SLOT(changedSlot()));
43 connect(placementCO, SIGNAL(activated(int)), this, SLOT(changedSlot()));
44 connect(topCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
45 connect(bottomCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
46 connect(pageCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
47 connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
48 connect(heredefinitelyCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
49 connect(ignoreCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
50 connect(spanCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
51 connect(sidewaysCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
52 connect(alignClassDefaultRB, SIGNAL(clicked()), this, SLOT(changedSlot()));
53 connect(alignDocDefaultRB, SIGNAL(clicked()), this, SLOT(changedSlot()));
54 connect(alignLeftRB, SIGNAL(clicked()), this, SLOT(changedSlot()));
55 connect(alignCenterRB, SIGNAL(clicked()), this, SLOT(changedSlot()));
56 connect(alignRightRB, SIGNAL(clicked()), this, SLOT(changedSlot()));
58 floatTypeTitle->setVisible(show_options);
59 floatTypeCO->setVisible(show_options);
60 alignDocDefaultRB->setVisible(show_options);
61 spanCB->setVisible(show_options);
62 sidewaysCB->setVisible(show_options);
63 optionsGB->setVisible(show_options);
64 initFloatPlacementCO(show_options);
68 docstring FloatPlacement::dialogToParams() const
70 InsetFloatParams params;
71 params.type = fromqstr(floatTypeCO->itemData(floatTypeCO->currentIndex()).toString());
72 params.wide = spanCB->isChecked();
73 params.sideways = sidewaysCB->isChecked();
74 params.alignment = getAlignment();
75 params.placement = getPlacement();
76 return from_ascii(InsetFloat::params2string(params));
80 void FloatPlacement::useWide()
86 void FloatPlacement::useSideways()
92 bool FloatPlacement::possiblePlacement(char p) const
94 return !spanCB->isVisible() || contains(allowed_placement_, p);
98 void FloatPlacement::setPlacement(string const & placement)
100 bool def_placement = false;
101 bool doc_placement = false;
107 bool here_definitely = false;
109 if (placement.empty() || placement == "class")
110 def_placement = true;
111 else if (placement == "document")
112 doc_placement = true;
113 else if (contains(placement, 'H') && possiblePlacement('H')) {
114 here_definitely = true;
116 if (contains(placement, '!') && possiblePlacement('!')) {
119 if (contains(placement, 't') && possiblePlacement('t')) {
122 if (contains(placement, 'b') && possiblePlacement('b')) {
125 if (contains(placement, 'p') && possiblePlacement('p')) {
128 if (contains(placement, 'h') && possiblePlacement('h')) {
134 placementCO->setCurrentIndex(placementCO->findData(toqstr("class")));
135 else if (doc_placement)
136 placementCO->setCurrentIndex(placementCO->findData(toqstr("document")));
138 placementCO->setCurrentIndex(placementCO->findData(toqstr("custom")));
139 topCB->setChecked(top);
140 bottomCB->setChecked(bottom);
141 pageCB->setChecked(page);
142 herepossiblyCB->setChecked(here);
143 ignoreCB->setChecked(force);
144 heredefinitelyCB->setChecked(here_definitely);
149 void FloatPlacement::setAlignment(string const & alignment)
151 if (alignment == "document")
152 alignDocDefaultRB->setChecked(true);
153 else if (alignment == "left")
154 alignLeftRB->setChecked(true);
155 else if (alignment == "center")
156 alignCenterRB->setChecked(true);
157 else if (alignment == "right")
158 alignRightRB->setChecked(true);
160 alignClassDefaultRB->setChecked(true);
164 void FloatPlacement::initFloatTypeCO(FloatList const & floats)
166 if (float_list_ == &floats)
169 float_list_ = &floats;
170 floatTypeCO->clear();
171 FloatList::const_iterator it = floats.begin();
172 FloatList::const_iterator const end = floats.end();
173 for (; it != end; ++it) {
174 floatTypeCO->addItem(qt_(it->second.name()),
175 toqstr(it->second.floattype()));
180 void FloatPlacement::initFloatPlacementCO(bool const local)
182 placementCO->addItem(qt_("Class Default"), "class");
184 placementCO->addItem(qt_("Document Default"), "document");
185 placementCO->addItem(qt_("Custom"), "custom");
189 void FloatPlacement::paramsToDialog(Inset const * inset)
191 InsetFloat const * fl = static_cast<InsetFloat const *>(inset);
192 InsetFloatParams const & params = fl->params();
194 BufferParams const & bp = fl->buffer().params();
195 FloatList const & floats = bp.documentClass().floats();
196 initFloatTypeCO(floats);
198 int const item = floatTypeCO->findData(toqstr(params.type));
199 floatTypeCO->setCurrentIndex(item);
201 allowed_placement_ = floats.allowedPlacement(params.type);
202 allows_sideways_ = floats.allowsSideways(params.type);
203 allows_wide_ = floats.allowsWide(params.type);
205 setPlacement(params.placement);
206 setAlignment(params.alignment);
208 standardfloat_ = (params.type == "figure"
209 || params.type == "table");
212 herepossiblyCB->setChecked(false);
213 heredefinitelyCB->setChecked(false);
214 bottomCB->setChecked(false);
217 spanCB->setChecked(params.wide && allows_wide_);
218 sidewaysCB->setChecked(params.sideways && allows_sideways_);
224 string const FloatPlacement::getPlacement() const
229 placementCO->itemData(placementCO->currentIndex()).toString();
232 if (data == "document")
235 if (heredefinitelyCB->isChecked()) {
238 if (ignoreCB->isChecked()) {
241 if (topCB->isChecked()) {
244 if (bottomCB->isChecked()) {
247 if (pageCB->isChecked()) {
250 if (herepossiblyCB->isChecked()) {
258 string const FloatPlacement::getAlignment() const
260 if (alignDocDefaultRB->isChecked())
262 if (alignLeftRB->isChecked())
264 if (alignCenterRB->isChecked())
266 if (alignRightRB->isChecked())
272 void FloatPlacement::on_placementCO_currentIndexChanged(int index)
275 if (placementCO->itemText(index) != "custom")
277 if (topCB->isChecked() || bottomCB->isChecked()
278 || pageCB->isChecked() || herepossiblyCB->isChecked()
279 || heredefinitelyCB->isChecked() || ignoreCB->isChecked())
284 void FloatPlacement::changedSlot()
291 void FloatPlacement::checkAllowed() const
293 bool const defaults =
294 placementCO->itemData(placementCO->currentIndex()).toString() != "custom";
295 bool const ignore = topCB->isChecked() || bottomCB->isChecked()
296 || pageCB->isChecked() || herepossiblyCB->isChecked();
297 bool const heredefinitely = heredefinitelyCB->isChecked();
299 // float or document dialog?
300 if (spanCB->isVisible()) {
301 bool const span = spanCB->isChecked();
302 bool const sideways = sidewaysCB->isChecked();
303 topCB->setEnabled(!sideways && !defaults && !heredefinitely
304 && contains(allowed_placement_, 't'));
305 bottomCB->setEnabled(!sideways && !defaults && !span && !heredefinitely
306 && contains(allowed_placement_, 'b'));
307 pageCB->setEnabled(!sideways && !defaults && !heredefinitely
308 && contains(allowed_placement_, 'p'));
309 if (!pageCB->isChecked())
310 pageCB->setChecked(sideways && contains(allowed_placement_, 'p'));
311 herepossiblyCB->setEnabled(!defaults && !span && !heredefinitely
312 && contains(allowed_placement_, 'h'));
313 heredefinitelyCB->setEnabled(!defaults && !span
314 && contains(allowed_placement_, 'H'));
315 ignoreCB->setEnabled(!defaults && ignore && !heredefinitely
316 && contains(allowed_placement_, '!'));
317 // handle special case with sideways
318 if ((!herepossiblyCB->isChecked() && sideways) || (span && sideways))
319 ignoreCB->setEnabled(false);
320 // when disabled the options must be unchecked to avoid strange LaTeX export
321 // don't do it for pageCB because this case is handled with sideways
322 if (ignoreCB->isChecked() && !ignoreCB->isEnabled())
323 ignoreCB->setChecked(false);
324 if (herepossiblyCB->isChecked() && !herepossiblyCB->isEnabled())
325 herepossiblyCB->setChecked(false);
326 if (topCB->isChecked() && !topCB->isEnabled())
327 topCB->setChecked(false);
328 if (bottomCB->isChecked() && !bottomCB->isEnabled())
329 bottomCB->setChecked(false);
330 spanCB->setEnabled(allows_wide_ && (!sideways || standardfloat_));
331 sidewaysCB->setEnabled(allows_sideways_);
332 placementCO->setEnabled(!(sideways && span));
334 topCB->setEnabled(!defaults && !heredefinitely);
335 bottomCB->setEnabled(!defaults && !heredefinitely);
336 pageCB->setEnabled(!defaults && !heredefinitely);
337 herepossiblyCB->setEnabled(!defaults && !heredefinitely);
338 heredefinitelyCB->setEnabled(!defaults);
339 ignoreCB->setEnabled(!defaults && ignore && !heredefinitely);
344 bool FloatPlacement::checkWidgets(bool readonly) const
347 floatTypeCO->setEnabled(false);
348 placementCO->setEnabled(false);
349 aligmentGB->setEnabled(false);
350 spanCB->setEnabled(false);
351 sidewaysCB->setEnabled(false);
355 return InsetParamsWidget::checkWidgets();
358 } // namespace frontend
361 #include "moc_FloatPlacement.cpp"