]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/FloatPlacement.cpp
header cleanup
[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 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         standardfloat_ = (params.type == "figure"
116                 || params.type == "table");
117
118         if (params.wide) {
119                 herepossiblyCB->setChecked(false);
120                 heredefinitelyCB->setChecked(false);
121                 bottomCB->setChecked(false);
122         }
123
124         spanCB->setChecked(params.wide);
125         sidewaysCB->setChecked(params.sideways);
126         // the package rotfloat only has *-versions for figure and table
127         spanCB->setEnabled(!params.sideways || standardfloat_);
128         checkAllowed();
129 }
130
131
132 string const FloatPlacement::get(bool & wide, bool & sideways) const
133 {
134         wide = spanCB->isChecked();
135         sideways = sidewaysCB->isChecked();
136
137         return get();
138 }
139
140
141 string const FloatPlacement::get() const
142 {
143         string placement;
144
145         if (defaultsCB->isChecked())
146                 return placement;
147
148         if (heredefinitelyCB->isChecked()) {
149                 placement += 'H';
150         } else {
151                 if (ignoreCB->isChecked()) {
152                         placement += '!';
153                 }
154                 if (topCB->isChecked()) {
155                         placement += 't';
156                 }
157                 if (bottomCB->isChecked()) {
158                         placement += 'b';
159                 }
160                 if (pageCB->isChecked()) {
161                         placement += 'p';
162                 }
163                 if (herepossiblyCB->isChecked()) {
164                         placement += 'h';
165                 }
166         }
167         return placement;
168 }
169
170
171 void FloatPlacement::tbhpClicked()
172 {
173         heredefinitelyCB->setChecked(false);
174         checkAllowed();
175 }
176
177
178 void FloatPlacement::on_heredefinitelyCB_clicked()
179 {
180         if (heredefinitelyCB->isChecked())
181                 ignoreCB->setEnabled(false);
182
183         topCB->setChecked(false);
184         bottomCB->setChecked(false);
185         pageCB->setChecked(false);
186         herepossiblyCB->setChecked(false);
187         ignoreCB->setChecked(false);
188 }
189
190
191 void FloatPlacement::on_spanCB_clicked()
192 {
193         checkAllowed();
194         changed();
195
196         if (!spanCB->isChecked())
197                 return;
198
199         herepossiblyCB->setChecked(false);
200         heredefinitelyCB->setChecked(false);
201         bottomCB->setChecked(false);
202 }
203
204
205 void FloatPlacement::on_sidewaysCB_clicked()
206 {
207         checkAllowed();
208         changed();
209 }
210
211
212 void FloatPlacement::checkAllowed()
213 {
214         bool const defaults = defaultsCB->isChecked();
215         bool ignore = topCB->isChecked();
216         ignore |= bottomCB->isChecked();
217         ignore |= pageCB->isChecked();
218         ignore |= herepossiblyCB->isChecked();
219
220         // float or document dialog?
221         if (spanCB->isVisible()) {
222                 bool const span = spanCB->isChecked();
223                 bool const sideways = sidewaysCB->isChecked();
224                 defaultsCB->setEnabled(!sideways);
225                 topCB->setEnabled(!sideways && !defaults);
226                 bottomCB->setEnabled(!sideways && !defaults && !span);
227                 pageCB->setEnabled(!sideways && !defaults);
228                 ignoreCB->setEnabled(!sideways && !defaults && ignore);
229                 herepossiblyCB->setEnabled(!sideways && !defaults && !span);
230                 heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
231                 spanCB->setEnabled(!sideways || standardfloat_);
232         } else {
233                 topCB->setEnabled(!defaults);
234                 bottomCB->setEnabled(!defaults);
235                 pageCB->setEnabled(!defaults);
236                 ignoreCB->setEnabled(!defaults && ignore);
237                 herepossiblyCB->setEnabled(!defaults);
238                 heredefinitelyCB->setEnabled(!defaults);
239         }
240 }
241
242 //} // namespace lyx
243
244 #include "FloatPlacement_moc.cpp"