]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/FloatPlacement.cpp
Rename .C ==> .cpp for files in src/frontends/qt4, part two
[lyx.git] / src / frontends / qt4 / FloatPlacement.cpp
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         connect(defaultsCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
35         connect(ignoreCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
36         connect(pageCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
37         connect(heredefinitelyCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
38         connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
39         connect(bottomCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
40         connect(topCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
41
42         spanCB->hide();
43         sidewaysCB->hide();
44 }
45
46
47 void FloatPlacement::useWide()
48 {
49         spanCB->show();
50 }
51
52
53 void FloatPlacement::useSideways()
54 {
55         sidewaysCB->show();
56 }
57
58
59 void FloatPlacement::changedSlot()
60 {
61         // emit signal
62         changed();
63 }
64
65
66 void FloatPlacement::set(string const & placement)
67 {
68         bool def_placement = false;
69         bool top = false;
70         bool bottom = false;
71         bool page = false;
72         bool here = false;
73         bool force = false;
74         bool here_definitely = false;
75
76         if (placement.empty()) {
77                 def_placement = true;
78         } else if (contains(placement, 'H')) {
79                 here_definitely = true;
80         } else {
81                 if (contains(placement, '!')) {
82                         force = true;
83                 }
84                 if (contains(placement, 't')) {
85                         top = true;
86                 }
87                 if (contains(placement, 'b')) {
88                         bottom = true;
89                 }
90                 if (contains(placement, 'p')) {
91                         page = true;
92                 }
93                 if (contains(placement, 'h')) {
94                         here = true;
95                 }
96         }
97
98         defaultsCB->setChecked(def_placement);
99         topCB->setChecked(top);
100         bottomCB->setChecked(bottom);
101         pageCB->setChecked(page);
102         herepossiblyCB->setChecked(here);
103         ignoreCB->setChecked(force);
104         ignoreCB->setEnabled(top || bottom || page || here);
105         heredefinitelyCB->setChecked(here_definitely);
106         checkAllowed();
107 }
108
109
110 void FloatPlacement::set(lyx::InsetFloatParams const & params)
111 {
112         set(params.placement);
113
114         if (params.wide) {
115                 herepossiblyCB->setChecked(false);
116                 heredefinitelyCB->setChecked(false);
117                 bottomCB->setChecked(false);
118         }
119
120         spanCB->setChecked(params.wide);
121         sidewaysCB->setChecked(params.sideways);
122         sidewaysCB->setEnabled(params.type == "figure"
123                 || params.type == "table");
124         checkAllowed();
125 }
126
127
128 string const FloatPlacement::get(bool & wide, bool & sideways) const
129 {
130         wide = spanCB->isChecked();
131         sideways = sidewaysCB->isChecked();
132
133         return get();
134 }
135
136
137 string const FloatPlacement::get() const
138 {
139         string placement;
140
141         if (defaultsCB->isChecked())
142                 return placement;
143
144         if (heredefinitelyCB->isChecked()) {
145                 placement += 'H';
146         } else {
147                 if (ignoreCB->isChecked()) {
148                         placement += '!';
149                 }
150                 if (topCB->isChecked()) {
151                         placement += 't';
152                 }
153                 if (bottomCB->isChecked()) {
154                         placement += 'b';
155                 }
156                 if (pageCB->isChecked()) {
157                         placement += 'p';
158                 }
159                 if (herepossiblyCB->isChecked()) {
160                         placement += 'h';
161                 }
162         }
163         return placement;
164 }
165
166
167 void FloatPlacement::tbhpClicked()
168 {
169         heredefinitelyCB->setChecked(false);
170         checkAllowed();
171 }
172
173
174 void FloatPlacement::on_heredefinitelyCB_clicked()
175 {
176         if (heredefinitelyCB->isChecked())
177                 ignoreCB->setEnabled(false);
178
179         topCB->setChecked(false);
180         bottomCB->setChecked(false);
181         pageCB->setChecked(false);
182         herepossiblyCB->setChecked(false);
183         ignoreCB->setChecked(false);
184 }
185
186
187 void FloatPlacement::on_spanCB_clicked()
188 {
189         checkAllowed();
190         changed();
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         changed();
205 }
206
207
208 void FloatPlacement::checkAllowed()
209 {
210         bool const defaults = defaultsCB->isChecked();
211         bool ignore = topCB->isChecked();
212         ignore |= bottomCB->isChecked();
213         ignore |= pageCB->isChecked();
214         ignore |= herepossiblyCB->isChecked();
215
216         // float or document dialog?
217         if (spanCB->isVisible()) {
218                 bool const span = spanCB->isChecked();
219                 bool const sideways = sidewaysCB->isChecked();
220                 defaultsCB->setEnabled(!sideways);
221                 topCB->setEnabled(!sideways && !defaults);
222                 bottomCB->setEnabled(!sideways && !defaults && !span);
223                 pageCB->setEnabled(!sideways && !defaults);
224                 ignoreCB->setEnabled(!sideways && !defaults && ignore);
225                 herepossiblyCB->setEnabled(!sideways && !defaults && !span);
226                 heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
227                 spanCB->setEnabled(!sideways);
228         } else {
229                 topCB->setEnabled(!defaults);
230                 bottomCB->setEnabled(!defaults);
231                 pageCB->setEnabled(!defaults);
232                 ignoreCB->setEnabled(!defaults && ignore);
233                 herepossiblyCB->setEnabled(!defaults);
234                 heredefinitelyCB->setEnabled(!defaults);
235         }
236 }
237
238 //} // namespace lyx
239
240 #include "FloatPlacement_moc.cpp"
241
242