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