]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/FloatPlacement.C
enable Font cache only for MacOSX and inline width() for other platform.
[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 FloatPlacement::FloatPlacement(QWidget *)
24 {
25         setupUi(this);
26
27         connect(topCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
28         connect(bottomCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
29         connect(pageCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
30         connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
31         connect(defaultsCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
32
33         connect(defaultsCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
34         connect(ignoreCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
35         connect(pageCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
36         connect(heredefinitelyCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
37         connect(herepossiblyCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
38         connect(bottomCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
39         connect(topCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
40
41         spanCB->hide();
42         sidewaysCB->hide();
43 }
44
45
46 FloatPlacement::~FloatPlacement()
47 {
48 }
49
50
51 void FloatPlacement::useWide()
52 {
53         spanCB->show();
54 }
55
56
57 void FloatPlacement::useSideways()
58 {
59         sidewaysCB->show();
60 }
61
62
63 void FloatPlacement::changedSlot()
64 {
65         // emit signal
66         changed();
67 }
68
69
70 void FloatPlacement::set(string const & placement)
71 {
72         bool def_placement = false;
73         bool top = false;
74         bool bottom = false;
75         bool page = false;
76         bool here = false;
77         bool force = false;
78         bool here_definitely = false;
79
80         if (placement.empty()) {
81                 def_placement = true;
82         } else if (contains(placement, 'H')) {
83                 here_definitely = true;
84         } else {
85                 if (contains(placement, '!')) {
86                         force = true;
87                 }
88                 if (contains(placement, 't')) {
89                         top = true;
90                 }
91                 if (contains(placement, 'b')) {
92                         bottom = true;
93                 }
94                 if (contains(placement, 'p')) {
95                         page = true;
96                 }
97                 if (contains(placement, 'h')) {
98                         here = true;
99                 }
100         }
101
102         defaultsCB->setChecked(def_placement);
103         topCB->setChecked(top);
104         bottomCB->setChecked(bottom);
105         pageCB->setChecked(page);
106         herepossiblyCB->setChecked(here);
107         ignoreCB->setChecked(force);
108         ignoreCB->setEnabled(top || bottom || page || here);
109         heredefinitelyCB->setChecked(here_definitely);
110         checkAllowed();
111 }
112
113
114 void FloatPlacement::set(InsetFloatParams const & params)
115 {
116         set(params.placement);
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         sidewaysCB->setEnabled(params.type == "figure"
127                 || params.type == "table");
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
195         if (!spanCB->isChecked())
196                 return;
197
198         herepossiblyCB->setChecked(false);
199         heredefinitelyCB->setChecked(false);
200         bottomCB->setChecked(false);
201 }
202
203
204 void FloatPlacement::on_sidewaysCB_clicked()
205 {
206         checkAllowed();
207 }
208
209
210 void FloatPlacement::checkAllowed()
211 {
212         bool const defaults(defaultsCB->isChecked());
213         bool ignore(topCB->isChecked());
214         ignore |= bottomCB->isChecked();
215         ignore |= pageCB->isChecked();
216         ignore |= herepossiblyCB->isChecked();
217
218         // float or document dialog?
219         if (spanCB->isVisible()) {
220                 bool const span(spanCB->isChecked());
221                 bool const sideways(sidewaysCB->isChecked());
222                 defaultsCB->setEnabled(!sideways);
223                 topCB->setEnabled(!sideways && !defaults);
224                 bottomCB->setEnabled(!sideways && !defaults && !span);
225                 pageCB->setEnabled(!sideways && !defaults);
226                 ignoreCB->setEnabled(!sideways && !defaults && ignore);
227                 herepossiblyCB->setEnabled(!sideways && !defaults && !span);
228                 heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
229                 spanCB->setEnabled(!sideways);
230         } else {
231                 topCB->setEnabled(!defaults);
232                 bottomCB->setEnabled(!defaults);
233                 pageCB->setEnabled(!defaults);
234                 ignoreCB->setEnabled(!defaults && ignore);
235                 herepossiblyCB->setEnabled(!defaults);
236                 heredefinitelyCB->setEnabled(!defaults);
237         }
238 }
239
240
241 #include "FloatPlacement_moc.cpp"