Krita Source Code Documentation
Loading...
Searching...
No Matches
KisScreentoneConfigWidget.cpp
Go to the documentation of this file.
1/*
2 * KDE. Krita Project.
3 *
4 * SPDX-FileCopyrightText: 2020 Deif Lou <ginoba@gmail.com>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9#include <KoColor.h>
12#include <kis_signals_blocker.h>
14#include <KisViewManager.h>
17#include <KoUnit.h>
18
22
24 : KisConfigWidget(parent)
25 , m_view(nullptr)
26 , m_colorSpace(cs)
27{
28 m_ui.setupUi(this);
29
33
34 m_ui.buttonEqualizationNone->setGroupPosition(KoGroupButton::GroupLeft);
35 m_ui.buttonEqualizationFunctionBased->setGroupPosition(KoGroupButton::GroupCenter);
36 m_ui.buttonEqualizationTemplateBased->setGroupPosition(KoGroupButton::GroupRight);
37
38 m_ui.sliderForegroundOpacity->setRange(0, 100);
39 KisSpinBoxI18nHelper::setText(m_ui.sliderForegroundOpacity,
40 i18nc("{n} is the number value, % is the percent sign", "Opacity: {n}%"));
41
42 m_ui.sliderBackgroundOpacity->setRange(0, 100);
43 KisSpinBoxI18nHelper::setText(m_ui.sliderBackgroundOpacity,
44 i18nc("{n} is the number value, % is the percent sign", "Opacity: {n}%"));
45
46 m_ui.sliderBrightness->setRange(0.0, 100.0, 2);
47 m_ui.sliderBrightness->setSingleStep(1.0);
48 KisSpinBoxI18nHelper::setText(m_ui.sliderBrightness,
49 i18nc("{n} is the number value, % is the percent sign", "{n}%"));
50
51 m_ui.sliderContrast->setRange(0.0, 100.0, 2);
52 m_ui.sliderContrast->setSingleStep(1.0);
53 KisSpinBoxI18nHelper::setText(m_ui.sliderContrast, i18nc("{n} is the number value, % is the percent sign", "{n}%"));
54
55 m_ui.buttonSizeModeResolutionBased->setGroupPosition(KoGroupButton::GroupLeft);
56 m_ui.buttonSizeModePixelBased->setGroupPosition(KoGroupButton::GroupRight);
57
58 m_ui.sliderResolution->setRange(1.0, 9999.0, 2);
59 m_ui.sliderResolution->setSoftRange(72.0, 600.0);
60
61 m_ui.sliderFrequencyX->setPrefix(i18n("X: "));
62 m_ui.sliderFrequencyX->setSingleStep(1.0);
63
64 m_ui.sliderFrequencyY->setPrefix(i18n("Y: "));
65 m_ui.sliderFrequencyY->setSingleStep(1.0);
66
68
70
71 m_ui.sliderPositionX->setRange(-1000.0, 1000.0, 2);
72 m_ui.sliderPositionX->setSoftRange(-100.0, 100.0);
73 m_ui.sliderPositionX->setPrefix(i18n("X: "));
74 m_ui.sliderPositionX->setSuffix(i18n(" px"));
75 m_ui.sliderPositionX->setSingleStep(1.0);
76
77 m_ui.sliderPositionY->setRange(-1000.0, 1000.0, 2);
78 m_ui.sliderPositionY->setSoftRange(-100.0, 100.0);
79 m_ui.sliderPositionY->setPrefix(i18n("Y: "));
80 m_ui.sliderPositionY->setSuffix(i18n(" px"));
81 m_ui.sliderPositionY->setSingleStep(1.0);
82
83 m_ui.sliderSizeX->setRange(1.0, 1000.0, 2);
84 m_ui.sliderSizeX->setSoftRange(1.0, 100.0);
85 m_ui.sliderSizeX->setPrefix(i18n("X: "));
86 m_ui.sliderSizeX->setSuffix(i18n(" px"));
87 m_ui.sliderSizeX->setSingleStep(1.0);
88 m_ui.sliderSizeX->setExponentRatio(4.32);
89
90 m_ui.sliderSizeY->setRange(1.0, 1000.0, 2);
91 m_ui.sliderSizeY->setSoftRange(1.0, 100.0);
92 m_ui.sliderSizeY->setPrefix(i18n("Y: "));
93 m_ui.sliderSizeY->setSuffix(i18n(" px"));
94 m_ui.sliderSizeY->setSingleStep(1.0);
95 m_ui.sliderSizeY->setExponentRatio(4.32);
96
97 m_ui.sliderShearX->setRange(-10.0, 10.0, 2);
98 m_ui.sliderShearX->setSoftRange(-2.0, 2.0);
99 m_ui.sliderShearX->setPrefix(i18n("X: "));
100 m_ui.sliderShearX->setSingleStep(0.1);
101
102 m_ui.sliderShearY->setRange(-10.0, 10.0, 2);
103 m_ui.sliderShearY->setSoftRange(-2.0, 2.0);
104 m_ui.sliderShearY->setPrefix(i18n("Y: "));
105 m_ui.sliderShearY->setSingleStep(0.1);
106
107 m_ui.sliderAlignToPixelGridX->setRange(1, 20);
108 m_ui.sliderAlignToPixelGridY->setRange(1, 20);
109
110 KisSpinBoxI18nHelper::install(m_ui.sliderAlignToPixelGridX, [](int value) {
111 // i18n: This is meant to be used in a spinbox so keep the {n} in the text
112 // and it will be substituted by the number. The text before will be
113 // used as the prefix and the text after as the suffix
114 return i18ncp("Horizontal pixel grid alignment prefix/suffix for spinboxes in screentone generator", "Every {n} cell horizontally", "Every {n} cells horizontally", value);
115 });
116
117 KisSpinBoxI18nHelper::install(m_ui.sliderAlignToPixelGridY, [](int value) {
118 // i18n: This is meant to be used in a spinbox so keep the {n} in the text
119 // and it will be substituted by the number. The text before will be
120 // used as the prefix and the text after as the suffix
121 return i18ncp("Vertical pixel grid alignment prefix/suffix for spinboxes in screentone generator", "Every {n} cell vertically", "Every {n} cells vertically", value);
122 });
123
125
126 connect(m_ui.comboBoxPattern, SIGNAL(currentIndexChanged(int)), this, SLOT(slot_comboBoxPattern_currentIndexChanged(int)));
127 connect(m_ui.comboBoxShape, SIGNAL(currentIndexChanged(int)), this, SLOT(slot_comboBoxShape_currentIndexChanged(int)));
128 connect(m_ui.comboBoxInterpolation, SIGNAL(currentIndexChanged(int)), this, SIGNAL(sigConfigurationUpdated()));
129
130 connect(m_ui.buttonEqualizationNone, SIGNAL(toggled(bool)), this, SIGNAL(sigConfigurationUpdated()));
131 connect(m_ui.buttonEqualizationFunctionBased, SIGNAL(toggled(bool)), this, SIGNAL(sigConfigurationUpdated()));
132 connect(m_ui.buttonEqualizationTemplateBased, SIGNAL(toggled(bool)), this, SIGNAL(sigConfigurationUpdated()));
133
134 connect(m_ui.buttonForegroundColor, SIGNAL(changed(const KoColor&)), this, SIGNAL(sigConfigurationUpdated()));
135 connect(m_ui.sliderForegroundOpacity, SIGNAL(valueChanged(int)), this, SIGNAL(sigConfigurationUpdated()));
136
137 connect(m_ui.buttonBackgroundColor, SIGNAL(changed(const KoColor&)), this, SIGNAL(sigConfigurationUpdated()));
138 connect(m_ui.sliderBackgroundOpacity, SIGNAL(valueChanged(int)), this, SIGNAL(sigConfigurationUpdated()));
139
140 connect(m_ui.checkBoxInvert, SIGNAL(toggled(bool)), this, SIGNAL(sigConfigurationUpdated()));
141
142 connect(m_ui.sliderBrightness, SIGNAL(valueChanged(qreal)), this, SIGNAL(sigConfigurationUpdated()));
143 connect(m_ui.sliderContrast, SIGNAL(valueChanged(qreal)), this, SIGNAL(sigConfigurationUpdated()));
144
145 connect(m_ui.buttonSizeModeResolutionBased, SIGNAL(toggled(bool)), this, SLOT(slot_buttonSizeModeResolutionBased_toggled(bool)));
146 connect(m_ui.buttonSizeModePixelBased, SIGNAL(toggled(bool)), this, SLOT(slot_buttonSizeModePixelBased_toggled(bool)));
147
148 connect(m_ui.comboBoxUnits, SIGNAL(currentIndexChanged(int)), this, SLOT(slot_comboBoxUnits_currentIndexChanged(int)));
149
150 connect(m_ui.sliderResolution, SIGNAL(valueChanged(qreal)), this, SLOT(slot_sliderResolution_valueChanged(qreal)));
151 connect(m_ui.sliderResolution, SIGNAL(valueChanged(qreal)), this, SIGNAL(sigConfigurationUpdated()));
152 connect(m_ui.buttonResolutionFromImage, SIGNAL(clicked()), this, SLOT(slot_buttonResolutionFromImage_clicked()));
153
154 connect(m_ui.sliderFrequencyX, SIGNAL(valueChanged(qreal)), this, SLOT(slot_sliderFrequencyX_valueChanged(qreal)));
155 connect(m_ui.sliderFrequencyY, SIGNAL(valueChanged(qreal)), this, SLOT(slot_sliderFrequencyY_valueChanged(qreal)));
156 connect(m_ui.buttonConstrainFrequency, SIGNAL(keepAspectRatioChanged(bool)), this, SLOT(slot_buttonConstrainFrequency_keepAspectRatioChanged(bool)));
157
158 connect(m_ui.sliderPositionX, SIGNAL(valueChanged(qreal)), this, SIGNAL(sigConfigurationUpdated()));
159 connect(m_ui.sliderPositionY, SIGNAL(valueChanged(qreal)), this, SIGNAL(sigConfigurationUpdated()));
160
161 connect(m_ui.sliderSizeX, SIGNAL(valueChanged(qreal)), this, SLOT(slot_sliderSizeX_valueChanged(qreal)));
162 connect(m_ui.sliderSizeY, SIGNAL(valueChanged(qreal)), this, SLOT(slot_sliderSizeY_valueChanged(qreal)));
163 connect(m_ui.buttonConstrainSize, SIGNAL(keepAspectRatioChanged(bool)), this, SLOT(slot_buttonConstrainSize_keepAspectRatioChanged(bool)));
164
165 connect(m_ui.sliderShearX, SIGNAL(valueChanged(qreal)), this, SIGNAL(sigConfigurationUpdated()));
166 connect(m_ui.sliderShearY, SIGNAL(valueChanged(qreal)), this, SIGNAL(sigConfigurationUpdated()));
167
168 connect(m_ui.angleSelectorRotation, SIGNAL(angleChanged(qreal)), this, SIGNAL(sigConfigurationUpdated()));
169
170 connect(m_ui.checkBoxAlignToPixelGrid, SIGNAL(toggled(bool)), this, SIGNAL(sigConfigurationUpdated()));
171 connect(m_ui.sliderAlignToPixelGridX, SIGNAL(valueChanged(int)), this, SLOT(slot_sliderAlignToPixelGridX_valueChanged(int)));
172 connect(m_ui.sliderAlignToPixelGridY, SIGNAL(valueChanged(int)), this, SLOT(slot_sliderAlignToPixelGridY_valueChanged(int)));
173}
174
177
179{
180 const KisScreentoneGeneratorConfiguration *generatorConfig =
181 dynamic_cast<const KisScreentoneGeneratorConfiguration*>(config.data());
182 KIS_ASSERT(generatorConfig);
183
184 {
185 KisSignalsBlocker blocker1(m_ui.buttonSizeModeResolutionBased, m_ui.buttonSizeModePixelBased,
186 m_ui.sliderResolution, m_ui.buttonConstrainFrequency,
187 m_ui.sliderFrequencyX, m_ui.sliderFrequencyY);
188 KisSignalsBlocker blocker2(m_ui.sliderSizeX, m_ui.sliderSizeY,
189 m_ui.buttonConstrainSize, m_ui.sliderAlignToPixelGridX,
190 m_ui.sliderAlignToPixelGridY, this);
191
192 m_ui.comboBoxPattern->setCurrentIndex(generatorConfig->pattern());
193 m_ui.comboBoxShape->setCurrentIndex(shapeToComboIndex(generatorConfig->pattern(), generatorConfig->shape()));
194 m_ui.comboBoxInterpolation->setCurrentIndex(generatorConfig->interpolation());
195 const int equalizationMode = generatorConfig->equalizationMode();
196 if (equalizationMode == KisScreentoneEqualizationMode_FunctionBased) {
197 m_ui.buttonEqualizationFunctionBased->setChecked(true);
198 } else if (equalizationMode == KisScreentoneEqualizationMode_TemplateBased) {
199 m_ui.buttonEqualizationTemplateBased->setChecked(true);
200 } else {
201 m_ui.buttonEqualizationNone->setChecked(true);
202 }
203
204 KoColor c;
205 c = generatorConfig->foregroundColor();
207 c.setOpacity(1.0);
208 m_ui.buttonForegroundColor->setColor(c);
209 m_ui.sliderForegroundOpacity->setValue(generatorConfig->foregroundOpacity());
210 c = generatorConfig->backgroundColor();
212 c.setOpacity(1.0);
213 m_ui.buttonBackgroundColor->setColor(c);
214 m_ui.sliderBackgroundOpacity->setValue(generatorConfig->backgroundOpacity());
215 m_ui.checkBoxInvert->setChecked(generatorConfig->invert());
216 m_ui.sliderBrightness->setValue(generatorConfig->brightness());
217 m_ui.sliderContrast->setValue(generatorConfig->contrast());
218
219 m_ui.comboBoxUnits->setCurrentIndex(generatorConfig->units());
220 m_ui.sliderResolution->setValue(generatorConfig->resolution());
222 m_ui.buttonConstrainFrequency->setKeepAspectRatio(generatorConfig->constrainFrequency());
223 m_ui.sliderFrequencyX->setValue(generatorConfig->frequencyX());
224 // Set the frequency y slider to the frequency y value only if the frequency is not constrained
225 if (m_ui.buttonConstrainFrequency->keepAspectRatio()) {
226 m_ui.sliderFrequencyY->setValue(generatorConfig->frequencyX());
227 } else {
228 m_ui.sliderFrequencyY->setValue(generatorConfig->frequencyY());
229 }
230 m_ui.sliderPositionX->setValue(generatorConfig->positionX());
231 m_ui.sliderPositionY->setValue(generatorConfig->positionY());
232 m_ui.buttonConstrainSize->setKeepAspectRatio(generatorConfig->constrainSize());
233 m_ui.sliderSizeX->setValue(generatorConfig->sizeX());
234 // Set the size y slider to the sithe y value only if the size must not be squared
235 if (m_ui.buttonConstrainSize->keepAspectRatio()) {
236 m_ui.sliderSizeY->setValue(generatorConfig->sizeX());
237 } else {
238 m_ui.sliderSizeY->setValue(generatorConfig->sizeY());
239 }
240 m_ui.sliderShearX->setValue(generatorConfig->shearX());
241 m_ui.sliderShearY->setValue(generatorConfig->shearY());
242 m_ui.angleSelectorRotation->setAngle(generatorConfig->rotation());
243 m_ui.checkBoxAlignToPixelGrid->setChecked(generatorConfig->alignToPixelGrid());
244 m_ui.sliderAlignToPixelGridX->setValue(generatorConfig->alignToPixelGridX());
245 m_ui.sliderAlignToPixelGridY->setValue(generatorConfig->alignToPixelGridY());
246 KisSpinBoxI18nHelper::update(m_ui.sliderAlignToPixelGridX);
247 KisSpinBoxI18nHelper::update(m_ui.sliderAlignToPixelGridY);
248
249 if (generatorConfig->sizeMode() == KisScreentoneSizeMode_PixelBased) {
250 m_ui.buttonSizeModePixelBased->setChecked(true);
253 } else {
254 m_ui.buttonSizeModeResolutionBased->setChecked(true);
257 }
258 }
260}
261
263{
268 );
269
270 config->setPattern(m_ui.comboBoxPattern->currentIndex());
271 config->setShape(comboIndexToShape(m_ui.comboBoxPattern->currentIndex(), m_ui.comboBoxShape->currentIndex()));
272 config->setInterpolation(m_ui.comboBoxInterpolation->currentIndex());
273 if (m_ui.buttonEqualizationFunctionBased->isChecked()) {
274 config->setEqualizationMode(KisScreentoneEqualizationMode_FunctionBased);
275 } else if (m_ui.buttonEqualizationTemplateBased->isChecked()) {
276 config->setEqualizationMode(KisScreentoneEqualizationMode_TemplateBased);
277 } else {
278 config->setEqualizationMode(KisScreentoneEqualizationMode_None);
279 }
280
281 config->setForegroundColor(m_ui.buttonForegroundColor->color());
282 config->setForegroundOpacity(m_ui.sliderForegroundOpacity->value());
283 config->setBackgroundColor(m_ui.buttonBackgroundColor->color());
284 config->setBackgroundOpacity(m_ui.sliderBackgroundOpacity->value());
285 config->setInvert(m_ui.checkBoxInvert->isChecked());
286 config->setBrightness(m_ui.sliderBrightness->value());
287 config->setContrast(m_ui.sliderContrast->value());
288
289 config->setSizeMode(m_ui.buttonSizeModePixelBased->isChecked() ? KisScreentoneSizeMode_PixelBased
291 config->setUnits(m_ui.comboBoxUnits->currentIndex());
292 config->setResolution(m_ui.sliderResolution->value());
293 config->setFrequencyX(m_ui.sliderFrequencyX->value());
294 config->setFrequencyY(m_ui.sliderFrequencyY->value());
295 config->setConstrainFrequency(m_ui.buttonConstrainFrequency->keepAspectRatio());
296 config->setPositionX(m_ui.sliderPositionX->value());
297 config->setPositionY(m_ui.sliderPositionY->value());
298 config->setSizeX(m_ui.sliderSizeX->value());
299 config->setSizeY(m_ui.sliderSizeY->value());
300 config->setConstrainSize(m_ui.buttonConstrainSize->keepAspectRatio());
301 config->setShearX(m_ui.sliderShearX->value());
302 config->setShearY(m_ui.sliderShearY->value());
303 config->setRotation(m_ui.angleSelectorRotation->angle());
304 config->setAlignToPixelGrid(m_ui.checkBoxAlignToPixelGrid->isChecked());
305 config->setAlignToPixelGridX(m_ui.sliderAlignToPixelGridX->value());
306 config->setAlignToPixelGridY(m_ui.sliderAlignToPixelGridY->value());
307
308 return config;
309}
310
319
321{
322 m_ui.comboBoxPattern->clear();
323 m_ui.comboBoxPattern->addItems(screentonePatternNames());
324}
325
327{
328 m_ui.comboBoxShape->clear();
329 QStringList names = screentoneShapeNames(m_ui.comboBoxPattern->currentIndex());
330 if (names.isEmpty()) {
331 m_ui.labelShape->hide();
332 m_ui.comboBoxShape->hide();
333 } else {
334 m_ui.comboBoxShape->addItems(names);
335 m_ui.labelShape->show();
336 m_ui.comboBoxShape->show();
337 }
338}
339
341{
342 if (m_ui.comboBoxInterpolation->count() > 0) {
343 m_lastSelectedInterpolationText = m_ui.comboBoxInterpolation->currentText();
344 m_ui.comboBoxInterpolation->clear();
345 }
346 QStringList names =
348 m_ui.comboBoxPattern->currentIndex(),
349 comboIndexToShape(m_ui.comboBoxPattern->currentIndex(), m_ui.comboBoxShape->currentIndex())
350 );
351 if (names.isEmpty()) {
352 m_ui.labelInterpolation->hide();
353 m_ui.comboBoxInterpolation->hide();
354 } else {
355 m_ui.comboBoxInterpolation->addItems(names);
356 int i = m_ui.comboBoxInterpolation->findText(m_lastSelectedInterpolationText);
357 m_ui.comboBoxInterpolation->setCurrentIndex(i != -1 ? i : KisScreentoneGeneratorConfiguration::defaultInterpolation());
358 m_ui.labelInterpolation->show();
359 m_ui.comboBoxInterpolation->show();
360 }
361}
362
363int KisScreentoneConfigWidget::shapeToComboIndex(int pattern, int shape) const
364{
365 if (pattern == KisScreentonePatternType_Lines) {
366 return shape;
367 }
369 return 0;
370 } else if (shape == KisScreentoneShapeType_EllipseDotsLegacy) {
371 return 1;
372 } else if (shape == KisScreentoneShapeType_EllipseDots) {
373 return 2;
374 } else if (shape == KisScreentoneShapeType_DiamondDots) {
375 return 3;
376 } else if (shape == KisScreentoneShapeType_SquareDots) {
377 return 4;
378 }
379 return -1;
380}
381
382int KisScreentoneConfigWidget::comboIndexToShape(int patternIndex, int shapeIndex) const
383{
384 if (patternIndex == KisScreentonePatternType_Lines) {
385 return shapeIndex;
386 }
387 switch (shapeIndex) {
393 }
394 return -1;
395}
396
404
411
413{
414 if (!checked) {
415 return;
416 }
417
418 m_ui.tabTransformation->setUpdatesEnabled(false);
419
420 if (m_ui.layoutTransformation->indexOf(m_ui.containerSize) != -1) {
421 m_ui.containerSize->hide();
422 m_ui.labelSize->hide();
423 m_ui.layoutTransformation->takeRow(m_ui.containerSize);
424 }
425
426 // Prevent adding the widgets if they are already in the layout
427 if (m_ui.layoutTransformation->indexOf(m_ui.containerResolution) == -1) {
428 m_ui.layoutTransformation->insertRow(1, m_ui.labelResolution, m_ui.containerResolution);
429 m_ui.layoutTransformation->insertRow(2, m_ui.labelFrequency, m_ui.containerFrequency);
430 m_ui.containerResolution->show();
431 m_ui.containerFrequency->show();
432 m_ui.labelResolution->show();
433 m_ui.labelFrequency->show();
434 }
435
437
438 m_ui.tabTransformation->setUpdatesEnabled(true);
439
441}
442
444{
445 if (!checked) {
446 return;
447 }
448
449 m_ui.tabTransformation->setUpdatesEnabled(false);
450
451 if (m_ui.layoutTransformation->indexOf(m_ui.containerResolution) != -1) {
452 m_ui.containerResolution->hide();
453 m_ui.containerFrequency->hide();
454 m_ui.labelResolution->hide();
455 m_ui.labelFrequency->hide();
456 m_ui.layoutTransformation->takeRow(m_ui.containerResolution);
457 m_ui.layoutTransformation->takeRow(m_ui.containerFrequency);
458 }
459
460 // Prevent adding the widgets if they are already in the layout
461 if (m_ui.layoutTransformation->indexOf(m_ui.containerSize) == -1) {
462 m_ui.layoutTransformation->insertRow(1, m_ui.labelSize, m_ui.containerSize);
463 m_ui.containerSize->show();
464 m_ui.labelSize->show();
465 }
466
468
469 m_ui.tabTransformation->setUpdatesEnabled(true);
470
472}
473
475{
476 const QString resSuffix =
477 index == 0
478 ? i18nc("Screentone generator resolution units - pixels/inch", " pixels/inch")
479 : i18nc("Screentone generator resolution units - pixels/cm", " pixels/cm");
480 const QString freqSuffix =
481 index == 0
482 ? i18nc("Screentone generator line units - lines/inch", " lines/inch")
483 : i18nc("Screentone generator line units - lines/cm", " lines/cm");
484 m_ui.sliderResolution->setSuffix(resSuffix);
485 m_ui.sliderFrequencyX->setSuffix(freqSuffix);
486 m_ui.sliderFrequencyY->setSuffix(freqSuffix);
487 {
488 KisSignalsBlocker blocker(m_ui.sliderResolution, m_ui.sliderFrequencyX, m_ui.sliderFrequencyY);
489 const KoUnit unitFrom = index == 1 ? KoUnit(KoUnit::Centimeter) : KoUnit(KoUnit::Inch);
490 const KoUnit unitTo = index == 1 ? KoUnit(KoUnit::Inch) : KoUnit(KoUnit::Centimeter);
491 m_ui.sliderResolution->setValue(
493 m_ui.sliderResolution->value(), unitFrom, unitTo)
494 );
495 m_ui.sliderFrequencyX->setValue(
496 KoUnit::convertFromUnitToUnit(m_ui.sliderFrequencyX->value(), unitFrom, unitTo)
497 );
498 m_ui.sliderFrequencyY->setValue(
499 KoUnit::convertFromUnitToUnit(m_ui.sliderFrequencyY->value(), unitFrom, unitTo)
500 );
501 }
503}
504
506{
507 if (m_view) {
508 if (m_ui.comboBoxUnits->currentIndex() == 1) {
509 m_ui.sliderResolution->setValue(
511 );
512 } else {
513 m_ui.sliderResolution->setValue(
515 );
516 }
517 }
518}
519
527
529{
530 if (m_ui.buttonConstrainFrequency->keepAspectRatio()) {
531 KisSignalsBlocker blocker(m_ui.sliderFrequencyY);
532 m_ui.sliderFrequencyY->setValue(value);
533 }
536}
537
539{
540 if (m_ui.buttonConstrainFrequency->keepAspectRatio()) {
541 KisSignalsBlocker blocker(m_ui.sliderFrequencyX);
542 m_ui.sliderFrequencyX->setValue(value);
543 }
546}
547
555
557{
558 if (m_ui.buttonConstrainSize->keepAspectRatio()) {
559 KisSignalsBlocker blocker(m_ui.sliderSizeY);
560 m_ui.sliderSizeY->setValue(value);
561 }
564}
565
567{
568 if (m_ui.buttonConstrainSize->keepAspectRatio()) {
569 KisSignalsBlocker blocker(m_ui.sliderSizeX);
570 m_ui.sliderSizeX->setValue(value);
571 }
574}
575
583
585{
586 Q_UNUSED(value);
587 if (m_ui.checkBoxAlignToPixelGrid->isChecked()) {
589 }
590}
591
593{
594 Q_UNUSED(value);
595 if (m_ui.checkBoxAlignToPixelGrid->isChecked()) {
597 }
598}
599
601{
602 KisSignalsBlocker blocker(m_ui.sliderFrequencyX, m_ui.sliderFrequencyY);
603 const qreal minimumFrequency = m_ui.sliderResolution->value() / maximumCellSize;
604 const qreal maximumFrequency = m_ui.sliderResolution->value() / minimumCellSize;
605 m_ui.sliderFrequencyX->setRange(minimumFrequency, maximumFrequency, 2);
606 m_ui.sliderFrequencyX->setSoftRange(qMax(minimumFrequency, 1.0), qMin(maximumFrequency, 100.0));
607 m_ui.sliderFrequencyY->setRange(minimumFrequency, maximumFrequency, 2);
608 m_ui.sliderFrequencyY->setSoftRange(qMax(minimumFrequency, 1.0), qMin(maximumFrequency, 100.0));
609}
610
612{
613 KisSignalsBlocker blocker(m_ui.sliderSizeX, m_ui.sliderSizeY, m_ui.buttonConstrainSize);
614 m_ui.sliderSizeX->setValue(m_ui.sliderResolution->value() / m_ui.sliderFrequencyX->value());
615 m_ui.sliderSizeY->setValue(m_ui.sliderResolution->value() / m_ui.sliderFrequencyY->value());
616 m_ui.buttonConstrainSize->setKeepAspectRatio(m_ui.buttonConstrainFrequency->keepAspectRatio());
617}
618
620{
621 KisSignalsBlocker blocker(m_ui.sliderFrequencyX, m_ui.sliderFrequencyY, m_ui.buttonConstrainFrequency);
622 m_ui.sliderFrequencyX->setValue(m_ui.sliderResolution->value() / m_ui.sliderSizeX->value());
623 m_ui.sliderFrequencyY->setValue(m_ui.sliderResolution->value() / m_ui.sliderSizeY->value());
624 m_ui.buttonConstrainFrequency->setKeepAspectRatio(m_ui.buttonConstrainSize->keepAspectRatio());
625}
float value(const T *src, size_t ch)
QStringList screentoneInterpolationNames(int pattern, int shape)
QStringList screentonePatternNames()
QStringList screentoneShapeNames(int pattern)
@ KisScreentoneEqualizationMode_TemplateBased
@ KisScreentoneEqualizationMode_FunctionBased
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KoCanvasResourceProvider * resourceManager()
virtual void setCanvasResourcesInterface(KoCanvasResourcesInterfaceSP canvasResourcesInterface)
void sigConfigurationItemChanged()
virtual KoCanvasResourcesInterfaceSP canvasResourcesInterface() const
void sigConfigurationUpdated()
static KisGeneratorRegistry * instance()
static KisResourcesInterfaceSP instance()
double yRes() const
KisPropertiesConfigurationSP configuration() const override
void slot_sliderResolution_valueChanged(qreal value)
void slot_buttonConstrainFrequency_keepAspectRatioChanged(bool keep)
static constexpr qreal maximumCellSize
int comboIndexToShape(int patterIndex, int shapeIndex) const
void setConfiguration(const KisPropertiesConfigurationSP) override
void slot_sliderAlignToPixelGridX_valueChanged(int value)
void slot_buttonSizeModePixelBased_toggled(bool checked)
void slot_sliderAlignToPixelGridY_valueChanged(int value)
void slot_buttonSizeModeResolutionBased_toggled(bool checked)
Ui_ScreentoneConfigWidget m_ui
void slot_sliderFrequencyX_valueChanged(qreal value)
void slot_buttonConstrainSize_keepAspectRatioChanged(bool keep)
void slot_sliderFrequencyY_valueChanged(qreal value)
KisScreentoneConfigWidget(QWidget *parent=0, const KoColorSpace *cs=KoColorSpaceRegistry::instance() ->rgb8())
void setView(KisViewManager *view) override
int shapeToComboIndex(int pattern, int shape) const
static constexpr qreal minimumCellSize
KisImageWSP image() const
Return the image this view is displaying.
KisCanvasResourceProvider * canvasResourceProvider()
KoCanvasResourcesInterfaceSP canvasResourcesInterface() const
void convertTo(const KoColorSpace *cs, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
Definition KoColor.cpp:136
void setOpacity(quint8 alpha)
Definition KoColor.cpp:333
T get(const QString &id) const
@ GroupLeft
The button is at the left of the group, so it would have rounded the left part.
@ GroupRight
The button is at the right of the group, so it would have rounded the right part.
@ GroupCenter
The button is on the center of the group, so it would have separators on both sides.
static qreal convertFromUnitToUnit(const qreal value, const KoUnit &fromUnit, const KoUnit &toUnit, qreal factor=1.0)
Definition KoUnit.cpp:295
@ Point
Postscript point, 1/72th of an Inco.
Definition KoUnit.h:76
@ Centimeter
Definition KoUnit.h:78
@ Inch
Definition KoUnit.h:77
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
void setText(QSpinBox *spinBox, const QStringView textTemplate)
void install(QSpinBox *spinBox, std::function< QString(int)> messageFn)
bool update(QSpinBox *spinBox)
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const