]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/floatplacement.C
get rid of QT3_SUPPORT and some cleanup
[lyx.git] / src / frontends / qt4 / floatplacement.C
1 /**
2  * \file floatplacement.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Edwin Leuven
7  * \author John Levon
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #ifndef QT3_SUPPORT
13  #define QT3_SUPPORT
14 #endif
15
16 #include <config.h>
17
18 #include "floatplacement.h"
19 #include "qt_helpers.h"
20 //Added by qt3to4:
21 #include <QVBoxLayout>
22 #include <QHBoxLayout>
23
24 #include "insets/insetfloat.h"
25 #include "support/lstrings.h"
26
27 #include <QCheckBox>
28 #include <QLayout>
29 #include <QGroupBox>
30
31 using lyx::support::contains;
32
33 using std::string;
34
35
36 // FIXME: set disabled doesn't work properly
37 // should be fixed now (jspitzm)
38 FloatPlacement::FloatPlacement(QWidget * parent)
39         : QWidget(parent)
40 {
41         QHBoxLayout * toplayout = new QHBoxLayout(this, 11, 6);
42         layout = new QVBoxLayout(0, 0, 6);
43         QGroupBox * options = new QGroupBox(qt_("Advanced Placement Options"), this);
44
45         defaultsCB = new QCheckBox(qt_("Use &default placement"), this);
46         topCB = new QCheckBox(qt_("&Top of page"), options);
47         bottomCB = new QCheckBox(qt_("&Bottom of page"), options);
48         pageCB = new QCheckBox(qt_("&Page of floats"), options);
49         herepossiblyCB = new QCheckBox(qt_("&Here if possible"), options);
50         heredefinitelyCB = new QCheckBox(qt_("Here definitely"), options);
51         ignoreCB = new QCheckBox(qt_("&Ignore LaTeX rules"), options);
52         spanCB = 0;
53         sidewaysCB = 0;
54
55         layout->addWidget(defaultsCB);
56
57         QVBoxLayout * optlay = new QVBoxLayout(options, 10, 6);
58         optlay->addSpacing(6);
59         optlay->addWidget(topCB);
60         optlay->addWidget(bottomCB);
61         optlay->addWidget(pageCB);
62         optlay->addWidget(herepossiblyCB);
63         optlay->addWidget(heredefinitelyCB);
64         optlay->addWidget(ignoreCB);
65
66         layout->addWidget(options);
67
68         toplayout->addLayout(layout);
69
70         connect(defaultsCB, SIGNAL(toggled(bool)), options, SLOT(setDisabled(bool)));
71
72         connect(heredefinitelyCB, SIGNAL(clicked()), this, SLOT(heredefinitelyClicked()));
73         connect(topCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
74         connect(bottomCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
75         connect(pageCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
76         connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
77         connect(defaultsCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
78
79         connect(defaultsCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
80         connect(ignoreCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
81         connect(pageCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
82         connect(heredefinitelyCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
83         connect(herepossiblyCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
84         connect(bottomCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
85         connect(topCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
86 }
87
88
89 void FloatPlacement::useWide()
90 {
91         spanCB = new QCheckBox(qt_("&Span columns"), this);
92         layout->addWidget(spanCB);
93         setTabOrder(ignoreCB, spanCB);
94         connect(spanCB, SIGNAL(clicked()), this, SLOT(spanClicked()));
95         connect(spanCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
96 }
97
98
99 void FloatPlacement::useSideways()
100 {
101         sidewaysCB = new QCheckBox(qt_("&Rotate sideways"), this);
102         layout->addWidget(sidewaysCB);
103         setTabOrder(spanCB, sidewaysCB);
104         connect(sidewaysCB, SIGNAL(clicked()), this, SLOT(sidewaysClicked()));
105         connect(sidewaysCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
106 }
107
108
109 void FloatPlacement::changedSlot()
110 {
111         // emit signal
112         changed();
113 }
114
115
116 void FloatPlacement::set(string const & placement)
117 {
118         bool def_placement = false;
119         bool top = false;
120         bool bottom = false;
121         bool page = false;
122         bool here = false;
123         bool force = false;
124         bool here_definitely = false;
125
126         if (placement.empty()) {
127                 def_placement = true;
128         } else if (contains(placement, 'H')) {
129                 here_definitely = true;
130         } else {
131                 if (contains(placement, '!')) {
132                         force = true;
133                 }
134                 if (contains(placement, 't')) {
135                         top = true;
136                 }
137                 if (contains(placement, 'b')) {
138                         bottom = true;
139                 }
140                 if (contains(placement, 'p')) {
141                         page = true;
142                 }
143                 if (contains(placement, 'h')) {
144                         here = true;
145                 }
146         }
147
148         defaultsCB->setChecked(def_placement);
149         topCB->setChecked(top);
150         bottomCB->setChecked(bottom);
151         pageCB->setChecked(page);
152         herepossiblyCB->setChecked(here);
153         ignoreCB->setChecked(force);
154         ignoreCB->setEnabled(top || bottom || page || here);
155         heredefinitelyCB->setChecked(here_definitely);
156         checkAllowed();
157 }
158
159
160 void FloatPlacement::set(InsetFloatParams const & params)
161 {
162         set(params.placement);
163
164         if (params.wide) {
165                 herepossiblyCB->setChecked(false);
166                 heredefinitelyCB->setChecked(false);
167                 bottomCB->setChecked(false);
168         }
169
170         spanCB->setChecked(params.wide);
171         sidewaysCB->setChecked(params.sideways);
172         sidewaysCB->setEnabled(params.type == "figure"
173                 || params.type == "table");
174         checkAllowed();
175 }
176
177
178 string const FloatPlacement::get(bool & wide, bool & sideways) const
179 {
180         wide = spanCB->isChecked();
181         sideways = sidewaysCB->isChecked();
182
183         return get();
184 }
185
186
187 string const FloatPlacement::get() const
188 {
189         string placement;
190
191         if (defaultsCB->isChecked())
192                 return placement;
193
194         if (heredefinitelyCB->isChecked()) {
195                 placement += 'H';
196         } else {
197                 if (ignoreCB->isChecked()) {
198                         placement += '!';
199                 }
200                 if (topCB->isChecked()) {
201                         placement += 't';
202                 }
203                 if (bottomCB->isChecked()) {
204                         placement += 'b';
205                 }
206                 if (pageCB->isChecked()) {
207                         placement += 'p';
208                 }
209                 if (herepossiblyCB->isChecked()) {
210                         placement += 'h';
211                 }
212         }
213         return placement;
214 }
215
216
217 void FloatPlacement::tbhpClicked()
218 {
219         heredefinitelyCB->setChecked(false);
220         checkAllowed();
221 }
222
223
224 void FloatPlacement::heredefinitelyClicked()
225 {
226         if (heredefinitelyCB->isChecked())
227                 ignoreCB->setEnabled(false);
228
229         topCB->setChecked(false);
230         bottomCB->setChecked(false);
231         pageCB->setChecked(false);
232         herepossiblyCB->setChecked(false);
233         ignoreCB->setChecked(false);
234 }
235
236
237 void FloatPlacement::spanClicked()
238 {
239         checkAllowed();
240
241         if (!spanCB->isChecked())
242                 return;
243
244         herepossiblyCB->setChecked(false);
245         heredefinitelyCB->setChecked(false);
246         bottomCB->setChecked(false);
247 }
248
249
250 void FloatPlacement::sidewaysClicked()
251 {
252         checkAllowed();
253 }
254
255
256 void FloatPlacement::checkAllowed()
257 {
258         bool const defaults(defaultsCB->isChecked());
259         bool ignore(topCB->isChecked());
260         ignore |= bottomCB->isChecked();
261         ignore |= pageCB->isChecked();
262         ignore |= herepossiblyCB->isChecked();
263
264         // float or document dialog?
265         if (spanCB != 0) {
266                 bool const span(spanCB->isChecked());
267                 bool const sideways(sidewaysCB->isChecked());
268                 defaultsCB->setEnabled(!sideways);
269                 topCB->setEnabled(!sideways && !defaults);
270                 bottomCB->setEnabled(!sideways && !defaults && !span);
271                 pageCB->setEnabled(!sideways && !defaults);
272                 ignoreCB->setEnabled(!sideways && !defaults && ignore);
273                 herepossiblyCB->setEnabled(!sideways && !defaults && !span);
274                 heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
275                 spanCB->setEnabled(!sideways);
276         } else {
277                 topCB->setEnabled(!defaults);
278                 bottomCB->setEnabled(!defaults);
279                 pageCB->setEnabled(!defaults);
280                 ignoreCB->setEnabled(!defaults && ignore);
281                 herepossiblyCB->setEnabled(!defaults);
282                 heredefinitelyCB->setEnabled(!defaults);
283         }
284 }
285
286 #include "floatplacement_moc.cpp"