1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7 #include <QToolButton>
8 #include <QSignalBlocker>
9
10 #include "smtabruler.h"
11 #include "smscrspinbox.h"
12 #include "units.h"
13
14
SMTabruler(QWidget * parent,bool haveFirst,int dEin,QList<ParagraphStyle::TabRecord> Tabs,double wid)15 SMTabruler::SMTabruler(QWidget* parent, bool haveFirst, int dEin, QList<ParagraphStyle::TabRecord> Tabs, double wid)
16 : Tabruler(parent, haveFirst, dEin, Tabs, wid)
17 {
18 m_parentButton = new QToolButton(this);
19 Q_CHECK_PTR(m_parentButton);
20 m_parentButton->setText( tr(" Parent Tabs "));
21 indentLayout->addWidget(m_parentButton);
22 m_parentButton->hide();
23 QFont f(font());
24 f.setBold(true);
25 m_parentButton->setFont(f);
26 connect(m_parentButton, SIGNAL(clicked()), this, SLOT(pbClicked()));
27 firstLineSpin = new SMScrSpinBox(-3000, 4000, this, dEin);
28 Q_CHECK_PTR(firstLineSpin);
29 leftIndentSpin = new SMScrSpinBox(0, 4000, this, dEin);
30 Q_CHECK_PTR(leftIndentSpin);
31 rightIndentSpin = new SMScrSpinBox(0, 4000, this, dEin);
32 Q_CHECK_PTR(rightIndentSpin);
33
34 indentLayout->removeWidget(firstLineData);
35 firstLineData->hide();
36 indentLayout->insertWidget(1, firstLineSpin);
37 firstLineSpin->show();
38
39 indentLayout->removeWidget(leftIndentData);
40 leftIndentData->hide();
41 indentLayout->insertWidget(3, leftIndentSpin);
42 leftIndentSpin->show();
43
44 indentLayout->removeWidget(rightIndentData);
45 rightIndentData->hide();
46 indentLayout->insertWidget(5, rightIndentSpin);
47 rightIndentSpin->show();
48
49 connect(firstLineData, SIGNAL(valueChanged(double)), this, SLOT(firstDataChanged()));
50 connect(rightIndentData, SIGNAL(valueChanged(double)), this, SLOT(rightDataChanged()));
51 connect(leftIndentData, SIGNAL(valueChanged(double)), this, SLOT(leftDataChanged()));
52
53 connect(firstLineSpin, SIGNAL(valueChanged(double)), this, SLOT(firstValueChanged()));
54 connect(rightIndentSpin, SIGNAL(valueChanged(double)), this, SLOT(rightValueChanged()));
55 connect(leftIndentSpin, SIGNAL(valueChanged(double)), this, SLOT(leftValueChanged()));
56 }
57
unitChange(int unitIndex)58 void SMTabruler::unitChange(int unitIndex)
59 {
60 this->blockSignals(true);
61 Tabruler::setTabs(ruler->tabValues, unitIndex);
62 Tabruler::repaint();
63
64 firstLineSpin->blockSignals(true);
65 leftIndentSpin->blockSignals(true);
66 rightIndentSpin->blockSignals(true);
67 tabData->blockSignals(true);
68
69 firstLineSpin->setNewUnit(unitIndex);
70 leftIndentSpin->setNewUnit(unitIndex);
71 rightIndentSpin->setNewUnit(unitIndex);
72 tabData->setNewUnit(unitIndex);
73
74 firstLineSpin->blockSignals(false);
75 leftIndentSpin->blockSignals(false);
76 rightIndentSpin->blockSignals(false);
77 tabData->blockSignals(false);
78
79 m_unitIndex = unitIndex;
80 this->blockSignals(false);
81 }
82
setTabs(const QList<ParagraphStyle::TabRecord> & Tabs,int unitIndex)83 void SMTabruler::setTabs(const QList<ParagraphStyle::TabRecord>& Tabs, int unitIndex)
84 {
85 disconnect(this, SIGNAL(tabsChanged()), this, SLOT(slotTabsChanged()));
86 disconnect(this, SIGNAL(mouseReleased()), this, SLOT(slotTabsChanged()));
87 m_hasParent = false;
88 m_parentButton->hide();
89 Tabruler::setTabs(Tabs, unitIndex);
90 Tabruler::repaint();
91 firstLineSpin->setNewUnit(unitIndex);
92 leftIndentSpin->setNewUnit(unitIndex);
93 rightIndentSpin->setNewUnit(unitIndex);
94 tabData->setNewUnit(unitIndex);
95 }
96
setTabs(const QList<ParagraphStyle::TabRecord> & Tabs,int unitIndex,bool isParentValue)97 void SMTabruler::setTabs(const QList<ParagraphStyle::TabRecord>& Tabs, int unitIndex, bool isParentValue)
98 {
99 disconnect(this, SIGNAL(tabsChanged()), this, SLOT(slotTabsChanged()));
100 disconnect(this, SIGNAL(mouseReleased()), this, SLOT(slotTabsChanged()));
101 m_hasParent = true;
102 m_unitIndex = unitIndex;
103 if (isParentValue)
104 m_parentButton->hide();
105 else
106 m_parentButton->show();
107 Tabruler::setTabs(Tabs, unitIndex);
108 Tabruler::repaint();
109 firstLineSpin->setNewUnit(unitIndex);
110 leftIndentSpin->setNewUnit(unitIndex);
111 rightIndentSpin->setNewUnit(unitIndex);
112 tabData->setNewUnit(unitIndex);
113
114 connect(this, SIGNAL(tabsChanged()), this, SLOT(slotTabsChanged()));
115 connect(this, SIGNAL(mouseReleased()), this, SLOT(slotTabsChanged()));
116 }
117
setParentTabs(const QList<ParagraphStyle::TabRecord> & Tabs)118 void SMTabruler::setParentTabs(const QList<ParagraphStyle::TabRecord>& Tabs)
119 {
120 m_hasParent = true;
121 m_parentTabs = Tabs;
122 }
123
setFirstLineValue(double t)124 void SMTabruler::setFirstLineValue(double t)
125 {
126 QSignalBlocker firstLineDataBlocker(firstLineData);
127 QSignalBlocker rightIndentDataBlocker(rightIndentData);
128 QSignalBlocker leftIndentDataBlocker(leftIndentData);
129 QSignalBlocker firstLineSpinBlocker(firstLineSpin);
130 QSignalBlocker rightIndentSpinBlocker(rightIndentSpin);
131 QSignalBlocker leftIndentSpinBlocker(leftIndentSpin);
132
133 firstLineSpin->setValue(t);
134 firstLineData->setValue(t);
135 setLeftIndent();
136 setFirstLine();
137 setRightIndent();
138 }
139
setFirstLineValue(double t,bool isParentValue)140 void SMTabruler::setFirstLineValue(double t, bool isParentValue)
141 {
142 QSignalBlocker firstLineDataBlocker(firstLineData);
143 QSignalBlocker rightIndentDataBlocker(rightIndentData);
144 QSignalBlocker leftIndentDataBlocker(leftIndentData);
145 QSignalBlocker firstLineSpinBlocker(firstLineSpin);
146 QSignalBlocker rightIndentSpinBlocker(rightIndentSpin);
147 QSignalBlocker leftIndentSpinBlocker(leftIndentSpin);
148
149 m_isSetupFirst = true;
150 firstLineSpin->setValue(t, isParentValue);
151 firstLineData->setValue(t);
152 setLeftIndent();
153 setFirstLine();
154 setRightIndent();
155 }
156
setParentFirstLine(double t)157 void SMTabruler::setParentFirstLine(double t)
158 {
159 firstLineSpin->setParentValue(t);
160 }
161
setLeftIndentValue(double t)162 void SMTabruler::setLeftIndentValue(double t)
163 {
164 QSignalBlocker firstLineDataBlocker(firstLineData);
165 QSignalBlocker rightIndentDataBlocker(rightIndentData);
166 QSignalBlocker leftIndentDataBlocker(leftIndentData);
167 QSignalBlocker firstLineSpinBlocker(firstLineSpin);
168 QSignalBlocker rightIndentSpinBlocker(rightIndentSpin);
169 QSignalBlocker leftIndentSpinBlocker(leftIndentSpin);
170
171 leftIndentSpin->setValue(t);
172 leftIndentData->setValue(t);
173 setLeftIndent();
174 setFirstLine();
175 setRightIndent();
176 }
177
setLeftIndentValue(double t,bool isParentValue)178 void SMTabruler::setLeftIndentValue(double t, bool isParentValue)
179 {
180 QSignalBlocker firstLineDataBlocker(firstLineData);
181 QSignalBlocker rightIndentDataBlocker(rightIndentData);
182 QSignalBlocker leftIndentDataBlocker(leftIndentData);
183 QSignalBlocker firstLineSpinBlocker(firstLineSpin);
184 QSignalBlocker rightIndentSpinBlocker(rightIndentSpin);
185 QSignalBlocker leftIndentSpinBlocker(leftIndentSpin);
186
187 m_isSetupLeft = true;
188 leftIndentSpin->setValue(t, isParentValue);
189 leftIndentData->setValue(t);
190 setLeftIndent();
191 setFirstLine();
192 setRightIndent();
193 }
194
setParentLeftIndent(double t)195 void SMTabruler::setParentLeftIndent(double t)
196 {
197 leftIndentSpin->setParentValue(t);
198 }
199
setRightIndentValue(double t)200 void SMTabruler::setRightIndentValue(double t)
201 {
202 QSignalBlocker firstLineDataBlocker(firstLineData);
203 QSignalBlocker rightIndentDataBlocker(rightIndentData);
204 QSignalBlocker leftIndentDataBlocker(leftIndentData);
205 QSignalBlocker firstLineSpinBlocker(firstLineSpin);
206 QSignalBlocker rightIndentSpinBlocker(rightIndentSpin);
207 QSignalBlocker leftIndentSpinBlocker(leftIndentSpin);
208
209 rightIndentSpin->setValue(t);
210 rightIndentData->setValue(t);
211 setLeftIndent();
212 setFirstLine();
213 setRightIndent();
214 }
215
setRightIndentValue(double t,bool isParentValue)216 void SMTabruler::setRightIndentValue(double t, bool isParentValue)
217 {
218 QSignalBlocker firstLineDataBlocker(firstLineData);
219 QSignalBlocker rightIndentDataBlocker(rightIndentData);
220 QSignalBlocker leftIndentDataBlocker(leftIndentData);
221 QSignalBlocker firstLineSpinBlocker(firstLineSpin);
222 QSignalBlocker rightIndentSpinBlocker(rightIndentSpin);
223 QSignalBlocker leftIndentSpinBlocker(leftIndentSpin);
224
225 m_isSetupRight = true;
226 rightIndentSpin->setValue(t, isParentValue);
227 rightIndentData->setValue(t);
228 setLeftIndent();
229 setFirstLine();
230 setRightIndent();
231 }
232
setParentRightIndent(double t)233 void SMTabruler::setParentRightIndent(double t)
234 {
235 rightIndentSpin->setParentValue(t);
236 }
237
useParentTabs()238 bool SMTabruler::useParentTabs()
239 {
240 bool ret = m_useParentTabs;
241 if (ret && m_hasParent)
242 {
243 setTabs(m_parentTabs, m_unitIndex, true);
244 Tabruler::repaint();
245 m_parentButton->hide();
246 m_useParentTabs = false;
247 }
248 else if (m_hasParent)
249 {
250 m_parentButton->show();
251 }
252
253 return ret;
254 }
255
useParentFirstLine()256 bool SMTabruler::useParentFirstLine()
257 {
258 return firstLineSpin->useParentValue();
259 }
260
useParentLeftIndent()261 bool SMTabruler::useParentLeftIndent()
262 {
263 return leftIndentSpin->useParentValue();
264 }
265
useParentRightIndent()266 bool SMTabruler::useParentRightIndent()
267 {
268 return rightIndentSpin->useParentValue();
269 }
270
slotTabsChanged()271 void SMTabruler::slotTabsChanged()
272 {
273 if (m_hasParent)
274 {
275 m_useParentTabs = false;
276 m_tabsChanged = true;
277 }
278 }
279
pbClicked()280 void SMTabruler::pbClicked()
281 {
282 if (m_hasParent)
283 {
284 m_useParentTabs = true;
285 emit mouseReleased();
286 }
287 }
288
leftDataChanged()289 void SMTabruler::leftDataChanged()
290 {
291 QSignalBlocker firstLineSpinBlocker(firstLineSpin);
292 QSignalBlocker rightIndentSpinBlocker(rightIndentSpin);
293 QSignalBlocker leftIndentSpinBlocker(leftIndentSpin);
294
295 double a, b, value;
296 int c;
297 leftIndentData->getValues(&a, &b, &c, &value);
298 if (m_hasParent && !m_isSetupLeft)
299 leftIndentSpin->setValue(value, false);
300 else if (!m_hasParent)
301 leftIndentSpin->setValue(value);
302
303 m_isSetupLeft = false;
304 }
305
rightDataChanged()306 void SMTabruler::rightDataChanged()
307 {
308 QSignalBlocker firstLineSpinBlocker(firstLineSpin);
309 QSignalBlocker rightIndentSpinBlocker(rightIndentSpin);
310 QSignalBlocker leftIndentSpinBlocker(leftIndentSpin);
311
312 double a, b, value;
313 int c;
314 rightIndentData->getValues(&a, &b, &c, &value);
315 if (m_hasParent && !m_isSetupRight)
316 rightIndentSpin->setValue(value, false);
317 else if (!m_hasParent)
318 rightIndentSpin->setValue(value);
319
320 m_isSetupRight = false;
321 }
322
firstDataChanged()323 void SMTabruler::firstDataChanged()
324 {
325 QSignalBlocker firstLineSpinBlocker(firstLineSpin);
326 QSignalBlocker rightIndentSpinBlocker(rightIndentSpin);
327 QSignalBlocker leftIndentSpinBlocker(leftIndentSpin);
328
329 double a, b, value;
330 int c;
331 firstLineData->getValues(&a, &b, &c, &value);
332 if (m_hasParent && !m_isSetupFirst)
333 firstLineSpin->setValue(value, false);
334 else if (!m_hasParent)
335 firstLineSpin->setValue(value);
336
337 m_isSetupFirst = false;
338 }
339
firstValueChanged()340 void SMTabruler::firstValueChanged()
341 {
342 // QSignalBlocker firstLineDataBlocker(firstLineData);
343 // QSignalBlocker rightIndentDataBlocker(rightIndentData);
344 // QSignalBlocker leftIndentDataBlocker(leftIndentData);
345
346 double a, b, value;
347 int c;
348 firstLineSpin->getValues(&a, &b, &c, &value);
349 setFirstLineData(value / m_docUnitRatio);
350 setFirstLine();
351 setLeftIndent();
352 setRightIndent();
353 m_isSetupFirst = true;
354 }
355
leftValueChanged()356 void SMTabruler::leftValueChanged()
357 {
358 // QSignalBlocker firstLineDataBlocker(firstLineData);
359 // QSignalBlocker rightIndentDataBlocker(rightIndentData);
360 QSignalBlocker leftIndentDataBlocker(leftIndentData);
361
362 double a, b, value;
363 int c;
364 leftIndentSpin->getValues(&a, &b, &c, &value);
365 setLeftIndentData(value / m_docUnitRatio);
366 setLeftIndent();
367 // setFirstLine();
368 setRightIndent();
369 m_isSetupLeft = true;
370 }
371
rightValueChanged()372 void SMTabruler::rightValueChanged()
373 {
374 QSignalBlocker firstLineDataBlocker(firstLineData);
375 QSignalBlocker rightIndentDataBlocker(rightIndentData);
376 QSignalBlocker leftIndentDataBlocker(leftIndentData);
377
378 double a, b, value;
379 int c;
380 rightIndentSpin->getValues(&a, &b, &c, &value);
381 setRightIndentData(value / m_docUnitRatio);
382 setLeftIndent();
383 setFirstLine();
384 setRightIndent();
385 m_isSetupRight = true;
386 }
387