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 "effectsdialog.h"
8 
9 #include <QGridLayout>
10 #include <QGroupBox>
11 #include <QHBoxLayout>
12 #include <QImage>
13 #include <QLabel>
14 #include <QListWidget>
15 #include <QListWidgetItem>
16 #include <QMenu>
17 #include <QPixmap>
18 #include <QPushButton>
19 #include <QSlider>
20 #include <QSpacerItem>
21 #include <QSpacerItem>
22 #include <QStackedWidget>
23 #include <QTime>
24 #include <QToolButton>
25 #include <QToolTip>
26 #include <QVBoxLayout>
27 #include <QWidget>
28 #include <QWidgetAction>
29 
30 #include "cmsettings.h"
31 #include "colorcombo.h"
32 #include "curvewidget.h"
33 #include "iconmanager.h"
34 #include "scclocale.h"
35 #include "scpage.h"
36 #include "scribusdoc.h"
37 #include "scrspinbox.h"
38 #include "sctextstream.h"
39 #include "shadebutton.h"
40 #include "util.h"
41 #include "util_color.h"
42 
43 
44 
EffectsDialog(QWidget * parent,PageItem * item,ScribusDoc * docc)45 EffectsDialog::EffectsDialog( QWidget* parent, PageItem* item, ScribusDoc* docc ) : QDialog( parent )
46 {
47 	setModal(true);
48 	setWindowTitle( tr( "Image Effects" ) );
49 	setWindowIcon(IconManager::instance().loadIcon("AppIcon.png"));
50 	m_item = item;
51 	effectsList = m_item->effectsInUse;
52 	m_doc = docc;
53 	currentOptions = nullptr;
54 
55 //	CMSettings cms(docc, "", Intent_Perceptual);
56 //	cms.allowColorManagement(false);
57 	bool mode = false;
58 	CMSettings cms(m_doc, m_item->ImageProfile, m_item->ImageIntent);
59 	cms.setUseEmbeddedProfile(m_item->UseEmbedded);
60 	cms.allowSoftProofing(true);
61 	m_image.loadPicture(m_item->Pfile, m_item->pixm.imgInfo.actualPageNumber, cms, ScImage::RGBData, 72, &mode);
62 	int iw = m_image.width();
63 	int ih = m_image.height();
64 	m_imageScale = 1.0;
65 	if ((iw > 220) || (ih > 220))
66 	{
67 		double sx = iw / 220.0;
68 		double sy = ih / 220.0;
69 		if (sy < sx)
70 			m_image.createLowRes(sx);
71 		else
72 			m_image.createLowRes(sy);
73 		m_imageScale = qMin(sx, sy);
74 	}
75 	EffectsDialogLayout = new QVBoxLayout( this );
76 	EffectsDialogLayout->setContentsMargins(9, 9, 9, 9);
77 	EffectsDialogLayout->setSpacing(6);
78 	layoutGrid = new QGridLayout();
79 	layoutGrid->setContentsMargins(0, 0, 0, 0);
80 	layoutGrid->setSpacing(6);
81 
82 	textLabel5 = new QLabel( this );
83 	textLabel5->setText( tr( "Preview" ) );
84 	pixmapLabel1 = new QLabel( this );
85 	pixmapLabel1->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
86 	pixmapLabel1->setMinimumSize( QSize( 220, 220 ) );
87 	pixmapLabel1->setMaximumSize( QSize( 220, 220 ) );
88 	pixmapLabel1->setFrameShape( QLabel::StyledPanel );
89 	pixmapLabel1->setFrameShadow( QLabel::Sunken );
90 	pixmapLabel1->setScaledContents( false );
91 
92 	optionStack = new QStackedWidget( this );
93 //	optionStack->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, 0, 0, optionStack->sizePolicy().hasHeightForWidth() ) );
94 //	optionStack->setMinimumSize( QSize( 220, 280 ) );
95 	optionStack->setFrameShape( QFrame::NoFrame );
96 	WStackPage = new QWidget( optionStack );
97 	optionStack->addWidget( WStackPage );
98 
99 	WStackPage_2 = new QWidget( optionStack );
100 	WStackPageLayout = new QVBoxLayout( WStackPage_2 );
101 	WStackPageLayout->setContentsMargins(0, 0, 0, 0);
102 	WStackPageLayout->setSpacing(6);
103 	WStackPageLayout->setAlignment( Qt::AlignTop );
104 	layout17 = new QHBoxLayout;
105 	layout17->setContentsMargins(0, 0, 0, 0);
106 	layout17->setSpacing(6);
107 	textLabel3 = new QLabel( tr( "Color:" ), WStackPage_2 );
108 	layout17->addWidget( textLabel3 );
109 
110 	colData = new ColorCombo(false, WStackPage_2);
111 	colData->setPixmapType(ColorCombo::fancyPixmaps);
112 	colData->setColors(m_doc->PageColors, false);
113 	layout17->addWidget( colData );
114 	WStackPageLayout->addLayout( layout17 );
115 
116 	layout19 = new QHBoxLayout;
117 	layout19->setContentsMargins(0, 0, 0, 0);
118 	layout19->setSpacing(6);
119 	textLabel4 = new QLabel( tr( "Shade:" ), WStackPage_2 );
120 	layout19->addWidget( textLabel4 );
121 	shade = new ShadeButton(WStackPage_2);
122 	shade->setValue(100);
123 	layout19->addWidget( shade );
124 	WStackPageLayout->addLayout( layout19 );
125 	optionStack->addWidget( WStackPage_2 );
126 
127 	WStackPage_3 = new QWidget( optionStack );
128 	WStackPage3Layout = new QVBoxLayout( WStackPage_3 );
129 	WStackPage3Layout->setContentsMargins(0, 0, 0, 0);
130 	WStackPage3Layout->setSpacing(6);
131 	WStackPage3Layout->setAlignment( Qt::AlignTop );
132 	layout20 = new QHBoxLayout;
133 	layout20->setContentsMargins(0, 0, 0, 0);
134 	layout20->setSpacing(6);
135 	textLabel6 = new QLabel( tr( "Brightness:" ), WStackPage_3 );
136 	layout20->addWidget( textLabel6, Qt::AlignLeft );
137 	textLabel7 = new QLabel( "0", WStackPage_3 );
138 	layout20->addWidget( textLabel7, Qt::AlignRight );
139 	WStackPage3Layout->addLayout( layout20 );
140 	brightnessSlider = new QSlider( WStackPage_3 );
141 	brightnessSlider->setMinimum(-255);
142 	brightnessSlider->setMaximum(255);
143 	brightnessSlider->setValue(0);
144 	brightnessSlider->setOrientation( Qt::Horizontal );
145 	brightnessSlider->setTickPosition( QSlider::TicksBelow );
146 	WStackPage3Layout->addWidget( brightnessSlider );
147 	optionStack->addWidget( WStackPage_3 );
148 
149 	WStackPage_4 = new QWidget( optionStack );
150 	WStackPage4Layout = new QVBoxLayout( WStackPage_4 );
151 	WStackPage4Layout->setContentsMargins(0, 0, 0, 0);
152 	WStackPage4Layout->setSpacing(6);
153 	WStackPage4Layout->setAlignment( Qt::AlignTop );
154 	layout21 = new QHBoxLayout;
155 	layout21->setContentsMargins(0, 0, 0, 0);
156 	layout21->setSpacing(6);
157 	textLabel8 = new QLabel( tr( "Contrast:" ), WStackPage_4 );
158 	layout21->addWidget( textLabel8, Qt::AlignLeft );
159 	textLabel9 = new QLabel( "0", WStackPage_4 );
160 	layout21->addWidget( textLabel9, Qt::AlignRight );
161 	WStackPage4Layout->addLayout( layout21 );
162 	contrastSlider = new QSlider( WStackPage_4 );
163 	contrastSlider->setMinimum(-127);
164 	contrastSlider->setMaximum(127);
165 	contrastSlider->setValue(0);
166 	contrastSlider->setOrientation( Qt::Horizontal );
167 	contrastSlider->setTickPosition( QSlider::TicksBelow );
168 	WStackPage4Layout->addWidget( contrastSlider );
169 	optionStack->addWidget( WStackPage_4 );
170 
171 	WStackPage_5 = new QWidget( optionStack );
172 	WStackPage5Layout = new QVBoxLayout( WStackPage_5 );
173 	WStackPage5Layout->setContentsMargins(0, 0, 0, 0);
174 	WStackPage5Layout->setSpacing(6);
175 	WStackPage5Layout->setAlignment( Qt::AlignTop );
176 	layout22 = new QHBoxLayout;
177 	layout22->setContentsMargins(0, 0, 0, 0);
178 	layout22->setSpacing(6);
179 	textLabel10 = new QLabel( tr( "Radius:" ), WStackPage_5 );
180 	layout22->addWidget( textLabel10 );
181 	shRadius = new ScrSpinBox( 0.0, 10.0, WStackPage_5, 1 );
182 	shRadius->setDecimals(1);
183 	shRadius->setSuffix("");
184 	shRadius->setValue(0);
185 	layout22->addWidget( shRadius );
186 	WStackPage5Layout->addLayout( layout22 );
187 	layout23 = new QHBoxLayout;
188 	layout23->setContentsMargins(0, 0, 0, 0);
189 	layout23->setSpacing(6);
190 	textLabel11 = new QLabel( tr("Value:"), WStackPage_5 );
191 	layout23->addWidget( textLabel11 );
192 	shValue = new ScrSpinBox( 0.0, 5.0, WStackPage_5, 1 );
193 	shValue->setDecimals(1);
194 	shValue->setSuffix("");
195 	shValue->setValue(1.0);
196 	layout23->addWidget( shValue );
197 	WStackPage5Layout->addLayout( layout23 );
198 	optionStack->addWidget( WStackPage_5 );
199 
200 	WStackPage_6 = new QWidget( optionStack );
201 	WStackPage6Layout = new QVBoxLayout( WStackPage_6 );
202 	WStackPage6Layout->setContentsMargins(0, 0, 0, 0);
203 	WStackPage6Layout->setSpacing(6);
204 	WStackPage6Layout->setAlignment( Qt::AlignTop );
205 	layout24 = new QHBoxLayout;
206 	layout24->setContentsMargins(0, 0, 0, 0);
207 	layout24->setSpacing(6);
208 	textLabel12 = new QLabel( tr( "Radius:" ), WStackPage_6 );
209 	layout24->addWidget( textLabel12 );
210 	blRadius = new ScrSpinBox( 0.0, 30.0, WStackPage_6, 1 );
211 	blRadius->setDecimals(1);
212 	blRadius->setSuffix("");
213 	blRadius->setValue(0);
214 	layout24->addWidget( blRadius );
215 	WStackPage6Layout->addLayout( layout24 );
216 	optionStack->addWidget( WStackPage_6 );
217 
218 	WStackPage_7 = new QWidget( optionStack );
219 	WStackPage7Layout = new QVBoxLayout( WStackPage_7 );
220 	WStackPage7Layout->setContentsMargins(0, 0, 0, 0);
221 	WStackPage7Layout->setSpacing(6);
222 	WStackPage7Layout->setAlignment( Qt::AlignTop );
223 	layout26 = new QHBoxLayout;
224 	layout26->setContentsMargins(0, 0, 0, 0);
225 	layout26->setSpacing(6);
226 	textLabel14 = new QLabel( tr( "Posterize:" ), WStackPage_7 );
227 	layout26->addWidget( textLabel14, Qt::AlignLeft );
228 	textLabel15 = new QLabel( "0", WStackPage_7 );
229 	layout26->addWidget( textLabel15, Qt::AlignRight );
230 	WStackPage7Layout->addLayout( layout26 );
231 	solarizeSlider = new QSlider( WStackPage_7 );
232 	solarizeSlider->setMinimum(1);
233 	solarizeSlider->setMaximum(255);
234 	solarizeSlider->setValue(255);
235 	solarizeSlider->setOrientation( Qt::Horizontal );
236 	solarizeSlider->setTickPosition( QSlider::TicksBelow );
237 	WStackPage7Layout->addWidget( solarizeSlider );
238 	optionStack->addWidget( WStackPage_7 );
239 
240 	WStackPage_8 = new QWidget( optionStack );
241 	WStackPage8Layout = new QGridLayout( WStackPage_8 );
242 	WStackPage8Layout->setContentsMargins(0, 0, 0, 0);
243 	WStackPage8Layout->setSpacing(6);
244 	WStackPage8Layout->setAlignment( Qt::AlignTop );
245 	textLabel1d = new QLabel( tr( "Color 1:" ), WStackPage_8 );
246 	WStackPage8Layout->addWidget( textLabel1d, 0, 0 );
247 	colData1 = new ColorCombo(false, WStackPage_8);
248 	colData1->setPixmapType(ColorCombo::fancyPixmaps);
249 	colData1->setColors(m_doc->PageColors, false);
250 	WStackPage8Layout->addWidget( colData1, 0, 1, 1, 2);
251 	shade1 = new ShadeButton(WStackPage_8);
252 	shade1->setValue(100);
253 	WStackPage8Layout->addWidget( shade1, 1, 1 );
254 	CurveD1 = new CurveWidget( nullptr );
255 	CurveD1Pop = new QMenu();
256 	CurveD1Act = new QWidgetAction(this);
257 	CurveD1Act->setDefaultWidget(CurveD1);
258 	CurveD1Pop->addAction(CurveD1Act);
259 	CurveD1Button = new QToolButton( WStackPage_8 );
260 	CurveD1Button->setText( "" );
261 	CurveD1Button->setMaximumSize( QSize( 22, 22 ) );
262 	CurveD1Button->setIcon(IconManager::instance().loadIcon("curve.png"));
263 	CurveD1Button->setMenu(CurveD1Pop);
264 	CurveD1Button->setPopupMode(QToolButton::InstantPopup);
265 	WStackPage8Layout->addWidget( CurveD1Button, 1, 2 );
266 
267 	textLabel2d = new QLabel( tr( "Color 2:" ), WStackPage_8 );
268 	WStackPage8Layout->addWidget( textLabel2d, 2, 0 );
269 	colData2 = new ColorCombo(false, WStackPage_8);
270 	colData2->setPixmapType(ColorCombo::fancyPixmaps);
271 	colData2->setColors(m_doc->PageColors, false);
272 	WStackPage8Layout->addWidget( colData2, 2, 1, 1, 2);
273 	shade2 = new ShadeButton(WStackPage_8);
274 	shade2->setValue(100);
275 	WStackPage8Layout->addWidget( shade2, 3, 1 );
276 	CurveD2 = new CurveWidget( nullptr );
277 	CurveD2Pop = new QMenu();
278 	CurveD2Act = new QWidgetAction(this);
279 	CurveD2Act->setDefaultWidget(CurveD2);
280 	CurveD2Pop->addAction(CurveD2Act);
281 	CurveD2Button = new QToolButton( WStackPage_8 );
282 	CurveD2Button->setText( "" );
283 	CurveD2Button->setMaximumSize( QSize( 22, 22 ) );
284 	CurveD2Button->setIcon(IconManager::instance().loadIcon("curve.png"));
285 	CurveD2Button->setMenu(CurveD2Pop);
286 	CurveD2Button->setPopupMode(QToolButton::InstantPopup);
287 	WStackPage8Layout->addWidget( CurveD2Button, 3, 2 );
288 	auto *spacerD1 = new QSpacerItem( 1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding );
289 	WStackPage8Layout->addItem( spacerD1, 4, 0 );
290 	optionStack->addWidget( WStackPage_8 );
291 
292 	WStackPage_9 = new QWidget( optionStack );
293 	WStackPage9Layout = new QGridLayout( WStackPage_9 );
294 	WStackPage9Layout->setContentsMargins(0, 0, 0, 0);
295 	WStackPage9Layout->setSpacing(6);
296 	WStackPage9Layout->setAlignment( Qt::AlignTop );
297 	textLabel1t = new QLabel( tr( "Color 1:" ), WStackPage_9 );
298 	WStackPage9Layout->addWidget( textLabel1t, 0, 0 );
299 	colDatat1 = new ColorCombo(false, WStackPage_9);
300 	colDatat1->setPixmapType(ColorCombo::fancyPixmaps);
301 	colDatat1->setColors(m_doc->PageColors, false);
302 	WStackPage9Layout->addWidget( colDatat1, 0, 1, 1, 2 );
303 	shadet1 = new ShadeButton(WStackPage_9);
304 	shadet1->setValue(100);
305 	WStackPage9Layout->addWidget( shadet1, 1, 1 );
306 	CurveT1 = new CurveWidget( nullptr );
307 	CurveT1Pop = new QMenu();
308 	CurveT1Act = new QWidgetAction(this);
309 	CurveT1Act->setDefaultWidget(CurveT1);
310 	CurveT1Pop->addAction(CurveT1Act);
311 	CurveT1Button = new QToolButton( WStackPage_9 );
312 	CurveT1Button->setText( "" );
313 	CurveT1Button->setMaximumSize( QSize( 22, 22 ) );
314 	CurveT1Button->setIcon(IconManager::instance().loadIcon("curve.png"));
315 	CurveT1Button->setMenu(CurveT1Pop);
316 	CurveT1Button->setPopupMode(QToolButton::InstantPopup);
317 	WStackPage9Layout->addWidget( CurveT1Button, 1, 2 );
318 	textLabel2t = new QLabel( tr( "Color 2:" ), WStackPage_9 );
319 	WStackPage9Layout->addWidget( textLabel2t, 2, 0 );
320 	colDatat2 = new ColorCombo(false, WStackPage_9);
321 	colDatat2->setPixmapType(ColorCombo::fancyPixmaps);
322 	colDatat2->setColors(m_doc->PageColors, false);
323 	WStackPage9Layout->addWidget( colDatat2, 2, 1, 1, 2 );
324 	shadet2 = new ShadeButton(WStackPage_9);
325 	shadet2->setValue(100);
326 	WStackPage9Layout->addWidget( shadet2, 3, 1 );
327 	CurveT2 = new CurveWidget( nullptr );
328 	CurveT2Pop = new QMenu();
329 	CurveT2Act = new QWidgetAction(this);
330 	CurveT2Act->setDefaultWidget(CurveT2);
331 	CurveT2Pop->addAction(CurveT2Act);
332 	CurveT2Button = new QToolButton( WStackPage_9 );
333 	CurveT2Button->setText( "" );
334 	CurveT2Button->setMaximumSize( QSize( 22, 22 ) );
335 	CurveT2Button->setIcon(IconManager::instance().loadIcon("curve.png"));
336 	CurveT2Button->setMenu(CurveT2Pop);
337 	CurveT2Button->setPopupMode(QToolButton::InstantPopup);
338 	WStackPage9Layout->addWidget( CurveT2Button, 3, 2 );
339 	textLabel3t = new QLabel( tr( "Color 3:" ), WStackPage_9 );
340 	WStackPage9Layout->addWidget( textLabel3t, 4, 0 );
341 	colDatat3 = new ColorCombo(false, WStackPage_9);
342 	colDatat3->setPixmapType(ColorCombo::fancyPixmaps);
343 	colDatat3->setColors(m_doc->PageColors, false);
344 	WStackPage9Layout->addWidget( colDatat3, 4, 1, 1, 2 );
345 	shadet3 = new ShadeButton(WStackPage_9);
346 	shadet3->setValue(100);
347 	WStackPage9Layout->addWidget( shadet3, 5, 1 );
348 	CurveT3 = new CurveWidget( nullptr );
349 	CurveT3Act = new QWidgetAction(this);
350 	CurveT3Pop = new QMenu();
351 	CurveT3Act->setDefaultWidget(CurveT3);
352 	CurveT3Pop->addAction(CurveT3Act);
353 	CurveT3Button = new QToolButton( WStackPage_9 );
354 	CurveT3Button->setText( "" );
355 	CurveT3Button->setMaximumSize( QSize( 22, 22 ) );
356 	CurveT3Button->setIcon(IconManager::instance().loadIcon("curve.png"));
357 	CurveT3Button->setMenu(CurveT3Pop);
358 	CurveT3Button->setPopupMode(QToolButton::InstantPopup);
359 	WStackPage9Layout->addWidget( CurveT3Button, 5, 2 );
360 	optionStack->addWidget( WStackPage_9 );
361 
362 	WStackPage_10 = new QWidget( optionStack );
363 	WStackPage10Layout = new QGridLayout( WStackPage_10 );
364 	WStackPage10Layout->setContentsMargins(0, 0, 0, 0);
365 	WStackPage10Layout->setSpacing(6);
366 	textLabel1q = new QLabel( tr( "Color 1:" ), WStackPage_10 );
367 	WStackPage10Layout->addWidget( textLabel1q, 0, 0 );
368 	colDataq1 = new ColorCombo(false, WStackPage_10);
369 	colDataq1->setPixmapType(ColorCombo::fancyPixmaps);
370 	colDataq1->setColors(m_doc->PageColors, false);
371 	WStackPage10Layout->addWidget( colDataq1, 0, 1, 1, 2 );
372 	shadeq1 = new ShadeButton(WStackPage_10);
373 	shadeq1->setValue(100);
374 	WStackPage10Layout->addWidget( shadeq1, 1, 1 );
375 	CurveQ1 = new CurveWidget( nullptr );
376 	CurveQ1Pop = new QMenu();
377 	CurveQ1Act = new QWidgetAction(this);
378 	CurveQ1Act->setDefaultWidget(CurveQ1);
379 	CurveQ1Pop->addAction(CurveQ1Act);
380 	CurveQ1Button = new QToolButton( WStackPage_10 );
381 	CurveQ1Button->setText( "" );
382 	CurveQ1Button->setMaximumSize( QSize( 22, 22 ) );
383 	CurveQ1Button->setIcon(IconManager::instance().loadIcon("curve.png"));
384 	CurveQ1Button->setMenu(CurveQ1Pop);
385 	CurveQ1Button->setPopupMode(QToolButton::InstantPopup);
386 	WStackPage10Layout->addWidget( CurveQ1Button, 1, 2 );
387 	textLabel2q = new QLabel( tr( "Color 2:" ), WStackPage_10 );
388 	WStackPage10Layout->addWidget( textLabel2q, 2, 0 );
389 	colDataq2 = new ColorCombo(false, WStackPage_10);
390 	colDataq2->setPixmapType(ColorCombo::fancyPixmaps);
391 	colDataq2->setColors(m_doc->PageColors, false);
392 	WStackPage10Layout->addWidget( colDataq2, 2, 1, 1, 2 );
393 	shadeq2 = new ShadeButton(WStackPage_10);
394 	shadeq2->setValue(100);
395 	WStackPage10Layout->addWidget( shadeq2, 3, 1 );
396 	CurveQ2 = new CurveWidget( nullptr );
397 	CurveQ2Pop = new QMenu();
398 	CurveQ2Act = new QWidgetAction(this);
399 	CurveQ2Act->setDefaultWidget(CurveQ2);
400 	CurveQ2Pop->addAction(CurveQ2Act);
401 	CurveQ2Button = new QToolButton( WStackPage_10 );
402 	CurveQ2Button->setText( "" );
403 	CurveQ2Button->setMaximumSize( QSize( 22, 22 ) );
404 	CurveQ2Button->setIcon(IconManager::instance().loadIcon("curve.png"));
405 	CurveQ2Button->setMenu(CurveQ2Pop);
406 	CurveQ2Button->setPopupMode(QToolButton::InstantPopup);
407 	WStackPage10Layout->addWidget( CurveQ2Button, 3, 2 );
408 	textLabel3q = new QLabel( tr( "Color 3:" ), WStackPage_10 );
409 	WStackPage10Layout->addWidget( textLabel3q, 4, 0 );
410 	colDataqc3 = new ColorCombo(false, WStackPage_10);
411 	colDataqc3->setPixmapType(ColorCombo::fancyPixmaps);
412 	colDataqc3->setColors(m_doc->PageColors, false);
413 	WStackPage10Layout->addWidget( colDataqc3, 4, 1, 1, 2 );
414 	shadeqc3 = new ShadeButton(WStackPage_10);
415 	shadeqc3->setValue(100);
416 	WStackPage10Layout->addWidget( shadeqc3, 5, 1 );
417 	CurveQc3 = new CurveWidget( nullptr );
418 	CurveQc3Pop = new QMenu();
419 	CurveQc3Act = new QWidgetAction(this);
420 	CurveQc3Act->setDefaultWidget(CurveQc3);
421 	CurveQc3Pop->addAction(CurveQc3Act);
422 	CurveQc3Button = new QToolButton( WStackPage_10 );
423 	CurveQc3Button->setText( "" );
424 	CurveQc3Button->setMaximumSize( QSize( 22, 22 ) );
425 	CurveQc3Button->setIcon(IconManager::instance().loadIcon("curve.png"));
426 	CurveQc3Button->setMenu(CurveQc3Pop);
427 	CurveQc3Button->setPopupMode(QToolButton::InstantPopup);
428 	WStackPage10Layout->addWidget( CurveQc3Button, 5, 2 );
429 	textLabel4q = new QLabel( tr( "Color 4:" ), WStackPage_10 );
430 	WStackPage10Layout->addWidget( textLabel4q, 6, 0 );
431 	colDataq4 = new ColorCombo(false, WStackPage_10);
432 	colDataq4->setPixmapType(ColorCombo::fancyPixmaps);
433 	colDataq4->setColors(m_doc->PageColors, false);
434 	WStackPage10Layout->addWidget( colDataq4, 6, 1, 1, 2 );
435 	shadeq4 = new ShadeButton(WStackPage_10);
436 	shadeq4->setValue(100);
437 	WStackPage10Layout->addWidget( shadeq4, 7, 1 );
438 	CurveQ4 = new CurveWidget( nullptr );
439 	CurveQ4Pop = new QMenu();
440 	CurveQ4Act = new QWidgetAction(this);
441 	CurveQ4Act->setDefaultWidget(CurveQ4);
442 	CurveQ4Pop->addAction(CurveQ4Act);
443 	CurveQ4Button = new QToolButton( WStackPage_10 );
444 	CurveQ4Button->setText( "" );
445 	CurveQ4Button->setMaximumSize( QSize( 22, 22 ) );
446 	CurveQ4Button->setIcon(IconManager::instance().loadIcon("curve.png"));
447 	CurveQ4Button->setMenu(CurveQ4Pop);
448 	CurveQ4Button->setPopupMode(QToolButton::InstantPopup);
449 	WStackPage10Layout->addWidget( CurveQ4Button, 7, 2 );
450 	optionStack->addWidget( WStackPage_10 );
451 
452 	WStackPage_11 = new QWidget( optionStack );
453 	WStackPage11Layout = new QVBoxLayout( WStackPage_11 );
454 	WStackPage11Layout->setContentsMargins(0, 0, 0, 0);
455 	WStackPage11Layout->setSpacing(6);
456 	WStackPage11Layout->setAlignment( Qt::AlignTop );
457 	Kdisplay = new CurveWidget(WStackPage_11);
458 	WStackPage11Layout->addWidget( Kdisplay );
459 	spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Expanding );
460 	WStackPage11Layout->addItem( spacer );
461 	optionStack->addWidget( WStackPage_11 );
462 
463 	textLabel1 = new QLabel( this );
464 	textLabel1->setText( tr( "Available Effects" ) );
465 	availableEffects = new QListWidget( this );
466 	availableEffects->clear();
467 	availableEffects->addItem( tr("Blur"));
468 	availableEffects->addItem( tr("Brightness"));
469 	availableEffects->addItem( tr("Colorize"));
470 	availableEffects->addItem( tr("Duotone"));
471 	availableEffects->addItem( tr("Tritone"));
472 	availableEffects->addItem( tr("Quadtone"));
473 	availableEffects->addItem( tr("Contrast"));
474 	availableEffects->addItem( tr("Grayscale"));
475 	availableEffects->addItem( tr("Curves"));
476 	availableEffects->addItem( tr("Invert"));
477 	availableEffects->addItem( tr("Posterize"));
478 	availableEffects->addItem( tr("Sharpen"));
479 
480 	QFontMetrics ftMetrics = this->fontMetrics();
481 	int availableEffectsAdvance = ftMetrics.horizontalAdvance( tr("Available Effects"));
482 
483 	availableEffects->setMinimumSize(availableEffectsAdvance + 40, 180);
484 	toEffects = new QPushButton( this );
485 	toEffects->setText( tr( "Add" ) );
486 	toEffects->setEnabled(false);
487 
488 	textLabel2 = new QLabel( this );
489 	textLabel2->setText( tr( "Applied Effects" ) );
490 	usedEffects = new QListWidget( this );
491 	usedEffects->setMinimumSize(availableEffectsAdvance + 40, 180);
492 	usedEffects->clear();
493 	m_effectValMap.clear();
494 	for (int i = 0; i < effectsList.count(); ++i)
495 	{
496 		if (effectsList.at(i).effectCode == ImageEffect::EF_INVERT)
497 		{
498 			usedEffects->addItem( tr("Invert"));
499 			m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), "");
500 		}
501 		if (effectsList.at(i).effectCode == ImageEffect::EF_GRAYSCALE)
502 		{
503 			usedEffects->addItem( tr("Grayscale"));
504 			m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), "");
505 		}
506 		if (effectsList.at(i).effectCode == ImageEffect::EF_COLORIZE)
507 		{
508 			usedEffects->addItem( tr("Colorize"));
509 			m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), effectsList.at(i).effectParameters);
510 			setItemSelectable(availableEffects, 2, false);
511 			setItemSelectable(availableEffects, 3, false);
512 			setItemSelectable(availableEffects, 4, false);
513 			setItemSelectable(availableEffects, 5, false);
514 		}
515 		if (effectsList.at(i).effectCode == ImageEffect::EF_BRIGHTNESS)
516 		{
517 			usedEffects->addItem( tr("Brightness"));
518 			m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), effectsList.at(i).effectParameters);
519 		}
520 		if (effectsList.at(i).effectCode == ImageEffect::EF_CONTRAST)
521 		{
522 			usedEffects->addItem( tr("Contrast"));
523 			m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), effectsList.at(i).effectParameters);
524 		}
525 		if (effectsList.at(i).effectCode == ImageEffect::EF_SHARPEN)
526 		{
527 			usedEffects->addItem( tr("Sharpen"));
528 			m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), effectsList.at(i).effectParameters);
529 		}
530 		if (effectsList.at(i).effectCode == ImageEffect::EF_BLUR)
531 		{
532 			usedEffects->addItem( tr("Blur"));
533 			QString tmpstr = effectsList.at(i).effectParameters;
534 			double radius;
535 			ScTextStream fp(&tmpstr, QIODevice::ReadOnly);
536 			fp >> radius; // has to be read from stream, as two numbers are stored in effectParameters
537 			blRadius->setValue(radius / m_imageScale);
538 			m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), QString("%1 1.0").arg(radius / m_imageScale));
539 		}
540 		if (effectsList.at(i).effectCode == ImageEffect::EF_SOLARIZE)
541 		{
542 			usedEffects->addItem( tr("Posterize"));
543 			m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), effectsList.at(i).effectParameters);
544 		}
545 		if (effectsList.at(i).effectCode == ImageEffect::EF_DUOTONE)
546 		{
547 			usedEffects->addItem( tr("Duotone"));
548 			m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), effectsList.at(i).effectParameters);
549 			setItemSelectable(availableEffects, 2, false);
550 			setItemSelectable(availableEffects, 3, false);
551 			setItemSelectable(availableEffects, 4, false);
552 			setItemSelectable(availableEffects, 5, false);
553 		}
554 		if (effectsList.at(i).effectCode == ImageEffect::EF_TRITONE)
555 		{
556 			usedEffects->addItem( tr("Tritone"));
557 			m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), effectsList.at(i).effectParameters);
558 			setItemSelectable(availableEffects, 2, false);
559 			setItemSelectable(availableEffects, 3, false);
560 			setItemSelectable(availableEffects, 4, false);
561 			setItemSelectable(availableEffects, 5, false);
562 		}
563 		if (effectsList.at(i).effectCode == ImageEffect::EF_QUADTONE)
564 		{
565 			usedEffects->addItem( tr("Quadtone"));
566 			m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), effectsList.at(i).effectParameters);
567 			setItemSelectable(availableEffects, 2, false);
568 			setItemSelectable(availableEffects, 3, false);
569 			setItemSelectable(availableEffects, 4, false);
570 			setItemSelectable(availableEffects, 5, false);
571 		}
572 		if (effectsList.at(i).effectCode == ImageEffect::EF_GRADUATE)
573 		{
574 			usedEffects->addItem( tr("Curves"));
575 			m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), effectsList.at(i).effectParameters);
576 		}
577 	}
578 	layout7 = new QHBoxLayout;
579 	layout7->setContentsMargins(0, 0, 0, 0);
580 	layout7->setSpacing(6);
581 	fromEffects = new QPushButton( this );
582 	fromEffects->setText( tr( "Remove" ) );
583 	fromEffects->setEnabled(false);
584 	layout7->addWidget( fromEffects );
585 	effectUp = new QPushButton( this );
586 	effectUp->setText( "" );
587 	effectUp->setIcon(IconManager::instance().loadIcon("16/go-up.png"));
588 	effectUp->setEnabled(false);
589 	layout7->addWidget( effectUp );
590 	effectDown = new QPushButton( this );
591 	effectDown->setText( "" );
592 	effectDown->setIcon(IconManager::instance().loadIcon("16/go-down.png"));
593 	effectDown->setEnabled(false);
594 	layout7->addWidget( effectDown );
595 
596 	groupBox = new QGroupBox( this );
597 	groupBox->setTitle( tr( "Options:" ) );
598 	layout8 = new QVBoxLayout( groupBox );
599 	layout8->addWidget( optionStack );
600 	layout8->setAlignment( Qt::AlignTop );
601 	layout8->setSpacing(6);
602 	layout8->setContentsMargins(9, 9, 9, 9);
603 
604 	layoutGrid->addWidget(textLabel1,       0, 0, 1, 1);
605 	layoutGrid->addWidget(textLabel2,       0, 1, 1, 1);
606 	layoutGrid->addWidget(textLabel5,       0, 2, 1, 1);
607 	layoutGrid->addWidget(availableEffects, 1, 0, 2, 1);
608 	layoutGrid->addWidget(usedEffects,      1, 1, 2, 1);
609 	layoutGrid->addWidget(pixmapLabel1,     1, 2, 1, 1);
610 	layoutGrid->addWidget(groupBox,         2, 2, 2, 1);
611 	layoutGrid->addWidget(toEffects,        3, 0, 1, 1);
612 	layoutGrid->addLayout(layout7,          3, 1, 1, 1);
613 	EffectsDialogLayout->addLayout( layoutGrid );
614 
615 	layoutDialogButtonBox = new QHBoxLayout;
616 	layoutDialogButtonBox->setContentsMargins(0, 0, 0, 0);
617 	layoutDialogButtonBox->setSpacing(6);
618 	spacer3 = new QSpacerItem( 1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum );
619 	layoutDialogButtonBox->addItem( spacer3 );
620 	okButton = new QPushButton( this );
621 	okButton->setText( tr( "OK" ) );
622 	layoutDialogButtonBox->addWidget( okButton );
623 	cancelButton = new QPushButton( this );
624 	cancelButton->setText( tr( "Cancel" ) );
625 	layoutDialogButtonBox->addWidget( cancelButton );
626 	EffectsDialogLayout->addLayout( layoutDialogButtonBox );
627 
628 
629 	optionStack->setCurrentIndex(0);
630 	usedEffects->clearSelection();
631 	availableEffects->clearSelection();
632 	resize( minimumSizeHint() );
633 	ScImage im(m_image);
634 	saveValues(false);
635 	im.applyEffect(effectsList, m_doc->PageColors, false);
636 	QPixmap Bild = QPixmap(pixmapLabel1->width(), pixmapLabel1->height());
637 	int x = (pixmapLabel1->width() - im.qImage().width()) / 2;
638 	int y = (pixmapLabel1->height() - im.qImage().height()) / 2;
639 	QPainter p;
640 	QBrush b(QColor(205,205,205), IconManager::instance().loadPixmap("testfill.png"));
641 	p.begin(&Bild);
642 	p.fillRect(0, 0, pixmapLabel1->width(), pixmapLabel1->height(), b);
643 	p.drawImage(x, y, im.qImage());
644 	p.end();
645 	pixmapLabel1->setPixmap( Bild );
646 
647 	// signals and slots connections
648 	connect( okButton, SIGNAL( clicked() ), this, SLOT( leaveOK() ) );
649 	connect( cancelButton, SIGNAL( clicked() ), this, SLOT( reject() ) );
650 	connect( usedEffects, SIGNAL( itemClicked(QListWidgetItem*) ), this, SLOT( selectEffect(QListWidgetItem*) ) );
651 	connect( usedEffects, SIGNAL( itemDoubleClicked(QListWidgetItem*) ), this, SLOT( moveFromEffects() ) );
652 	connect( availableEffects, SIGNAL( itemClicked(QListWidgetItem*) ), this, SLOT( selectAvailEffect(QListWidgetItem*) ) );
653 	connect( availableEffects, SIGNAL( itemDoubleClicked(QListWidgetItem*) ), this, SLOT( selectAvailEffectDbl(QListWidgetItem*) ) );
654 	connect( toEffects, SIGNAL( clicked() ), this, SLOT( moveToEffects() ) );
655 	connect( fromEffects, SIGNAL( clicked() ), this, SLOT( moveFromEffects() ) );
656 	connect( effectUp, SIGNAL( clicked() ), this, SLOT( moveEffectUp() ) );
657 	connect( effectDown, SIGNAL( clicked() ), this, SLOT( moveEffectDown() ) );
658 	connect( colData, SIGNAL(activated(int)), this, SLOT( createPreview()));
659 	connect( shade, SIGNAL(clicked()), this, SLOT(createPreview()));
660 	connect( colData1, SIGNAL(activated(int)), this, SLOT( createPreview()));
661 	connect( shade1, SIGNAL(clicked()), this, SLOT(createPreview()));
662 	connect( colData2, SIGNAL(activated(int)), this, SLOT( createPreview()));
663 	connect( shade2, SIGNAL(clicked()), this, SLOT(createPreview()));
664 	connect( colDatat1, SIGNAL(activated(int)), this, SLOT( createPreview()));
665 	connect( shadet1, SIGNAL(clicked()), this, SLOT(createPreview()));
666 	connect( colDatat2, SIGNAL(activated(int)), this, SLOT( createPreview()));
667 	connect( shadet2, SIGNAL(clicked()), this, SLOT(createPreview()));
668 	connect( colDatat3, SIGNAL(activated(int)), this, SLOT( createPreview()));
669 	connect( shadet3, SIGNAL(clicked()), this, SLOT(createPreview()));
670 	connect( colDataq1, SIGNAL(activated(int)), this, SLOT( createPreview()));
671 	connect( shadeq1, SIGNAL(clicked()), this, SLOT(createPreview()));
672 	connect( colDataq2, SIGNAL(activated(int)), this, SLOT( createPreview()));
673 	connect( shadeq2, SIGNAL(clicked()), this, SLOT(createPreview()));
674 	connect( colDataqc3, SIGNAL(activated(int)), this, SLOT( createPreview()));
675 	connect( shadeqc3, SIGNAL(clicked()), this, SLOT(createPreview()));
676 	connect( colDataq4, SIGNAL(activated(int)), this, SLOT( createPreview()));
677 	connect( shadeq4, SIGNAL(clicked()), this, SLOT(createPreview()));
678 	connect( brightnessSlider, SIGNAL(valueChanged(int)), this, SLOT(updateBright(int)));
679 	connect( brightnessSlider, SIGNAL(sliderReleased()), this, SLOT(createPreview()));
680 	connect( contrastSlider, SIGNAL(valueChanged(int)), this, SLOT(updateContrast(int)));
681 	connect( contrastSlider, SIGNAL(sliderReleased()), this, SLOT(createPreview()));
682 	connect( shRadius, SIGNAL(valueChanged(double)), this, SLOT(createPreview()));
683 	connect( shValue, SIGNAL(valueChanged(double)), this, SLOT(createPreview()));
684 	connect( blRadius, SIGNAL(valueChanged(double)), this, SLOT(createPreview()));
685 	connect( solarizeSlider, SIGNAL(valueChanged(int)), this, SLOT(updateSolarize(int)));
686 	connect( solarizeSlider, SIGNAL(sliderReleased()), this, SLOT(createPreview()));
687 	connect( Kdisplay->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
688 	connect( CurveD1->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
689 	connect( CurveD2->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
690 	connect( CurveT1->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
691 	connect( CurveT2->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
692 	connect( CurveT3->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
693 	connect( CurveQ1->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
694 	connect( CurveQ2->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
695 	connect( CurveQc3->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
696 	connect( CurveQ4->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
697 	m_time.start();
698 }
699 
setItemSelectable(QListWidget * widget,int itemNr,bool enable)700 void EffectsDialog::setItemSelectable(QListWidget* widget, int itemNr, bool enable)
701 {
702 	if (enable)
703 		widget->item(itemNr)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
704 	else
705 		widget->item(itemNr)->setFlags(Qt::NoItemFlags);
706 }
707 
leaveOK()708 void EffectsDialog::leaveOK()
709 {
710 	saveValues(true);
711 	accept();
712 }
713 
updateSolarize(int val)714 void EffectsDialog::updateSolarize(int val)
715 {
716 	QString tmp;
717 	tmp.setNum(val);
718 	textLabel15->setText(tmp);
719 	createPreview();
720 }
721 
updateContrast(int val)722 void EffectsDialog::updateContrast(int val)
723 {
724 	QString tmp;
725 	tmp.setNum(val);
726 	textLabel9->setText(tmp);
727 	createPreview();
728 }
729 
updateBright(int val)730 void EffectsDialog::updateBright(int val)
731 {
732 	QString tmp;
733 	tmp.setNum(val);
734 	textLabel7->setText(tmp);
735 	createPreview();
736 }
737 
createPreview()738 void EffectsDialog::createPreview()
739 {
740 	if (m_time.elapsed() < 50)
741 		return;
742 	ScImage im(m_image);
743 	saveValues(false);
744 	im.applyEffect(effectsList, m_doc->PageColors, false);
745 	QPixmap Bild = QPixmap(pixmapLabel1->width(), pixmapLabel1->height());
746 	int x = (pixmapLabel1->width() - im.qImage().width()) / 2;
747 	int y = (pixmapLabel1->height() - im.qImage().height()) / 2;
748 	QPainter p;
749 	QBrush b(QColor(205,205,205), IconManager::instance().loadPixmap("testfill.png"));
750 	p.begin(&Bild);
751 	p.fillRect(0, 0, pixmapLabel1->width(), pixmapLabel1->height(), b);
752 	p.drawImage(x, y, im.qImage());
753 	p.end();
754 	pixmapLabel1->setPixmap( Bild );
755 	m_time.start();
756 }
757 
saveValues(bool final)758 void EffectsDialog::saveValues(bool final)
759 {
760 	selectEffectHelper(final);
761 	effectsList.clear();
762 	struct ImageEffect ef;
763 	for (int e = 0; e < usedEffects->count(); ++e)
764 	{
765 		if (usedEffects->item(e)->text() == tr("Invert"))
766 		{
767 			ef.effectCode = ImageEffect::EF_INVERT;
768 			ef.effectParameters = "";
769 		}
770 		if (usedEffects->item(e)->text() == tr("Grayscale"))
771 		{
772 			ef.effectCode = ImageEffect::EF_GRAYSCALE;
773 			ef.effectParameters = "";
774 		}
775 		if (usedEffects->item(e)->text() == tr("Colorize"))
776 		{
777 			ef.effectCode = ImageEffect::EF_COLORIZE;
778 			ef.effectParameters = m_effectValMap[usedEffects->item(e)];
779 		}
780 		if (usedEffects->item(e)->text() == tr("Brightness"))
781 		{
782 			ef.effectCode = ImageEffect::EF_BRIGHTNESS;
783 			ef.effectParameters = m_effectValMap[usedEffects->item(e)];
784 		}
785 		if (usedEffects->item(e)->text() == tr("Contrast"))
786 		{
787 			ef.effectCode = ImageEffect::EF_CONTRAST;
788 			ef.effectParameters = m_effectValMap[usedEffects->item(e)];
789 		}
790 		if (usedEffects->item(e)->text() == tr("Sharpen"))
791 		{
792 			ef.effectCode = ImageEffect::EF_SHARPEN;
793 			ef.effectParameters = m_effectValMap[usedEffects->item(e)];
794 		}
795 		if (usedEffects->item(e)->text() == tr("Blur"))
796 		{
797 			ef.effectCode = ImageEffect::EF_BLUR;
798 			if (final)
799 				ef.effectParameters = QString("%1 1.0").arg(blRadius->value() * m_imageScale);
800 			else
801 				ef.effectParameters = QString("%1 1.0").arg(blRadius->value());
802 		}
803 		if (usedEffects->item(e)->text() == tr("Posterize"))
804 		{
805 			ef.effectCode = ImageEffect::EF_SOLARIZE;
806 			ef.effectParameters = m_effectValMap[usedEffects->item(e)];
807 		}
808 		if (usedEffects->item(e)->text() == tr("Duotone"))
809 		{
810 			ef.effectCode = ImageEffect::EF_DUOTONE;
811 			ef.effectParameters = m_effectValMap[usedEffects->item(e)];
812 		}
813 		if (usedEffects->item(e)->text() == tr("Tritone"))
814 		{
815 			ef.effectCode = ImageEffect::EF_TRITONE;
816 			ef.effectParameters = m_effectValMap[usedEffects->item(e)];
817 		}
818 		if (usedEffects->item(e)->text() == tr("Quadtone"))
819 		{
820 			ef.effectCode = ImageEffect::EF_QUADTONE;
821 			ef.effectParameters = m_effectValMap[usedEffects->item(e)];
822 		}
823 		if (usedEffects->item(e)->text() == tr("Curves"))
824 		{
825 			ef.effectCode = ImageEffect::EF_GRADUATE;
826 			ef.effectParameters = m_effectValMap[usedEffects->item(e)];
827 		}
828 		effectsList.append(ef);
829 	}
830 }
831 
selectAvailEffectDbl(QListWidgetItem * c)832 void EffectsDialog::selectAvailEffectDbl(QListWidgetItem* c)
833 {
834 	if (!c)
835 		return;
836 	if (!(c->flags() & Qt::ItemIsSelectable))
837 		return;
838 	moveToEffects();
839 }
840 
moveToEffects()841 void EffectsDialog::moveToEffects()
842 {
843 	disconnect( usedEffects, SIGNAL( itemActivated(QListWidgetItem*) ), this, SLOT( selectEffect(QListWidgetItem*) ) );
844 	usedEffects->addItem(availableEffects->currentItem()->text());
845 	if (availableEffects->currentItem()->text() == tr("Invert"))
846 		m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), "");
847 	if (availableEffects->currentItem()->text() == tr("Grayscale"))
848 		m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), "");
849 	if (availableEffects->currentItem()->text() == tr("Brightness"))
850 		m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), "0");
851 	if (availableEffects->currentItem()->text() == tr("Contrast"))
852 		m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), "0");
853 	if (availableEffects->currentItem()->text() == tr("Sharpen"))
854 		m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), "0 1");
855 	if (availableEffects->currentItem()->text() == tr("Blur"))
856 		m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), "0 1");
857 	if (availableEffects->currentItem()->text() == tr("Posterize"))
858 		m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), "255");
859 	if (availableEffects->currentItem()->text() == tr("Colorize"))
860 	{
861 		ColorList::Iterator it;
862 		it = m_doc->PageColors.begin();
863 		QString efval = it.key()+"\n100";
864 		m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), efval);
865 		setItemSelectable(availableEffects, 2, false);
866 		setItemSelectable(availableEffects, 3, false);
867 		setItemSelectable(availableEffects, 4, false);
868 		setItemSelectable(availableEffects, 5, false);
869 	}
870 	if (availableEffects->currentItem()->text() == tr("Duotone"))
871 	{
872 		ColorList::Iterator it;
873 		it = m_doc->PageColors.begin();
874 		QString efval = it.key()+"\n"+it.key()+"\n100 100 2 0.0 0.0 1.0 1.0 0 2 0.0 0.0 1.0 1.0 0";
875 		m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), efval);
876 		setItemSelectable(availableEffects, 2, false);
877 		setItemSelectable(availableEffects, 3, false);
878 		setItemSelectable(availableEffects, 4, false);
879 		setItemSelectable(availableEffects, 5, false);
880 	}
881 	if (availableEffects->currentItem()->text() == tr("Tritone"))
882 	{
883 		ColorList::Iterator it;
884 		it = m_doc->PageColors.begin();
885 		QString efval = it.key()+"\n"+it.key()+"\n"+it.key()+"\n100 100 100 2 0.0 0.0 1.0 1.0 0 2 0.0 0.0 1.0 1.0 0 2 0.0 0.0 1.0 1.0 0";
886 		m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), efval);
887 		setItemSelectable(availableEffects, 2, false);
888 		setItemSelectable(availableEffects, 3, false);
889 		setItemSelectable(availableEffects, 4, false);
890 		setItemSelectable(availableEffects, 5, false);
891 	}
892 	if (availableEffects->currentItem()->text() == tr("Quadtone"))
893 	{
894 		ColorList::Iterator it;
895 		it = m_doc->PageColors.begin();
896 		QString efval = it.key()+"\n"+it.key()+"\n"+it.key()+"\n"+it.key()+"\n100 100 100 100 2 0.0 0.0 1.0 1.0 0 2 0.0 0.0 1.0 1.0 0 2 0.0 0.0 1.0 1.0 0 2 0.0 0.0 1.0 1.0 0";
897 		m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), efval);
898 		setItemSelectable(availableEffects, 2, false);
899 		setItemSelectable(availableEffects, 3, false);
900 		setItemSelectable(availableEffects, 4, false);
901 		setItemSelectable(availableEffects, 5, false);
902 	}
903 	if (availableEffects->currentItem()->text() == tr("Curves"))
904 		m_effectValMap.insert(usedEffects->item(usedEffects->count()-1), "2 0.0 0.0 1.0 1.0 0");
905 	usedEffects->setCurrentItem(usedEffects->item(usedEffects->count()-1));
906 	selectEffect(usedEffects->item(usedEffects->count()-1));
907 	connect( usedEffects, SIGNAL( itemActivated(QListWidgetItem*) ), this, SLOT( selectEffect(QListWidgetItem*) ) );
908 	createPreview();
909 }
910 
moveFromEffects()911 void EffectsDialog::moveFromEffects()
912 {
913 	disconnect( usedEffects, SIGNAL( itemActivated(QListWidgetItem*) ), this, SLOT( selectEffect(QListWidgetItem*) ) );
914 	if ((usedEffects->currentItem()->text() == tr("Colorize")) || (usedEffects->currentItem()->text() == tr("Duotone")) || (usedEffects->currentItem()->text() == tr("Tritone")) || (usedEffects->currentItem()->text() == tr("Quadtone")))
915 	{
916 		setItemSelectable(availableEffects, 2, true);
917 		setItemSelectable(availableEffects, 3, true);
918 		setItemSelectable(availableEffects, 4, true);
919 		setItemSelectable(availableEffects, 5, true);
920 	}
921 	m_effectValMap.remove(usedEffects->currentItem());
922 	int curr = usedEffects->currentRow();
923 	QListWidgetItem *it = usedEffects->takeItem(curr);
924 	delete it;
925 	currentOptions = nullptr;
926 	usedEffects->clearSelection();
927 	if (usedEffects->count() == 0)
928 	{
929 		fromEffects->setEnabled(false);
930 		toEffects->setEnabled(false);
931 		selectEffectHelper();
932 		optionStack->setCurrentIndex(0);
933 		disconnect( availableEffects, SIGNAL( itemClicked(QListWidgetItem*) ), this, SLOT( selectAvailEffect(QListWidgetItem*) ) );
934 		availableEffects->clearSelection();
935 		connect( availableEffects, SIGNAL( itemClicked(QListWidgetItem*) ), this, SLOT( selectAvailEffect(QListWidgetItem*) ) );
936 	}
937 	else
938 	{
939 		usedEffects->setCurrentItem(usedEffects->item(qMax(curr-1, 0)));
940 		usedEffects->currentItem()->setSelected(true);
941 		selectEffect(usedEffects->currentItem());
942 	}
943 	if (usedEffects->count() < 2)
944 	{
945 		effectUp->setEnabled(false);
946 		effectDown->setEnabled(false);
947 	}
948 	createPreview();
949 	connect( usedEffects, SIGNAL( itemActivated(QListWidgetItem*) ), this, SLOT( selectEffect(QListWidgetItem*) ) );
950 }
951 
moveEffectUp()952 void EffectsDialog::moveEffectUp()
953 {
954 	int curr = usedEffects->currentRow();
955 	if (curr == 0)
956 		return;
957 	disconnect( usedEffects, SIGNAL( itemActivated(QListWidgetItem*) ), this, SLOT( selectEffect(QListWidgetItem*) ) );
958 	QListWidgetItem *it = usedEffects->takeItem(curr);
959 	usedEffects->insertItem(curr-1, it);
960 	usedEffects->setCurrentItem(it);
961 	selectEffect(usedEffects->currentItem());
962 	createPreview();
963 	connect( usedEffects, SIGNAL( itemActivated(QListWidgetItem*) ), this, SLOT( selectEffect(QListWidgetItem*) ) );
964 }
965 
moveEffectDown()966 void EffectsDialog::moveEffectDown()
967 {
968 	int curr = usedEffects->currentRow();
969 	if (curr == static_cast<int>(usedEffects->count())-1)
970 		return;
971 	disconnect( usedEffects, SIGNAL( itemActivated(QListWidgetItem*) ), this, SLOT( selectEffect(QListWidgetItem*) ) );
972 	QListWidgetItem *it = usedEffects->takeItem(curr);
973 	usedEffects->insertItem(curr+1, it);
974 	usedEffects->setCurrentItem(it);
975 	selectEffect(usedEffects->currentItem());
976 	createPreview();
977 	connect( usedEffects, SIGNAL( itemActivated(QListWidgetItem*) ), this, SLOT( selectEffect(QListWidgetItem*) ) );
978 }
979 
selectEffect(QListWidgetItem * c)980 void EffectsDialog::selectEffect(QListWidgetItem* c)
981 {
982 	QString s;
983 	toEffects->setEnabled(false);
984 	selectEffectHelper();
985 	if (c)
986 	{
987 		fromEffects->setEnabled(true);
988 		if (usedEffects->count() > 1)
989 		{
990 			effectUp->setEnabled(true);
991 			effectDown->setEnabled(true);
992 			if (usedEffects->currentItem() == nullptr)
993 				effectUp->setEnabled(false);
994 			if (usedEffects->currentRow() == static_cast<int>(usedEffects->count())-1)
995 				effectDown->setEnabled(false);
996 		}
997 		if (c->text() == tr("Grayscale"))
998 			optionStack->setCurrentIndex(0);
999 		else if (c->text() == tr("Invert"))
1000 			optionStack->setCurrentIndex(0);
1001 		else if (c->text() == tr("Colorize"))
1002 		{
1003 			disconnect( colData, SIGNAL(activated(int)), this, SLOT( createPreview()));
1004 			disconnect( shade, SIGNAL(clicked()), this, SLOT(createPreview()));
1005 			QString tmpstr = m_effectValMap[c];
1006 			QString col;
1007 			int shading;
1008 			ScTextStream fp(&tmpstr, QIODevice::ReadOnly);
1009 		//	fp >> col;
1010 			col = fp.readLine();
1011 			fp >> shading;
1012 			setCurrentComboItem(colData, col);
1013 			shade->setValue(shading);
1014 			optionStack->setCurrentIndex(1);
1015 			connect( colData, SIGNAL(activated(int)), this, SLOT( createPreview()));
1016 			connect( shade, SIGNAL(clicked()), this, SLOT(createPreview()));
1017 		}
1018 		else if (c->text() == tr("Duotone"))
1019 		{
1020 			disconnect( colData1, SIGNAL(activated(int)), this, SLOT( createPreview()));
1021 			disconnect( shade1, SIGNAL(clicked()), this, SLOT(createPreview()));
1022 			disconnect( colData2, SIGNAL(activated(int)), this, SLOT( createPreview()));
1023 			disconnect( shade2, SIGNAL(clicked()), this, SLOT(createPreview()));
1024 			disconnect( CurveD1->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1025 			disconnect( CurveD2->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1026 			QString tmpstr = m_effectValMap[c];
1027 			QString col1, col2;
1028 			int shading1, shading2;
1029 			ScTextStream fp(&tmpstr, QIODevice::ReadOnly);
1030 			col1 = fp.readLine();
1031 			col2 = fp.readLine();
1032 			fp >> shading1;
1033 			fp >> shading2;
1034 			setCurrentComboItem(colData1, col1);
1035 			shade1->setValue(shading1);
1036 			setCurrentComboItem(colData2, col2);
1037 			shade2->setValue(shading2);
1038 			int numVals;
1039 			double xval, yval;
1040 			FPointArray curve;
1041 			curve.resize(0);
1042 			fp >> numVals;
1043 			for (int i = 0; i < numVals; i++)
1044 			{
1045 				fp >> s;
1046 				xval = ScCLocale::toDoubleC(s);
1047 				fp >> s;
1048 				yval = ScCLocale::toDoubleC(s);
1049 				curve.addPoint(xval, yval);
1050 			}
1051 			CurveD1->cDisplay->setCurve(curve);
1052 			int lin;
1053 			fp >> lin;
1054 			CurveD1->setLinear(lin);
1055 			curve.resize(0);
1056 			fp >> numVals;
1057 			for (int i = 0; i < numVals; i++)
1058 			{
1059 				fp >> s;
1060 				xval = ScCLocale::toDoubleC(s);
1061 				fp >> s;
1062 				yval = ScCLocale::toDoubleC(s);
1063 				curve.addPoint(xval, yval);
1064 			}
1065 			CurveD2->cDisplay->setCurve(curve);
1066 			fp >> lin;
1067 			CurveD2->setLinear(lin);
1068 			optionStack->setCurrentIndex(7);
1069 			connect( colData1, SIGNAL(activated(int)), this, SLOT( createPreview()));
1070 			connect( shade1, SIGNAL(clicked()), this, SLOT(createPreview()));
1071 			connect( colData2, SIGNAL(activated(int)), this, SLOT( createPreview()));
1072 			connect( shade2, SIGNAL(clicked()), this, SLOT(createPreview()));
1073 			connect( CurveD1->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1074 			connect( CurveD2->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1075 		}
1076 		else if (c->text() == tr("Tritone"))
1077 		{
1078 			disconnect( colDatat1, SIGNAL(activated(int)), this, SLOT( createPreview()));
1079 			disconnect( shadet1, SIGNAL(clicked()), this, SLOT(createPreview()));
1080 			disconnect( colDatat2, SIGNAL(activated(int)), this, SLOT( createPreview()));
1081 			disconnect( shadet2, SIGNAL(clicked()), this, SLOT(createPreview()));
1082 			disconnect( colDatat3, SIGNAL(activated(int)), this, SLOT( createPreview()));
1083 			disconnect( shadet3, SIGNAL(clicked()), this, SLOT(createPreview()));
1084 			disconnect( CurveT1->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1085 			disconnect( CurveT2->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1086 			disconnect( CurveT3->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1087 			QString tmpstr = m_effectValMap[c];
1088 			QString col1, col2, col3;
1089 			int shading1, shading2, shading3;
1090 			ScTextStream fp(&tmpstr, QIODevice::ReadOnly);
1091 			col1 = fp.readLine();
1092 			col2 = fp.readLine();
1093 			col3 = fp.readLine();
1094 			fp >> shading1;
1095 			fp >> shading2;
1096 			fp >> shading3;
1097 			setCurrentComboItem(colDatat1, col1);
1098 			shadet1->setValue(shading1);
1099 			setCurrentComboItem(colDatat2, col2);
1100 			shadet2->setValue(shading2);
1101 			setCurrentComboItem(colDatat3, col3);
1102 			shadet3->setValue(shading3);
1103 			int numVals;
1104 			double xval, yval;
1105 			FPointArray curve;
1106 			curve.resize(0);
1107 			fp >> numVals;
1108 			for (int i = 0; i < numVals; i++)
1109 			{
1110 				fp >> s;
1111 				xval = ScCLocale::toDoubleC(s);
1112 				fp >> s;
1113 				yval = ScCLocale::toDoubleC(s);
1114 				curve.addPoint(xval, yval);
1115 			}
1116 			CurveT1->cDisplay->setCurve(curve);
1117 			int lin;
1118 			fp >> lin;
1119 			CurveT1->setLinear(lin);
1120 			curve.resize(0);
1121 			fp >> numVals;
1122 			for (int i = 0; i < numVals; i++)
1123 			{
1124 				fp >> s;
1125 				xval = ScCLocale::toDoubleC(s);
1126 				fp >> s;
1127 				yval = ScCLocale::toDoubleC(s);
1128 				curve.addPoint(xval, yval);
1129 			}
1130 			CurveT2->cDisplay->setCurve(curve);
1131 			fp >> lin;
1132 			CurveT2->setLinear(lin);
1133 			curve.resize(0);
1134 			fp >> numVals;
1135 			for (int i = 0; i < numVals; i++)
1136 			{
1137 				fp >> s;
1138 				xval = ScCLocale::toDoubleC(s);
1139 				fp >> s;
1140 				yval = ScCLocale::toDoubleC(s);
1141 				curve.addPoint(xval, yval);
1142 			}
1143 			CurveT3->cDisplay->setCurve(curve);
1144 			fp >> lin;
1145 			CurveT3->setLinear(lin);
1146 			optionStack->setCurrentIndex(8);
1147 			connect( colDatat1, SIGNAL(activated(int)), this, SLOT( createPreview()));
1148 			connect( shadet1, SIGNAL(clicked()), this, SLOT(createPreview()));
1149 			connect( colDatat2, SIGNAL(activated(int)), this, SLOT( createPreview()));
1150 			connect( shadet2, SIGNAL(clicked()), this, SLOT(createPreview()));
1151 			connect( colDatat3, SIGNAL(activated(int)), this, SLOT( createPreview()));
1152 			connect( shadet3, SIGNAL(clicked()), this, SLOT(createPreview()));
1153 			connect( CurveT1->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1154 			connect( CurveT2->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1155 			connect( CurveT3->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1156 		}
1157 		else if (c->text() == tr("Quadtone"))
1158 		{
1159 			disconnect( colDataq1, SIGNAL(activated(int)), this, SLOT( createPreview()));
1160 			disconnect( shadeq1, SIGNAL(clicked()), this, SLOT(createPreview()));
1161 			disconnect( colDataq2, SIGNAL(activated(int)), this, SLOT( createPreview()));
1162 			disconnect( shadeq2, SIGNAL(clicked()), this, SLOT(createPreview()));
1163 			disconnect( colDataqc3, SIGNAL(activated(int)), this, SLOT( createPreview()));
1164 			disconnect( shadeqc3, SIGNAL(clicked()), this, SLOT(createPreview()));
1165 			disconnect( colDataq4, SIGNAL(activated(int)), this, SLOT( createPreview()));
1166 			disconnect( shadeq4, SIGNAL(clicked()), this, SLOT(createPreview()));
1167 			disconnect( CurveQ1->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1168 			disconnect( CurveQ2->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1169 			disconnect( CurveQc3->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1170 			disconnect( CurveQ4->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1171 			QString tmpstr = m_effectValMap[c];
1172 			QString col1, col2, col3, col4;
1173 			int shading1, shading2, shading3, shading4;
1174 			ScTextStream fp(&tmpstr, QIODevice::ReadOnly);
1175 			col1 = fp.readLine();
1176 			col2 = fp.readLine();
1177 			col3 = fp.readLine();
1178 			col4 = fp.readLine();
1179 			fp >> shading1;
1180 			fp >> shading2;
1181 			fp >> shading3;
1182 			fp >> shading4;
1183 			setCurrentComboItem(colDataq1, col1);
1184 			shadeq1->setValue(shading1);
1185 			setCurrentComboItem(colDataq2, col2);
1186 			shadeq2->setValue(shading2);
1187 			setCurrentComboItem(colDataqc3, col3);
1188 			shadeqc3->setValue(shading3);
1189 			setCurrentComboItem(colDataq4, col4);
1190 			shadeq4->setValue(shading4);
1191 			int numVals;
1192 			double xval, yval;
1193 			FPointArray curve;
1194 			curve.resize(0);
1195 			fp >> numVals;
1196 			for (int i = 0; i < numVals; i++)
1197 			{
1198 				fp >> s;
1199 				xval = ScCLocale::toDoubleC(s);
1200 				fp >> s;
1201 				yval = ScCLocale::toDoubleC(s);
1202 				curve.addPoint(xval, yval);
1203 			}
1204 			CurveQ1->cDisplay->setCurve(curve);
1205 			int lin;
1206 			fp >> lin;
1207 			CurveQ1->setLinear(lin);
1208 			curve.resize(0);
1209 			fp >> numVals;
1210 			for (int i = 0; i < numVals; i++)
1211 			{
1212 				fp >> s;
1213 				xval = ScCLocale::toDoubleC(s);
1214 				fp >> s;
1215 				yval = ScCLocale::toDoubleC(s);
1216 				curve.addPoint(xval, yval);
1217 			}
1218 			CurveQ2->cDisplay->setCurve(curve);
1219 			fp >> lin;
1220 			CurveQ2->setLinear(lin);
1221 			curve.resize(0);
1222 			fp >> numVals;
1223 			for (int i = 0; i < numVals; i++)
1224 			{
1225 				fp >> s;
1226 				xval = ScCLocale::toDoubleC(s);
1227 				fp >> s;
1228 				yval = ScCLocale::toDoubleC(s);
1229 				curve.addPoint(xval, yval);
1230 			}
1231 			CurveQc3->cDisplay->setCurve(curve);
1232 			fp >> lin;
1233 			CurveQc3->setLinear(lin);
1234 			curve.resize(0);
1235 			fp >> numVals;
1236 			for (int i = 0; i < numVals; i++)
1237 			{
1238 				fp >> s;
1239 				xval = ScCLocale::toDoubleC(s);
1240 				fp >> s;
1241 				yval = ScCLocale::toDoubleC(s);
1242 				curve.addPoint(xval, yval);
1243 			}
1244 			CurveQ4->cDisplay->setCurve(curve);
1245 			fp >> lin;
1246 			CurveQ4->setLinear(lin);
1247 			optionStack->setCurrentIndex(9);
1248 			connect( colDataq1, SIGNAL(activated(int)), this, SLOT( createPreview()));
1249 			connect( shadeq1, SIGNAL(clicked()), this, SLOT(createPreview()));
1250 			connect( colDataq2, SIGNAL(activated(int)), this, SLOT( createPreview()));
1251 			connect( shadeq2, SIGNAL(clicked()), this, SLOT(createPreview()));
1252 			connect( colDataqc3, SIGNAL(activated(int)), this, SLOT( createPreview()));
1253 			connect( shadeqc3, SIGNAL(clicked()), this, SLOT(createPreview()));
1254 			connect( colDataq4, SIGNAL(activated(int)), this, SLOT( createPreview()));
1255 			connect( shadeq4, SIGNAL(clicked()), this, SLOT(createPreview()));
1256 			connect( CurveQ1->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1257 			connect( CurveQ2->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1258 			connect( CurveQc3->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1259 			connect( CurveQ4->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1260 		}
1261 		else if (c->text() == tr("Brightness"))
1262 		{
1263 			disconnect( brightnessSlider, SIGNAL(valueChanged(int)), this, SLOT(updateBright(int)));
1264 			disconnect( brightnessSlider, SIGNAL(sliderReleased()), this, SLOT(createPreview()));
1265 			QString tmpstr = m_effectValMap[c];
1266 			int brightness;
1267 			ScTextStream fp(&tmpstr, QIODevice::ReadOnly);
1268 			fp >> brightness;
1269 			brightnessSlider->setValue(brightness);
1270 			QString tmp;
1271 			tmp.setNum(brightness);
1272 			textLabel7->setText(tmp);
1273 			optionStack->setCurrentIndex(2);
1274 			connect( brightnessSlider, SIGNAL(valueChanged(int)), this, SLOT(updateBright(int)));
1275 			connect( brightnessSlider, SIGNAL(sliderReleased()), this, SLOT(createPreview()));
1276 		}
1277 		else if (c->text() == tr("Contrast"))
1278 		{
1279 			disconnect( contrastSlider, SIGNAL(valueChanged(int)), this, SLOT(updateContrast(int)));
1280 			disconnect( contrastSlider, SIGNAL(sliderReleased()), this, SLOT(createPreview()));
1281 			QString tmpstr = m_effectValMap[c];
1282 			int contrast;
1283 			ScTextStream fp(&tmpstr, QIODevice::ReadOnly);
1284 			fp >> contrast;
1285 			contrastSlider->setValue(contrast);
1286 			QString tmp;
1287 			tmp.setNum(contrast);
1288 			textLabel9->setText(tmp);
1289 			optionStack->setCurrentIndex(3);
1290 			connect( contrastSlider, SIGNAL(valueChanged(int)), this, SLOT(updateContrast(int)));
1291 			connect( contrastSlider, SIGNAL(sliderReleased()), this, SLOT(createPreview()));
1292 		}
1293 		else if (c->text() == tr("Sharpen"))
1294 		{
1295 			disconnect( shRadius, SIGNAL(valueChanged(double)), this, SLOT(createPreview()));
1296 			disconnect( shValue, SIGNAL(valueChanged(double)), this, SLOT(createPreview()));
1297 			QString tmpstr = m_effectValMap[c];
1298 			double radius, sigma;
1299 			ScTextStream fp(&tmpstr, QIODevice::ReadOnly);
1300 			fp >> s;
1301 			radius = ScCLocale::toDoubleC(s);
1302 			fp >> s;
1303 			sigma = ScCLocale::toDoubleC(s);
1304 			shRadius->setValue(radius);
1305 			shValue->setValue(sigma);
1306 			optionStack->setCurrentIndex(4);
1307 			connect( shRadius, SIGNAL(valueChanged(double)), this, SLOT(createPreview()));
1308 			connect( shValue, SIGNAL(valueChanged(double)), this, SLOT(createPreview()));
1309 		}
1310 		else if (c->text() == tr("Blur"))
1311 		{
1312 			disconnect( blRadius, SIGNAL(valueChanged(double)), this, SLOT(createPreview()));
1313 			QString tmpstr = m_effectValMap[c];
1314 			double radius;
1315 			ScTextStream fp(&tmpstr, QIODevice::ReadOnly);
1316 			fp >> s;
1317 			radius = ScCLocale::toDoubleC(s);
1318 			blRadius->setValue(radius);
1319 			optionStack->setCurrentIndex(5);
1320 			connect( blRadius, SIGNAL(valueChanged(double)), this, SLOT(createPreview()));
1321 		}
1322 		else if (c->text() == tr("Posterize"))
1323 		{
1324 			disconnect( solarizeSlider, SIGNAL(valueChanged(int)), this, SLOT(updateSolarize(int)));
1325 			disconnect( solarizeSlider, SIGNAL(sliderReleased()), this, SLOT(createPreview()));
1326 			QString tmpstr = m_effectValMap[c];
1327 			int solarize;
1328 			ScTextStream fp(&tmpstr, QIODevice::ReadOnly);
1329 			fp >> solarize;
1330 			solarizeSlider->setValue(solarize);
1331 			QString tmp;
1332 			tmp.setNum(solarize);
1333 			textLabel15->setText(tmp);
1334 			optionStack->setCurrentIndex(6);
1335 			connect( solarizeSlider, SIGNAL(valueChanged(int)), this, SLOT(updateSolarize(int)));
1336 			connect( solarizeSlider, SIGNAL(sliderReleased()), this, SLOT(createPreview()));
1337 		}
1338 		else if (c->text() == tr("Curves"))
1339 		{
1340 			disconnect( Kdisplay->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1341 			QString tmpstr = m_effectValMap[c];
1342 			ScTextStream fp(&tmpstr, QIODevice::ReadOnly);
1343 			int numVals;
1344 			double xval, yval;
1345 			FPointArray curve;
1346 			curve.resize(0);
1347 			fp >> numVals;
1348 			for (int i = 0; i < numVals; i++)
1349 			{
1350 				fp >> s;
1351 				xval = ScCLocale::toDoubleC(s);
1352 				fp >> s;
1353 				yval = ScCLocale::toDoubleC(s);
1354 				curve.addPoint(xval, yval);
1355 			}
1356 			Kdisplay->cDisplay->setCurve(curve);
1357 			int lin;
1358 			fp >> lin;
1359 			if (lin == 1)
1360 				Kdisplay->setLinear(true);
1361 			else
1362 				Kdisplay->setLinear(false);
1363 			optionStack->setCurrentIndex(10);
1364 			connect( Kdisplay->cDisplay, SIGNAL(modified()), this, SLOT(createPreview()));
1365 		}
1366 		else
1367 			optionStack->setCurrentIndex(0);
1368 		currentOptions = c;
1369 	}
1370 	else
1371 		optionStack->setCurrentIndex(0);
1372 	disconnect( availableEffects, SIGNAL( itemClicked(QListWidgetItem*) ), this, SLOT( selectAvailEffect(QListWidgetItem*) ) );
1373 	availableEffects->clearSelection();
1374 	connect( availableEffects, SIGNAL( itemClicked(QListWidgetItem*) ), this, SLOT( selectAvailEffect(QListWidgetItem*) ) );
1375 }
1376 
selectAvailEffect(QListWidgetItem * c)1377 void EffectsDialog::selectAvailEffect(QListWidgetItem* c)
1378 {
1379 	if (c)
1380 	{
1381 		if (!(c->flags() & Qt::ItemIsSelectable))
1382 			toEffects->setEnabled(false);
1383 		else
1384 			toEffects->setEnabled(true);
1385 	}
1386 	fromEffects->setEnabled(false);
1387 	effectUp->setEnabled(false);
1388 	effectDown->setEnabled(false);
1389 	disconnect( usedEffects, SIGNAL( itemActivated(QListWidgetItem*) ), this, SLOT( selectEffect(QListWidgetItem*) ) );
1390 	selectEffectHelper();
1391 	currentOptions = nullptr;
1392 	usedEffects->clearSelection();
1393 	optionStack->setCurrentIndex(0);
1394 	connect( usedEffects, SIGNAL( itemActivated(QListWidgetItem*) ), this, SLOT( selectEffect(QListWidgetItem*) ) );
1395 }
1396 
selectEffectHelper(bool final)1397 void EffectsDialog::selectEffectHelper(bool final)
1398 {
1399 	if (currentOptions != nullptr)
1400 	{
1401 		if (currentOptions->text() == tr("Colorize"))
1402 		{
1403 			QString efval = colData->currentText();
1404 			QString tmp;
1405 			tmp.setNum(shade->getValue());
1406 			efval += "\n"+tmp;
1407 			m_effectValMap[currentOptions] = efval;
1408 		}
1409 		if (currentOptions->text() == tr("Brightness"))
1410 		{
1411 			QString tmp;
1412 			tmp.setNum(brightnessSlider->value());
1413 			m_effectValMap[currentOptions] = tmp;
1414 		}
1415 		if (currentOptions->text() == tr("Contrast"))
1416 		{
1417 			QString tmp;
1418 			tmp.setNum(contrastSlider->value());
1419 			m_effectValMap[currentOptions] = tmp;
1420 		}
1421 		if (currentOptions->text() == tr("Sharpen"))
1422 		{
1423 			QString efval;
1424 			QString tmp;
1425 			tmp.setNum(shRadius->value());
1426 			efval += tmp;
1427 			tmp.setNum(shValue->value());
1428 			efval += " "+tmp;
1429 			m_effectValMap[currentOptions] = efval;
1430 		}
1431 		if (currentOptions->text() == tr("Blur"))
1432 		{
1433 			QString efval;
1434 			QString tmp;
1435 			if (!final)
1436 				tmp.setNum(blRadius->value());
1437 			else
1438 				tmp.setNum(blRadius->value()*m_imageScale);
1439 			efval += tmp;
1440 			tmp.setNum(1.0);
1441 			efval += " "+tmp;
1442 			m_effectValMap[currentOptions] = efval;
1443 		}
1444 		if (currentOptions->text() == tr("Posterize"))
1445 		{
1446 			QString tmp;
1447 			tmp.setNum(solarizeSlider->value());
1448 			m_effectValMap[currentOptions] = tmp;
1449 		}
1450 		if (currentOptions->text() == tr("Duotone"))
1451 		{
1452 			QString efval = colData1->currentText()+"\n";
1453 			efval += colData2->currentText()+"\n";
1454 			QString tmp;
1455 			tmp.setNum(shade1->getValue());
1456 			efval += tmp;
1457 			tmp.setNum(shade2->getValue());
1458 			efval += " "+tmp;
1459 			FPointArray Vals = CurveD1->cDisplay->getCurve();
1460 			tmp.setNum(Vals.size());
1461 			efval += " "+tmp;
1462 			for (int i = 0; i < Vals.size(); i++)
1463 			{
1464 				const FPoint& pv = Vals.point(i);
1465 				efval += QString(" %1 %2").arg(pv.x()).arg(pv.y());
1466 			}
1467 			if (CurveD1->cDisplay->isLinear())
1468 				efval += " 1";
1469 			else
1470 				efval += " 0";
1471 			Vals = CurveD2->cDisplay->getCurve();
1472 			tmp.setNum(Vals.size());
1473 			efval += " "+tmp;
1474 			for (int i = 0; i < Vals.size(); i++)
1475 			{
1476 				const FPoint& pv = Vals.point(i);
1477 				efval += QString(" %1 %2").arg(pv.x()).arg(pv.y());
1478 			}
1479 			if (CurveD2->cDisplay->isLinear())
1480 				efval += " 1";
1481 			else
1482 				efval += " 0";
1483 			m_effectValMap[currentOptions] = efval;
1484 		}
1485 		if (currentOptions->text() == tr("Tritone"))
1486 		{
1487 			QString efval = "";
1488 			efval = colDatat1->currentText()+"\n";
1489 			efval += colDatat2->currentText()+"\n";
1490 			efval += colDatat3->currentText()+"\n";
1491 			QString tmp;
1492 			tmp.setNum(shadet1->getValue());
1493 			efval += tmp;
1494 			tmp.setNum(shadet2->getValue());
1495 			efval += " "+tmp;
1496 			tmp.setNum(shadet3->getValue());
1497 			efval += " "+tmp;
1498 			FPointArray Vals = CurveT1->cDisplay->getCurve();
1499 			tmp.setNum(Vals.size());
1500 			efval += " "+tmp;
1501 			for (int p = 0; p < Vals.size(); p++)
1502 			{
1503 				const FPoint& pv = Vals.point(p);
1504 				efval += QString(" %1 %2").arg(pv.x()).arg(pv.y());
1505 			}
1506 			if (CurveT1->cDisplay->isLinear())
1507 				efval += " 1";
1508 			else
1509 				efval += " 0";
1510 			Vals = CurveT2->cDisplay->getCurve();
1511 			tmp.setNum(Vals.size());
1512 			efval += " "+tmp;
1513 			for (int p = 0; p < Vals.size(); p++)
1514 			{
1515 				const FPoint& pv = Vals.point(p);
1516 				efval += QString(" %1 %2").arg(pv.x()).arg(pv.y());
1517 			}
1518 			if (CurveT2->cDisplay->isLinear())
1519 				efval += " 1";
1520 			else
1521 				efval += " 0";
1522 			Vals = CurveT3->cDisplay->getCurve();
1523 			tmp.setNum(Vals.size());
1524 			efval += " "+tmp;
1525 			for (int p = 0; p < Vals.size(); p++)
1526 			{
1527 				const FPoint& pv = Vals.point(p);
1528 				efval += QString(" %1 %2").arg(pv.x()).arg(pv.y());
1529 			}
1530 			if (CurveT3->cDisplay->isLinear())
1531 				efval += " 1";
1532 			else
1533 				efval += " 0";
1534 			m_effectValMap[currentOptions] = efval;
1535 		}
1536 		if (currentOptions->text() == tr("Quadtone"))
1537 		{
1538 			QString efval = colDataq1->currentText()+"\n";
1539 			efval += colDataq2->currentText()+"\n";
1540 			efval += colDataqc3->currentText()+"\n";
1541 			efval += colDataq4->currentText()+"\n";
1542 			QString tmp;
1543 			tmp.setNum(shadeq1->getValue());
1544 			efval += tmp;
1545 			tmp.setNum(shadeq2->getValue());
1546 			efval += " "+tmp;
1547 			tmp.setNum(shadeqc3->getValue());
1548 			efval += " "+tmp;
1549 			tmp.setNum(shadeq4->getValue());
1550 			efval += " "+tmp;
1551 			FPointArray Vals = CurveQ1->cDisplay->getCurve();
1552 			tmp.setNum(Vals.size());
1553 			efval += " "+tmp;
1554 			for (int i = 0; i < Vals.size(); i++)
1555 			{
1556 				const FPoint& pv = Vals.point(i);
1557 				efval += QString(" %1 %2").arg(pv.x()).arg(pv.y());
1558 			}
1559 			if (CurveQ1->cDisplay->isLinear())
1560 				efval += " 1";
1561 			else
1562 				efval += " 0";
1563 			Vals = CurveQ2->cDisplay->getCurve();
1564 			tmp.setNum(Vals.size());
1565 			efval += " "+tmp;
1566 			for (int i = 0; i < Vals.size(); i++)
1567 			{
1568 				const FPoint& pv = Vals.point(i);
1569 				efval += QString(" %1 %2").arg(pv.x()).arg(pv.y());
1570 			}
1571 			if (CurveQ2->cDisplay->isLinear())
1572 				efval += " 1";
1573 			else
1574 				efval += " 0";
1575 			Vals = CurveQc3->cDisplay->getCurve();
1576 			tmp.setNum(Vals.size());
1577 			efval += " "+tmp;
1578 			for (int i = 0; i < Vals.size(); i++)
1579 			{
1580 				const FPoint& pv = Vals.point(i);
1581 				efval += QString(" %1 %2").arg(pv.x()).arg(pv.y());
1582 			}
1583 			if (CurveQc3->cDisplay->isLinear())
1584 				efval += " 1";
1585 			else
1586 				efval += " 0";
1587 			Vals = CurveQ4->cDisplay->getCurve();
1588 			tmp.setNum(Vals.size());
1589 			efval += " "+tmp;
1590 			for (int i = 0; i < Vals.size(); i++)
1591 			{
1592 				const FPoint& pv = Vals.point(i);
1593 				efval += QString(" %1 %2").arg(pv.x()).arg(pv.y());
1594 			}
1595 			if (CurveQ4->cDisplay->isLinear())
1596 				efval += " 1";
1597 			else
1598 				efval += " 0";
1599 			m_effectValMap[currentOptions] = efval;
1600 		}
1601 		if (currentOptions->text() == tr("Curves"))
1602 		{
1603 			QString efval;
1604 			FPointArray Vals = Kdisplay->cDisplay->getCurve();
1605 			QString tmp;
1606 			tmp.setNum(Vals.size());
1607 			efval += tmp;
1608 			for (int i = 0; i < Vals.size(); i++)
1609 			{
1610 				const FPoint& pv = Vals.point(i);
1611 				efval += QString(" %1 %2").arg(pv.x()).arg(pv.y());
1612 			}
1613 			if (Kdisplay->cDisplay->isLinear())
1614 				efval += " 1";
1615 			else
1616 				efval += " 0";
1617 			m_effectValMap[currentOptions] = efval;
1618 		}
1619 	}
1620 }
1621