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"
17 #include "insets/InsetFloat.h"
18 #include "support/lstrings.h"
21 using namespace lyx::support;
26 FloatPlacement::FloatPlacement(QWidget *)
30 connect(topCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
31 connect(bottomCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
32 connect(pageCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
33 connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
34 connect(defaultsCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
35 connect(defaultsCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
36 connect(ignoreCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
37 connect(pageCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
38 connect(heredefinitelyCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
39 connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
40 connect(bottomCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
41 connect(topCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
48 docstring FloatPlacement::dialogToParams() const
50 InsetFloatParams params;
51 params.type = float_type_;
52 params.placement = get(params.wide, params.sideways);
53 return from_ascii(InsetFloat::params2string(params));
57 void FloatPlacement::useWide()
63 void FloatPlacement::useSideways()
69 void FloatPlacement::changedSlot()
76 void FloatPlacement::set(string const & placement)
78 bool def_placement = false;
84 bool here_definitely = false;
86 if (placement.empty()) {
88 } else if (contains(placement, 'H')) {
89 here_definitely = true;
91 if (contains(placement, '!')) {
94 if (contains(placement, 't')) {
97 if (contains(placement, 'b')) {
100 if (contains(placement, 'p')) {
103 if (contains(placement, 'h')) {
108 defaultsCB->setChecked(def_placement);
109 topCB->setChecked(top);
110 bottomCB->setChecked(bottom);
111 pageCB->setChecked(page);
112 herepossiblyCB->setChecked(here);
113 ignoreCB->setChecked(force);
114 ignoreCB->setEnabled(top || bottom || page || here);
115 heredefinitelyCB->setChecked(here_definitely);
120 void FloatPlacement::paramsToDialog(Inset const * inset)
122 InsetFloat const * fl = static_cast<InsetFloat const *>(inset);
123 InsetFloatParams const & params = fl->params();
125 float_type_ = params.type;
126 floatType->setText(qt_(float_type_));
128 set(params.placement);
130 standardfloat_ = (params.type == "figure"
131 || params.type == "table");
134 herepossiblyCB->setChecked(false);
135 heredefinitelyCB->setChecked(false);
136 bottomCB->setChecked(false);
139 spanCB->setChecked(params.wide);
140 sidewaysCB->setChecked(params.sideways);
141 // the package rotfloat only has *-versions for figure and table
142 spanCB->setEnabled(!params.sideways || standardfloat_);
147 string const FloatPlacement::get(bool & wide, bool & sideways) const
149 wide = spanCB->isChecked();
150 sideways = sidewaysCB->isChecked();
156 string const FloatPlacement::get() const
160 if (defaultsCB->isChecked())
163 if (heredefinitelyCB->isChecked()) {
166 if (ignoreCB->isChecked()) {
169 if (topCB->isChecked()) {
172 if (bottomCB->isChecked()) {
175 if (pageCB->isChecked()) {
178 if (herepossiblyCB->isChecked()) {
186 void FloatPlacement::tbhpClicked()
188 heredefinitelyCB->setChecked(false);
193 void FloatPlacement::on_heredefinitelyCB_clicked()
195 if (heredefinitelyCB->isChecked())
196 ignoreCB->setEnabled(false);
198 topCB->setChecked(false);
199 bottomCB->setChecked(false);
200 pageCB->setChecked(false);
201 herepossiblyCB->setChecked(false);
202 ignoreCB->setChecked(false);
206 void FloatPlacement::on_spanCB_clicked()
211 if (!spanCB->isChecked())
214 herepossiblyCB->setChecked(false);
215 heredefinitelyCB->setChecked(false);
216 bottomCB->setChecked(false);
220 void FloatPlacement::on_sidewaysCB_clicked()
227 void FloatPlacement::checkAllowed()
229 bool const defaults = defaultsCB->isChecked();
230 bool ignore = topCB->isChecked();
231 ignore |= bottomCB->isChecked();
232 ignore |= pageCB->isChecked();
233 ignore |= herepossiblyCB->isChecked();
235 // float or document dialog?
236 if (spanCB->isVisible()) {
237 bool const span = spanCB->isChecked();
238 bool const sideways = sidewaysCB->isChecked();
239 defaultsCB->setEnabled(!sideways);
240 topCB->setEnabled(!sideways && !defaults);
241 bottomCB->setEnabled(!sideways && !defaults && !span);
242 pageCB->setEnabled(!sideways && !defaults);
243 ignoreCB->setEnabled(!sideways && !defaults && ignore);
244 herepossiblyCB->setEnabled(!sideways && !defaults && !span);
245 heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
246 spanCB->setEnabled(!sideways || standardfloat_);
248 topCB->setEnabled(!defaults);
249 bottomCB->setEnabled(!defaults);
250 pageCB->setEnabled(!defaults);
251 ignoreCB->setEnabled(!defaults && ignore);
252 herepossiblyCB->setEnabled(!defaults);
253 heredefinitelyCB->setEnabled(!defaults);
259 #include "moc_FloatPlacement.cpp"