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