GuiPrintNomencl.{cpp,h}:
[lyx.git] / src / frontends / qt4 / FloatPlacement.cpp
blob22fc1ac1d79d649ec1aeee9c8d5b81284e1f5ae0
1 /**
2 * \file FloatPlacement.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Edwin Leuven
7 * \author John Levon
9 * Full author contact details are available in file CREDITS.
12 #include <config.h>
14 #include "FloatPlacement.h"
15 #include "qt_helpers.h"
17 #include "insets/InsetFloat.h"
18 #include "support/lstrings.h"
20 using namespace std;
21 using namespace lyx::support;
24 namespace lyx {
26 FloatPlacement::FloatPlacement(QWidget *)
28 setupUi(this);
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()));
43 spanCB->hide();
44 sidewaysCB->hide();
48 void FloatPlacement::useWide()
50 spanCB->show();
54 void FloatPlacement::useSideways()
56 sidewaysCB->show();
60 void FloatPlacement::changedSlot()
62 // emit signal
63 changed();
67 void FloatPlacement::set(string const & placement)
69 bool def_placement = false;
70 bool top = false;
71 bool bottom = false;
72 bool page = false;
73 bool here = false;
74 bool force = false;
75 bool here_definitely = false;
77 if (placement.empty()) {
78 def_placement = true;
79 } else if (contains(placement, 'H')) {
80 here_definitely = true;
81 } else {
82 if (contains(placement, '!')) {
83 force = true;
85 if (contains(placement, 't')) {
86 top = true;
88 if (contains(placement, 'b')) {
89 bottom = true;
91 if (contains(placement, 'p')) {
92 page = true;
94 if (contains(placement, 'h')) {
95 here = true;
99 defaultsCB->setChecked(def_placement);
100 topCB->setChecked(top);
101 bottomCB->setChecked(bottom);
102 pageCB->setChecked(page);
103 herepossiblyCB->setChecked(here);
104 ignoreCB->setChecked(force);
105 ignoreCB->setEnabled(top || bottom || page || here);
106 heredefinitelyCB->setChecked(here_definitely);
107 checkAllowed();
111 void FloatPlacement::set(lyx::InsetFloatParams const & params)
113 set(params.placement);
115 standardfloat_ = (params.type == "figure"
116 || params.type == "table");
118 if (params.wide) {
119 herepossiblyCB->setChecked(false);
120 heredefinitelyCB->setChecked(false);
121 bottomCB->setChecked(false);
124 spanCB->setChecked(params.wide);
125 sidewaysCB->setChecked(params.sideways);
126 // the package rotfloat only has *-versions for figure and table
127 spanCB->setEnabled(!params.sideways || standardfloat_);
128 checkAllowed();
132 string const FloatPlacement::get(bool & wide, bool & sideways) const
134 wide = spanCB->isChecked();
135 sideways = sidewaysCB->isChecked();
137 return get();
141 string const FloatPlacement::get() const
143 string placement;
145 if (defaultsCB->isChecked())
146 return placement;
148 if (heredefinitelyCB->isChecked()) {
149 placement += 'H';
150 } else {
151 if (ignoreCB->isChecked()) {
152 placement += '!';
154 if (topCB->isChecked()) {
155 placement += 't';
157 if (bottomCB->isChecked()) {
158 placement += 'b';
160 if (pageCB->isChecked()) {
161 placement += 'p';
163 if (herepossiblyCB->isChecked()) {
164 placement += 'h';
167 return placement;
171 void FloatPlacement::tbhpClicked()
173 heredefinitelyCB->setChecked(false);
174 checkAllowed();
178 void FloatPlacement::on_heredefinitelyCB_clicked()
180 if (heredefinitelyCB->isChecked())
181 ignoreCB->setEnabled(false);
183 topCB->setChecked(false);
184 bottomCB->setChecked(false);
185 pageCB->setChecked(false);
186 herepossiblyCB->setChecked(false);
187 ignoreCB->setChecked(false);
191 void FloatPlacement::on_spanCB_clicked()
193 checkAllowed();
194 changed();
196 if (!spanCB->isChecked())
197 return;
199 herepossiblyCB->setChecked(false);
200 heredefinitelyCB->setChecked(false);
201 bottomCB->setChecked(false);
205 void FloatPlacement::on_sidewaysCB_clicked()
207 checkAllowed();
208 changed();
212 void FloatPlacement::checkAllowed()
214 bool const defaults = defaultsCB->isChecked();
215 bool ignore = topCB->isChecked();
216 ignore |= bottomCB->isChecked();
217 ignore |= pageCB->isChecked();
218 ignore |= herepossiblyCB->isChecked();
220 // float or document dialog?
221 if (spanCB->isVisible()) {
222 bool const span = spanCB->isChecked();
223 bool const sideways = sidewaysCB->isChecked();
224 defaultsCB->setEnabled(!sideways);
225 topCB->setEnabled(!sideways && !defaults);
226 bottomCB->setEnabled(!sideways && !defaults && !span);
227 pageCB->setEnabled(!sideways && !defaults);
228 ignoreCB->setEnabled(!sideways && !defaults && ignore);
229 herepossiblyCB->setEnabled(!sideways && !defaults && !span);
230 heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
231 spanCB->setEnabled(!sideways || standardfloat_);
232 } else {
233 topCB->setEnabled(!defaults);
234 bottomCB->setEnabled(!defaults);
235 pageCB->setEnabled(!defaults);
236 ignoreCB->setEnabled(!defaults && ignore);
237 herepossiblyCB->setEnabled(!defaults);
238 heredefinitelyCB->setEnabled(!defaults);
242 } // namespace lyx
244 #include "moc_FloatPlacement.cpp"