1 /* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2010-02-26
7 * Description : White Balance settings view.
8 *
9 * Copyright (C) 2010-2021 by Gilles Caulier <caulier dot gilles at gmail dot com>
10 *
11 * This program is free software; you can redistribute it
12 * and/or modify it under the terms of the GNU General
13 * Public License as published by the Free Software Foundation;
14 * either version 2, or (at your option)
15 * any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * ============================================================ */
23
24 #include "wbsettings.h"
25
26 // Qt includes
27
28 #include <QString>
29 #include <QButtonGroup>
30 #include <QFile>
31 #include <QFrame>
32 #include <QGridLayout>
33 #include <QGroupBox>
34 #include <QHBoxLayout>
35 #include <QLabel>
36 #include <QRegExp>
37 #include <QTextStream>
38 #include <QToolButton>
39 #include <QVBoxLayout>
40 #include <QStandardPaths>
41 #include <QApplication>
42 #include <QStyle>
43 #include <QUrl>
44 #include <QMessageBox>
45
46 // KDE includes
47
48 #include <kconfiggroup.h>
49 #include <klocalizedstring.h>
50
51 // Local includes
52
53 #include "dlayoutbox.h"
54 #include "dexpanderbox.h"
55 #include "dfiledialog.h"
56 #include "dnuminput.h"
57 #include "digikam_debug.h"
58 #include "dcombobox.h"
59
60 namespace Digikam
61 {
62
63 class Q_DECL_HIDDEN WBSettings::Private
64 {
65
66 public:
67
68 enum TemperaturePreset
69 {
70 None = -1,
71 Candle = 1850,
72 Lamp40W = 2680,
73 Lamp100W = 2800,
74 Lamp200W = 3000,
75 Sunrise = 3200,
76 StudioLamp = 3400,
77 MoonLight = 4100,
78 Neutral = 4750,
79 DaylightD50 = 5000,
80 Flash = 5500,
81 Sun = 5770,
82 XenonLamp = 6420,
83 DaylightD65 = 6500
84 };
85
86 public:
87
Private()88 explicit Private()
89 : DefaultTemperature (DaylightD65),
90 pickTemperature (nullptr),
91 autoAdjustExposure (nullptr),
92 adjTemperatureLabel (nullptr),
93 temperaturePresetLabel (nullptr),
94 darkLabel (nullptr),
95 blackLabel (nullptr),
96 mainExposureLabel (nullptr),
97 fineExposureLabel (nullptr),
98 gammaLabel (nullptr),
99 saturationLabel (nullptr),
100 greenLabel (nullptr),
101 exposureLabel (nullptr),
102 temperatureLabel (nullptr),
103 temperaturePresetCB (nullptr),
104 temperatureInput (nullptr),
105 darkInput (nullptr),
106 blackInput (nullptr),
107 mainExposureInput (nullptr),
108 fineExposureInput (nullptr),
109 gammaInput (nullptr),
110 saturationInput (nullptr),
111 greenInput (nullptr)
112 {
113 }
114
addTemperatureDescription(const QString & desc,TemperaturePreset preset) const115 QString addTemperatureDescription(const QString& desc, TemperaturePreset preset) const
116 {
117 int index = temperaturePresetCB->combo()->findData((int)preset);
118 QString itemText = temperaturePresetCB->combo()->itemText(index);
119 QString tempDesc = QString::fromLatin1("<p><b>%1</b>: %2 (%3K).</p>")
120 .arg(itemText)
121 .arg(desc)
122 .arg((int)preset);
123
124 if (preset == None)
125 {
126 tempDesc.remove(QRegExp(QLatin1String("\\(.*\\)")));
127 }
128
129 return tempDesc;
130 }
131
132 public:
133
134 static const QString configDarkInputEntry;
135 static const QString configBlackInputEntry;
136 static const QString configMainExposureEntry;
137 static const QString configFineExposureEntry;
138 static const QString configGammaInputEntry;
139 static const QString configSaturationInputEntry;
140 static const QString configGreenInputEntry;
141 static const QString configTemperatureInputEntry;
142
143 const int DefaultTemperature;
144
145 QToolButton* pickTemperature;
146 QToolButton* autoAdjustExposure;
147
148 QLabel* adjTemperatureLabel;
149 QLabel* temperaturePresetLabel;
150 QLabel* darkLabel;
151 QLabel* blackLabel;
152 QLabel* mainExposureLabel;
153 QLabel* fineExposureLabel;
154 QLabel* gammaLabel;
155 QLabel* saturationLabel;
156 QLabel* greenLabel;
157 QLabel* exposureLabel;
158 QLabel* temperatureLabel;
159
160 DComboBox* temperaturePresetCB;
161
162 DDoubleNumInput* temperatureInput;
163 DDoubleNumInput* darkInput;
164 DDoubleNumInput* blackInput;
165 DDoubleNumInput* mainExposureInput;
166 DDoubleNumInput* fineExposureInput;
167 DDoubleNumInput* gammaInput;
168 DDoubleNumInput* saturationInput;
169 DDoubleNumInput* greenInput;
170 };
171
172 const QString WBSettings::Private::configDarkInputEntry(QLatin1String("Dark"));
173 const QString WBSettings::Private::configBlackInputEntry(QLatin1String("Black"));
174 const QString WBSettings::Private::configMainExposureEntry(QLatin1String("MainExposure"));
175 const QString WBSettings::Private::configFineExposureEntry(QLatin1String("FineExposure"));
176 const QString WBSettings::Private::configGammaInputEntry(QLatin1String("Gamma"));
177 const QString WBSettings::Private::configSaturationInputEntry(QLatin1String("Saturation"));
178 const QString WBSettings::Private::configGreenInputEntry(QLatin1String("Green"));
179 const QString WBSettings::Private::configTemperatureInputEntry(QLatin1String("Temperature"));
180
181 // --------------------------------------------------------
182
WBSettings(QWidget * const parent)183 WBSettings::WBSettings(QWidget* const parent)
184 : QWidget(parent),
185 d (new Private)
186 {
187 const int spacing = QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing);
188
189 QGridLayout* const grid = new QGridLayout(parent);
190 d->temperatureLabel = new QLabel(QString::fromUtf8("<a href='https://en.wikipedia.org/wiki/Color_temperature'>%1</a> (K): ")
191 .arg(i18nc("@title: WB", "Color Temperature")));
192 d->temperatureLabel->setOpenExternalLinks(true);
193
194 d->adjTemperatureLabel = new QLabel(i18nc("@label: WB settings", "Adjustment:"));
195 d->temperatureInput = new DDoubleNumInput;
196 d->temperatureInput->setDecimals(1);
197 d->temperatureInput->setRange(1750.0, 12000.0, 10.0);
198 d->temperatureInput->setDefaultValue((double)d->DefaultTemperature);
199 d->temperatureInput->setWhatsThis(i18nc("@info: WB settings", "Set here the white balance color temperature in Kelvin."));
200
201 d->temperaturePresetLabel = new QLabel(i18nc("@label: WB settings", "Preset:"));
202 d->temperaturePresetCB = new DComboBox;
203 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "Candle"), QVariant(d->Candle));
204 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "40W Lamp"), QVariant(d->Lamp40W));
205 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "100W Lamp"), QVariant(d->Lamp100W));
206 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "200W Lamp"), QVariant(d->Lamp200W));
207 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "Sunrise"), QVariant(d->Sunrise));
208 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "Studio Lamp"), QVariant(d->StudioLamp));
209 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "Moonlight"), QVariant(d->MoonLight));
210 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "Neutral"), QVariant(d->Neutral));
211 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "Daylight D50"), QVariant(d->DaylightD50));
212 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "Photo Flash"), QVariant(d->Flash));
213 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "Sun"), QVariant(d->Sun));
214 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "Xenon Lamp"), QVariant(d->XenonLamp));
215 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "Daylight D65"), QVariant(d->DaylightD65));
216 d->temperaturePresetCB->combo()->addItem(i18nc("@item: WB temperature preset", "None"), QVariant(d->None));
217 d->temperaturePresetCB->setDefaultIndex(d->temperaturePresetCB->combo()->findData(QVariant(d->DefaultTemperature)));
218
219 QString toolTip = QString::fromLatin1("<p>%1</p>").arg(i18nc("@info: WB settings", "Select the white balance color temperature preset to use."));
220 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "candle light"), d->Candle);
221 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "40 Watt incandescent lamp"), d->Lamp40W);
222 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "100 Watt incandescent lamp"), d->Lamp100W);
223 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "200 Watt incandescent lamp"), d->Lamp200W);
224 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "sunrise or sunset light"), d->Sunrise);
225 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "tungsten lamp used in photo studio or "
226 "light at 1 hour from dusk/dawn"), d->StudioLamp);
227 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "moon light"), d->MoonLight);
228 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "neutral color temperature"), d->Neutral);
229 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "sunny daylight around noon"), d->DaylightD50);
230 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "electronic photo flash"), d->Flash);
231 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "effective sun temperature"), d->Sun);
232 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "xenon lamp or light arc"), d->XenonLamp);
233 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "overcast sky light"), d->DaylightD65);
234 toolTip += d->addTemperatureDescription(i18nc("@item: WB settings", "no preset value"), d->None);
235 d->temperaturePresetCB->setToolTip(toolTip);
236
237 d->pickTemperature = new QToolButton;
238 d->pickTemperature->setIcon(QIcon::fromTheme(QLatin1String("color-picker-grey")));
239 d->pickTemperature->setCheckable(true);
240 d->pickTemperature->setToolTip(i18nc("@info: WB settings", "Temperature tone color picker."));
241 d->pickTemperature->setWhatsThis(i18nc("@info: WB settings", "With this button, you can pick the color from the original "
242 "image used to set the white color balance temperature and "
243 "green component."));
244
245 DLineWidget* const line = new DLineWidget(Qt::Horizontal);
246
247 // -------------------------------------------------------------
248
249 d->blackLabel = new QLabel(i18nc("@label: WB settings", "Black point:"));
250 d->blackInput = new DDoubleNumInput;
251 d->blackInput->setDecimals(2);
252 d->blackInput->setRange(0.0, 0.05, 0.01);
253 d->blackInput->setWhatsThis(i18nc("@info: WB settings", "Set here the black level value."));
254 d->blackInput->setDefaultValue(0.0);
255
256 d->darkLabel = new QLabel(i18nc("@label: WB settings", "Shadows:"));
257 d->darkInput = new DDoubleNumInput;
258 d->darkInput->setDecimals(2);
259 d->darkInput->setRange(0.0, 1.0, 0.01);
260 d->darkInput->setDefaultValue(0.0);
261 d->darkInput->setWhatsThis(i18nc("@info: WB settings", "Set here the shadow noise suppression level."));
262
263 d->saturationLabel = new QLabel(i18nc("@label: WB settings", "Saturation:"));
264 d->saturationInput = new DDoubleNumInput;
265 d->saturationInput->setDecimals(2);
266 d->saturationInput->setRange(0.0, 2.0, 0.01);
267 d->saturationInput->setDefaultValue(1.0);
268 d->saturationInput->setWhatsThis(i18nc("@info: WB settings", "Set here the saturation value."));
269
270 d->gammaLabel = new QLabel(i18nc("@label: WB settings", "Gamma:"));
271 d->gammaInput = new DDoubleNumInput;
272 d->gammaInput->setDecimals(2);
273 d->gammaInput->setRange(0.1, 3.0, 0.01);
274 d->gammaInput->setDefaultValue(1.0);
275 d->gammaInput->setWhatsThis(i18nc("@info: WB settings", "Set here the gamma correction value."));
276
277 d->greenLabel = new QLabel(i18nc("@label: WB settings", "Green:"));
278 d->greenInput = new DDoubleNumInput;
279 d->greenInput->setDecimals(2);
280 d->greenInput->setRange(0.2, 2.5, 0.01);
281 d->greenInput->setDefaultValue(1.0);
282 d->greenInput->setWhatsThis(i18nc("@info: WB settings", "Set here the green component to control the magenta color "
283 "cast removal level."));
284
285 DLineWidget* const line2 = new DLineWidget(Qt::Horizontal);
286
287 // -------------------------------------------------------------
288
289 d->exposureLabel = new QLabel(QString::fromUtf8("<a href='https://en.wikipedia.org/wiki/Exposure_value'>%1</a> (E.V): ")
290 .arg(i18nc("@label: WB settings", "Exposure Compensation")));
291 d->exposureLabel->setOpenExternalLinks(true);
292
293 d->mainExposureLabel = new QLabel(i18nc("@label: WB settings", "Main:"));
294 d->autoAdjustExposure = new QToolButton;
295 d->autoAdjustExposure->setIcon(QIcon::fromTheme(QLatin1String("system-run")));
296 d->autoAdjustExposure->setToolTip(i18nc("@info: WB settings", "Auto exposure adjustments"));
297 d->autoAdjustExposure->setWhatsThis(i18nc("@info: WB settings", "With this button, you can automatically adjust Exposure "
298 "and Black Point values."));
299 d->mainExposureInput = new DDoubleNumInput;
300 d->mainExposureInput->setDecimals(2);
301 d->mainExposureInput->setRange(-6.0, 8.0, 0.1);
302 d->mainExposureInput->setDefaultValue(0.0);
303 d->mainExposureInput->setWhatsThis(i18nc("@info: WB settings", "Set here the main exposure compensation value in E.V."));
304
305 d->fineExposureLabel = new QLabel(i18nc("@label: WB settings", "Fine:"));
306 d->fineExposureInput = new DDoubleNumInput;
307 d->fineExposureInput->setDecimals(2);
308 d->fineExposureInput->setRange(-0.5, 0.5, 0.01);
309 d->fineExposureInput->setDefaultValue(0.0);
310 d->fineExposureInput->setWhatsThis(i18nc("@info: WB settings", "This value in E.V will be added to main exposure "
311 "compensation value to set fine exposure adjustment."));
312
313 // -------------------------------------------------------------
314
315 grid->addWidget(d->temperatureLabel, 0, 0, 1, 6);
316 grid->addWidget(d->adjTemperatureLabel, 1, 0, 1, 1);
317 grid->addWidget(d->pickTemperature, 1, 1, 1, 1);
318 grid->addWidget(d->temperatureInput, 1, 2, 1, 4);
319 grid->addWidget(d->temperaturePresetLabel, 2, 0, 1, 1);
320 grid->addWidget(d->temperaturePresetCB, 2, 2, 1, 4);
321 grid->addWidget(line, 3, 0, 1, 6);
322 grid->addWidget(d->blackLabel, 4, 0, 1, 1);
323 grid->addWidget(d->blackInput, 4, 1, 1, 5);
324 grid->addWidget(d->darkLabel, 5, 0, 1, 1);
325 grid->addWidget(d->darkInput, 5, 1, 1, 5);
326 grid->addWidget(d->saturationLabel, 6, 0, 1, 1);
327 grid->addWidget(d->saturationInput, 6, 1, 1, 5);
328 grid->addWidget(d->gammaLabel, 7, 0, 1, 1);
329 grid->addWidget(d->gammaInput, 7, 1, 1, 5);
330 grid->addWidget(d->greenLabel, 8, 0, 1, 1);
331 grid->addWidget(d->greenInput, 8, 1, 1, 5);
332 grid->addWidget(line2, 9, 0, 1, 6);
333 grid->addWidget(d->exposureLabel, 10, 0, 1, 6);
334 grid->addWidget(d->mainExposureLabel, 11, 0, 1, 1);
335 grid->addWidget(d->autoAdjustExposure, 11, 1, 1, 1);
336 grid->addWidget(d->mainExposureInput, 11, 2, 1, 4);
337 grid->addWidget(d->fineExposureLabel, 12, 0, 1, 2);
338 grid->addWidget(d->fineExposureInput, 12, 2, 1, 4);
339 grid->setRowStretch(13, 10);
340 grid->setContentsMargins(spacing, spacing, spacing, spacing);
341 grid->setSpacing(spacing);
342
343 // -------------------------------------------------------------
344
345 connect(d->temperaturePresetCB, SIGNAL(activated(int)),
346 this, SLOT(slotTemperaturePresetChanged(int)));
347
348 connect(d->temperatureInput, SIGNAL(valueChanged(double)),
349 this, SLOT(slotTemperatureChanged(double)));
350
351 connect(d->darkInput, SIGNAL(valueChanged(double)),
352 this, SIGNAL(signalSettingsChanged()));
353
354 connect(d->blackInput, SIGNAL(valueChanged(double)),
355 this, SIGNAL(signalSettingsChanged()));
356
357 connect(d->mainExposureInput, SIGNAL(valueChanged(double)),
358 this, SIGNAL(signalSettingsChanged()));
359
360 connect(d->fineExposureInput, SIGNAL(valueChanged(double)),
361 this, SIGNAL(signalSettingsChanged()));
362
363 connect(d->gammaInput, SIGNAL(valueChanged(double)),
364 this, SIGNAL(signalSettingsChanged()));
365
366 connect(d->saturationInput, SIGNAL(valueChanged(double)),
367 this, SIGNAL(signalSettingsChanged()));
368
369 connect(d->greenInput, SIGNAL(valueChanged(double)),
370 this, SIGNAL(signalSettingsChanged()));
371
372 connect(d->autoAdjustExposure, SIGNAL(clicked()),
373 this, SIGNAL(signalAutoAdjustExposure()));
374
375 connect(d->pickTemperature, SIGNAL(released()),
376 this, SIGNAL(signalPickerColorButtonActived()));
377 }
378
~WBSettings()379 WBSettings::~WBSettings()
380 {
381 delete d;
382 }
383
pickTemperatureIsChecked()384 bool WBSettings::pickTemperatureIsChecked()
385 {
386 return d->pickTemperature->isChecked();
387 }
388
setCheckedPickTemperature(bool b)389 void WBSettings::setCheckedPickTemperature(bool b)
390 {
391 d->pickTemperature->setChecked(b);
392 }
393
showAdvancedButtons(bool b)394 void WBSettings::showAdvancedButtons(bool b)
395 {
396 d->pickTemperature->setVisible(b);
397 d->autoAdjustExposure->setVisible(b);
398 }
399
slotTemperatureChanged(double temperature)400 void WBSettings::slotTemperatureChanged(double temperature)
401 {
402 int index = d->temperaturePresetCB->combo()->findData(QVariant((int)temperature));
403
404 if (index == -1)
405 {
406 index = d->temperaturePresetCB->combo()->findData(QVariant((int)d->None));
407 }
408
409 d->temperaturePresetCB->setCurrentIndex(index);
410
411 emit signalSettingsChanged();
412 }
413
slotTemperaturePresetChanged(int tempPreset)414 void WBSettings::slotTemperaturePresetChanged(int tempPreset)
415 {
416 bool ok = true;
417 int temperature = d->temperaturePresetCB->combo()->itemData(tempPreset).toInt(&ok);
418
419 if (!ok)
420 {
421 temperature = d->DefaultTemperature;
422 }
423
424 if (temperature != -1)
425 {
426 d->temperatureInput->setValue((double)temperature);
427 }
428
429 emit signalSettingsChanged();
430 }
431
settings() const432 WBContainer WBSettings::settings() const
433 {
434 WBContainer prm;
435
436 prm.black = d->blackInput->value();
437 prm.expositionMain = d->mainExposureInput->value();
438 prm.expositionFine = d->fineExposureInput->value();
439 prm.temperature = d->temperatureInput->value();
440 prm.green = d->greenInput->value();
441 prm.dark = d->darkInput->value();
442 prm.gamma = d->gammaInput->value();
443 prm.saturation = d->saturationInput->value();
444
445 return prm;
446 }
447
setSettings(const WBContainer & settings)448 void WBSettings::setSettings(const WBContainer& settings)
449 {
450 blockSignals(true);
451
452 d->blackInput->setValue(settings.black);
453 d->mainExposureInput->setValue(settings.expositionMain);
454 d->fineExposureInput->setValue(settings.expositionFine);
455 d->temperatureInput->setValue(settings.temperature);
456 d->greenInput->setValue(settings.green);
457 d->darkInput->setValue(settings.dark);
458 d->gammaInput->setValue(settings.gamma);
459 d->saturationInput->setValue(settings.saturation);
460 slotTemperatureChanged(d->temperatureInput->value());
461
462 blockSignals(false);
463 }
464
resetToDefault()465 void WBSettings::resetToDefault()
466 {
467 blockSignals(true);
468
469 // Neutral color temperature settings is D65.
470
471 d->blackInput->slotReset();
472 d->darkInput->slotReset();
473 d->gammaInput->slotReset();
474 d->greenInput->slotReset();
475 d->mainExposureInput->slotReset();
476 d->fineExposureInput->slotReset();
477 d->saturationInput->slotReset();
478 d->temperatureInput->slotReset();
479 d->temperaturePresetCB->slotReset();
480 slotTemperaturePresetChanged(d->temperaturePresetCB->defaultIndex());
481
482 blockSignals(false);
483 }
484
defaultSettings() const485 WBContainer WBSettings::defaultSettings() const
486 {
487 WBContainer prm;
488
489 prm.black = d->blackInput->defaultValue();
490 prm.expositionMain = d->mainExposureInput->defaultValue();
491 prm.expositionFine = d->fineExposureInput->defaultValue();
492 prm.temperature = d->temperatureInput->defaultValue();
493 prm.green = d->greenInput->defaultValue();
494 prm.dark = d->darkInput->defaultValue();
495 prm.gamma = d->gammaInput->defaultValue();
496 prm.saturation = d->saturationInput->defaultValue();
497
498 return prm;
499 }
500
readSettings(KConfigGroup & group)501 void WBSettings::readSettings(KConfigGroup& group)
502 {
503 WBContainer prm;
504 prm.black = group.readEntry(d->configBlackInputEntry, d->blackInput->defaultValue());
505 prm.temperature = group.readEntry(d->configTemperatureInputEntry, d->temperatureInput->defaultValue());
506 prm.green = group.readEntry(d->configGreenInputEntry, d->greenInput->defaultValue());
507 prm.dark = group.readEntry(d->configDarkInputEntry, d->darkInput->defaultValue());
508 prm.gamma = group.readEntry(d->configGammaInputEntry, d->gammaInput->defaultValue());
509 prm.saturation = group.readEntry(d->configSaturationInputEntry, d->saturationInput->defaultValue());
510 prm.expositionMain = group.readEntry(d->configMainExposureEntry, d->mainExposureInput->defaultValue());
511 prm.expositionFine = group.readEntry(d->configFineExposureEntry, d->fineExposureInput->defaultValue());
512
513 setSettings(prm);
514 }
515
writeSettings(KConfigGroup & group)516 void WBSettings::writeSettings(KConfigGroup& group)
517 {
518 group.writeEntry(d->configDarkInputEntry, d->darkInput->value());
519 group.writeEntry(d->configBlackInputEntry, d->blackInput->value());
520 group.writeEntry(d->configMainExposureEntry, d->mainExposureInput->value());
521 group.writeEntry(d->configFineExposureEntry, d->fineExposureInput->value());
522 group.writeEntry(d->configGammaInputEntry, d->gammaInput->value());
523 group.writeEntry(d->configSaturationInputEntry, d->saturationInput->value());
524 group.writeEntry(d->configGreenInputEntry, d->greenInput->value());
525 group.writeEntry(d->configTemperatureInputEntry, d->temperatureInput->value());
526 }
527
loadSettings()528 void WBSettings::loadSettings()
529 {
530 QUrl loadWhiteBalanceFile = DFileDialog::getOpenFileUrl(qApp->activeWindow(), i18nc("@info", "White Color Balance Settings File to Load"),
531 QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)),
532 QLatin1String("*"));
533
534 if (loadWhiteBalanceFile.isEmpty())
535 {
536 return;
537 }
538
539 QFile file(loadWhiteBalanceFile.toLocalFile());
540
541 if (file.open(QIODevice::ReadOnly))
542 {
543 QTextStream stream(&file);
544
545 if (stream.readLine() != QLatin1String("# White Color Balance Configuration File V2"))
546 {
547 QMessageBox::critical(qApp->activeWindow(), qApp->applicationName(),
548 i18nc("@info", "\"%1\" is not a White Color Balance settings text file.",
549 loadWhiteBalanceFile.fileName()));
550 file.close();
551 return;
552 }
553
554 blockSignals(true);
555 d->temperatureInput->setValue(stream.readLine().toDouble());
556 d->darkInput->setValue(stream.readLine().toDouble());
557 d->blackInput->setValue(stream.readLine().toDouble());
558 d->mainExposureInput->setValue(stream.readLine().toDouble());
559 d->fineExposureInput->setValue(stream.readLine().toDouble());
560 d->gammaInput->setValue(stream.readLine().toDouble());
561 d->saturationInput->setValue(stream.readLine().toDouble());
562 d->greenInput->setValue(stream.readLine().toDouble());
563 slotTemperatureChanged(d->temperatureInput->value());
564 blockSignals(false);
565 }
566 else
567 {
568 QMessageBox::critical(qApp->activeWindow(), qApp->applicationName(),
569 i18nc("@info", "Cannot load settings from the White Color Balance text file."));
570 }
571
572 file.close();
573 }
574
saveAsSettings()575 void WBSettings::saveAsSettings()
576 {
577 QUrl saveWhiteBalanceFile = DFileDialog::getSaveFileUrl(qApp->activeWindow(), i18nc("@info", "White Color Balance Settings File to Save"),
578 QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)),
579 QLatin1String("*"));
580
581 if (saveWhiteBalanceFile.isEmpty())
582 {
583 return;
584 }
585
586 QFile file(saveWhiteBalanceFile.toLocalFile());
587
588 if (file.open(QIODevice::WriteOnly))
589 {
590 QTextStream stream(&file);
591 stream << QLatin1String("# White Color Balance Configuration File V2\n");
592 stream << d->temperatureInput->value() << QLatin1Char('\n');
593 stream << d->darkInput->value() << QLatin1Char('\n');
594 stream << d->blackInput->value() << QLatin1Char('\n');
595 stream << d->mainExposureInput->value() << QLatin1Char('\n');
596 stream << d->fineExposureInput->value() << QLatin1Char('\n');
597 stream << d->gammaInput->value() << QLatin1Char('\n');
598 stream << d->saturationInput->value() << QLatin1Char('\n');
599 stream << d->greenInput->value() << QLatin1Char('\n');
600 }
601 else
602 {
603 QMessageBox::critical(qApp->activeWindow(), qApp->applicationName(),
604 i18nc("@info", "Cannot save settings to the White Color Balance text file."));
605 }
606
607 file.close();
608 }
609
610 } // namespace Digikam
611