]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/FloatPlacement.C
* Painter.h:
[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 #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 lyx::support::contains;
21 using std::string;
22
23 //namespace lyx {
24
25 FloatPlacement::FloatPlacement(QWidget *)
26 {
27         setupUi(this);
28
29         connect(topCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
30         connect(bottomCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
31         connect(pageCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
32         connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
33         connect(defaultsCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
34
35         connect(defaultsCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
36         connect(ignoreCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
37         connect(pageCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
38         connect(heredefinitelyCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
39         connect(herepossiblyCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
40         connect(bottomCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
41         connect(topCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
42
43         spanCB->hide();
44         sidewaysCB->hide();
45 }
46
47
48 void FloatPlacement::useWide()
49 {
50         spanCB->show();
51 }
52
53
54 void FloatPlacement::useSideways()
55 {
56         sidewaysCB->show();
57 }
58
59
60 void FloatPlacement::changedSlot()
61 {
62         // emit signal
63         changed();
64 }
65
66
67 void FloatPlacement::set(string const & placement)
68 {
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;
76
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;
84                 }
85                 if (contains(placement, 't')) {
86                         top = true;
87                 }
88                 if (contains(placement, 'b')) {
89                         bottom = true;
90                 }
91                 if (contains(placement, 'p')) {
92                         page = true;
93                 }
94                 if (contains(placement, 'h')) {
95                         here = true;
96                 }
97         }
98
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();
108 }
109
110
111 void FloatPlacement::set(lyx::InsetFloatParams const & params)
112 {
113         set(params.placement);
114
115         if (params.wide) {
116                 herepossiblyCB->setChecked(false);
117                 heredefinitelyCB->setChecked(false);
118                 bottomCB->setChecked(false);
119         }
120
121         spanCB->setChecked(params.wide);
122         sidewaysCB->setChecked(params.sideways);
123         sidewaysCB->setEnabled(params.type == "figure"
124                 || params.type == "table");
125         checkAllowed();
126 }
127
128
129 string const FloatPlacement::get(bool & wide, bool & sideways) const
130 {
131         wide = spanCB->isChecked();
132         sideways = sidewaysCB->isChecked();
133
134         return get();
135 }
136
137
138 string const FloatPlacement::get() const
139 {
140         string placement;
141
142         if (defaultsCB->isChecked())
143                 return placement;
144
145         if (heredefinitelyCB->isChecked()) {
146                 placement += 'H';
147         } else {
148                 if (ignoreCB->isChecked()) {
149                         placement += '!';
150                 }
151                 if (topCB->isChecked()) {
152                         placement += 't';
153                 }
154                 if (bottomCB->isChecked()) {
155                         placement += 'b';
156                 }
157                 if (pageCB->isChecked()) {
158                         placement += 'p';
159                 }
160                 if (herepossiblyCB->isChecked()) {
161                         placement += 'h';
162                 }
163         }
164         return placement;
165 }
166
167
168 void FloatPlacement::tbhpClicked()
169 {
170         heredefinitelyCB->setChecked(false);
171         checkAllowed();
172 }
173
174
175 void FloatPlacement::on_heredefinitelyCB_clicked()
176 {
177         if (heredefinitelyCB->isChecked())
178                 ignoreCB->setEnabled(false);
179
180         topCB->setChecked(false);
181         bottomCB->setChecked(false);
182         pageCB->setChecked(false);
183         herepossiblyCB->setChecked(false);
184         ignoreCB->setChecked(false);
185 }
186
187
188 void FloatPlacement::on_spanCB_clicked()
189 {
190         checkAllowed();
191
192         if (!spanCB->isChecked())
193                 return;
194
195         herepossiblyCB->setChecked(false);
196         heredefinitelyCB->setChecked(false);
197         bottomCB->setChecked(false);
198 }
199
200
201 void FloatPlacement::on_sidewaysCB_clicked()
202 {
203         checkAllowed();
204 }
205
206
207 void FloatPlacement::checkAllowed()
208 {
209         bool const defaults = defaultsCB->isChecked();
210         bool ignore = topCB->isChecked();
211         ignore |= bottomCB->isChecked();
212         ignore |= pageCB->isChecked();
213         ignore |= herepossiblyCB->isChecked();
214
215         // float or document dialog?
216         if (spanCB->isVisible()) {
217                 bool const span = spanCB->isChecked();
218                 bool const sideways = sidewaysCB->isChecked();
219                 defaultsCB->setEnabled(!sideways);
220                 topCB->setEnabled(!sideways && !defaults);
221                 bottomCB->setEnabled(!sideways && !defaults && !span);
222                 pageCB->setEnabled(!sideways && !defaults);
223                 ignoreCB->setEnabled(!sideways && !defaults && ignore);
224                 herepossiblyCB->setEnabled(!sideways && !defaults && !span);
225                 heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
226                 spanCB->setEnabled(!sideways);
227         } else {
228                 topCB->setEnabled(!defaults);
229                 bottomCB->setEnabled(!defaults);
230                 pageCB->setEnabled(!defaults);
231                 ignoreCB->setEnabled(!defaults && ignore);
232                 herepossiblyCB->setEnabled(!defaults);
233                 heredefinitelyCB->setEnabled(!defaults);
234         }
235 }
236
237 //} // namespace lyx
238
239 #include "FloatPlacement_moc.cpp"
240