]> git.lyx.org Git - features.git/blob - src/frontends/qt4/FloatPlacement.cpp
* Migrate InsetFloat to InsetDialog
[features.git] / src / frontends / qt4 / FloatPlacement.cpp
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.
5  *
6  * \author Edwin Leuven
7  * \author John Levon
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 #include "FloatPlacement.h"
15 #include "qt_helpers.h"
16
17 #include "insets/InsetFloat.h"
18 #include "support/lstrings.h"
19
20 using namespace std;
21 using namespace lyx::support;
22
23
24 namespace lyx {
25
26 FloatPlacement::FloatPlacement(QWidget *)
27 {
28         setupUi(this);
29
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()));
42
43         spanCB->hide();
44         sidewaysCB->hide();
45 }
46
47
48 docstring FloatPlacement::dialogToParams() const
49 {
50         InsetFloatParams params;
51         params.type = fromqstr(floatType->text());
52         params.placement = get(params.wide, params.sideways);
53         return from_ascii(InsetFloat::params2string(params));
54 }
55
56
57 void FloatPlacement::useWide()
58 {
59         spanCB->show();
60 }
61
62
63 void FloatPlacement::useSideways()
64 {
65         sidewaysCB->show();
66 }
67
68
69 void FloatPlacement::changedSlot()
70 {
71         // emit signal
72         changed();
73 }
74
75
76 void FloatPlacement::set(string const & placement)
77 {
78         bool def_placement = false;
79         bool top = false;
80         bool bottom = false;
81         bool page = false;
82         bool here = false;
83         bool force = false;
84         bool here_definitely = false;
85
86         if (placement.empty()) {
87                 def_placement = true;
88         } else if (contains(placement, 'H')) {
89                 here_definitely = true;
90         } else {
91                 if (contains(placement, '!')) {
92                         force = true;
93                 }
94                 if (contains(placement, 't')) {
95                         top = true;
96                 }
97                 if (contains(placement, 'b')) {
98                         bottom = true;
99                 }
100                 if (contains(placement, 'p')) {
101                         page = true;
102                 }
103                 if (contains(placement, 'h')) {
104                         here = true;
105                 }
106         }
107
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);
116         checkAllowed();
117 }
118
119
120 void FloatPlacement::paramsToDialog(Inset const * inset)
121 {
122         InsetFloat const * fl = static_cast<InsetFloat const *>(inset);
123         InsetFloatParams const & params = fl->params();
124
125         floatType->setText(toqstr(params.type));
126
127         set(params.placement);
128
129         standardfloat_ = (params.type == "figure"
130                 || params.type == "table");
131
132         if (params.wide) {
133                 herepossiblyCB->setChecked(false);
134                 heredefinitelyCB->setChecked(false);
135                 bottomCB->setChecked(false);
136         }
137
138         spanCB->setChecked(params.wide);
139         sidewaysCB->setChecked(params.sideways);
140         // the package rotfloat only has *-versions for figure and table
141         spanCB->setEnabled(!params.sideways || standardfloat_);
142         checkAllowed();
143 }
144
145
146 string const FloatPlacement::get(bool & wide, bool & sideways) const
147 {
148         wide = spanCB->isChecked();
149         sideways = sidewaysCB->isChecked();
150
151         return get();
152 }
153
154
155 string const FloatPlacement::get() const
156 {
157         string placement;
158
159         if (defaultsCB->isChecked())
160                 return placement;
161
162         if (heredefinitelyCB->isChecked()) {
163                 placement += 'H';
164         } else {
165                 if (ignoreCB->isChecked()) {
166                         placement += '!';
167                 }
168                 if (topCB->isChecked()) {
169                         placement += 't';
170                 }
171                 if (bottomCB->isChecked()) {
172                         placement += 'b';
173                 }
174                 if (pageCB->isChecked()) {
175                         placement += 'p';
176                 }
177                 if (herepossiblyCB->isChecked()) {
178                         placement += 'h';
179                 }
180         }
181         return placement;
182 }
183
184
185 void FloatPlacement::tbhpClicked()
186 {
187         heredefinitelyCB->setChecked(false);
188         checkAllowed();
189 }
190
191
192 void FloatPlacement::on_heredefinitelyCB_clicked()
193 {
194         if (heredefinitelyCB->isChecked())
195                 ignoreCB->setEnabled(false);
196
197         topCB->setChecked(false);
198         bottomCB->setChecked(false);
199         pageCB->setChecked(false);
200         herepossiblyCB->setChecked(false);
201         ignoreCB->setChecked(false);
202 }
203
204
205 void FloatPlacement::on_spanCB_clicked()
206 {
207         checkAllowed();
208         changed();
209
210         if (!spanCB->isChecked())
211                 return;
212
213         herepossiblyCB->setChecked(false);
214         heredefinitelyCB->setChecked(false);
215         bottomCB->setChecked(false);
216 }
217
218
219 void FloatPlacement::on_sidewaysCB_clicked()
220 {
221         checkAllowed();
222         changed();
223 }
224
225
226 void FloatPlacement::checkAllowed()
227 {
228         bool const defaults = defaultsCB->isChecked();
229         bool ignore = topCB->isChecked();
230         ignore |= bottomCB->isChecked();
231         ignore |= pageCB->isChecked();
232         ignore |= herepossiblyCB->isChecked();
233
234         // float or document dialog?
235         if (spanCB->isVisible()) {
236                 bool const span = spanCB->isChecked();
237                 bool const sideways = sidewaysCB->isChecked();
238                 defaultsCB->setEnabled(!sideways);
239                 topCB->setEnabled(!sideways && !defaults);
240                 bottomCB->setEnabled(!sideways && !defaults && !span);
241                 pageCB->setEnabled(!sideways && !defaults);
242                 ignoreCB->setEnabled(!sideways && !defaults && ignore);
243                 herepossiblyCB->setEnabled(!sideways && !defaults && !span);
244                 heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
245                 spanCB->setEnabled(!sideways || standardfloat_);
246         } else {
247                 topCB->setEnabled(!defaults);
248                 bottomCB->setEnabled(!defaults);
249                 pageCB->setEnabled(!defaults);
250                 ignoreCB->setEnabled(!defaults && ignore);
251                 herepossiblyCB->setEnabled(!defaults);
252                 heredefinitelyCB->setEnabled(!defaults);
253         }
254 }
255
256 } // namespace lyx
257
258 #include "moc_FloatPlacement.cpp"