]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/FloatPlacement.cpp
Make float type translatable.
[lyx.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 = float_type_;
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         float_type_ = params.type;
126         floatType->setText(qt_(float_type_));
127
128         set(params.placement);
129
130         standardfloat_ = (params.type == "figure"
131                 || params.type == "table");
132
133         if (params.wide) {
134                 herepossiblyCB->setChecked(false);
135                 heredefinitelyCB->setChecked(false);
136                 bottomCB->setChecked(false);
137         }
138
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_);
143         checkAllowed();
144 }
145
146
147 string const FloatPlacement::get(bool & wide, bool & sideways) const
148 {
149         wide = spanCB->isChecked();
150         sideways = sidewaysCB->isChecked();
151
152         return get();
153 }
154
155
156 string const FloatPlacement::get() const
157 {
158         string placement;
159
160         if (defaultsCB->isChecked())
161                 return placement;
162
163         if (heredefinitelyCB->isChecked()) {
164                 placement += 'H';
165         } else {
166                 if (ignoreCB->isChecked()) {
167                         placement += '!';
168                 }
169                 if (topCB->isChecked()) {
170                         placement += 't';
171                 }
172                 if (bottomCB->isChecked()) {
173                         placement += 'b';
174                 }
175                 if (pageCB->isChecked()) {
176                         placement += 'p';
177                 }
178                 if (herepossiblyCB->isChecked()) {
179                         placement += 'h';
180                 }
181         }
182         return placement;
183 }
184
185
186 void FloatPlacement::tbhpClicked()
187 {
188         heredefinitelyCB->setChecked(false);
189         checkAllowed();
190 }
191
192
193 void FloatPlacement::on_heredefinitelyCB_clicked()
194 {
195         if (heredefinitelyCB->isChecked())
196                 ignoreCB->setEnabled(false);
197
198         topCB->setChecked(false);
199         bottomCB->setChecked(false);
200         pageCB->setChecked(false);
201         herepossiblyCB->setChecked(false);
202         ignoreCB->setChecked(false);
203 }
204
205
206 void FloatPlacement::on_spanCB_clicked()
207 {
208         checkAllowed();
209         changed();
210
211         if (!spanCB->isChecked())
212                 return;
213
214         herepossiblyCB->setChecked(false);
215         heredefinitelyCB->setChecked(false);
216         bottomCB->setChecked(false);
217 }
218
219
220 void FloatPlacement::on_sidewaysCB_clicked()
221 {
222         checkAllowed();
223         changed();
224 }
225
226
227 void FloatPlacement::checkAllowed()
228 {
229         bool const defaults = defaultsCB->isChecked();
230         bool ignore = topCB->isChecked();
231         ignore |= bottomCB->isChecked();
232         ignore |= pageCB->isChecked();
233         ignore |= herepossiblyCB->isChecked();
234
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_);
247         } else {
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);
254         }
255 }
256
257 } // namespace lyx
258
259 #include "moc_FloatPlacement.cpp"