1 /**
2  * This file is a part of Luminance HDR package.
3  * ----------------------------------------------------------------------
4  * Copyright (C) 2006,2007 Giuseppe Rota
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  * ----------------------------------------------------------------------
20  *
21  * @author Giuseppe Rota <grota@users.sourceforge.net>
22  *
23  * @author Franco Comida <fcomida@users.sourceforge.net>
24  *
25  */
26 
27 #include <QtGlobal>
28 #include <QColorDialog>
29 #include <QDebug>
30 #include <QFileDialog>
31 #include <QMessageBox>
32 #include <QStyleFactory>
33 #include <QWhatsThis>
34 
35 #include <cmath>
36 #include <iostream>
37 
38 #include "Common/LuminanceOptions.h"
39 #include "Common/TranslatorManager.h"
40 #include "Common/config.h"
41 #include "Common/global.h"
42 #include "Preferences/PreferencesDialog.h"
43 
44 // UI
45 #include "Preferences/ui_PreferencesDialog.h"
46 
47 #ifdef Q_OS_WIN
48 #define ICC_PATH "C:\\WINDOWS\\system32\\spool\\drivers\\color"
49 #elif defined Q_OS_MACOS
50 #define ICC_PATH "/Library/ColorSync/Profiles/"
51 #else
52 #define ICC_PATH "/usr/share/color/icc"
53 #endif
54 
55 namespace {
pos2value(int pos,int minpos,int maxpos,double minv,double maxv)56 inline double pos2value(int pos, int minpos, int maxpos, double minv,
57                         double maxv) {
58     double x = (pos - minpos) / ((double)(maxpos - minpos));
59     return minv * exp(log(maxv / minv) * x);
60 }
61 
value2pos(double value,int minpos,int maxpos,double minv,double maxv)62 inline int value2pos(double value, int minpos, int maxpos, double minv,
63                      double maxv) {
64     double y = (log(value) - log(minv)) / (log(maxv) - log(minv));
65     return (int)((maxpos - minpos) * y) + minpos;
66 }
67 }
68 
PreferencesDialog(QWidget * p,int tab)69 PreferencesDialog::PreferencesDialog(QWidget *p, int tab)
70     : QDialog(p), m_Ui(new Ui::PreferencesDialog) {
71     m_Ui->setupUi(this);
72 
73     if (!QIcon::hasThemeIcon(QStringLiteral("color-management")))
74         m_Ui->toolButtonCMS->setIcon(QIcon(":/program-icons/color-management"));
75     if (!QIcon::hasThemeIcon(QStringLiteral("preferences-system-windows")))
76         m_Ui->toolButtonInterface->setIcon(
77             QIcon(":/program-icons/preferences-system-windows"));
78 
79     connect(m_Ui->themeComboBox, SIGNAL(currentIndexChanged(int)), this,
80             SLOT(on_themeChanged()));
81 
82 #ifdef DEMOSAICING_GPL2
83     qDebug() << "PreferencesDialog: Found demosaicing pack GPL2";
84     m_Ui->user_qual_comboBox->addItem(QStringLiteral("DCB"));
85     m_Ui->user_qual_comboBox->addItem(QStringLiteral("AHD v2"));
86     m_Ui->user_qual_comboBox->addItem(QStringLiteral("AFD"));
87     m_Ui->user_qual_comboBox->addItem(QStringLiteral("VCD"));
88     m_Ui->user_qual_comboBox->addItem(QStringLiteral("VCD & AHD"));
89     m_Ui->user_qual_comboBox->addItem(QStringLiteral("LMMSE"));
90 #endif
91 #ifdef DEMOSAICING_GPL3
92     qDebug() << "PreferencesDialog: Found AMaZE";
93     m_Ui->user_qual_comboBox->addItem(QStringLiteral("AMaZE"));
94 #endif
95 
96     fromIso639ToGuiIndex[QStringLiteral("cs")] = 0;
97     fromIso639ToGuiIndex[QStringLiteral("da")] = 1;
98     fromIso639ToGuiIndex[QStringLiteral("de")] = 2;
99     fromIso639ToGuiIndex[QStringLiteral("en")] = 3;
100     fromIso639ToGuiIndex[QStringLiteral("es")] = 4;
101     fromIso639ToGuiIndex[QStringLiteral("fr")] = 5;
102     fromIso639ToGuiIndex[QStringLiteral("id")] = 6;
103     fromIso639ToGuiIndex[QStringLiteral("it")] = 7;
104     fromIso639ToGuiIndex[QStringLiteral("hu")] = 8;
105     fromIso639ToGuiIndex[QStringLiteral("pl")] = 9;
106     fromIso639ToGuiIndex[QStringLiteral("pt_BR")] = 10;
107     fromIso639ToGuiIndex[QStringLiteral("ru")] = 11;
108     fromIso639ToGuiIndex[QStringLiteral("ro")] = 12;
109     fromIso639ToGuiIndex[QStringLiteral("fi")] = 13;
110     fromIso639ToGuiIndex[QStringLiteral("tr")] = 14;
111     fromIso639ToGuiIndex[QStringLiteral("zh")] = 15;
112 
113     fromGuiIndexToIso639[0] = QStringLiteral("cs");
114     fromGuiIndexToIso639[1] = QStringLiteral("da");
115     fromGuiIndexToIso639[2] = QStringLiteral("de");
116     fromGuiIndexToIso639[3] = QStringLiteral("en");
117     fromGuiIndexToIso639[4] = QStringLiteral("es");
118     fromGuiIndexToIso639[5] = QStringLiteral("fr");
119     fromGuiIndexToIso639[6] = QStringLiteral("id");
120     fromGuiIndexToIso639[7] = QStringLiteral("it");
121     fromGuiIndexToIso639[8] = QStringLiteral("hu");
122     fromGuiIndexToIso639[9] = QStringLiteral("pl");
123     fromGuiIndexToIso639[10] = QStringLiteral("pt_BR");
124     fromGuiIndexToIso639[11] = QStringLiteral("ru");
125     fromGuiIndexToIso639[12] = QStringLiteral("ro");
126     fromGuiIndexToIso639[13] = QStringLiteral("fi");
127     fromGuiIndexToIso639[14] = QStringLiteral("tr");
128     fromGuiIndexToIso639[15] = QStringLiteral("zh");
129 
130     // for (const QString &style : QStyleFactory::keys())
131     foreach (const QString &style, QStyleFactory::keys()) {
132 #ifdef Q_OS_MACOS
133         if (style == "Windows") {
134             continue;
135         }
136 #endif
137         qDebug() << "Available theme: " << style;
138         m_Ui->themeComboBox->addItem(style);
139     }
140 
141     m_formatHelper.initConnection(m_Ui->exportFormatCombo,
142                                   m_Ui->exportFormatToolbutton, false);
143 
144     from_options_to_gui();  // update the gui in order to show the options
145 
146     toolButtonMapper = new QSignalMapper(this);
147     connect(toolButtonMapper, SIGNAL(mapped(int)), this,
148             SLOT(toolButton_clicked(int)));
149 
150     QObject *tabEntries[] = {
151         m_Ui->toolButtonInterface, m_Ui->toolButtonQueue,
152         m_Ui->toolButtonTM,        m_Ui->toolButtonRAW,
153         m_Ui->toolButtonCMS,       m_Ui->toolButtonExtTool};
154     for (int i = 0; i < 6; i++) {
155         toolButtonMapper->setMapping(tabEntries[i], i);
156         connect(tabEntries[i], SIGNAL(clicked()), toolButtonMapper,
157                 SLOT(map()));
158     }
159 
160     toolButton_clicked(tab);
161 }
162 
~PreferencesDialog()163 PreferencesDialog::~PreferencesDialog() { delete toolButtonMapper; }
164 
changeEvent(QEvent * event)165 void PreferencesDialog::changeEvent(QEvent *event) {
166     if (event->type() == QEvent::LanguageChange) {
167         m_Ui->retranslateUi(this);
168     }
169     QWidget::changeEvent(event);
170 }
171 
on_okButton_clicked()172 void PreferencesDialog::on_okButton_clicked() {
173     bool restartNeeded = false;
174 
175     LuminanceOptions luminance_options;
176 
177     if (luminance_options.getGuiLang() !=
178         fromGuiIndexToIso639[m_Ui->languageComboBox->currentIndex()]) {
179         luminance_options.setGuiLang(
180             fromGuiIndexToIso639[m_Ui->languageComboBox->currentIndex()]);
181         TranslatorManager::setLanguage(luminance_options.getGuiLang());
182     }
183 
184     if (luminance_options.getGuiTheme() != m_Ui->themeComboBox->currentText() ||
185         luminance_options.isGuiDarkMode() != m_Ui->chkDarkMode->isChecked()) {
186         if (luminance_options.isGuiDarkMode() !=
187                 m_Ui->chkDarkMode->isChecked() &&
188             !m_Ui->chkDarkMode->isChecked()) {
189             restartNeeded = true;
190         }
191         luminance_options.setGuiTheme(m_Ui->themeComboBox->currentText());
192         luminance_options.setGuiDarkMode(m_Ui->chkDarkMode->isChecked());
193         luminance_options.applyTheme(false);
194     }
195 
196     luminance_options.setTempDir(m_Ui->lineEditTempPath->text());
197 
198     luminance_options.setPreviewWidth(m_Ui->previewsWidthSpinBox->value());
199     luminance_options.setPreviewPanelActive(
200         m_Ui->checkBoxTMOWindowsPreviewPanel->isChecked());
201 
202     if (m_Ui->chkPortableMode->isChecked() !=
203         LuminanceOptions::isCurrentPortableMode) {
204         restartNeeded = true;
205         luminance_options.setPortableMode(m_Ui->chkPortableMode->isChecked());
206     }
207 
208     // --- Batch TM
209     luminance_options.setBatchTmNumThreads(m_Ui->numThreadspinBox->value());
210 
211     // --- Other Parameters
212 
213     QStringList ais_options = m_Ui->aisParamsLineEdit->text().split(
214         QStringLiteral(" "), QString::SkipEmptyParts);
215     luminance_options.setAlignImageStackOptions(ais_options, true);
216 
217     // --- RAW parameters
218     luminance_options.setRawFourColorRGB(m_Ui->four_color_rgb_CB->isChecked());
219     luminance_options.setRawDoNotUseFujiRotate(
220         m_Ui->do_not_use_fuji_rotate_CB->isChecked());
221     QString user_qual = m_Ui->user_qual_comboBox->itemText(
222         m_Ui->user_qual_comboBox->currentIndex());
223     if (user_qual == QLatin1String("Bilinear") ||
224         user_qual == QLatin1String("VNG") ||
225         user_qual == QLatin1String("PPG") || user_qual == QLatin1String("AHD"))
226         luminance_options.setRawUserQuality(
227             m_Ui->user_qual_comboBox->currentIndex());
228     else if (user_qual == QLatin1String("DCB"))
229         luminance_options.setRawUserQuality(4);
230     else if (user_qual == QLatin1String("AHD v2"))
231         luminance_options.setRawUserQuality(5);
232     else if (user_qual == QLatin1String("AFD"))
233         luminance_options.setRawUserQuality(6);
234     else if (user_qual == QLatin1String("VCD"))
235         luminance_options.setRawUserQuality(7);
236     else if (user_qual == QLatin1String("VCD & AHD"))
237         luminance_options.setRawUserQuality(8);
238     else if (user_qual == QLatin1String("LMMSE"))
239         luminance_options.setRawUserQuality(9);
240     else if (user_qual == QLatin1String("AMaZE"))
241         luminance_options.setRawUserQuality(10);
242     luminance_options.setRawMedPasses(m_Ui->med_passes_spinBox->value());
243     luminance_options.setRawWhiteBalanceMethod(
244         m_Ui->wb_method_comboBox->currentIndex());
245     luminance_options.setRawTemperatureKelvin(m_Ui->TK_spinBox->value());
246     luminance_options.setRawGreen(m_Ui->green_doubleSpinBox->value());
247     luminance_options.setRawHighlightsMode(
248         m_Ui->highlights_comboBox->currentIndex());
249     luminance_options.setRawLevel(m_Ui->level_spinBox->value());
250     luminance_options.setRawAutoBrightness(m_Ui->auto_bright_CB->isChecked());
251     luminance_options.setRawBrightness(m_Ui->brightness_doubleSpinBox->value());
252     luminance_options.setRawUseBlack(m_Ui->use_black_CB->isChecked());
253     luminance_options.setRawUseSaturation(m_Ui->use_sat_CB->isChecked());
254     luminance_options.setRawUseNoiseReduction(m_Ui->use_noise_CB->isChecked());
255     luminance_options.setRawUseChromaAber(m_Ui->use_chroma_CB->isChecked());
256     luminance_options.setRawNoiseReductionThreshold(
257         m_Ui->threshold_spinBox->value());
258     luminance_options.setRawUserBlack(m_Ui->user_black_spinBox->value());
259     luminance_options.setRawUserSaturation(m_Ui->user_sat_spinBox->value());
260     luminance_options.setRawAber0(m_Ui->red_doubleSpinBox->value());
261     luminance_options.setRawAber2(m_Ui->blue_doubleSpinBox->value());
262 
263     // --- Color Management
264     luminance_options.setCameraProfileFileName(m_Ui->camera_lineEdit->text());
265     luminance_options.setMonitorProfileFileName(m_Ui->monitor_lineEdit->text());
266     luminance_options.setPrinterProfileFileName(m_Ui->printer_lineEdit->text());
267 
268     // ---- temporary... this rubbish must go away!
269     luminance_options.setValue(KEY_USER_QUAL_TOOLBUTTON,
270                                m_Ui->user_qual_toolButton->isEnabled());
271     luminance_options.setValue(KEY_MED_PASSES_TOOLBUTTON,
272                                m_Ui->med_passes_toolButton->isEnabled());
273     luminance_options.setValue(KEY_WB_METHOD_TOOLBUTTON,
274                                m_Ui->wb_method_toolButton->isEnabled());
275     luminance_options.setValue(KEY_TK_TOOLBUTTON,
276                                m_Ui->TK_toolButton->isEnabled());
277     luminance_options.setValue(KEY_HIGHLIGHTS_TOOLBUTTON,
278                                m_Ui->highlights_toolButton->isEnabled());
279     luminance_options.setValue(KEY_LEVEL_TOOLBUTTON,
280                                m_Ui->level_toolButton->isEnabled());
281     luminance_options.setValue(KEY_BRIGHTNESS_TOOLBUTTON,
282                                m_Ui->brightness_toolButton->isEnabled());
283     luminance_options.setValue(KEY_USER_BLACK_TOOLBUTTON,
284                                m_Ui->user_black_toolButton->isEnabled());
285     luminance_options.setValue(KEY_USER_SAT_TOOLBUTTON,
286                                m_Ui->user_sat_toolButton->isEnabled());
287     luminance_options.setValue(KEY_THRESHOLD_TOOLBUTTON,
288                                m_Ui->threshold_toolButton->isEnabled());
289     luminance_options.setValue(KEY_RED_TOOLBUTTON,
290                                m_Ui->red_toolButton->isEnabled());
291     luminance_options.setValue(KEY_BLUE_TOOLBUTTON,
292                                m_Ui->blue_toolButton->isEnabled());
293     luminance_options.setValue(KEY_GREEN_TOOLBUTTON,
294                                m_Ui->green_toolButton->isEnabled());
295 
296     luminance_options.setExportDir(m_Ui->exportDirectoryEdit->text());
297     m_formatHelper.writeSettings(KEY_FILEFORMAT_QUEUE);
298 
299     if (restartNeeded) {
300         QMessageBox::information(this, tr("Restart"),
301                                  tr("For the settings to take effect, please "
302                                     "restart the application!"));
303     }
304     accept();
305 }
306 
on_cancelButton_clicked()307 void PreferencesDialog::on_cancelButton_clicked() { reject(); }
308 
on_user_qual_comboBox_currentIndexChanged(int value)309 void PreferencesDialog::on_user_qual_comboBox_currentIndexChanged(int value) {
310     m_Ui->user_qual_toolButton->setEnabled(value != 0);
311 }
312 
on_med_passes_spinBox_valueChanged(int value)313 void PreferencesDialog::on_med_passes_spinBox_valueChanged(int value) {
314     m_Ui->med_passes_toolButton->setEnabled(value != 0);
315 }
316 
on_wb_method_comboBox_currentIndexChanged(int i)317 void PreferencesDialog::on_wb_method_comboBox_currentIndexChanged(int i) {
318     bool isManualWb = i == 3;
319     m_Ui->TK_label->setEnabled(isManualWb);
320     m_Ui->TK_horizontalSlider->setEnabled(isManualWb);
321     m_Ui->TK_spinBox->setEnabled(isManualWb);
322     m_Ui->green_label->setEnabled(isManualWb);
323     m_Ui->green_horizontalSlider->setEnabled(isManualWb);
324     m_Ui->green_doubleSpinBox->setEnabled(isManualWb);
325 
326     m_Ui->wb_method_toolButton->setEnabled(i != 1);
327 }
328 
on_TK_spinBox_valueChanged(int value)329 void PreferencesDialog::on_TK_spinBox_valueChanged(int value) {
330     m_Ui->TK_toolButton->setEnabled(value != false);
331 }
332 
on_highlights_comboBox_currentIndexChanged(int i)333 void PreferencesDialog::on_highlights_comboBox_currentIndexChanged(int i) {
334     m_Ui->highlights_toolButton->setEnabled(i != 0);
335 }
336 
on_level_spinBox_valueChanged(int value)337 void PreferencesDialog::on_level_spinBox_valueChanged(int value) {
338     m_Ui->level_toolButton->setEnabled(value != 0);
339 }
340 
on_user_black_spinBox_valueChanged(int value)341 void PreferencesDialog::on_user_black_spinBox_valueChanged(int value) {
342     m_Ui->user_black_toolButton->setEnabled(value != 0);
343 }
344 
on_user_sat_spinBox_valueChanged(int value)345 void PreferencesDialog::on_user_sat_spinBox_valueChanged(int value) {
346     m_Ui->user_sat_toolButton->setEnabled(value != 20000);
347 }
348 
on_threshold_spinBox_valueChanged(int value)349 void PreferencesDialog::on_threshold_spinBox_valueChanged(int value) {
350     m_Ui->threshold_toolButton->setEnabled(value != 100);
351 }
352 
on_use_black_CB_stateChanged(int)353 void PreferencesDialog::on_use_black_CB_stateChanged(int) {
354     bool checked = m_Ui->use_black_CB->isChecked();
355     m_Ui->user_black_horizontalSlider->setEnabled(checked);
356     m_Ui->user_black_spinBox->setEnabled(checked);
357 }
358 
on_use_sat_CB_stateChanged(int)359 void PreferencesDialog::on_use_sat_CB_stateChanged(int) {
360     bool checked = m_Ui->use_sat_CB->isChecked();
361     m_Ui->user_sat_horizontalSlider->setEnabled(checked);
362     m_Ui->user_sat_spinBox->setEnabled(checked);
363 }
364 
on_use_noise_CB_stateChanged(int)365 void PreferencesDialog::on_use_noise_CB_stateChanged(int) {
366     bool checked = m_Ui->use_noise_CB->isChecked();
367     m_Ui->threshold_label->setEnabled(checked);
368     m_Ui->threshold_horizontalSlider->setEnabled(checked);
369     m_Ui->threshold_spinBox->setEnabled(checked);
370     m_Ui->threshold_toolButton->setEnabled(checked);
371 }
372 
on_use_chroma_CB_stateChanged(int)373 void PreferencesDialog::on_use_chroma_CB_stateChanged(int) {
374     bool checked = m_Ui->use_chroma_CB->isChecked();
375     m_Ui->red_label->setEnabled(checked);
376     m_Ui->red_horizontalSlider->setEnabled(checked);
377     m_Ui->red_doubleSpinBox->setEnabled(checked);
378     m_Ui->blue_label->setEnabled(checked);
379     m_Ui->blue_horizontalSlider->setEnabled(checked);
380     m_Ui->blue_doubleSpinBox->setEnabled(checked);
381 }
382 
on_brightness_horizontalSlider_valueChanged(int value)383 void PreferencesDialog::on_brightness_horizontalSlider_valueChanged(int value) {
384     m_Ui->brightness_doubleSpinBox->setValue(
385         ((double)value) / m_Ui->brightness_doubleSpinBox->maximum());
386 }
387 
on_brightness_doubleSpinBox_valueChanged(double value)388 void PreferencesDialog::on_brightness_doubleSpinBox_valueChanged(double value) {
389     m_Ui->brightness_horizontalSlider->setValue(
390         (int)(value * m_Ui->brightness_doubleSpinBox->maximum()));
391     m_Ui->brightness_toolButton->setEnabled(fabs(value - 1.0) >= 1e-4);
392 }
393 
on_red_horizontalSlider_valueChanged(int pos)394 void PreferencesDialog::on_red_horizontalSlider_valueChanged(int pos) {
395     int minpos = m_Ui->red_horizontalSlider->minimum();
396     int maxpos = m_Ui->red_horizontalSlider->maximum();
397     double minv = m_Ui->red_doubleSpinBox->minimum();
398     double maxv = m_Ui->red_doubleSpinBox->maximum();
399 
400     m_Ui->red_doubleSpinBox->setValue(
401         pos2value(pos, minpos, maxpos, minv, maxv));
402 }
403 
on_red_doubleSpinBox_valueChanged(double value)404 void PreferencesDialog::on_red_doubleSpinBox_valueChanged(double value) {
405     int minpos = m_Ui->red_horizontalSlider->minimum();
406     int maxpos = m_Ui->red_horizontalSlider->maximum();
407     double minv = m_Ui->red_doubleSpinBox->minimum();
408     double maxv = m_Ui->red_doubleSpinBox->maximum();
409 
410     m_Ui->red_horizontalSlider->setValue(
411         value2pos(value, minpos, maxpos, minv, maxv));
412     m_Ui->red_toolButton->setEnabled(fabs(value - 1.0) >= 1e-4);
413 }
414 
on_blue_horizontalSlider_valueChanged(int pos)415 void PreferencesDialog::on_blue_horizontalSlider_valueChanged(int pos) {
416     int minpos = m_Ui->blue_horizontalSlider->minimum();
417     int maxpos = m_Ui->blue_horizontalSlider->maximum();
418     double minv = m_Ui->blue_doubleSpinBox->minimum();
419     double maxv = m_Ui->blue_doubleSpinBox->maximum();
420 
421     m_Ui->blue_doubleSpinBox->setValue(
422         pos2value(pos, minpos, maxpos, minv, maxv));
423 }
424 
on_blue_doubleSpinBox_valueChanged(double value)425 void PreferencesDialog::on_blue_doubleSpinBox_valueChanged(double value) {
426     int minpos = m_Ui->blue_horizontalSlider->minimum();
427     int maxpos = m_Ui->blue_horizontalSlider->maximum();
428     double minv = m_Ui->blue_doubleSpinBox->minimum();
429     double maxv = m_Ui->blue_doubleSpinBox->maximum();
430 
431     m_Ui->blue_horizontalSlider->setValue(
432         value2pos(value, minpos, maxpos, minv, maxv));
433     m_Ui->blue_toolButton->setEnabled(fabs(value - 1.0) >= 1e-4);
434 }
435 
on_green_horizontalSlider_valueChanged(int pos)436 void PreferencesDialog::on_green_horizontalSlider_valueChanged(int pos) {
437     int minpos = m_Ui->green_horizontalSlider->minimum();
438     int maxpos = m_Ui->green_horizontalSlider->maximum();
439     double minv = m_Ui->green_doubleSpinBox->minimum();
440     double maxv = m_Ui->green_doubleSpinBox->maximum();
441 
442     m_Ui->green_doubleSpinBox->setValue(
443         pos2value(pos, minpos, maxpos, minv, maxv));
444 }
445 
on_green_doubleSpinBox_valueChanged(double value)446 void PreferencesDialog::on_green_doubleSpinBox_valueChanged(double value) {
447     int minpos = m_Ui->green_horizontalSlider->minimum();
448     int maxpos = m_Ui->green_horizontalSlider->maximum();
449     double minv = m_Ui->green_doubleSpinBox->minimum();
450     double maxv = m_Ui->green_doubleSpinBox->maximum();
451 
452     m_Ui->blue_horizontalSlider->setValue(
453         value2pos(value, minpos, maxpos, minv, maxv));
454     m_Ui->green_toolButton->setEnabled(fabs(value - 1.0) >= 1e-4);
455 }
456 
on_user_qual_toolButton_clicked()457 void PreferencesDialog::on_user_qual_toolButton_clicked() {
458     m_Ui->user_qual_comboBox->setCurrentIndex(0);
459 }
460 
on_med_passes_toolButton_clicked()461 void PreferencesDialog::on_med_passes_toolButton_clicked() {
462     m_Ui->med_passes_horizontalSlider->setValue(0);
463     m_Ui->med_passes_spinBox->setValue(0);
464     m_Ui->med_passes_toolButton->setEnabled(false);
465 }
466 
on_wb_method_toolButton_clicked()467 void PreferencesDialog::on_wb_method_toolButton_clicked() {
468     m_Ui->wb_method_comboBox->setCurrentIndex(1);
469     m_Ui->wb_method_toolButton->setEnabled(false);
470 }
471 
on_TK_toolButton_clicked()472 void PreferencesDialog::on_TK_toolButton_clicked() {
473     m_Ui->TK_horizontalSlider->setValue(6500);
474     m_Ui->TK_spinBox->setValue(6500);
475     m_Ui->TK_toolButton->setEnabled(false);
476 }
477 
on_highlights_toolButton_clicked()478 void PreferencesDialog::on_highlights_toolButton_clicked() {
479     m_Ui->highlights_comboBox->setCurrentIndex(0);
480     m_Ui->highlights_toolButton->setEnabled(false);
481 }
482 
on_level_toolButton_clicked()483 void PreferencesDialog::on_level_toolButton_clicked() {
484     m_Ui->level_horizontalSlider->setValue(0);
485     m_Ui->level_spinBox->setValue(0);
486     m_Ui->level_toolButton->setEnabled(false);
487 }
488 
on_brightness_toolButton_clicked()489 void PreferencesDialog::on_brightness_toolButton_clicked() {
490     m_Ui->brightness_horizontalSlider->setValue(10);
491     m_Ui->brightness_doubleSpinBox->setValue(1.0);
492     m_Ui->brightness_toolButton->setEnabled(false);
493 }
494 
on_user_black_toolButton_clicked()495 void PreferencesDialog::on_user_black_toolButton_clicked() {
496     m_Ui->user_black_horizontalSlider->setValue(0);
497     m_Ui->user_black_spinBox->setValue(0);
498     m_Ui->user_black_toolButton->setEnabled(false);
499 }
500 
on_user_sat_toolButton_clicked()501 void PreferencesDialog::on_user_sat_toolButton_clicked() {
502     m_Ui->user_sat_horizontalSlider->setValue(20000);
503     m_Ui->user_sat_spinBox->setValue(20000);
504     m_Ui->user_sat_toolButton->setEnabled(false);
505 }
506 
on_threshold_toolButton_clicked()507 void PreferencesDialog::on_threshold_toolButton_clicked() {
508     m_Ui->use_noise_CB->setChecked(true);
509     m_Ui->threshold_horizontalSlider->setValue(100);
510     m_Ui->threshold_spinBox->setValue(100);
511     m_Ui->threshold_toolButton->setEnabled(false);
512 }
513 
on_red_toolButton_clicked()514 void PreferencesDialog::on_red_toolButton_clicked() {
515     int minpos = m_Ui->red_horizontalSlider->minimum();
516     int maxpos = m_Ui->red_horizontalSlider->maximum();
517     double minv = m_Ui->red_doubleSpinBox->minimum();
518     double maxv = m_Ui->red_doubleSpinBox->maximum();
519 
520     m_Ui->red_horizontalSlider->setValue(
521         value2pos(1.0, minpos, maxpos, minv, maxv));
522     m_Ui->red_doubleSpinBox->setValue(1.0);
523     m_Ui->red_toolButton->setEnabled(false);
524 }
525 
on_blue_toolButton_clicked()526 void PreferencesDialog::on_blue_toolButton_clicked() {
527     int minpos = m_Ui->blue_horizontalSlider->minimum();
528     int maxpos = m_Ui->blue_horizontalSlider->maximum();
529     double minv = m_Ui->blue_doubleSpinBox->minimum();
530     double maxv = m_Ui->blue_doubleSpinBox->maximum();
531 
532     m_Ui->blue_horizontalSlider->setValue(
533         value2pos(1.0, minpos, maxpos, minv, maxv));
534     m_Ui->blue_doubleSpinBox->setValue(1.0);
535     m_Ui->blue_toolButton->setEnabled(false);
536 }
537 
on_green_toolButton_clicked()538 void PreferencesDialog::on_green_toolButton_clicked() {
539     int minpos = m_Ui->green_horizontalSlider->minimum();
540     int maxpos = m_Ui->green_horizontalSlider->maximum();
541     double minv = m_Ui->green_doubleSpinBox->minimum();
542     double maxv = m_Ui->green_doubleSpinBox->maximum();
543 
544     m_Ui->green_horizontalSlider->setValue(
545         value2pos(1.0, minpos, maxpos, minv, maxv));
546     m_Ui->green_doubleSpinBox->setValue(1.0);
547     m_Ui->green_toolButton->setEnabled(false);
548 }
549 
toolButton_clicked(int index)550 void PreferencesDialog::toolButton_clicked(int index) {
551     QObject *tabEntries[] = {
552         m_Ui->toolButtonInterface, m_Ui->toolButtonQueue,
553         m_Ui->toolButtonTM,        m_Ui->toolButtonRAW,
554         m_Ui->toolButtonCMS,       m_Ui->toolButtonExtTool};
555     m_Ui->stackedPagesWidget->setCurrentIndex(index);
556     QToolButton *tb = dynamic_cast<QToolButton *>(tabEntries[index]);
557     tb->setFocus();
558 }
559 
from_options_to_gui()560 void PreferencesDialog::from_options_to_gui() {
561     LuminanceOptions luminance_options;
562 
563     // language: if by any chance luminance_options.gui_lang does NOT contain
564     // one
565     // of the valid 2 chars
566     // codes which are key for the fromIso639ToGuiIndex QMap, provide the
567     // default
568     // "en"
569     if (!fromIso639ToGuiIndex.contains(luminance_options.getGuiLang())) {
570         luminance_options.setGuiLang(QStringLiteral("en"));
571     }
572     m_Ui->languageComboBox->setCurrentIndex(
573         fromIso639ToGuiIndex.value(luminance_options.getGuiLang()));
574     m_Ui->themeComboBox->setCurrentText(luminance_options.getGuiTheme());
575     m_Ui->chkDarkMode->setChecked(luminance_options.isGuiDarkMode());
576 
577     // Temp directory
578     m_Ui->lineEditTempPath->setText(luminance_options.getTempDir());
579 
580     m_Ui->numThreadspinBox->setValue(luminance_options.getBatchTmNumThreads());
581 
582     m_Ui->aisParamsLineEdit->setText(
583         luminance_options.getAlignImageStackOptions().join(
584             QStringLiteral(" ")));
585 
586     m_Ui->previewsWidthSpinBox->setValue(luminance_options.getPreviewWidth());
587 
588     m_Ui->checkBoxTMOWindowsPreviewPanel->setChecked(
589         luminance_options.isPreviewPanelActive());
590 
591     m_Ui->chkPortableMode->setChecked(LuminanceOptions::isCurrentPortableMode);
592 
593     QFile file(QDir(QApplication::applicationDirPath())
594                    .filePath(QStringLiteral(".write")));
595     bool dirWritable = file.open(QIODevice::ReadWrite);
596     if (dirWritable) file.remove();
597     m_Ui->chkPortableMode->setEnabled(dirWritable);
598 
599     // RAW Processing
600     m_Ui->four_color_rgb_CB->setChecked(luminance_options.isRawFourColorRGB());
601     m_Ui->do_not_use_fuji_rotate_CB->setChecked(
602         luminance_options.isRawDoNotUseFujiRotate());
603 
604 #ifdef DEMOSAICING_GPL2
605     bool GPL2 = true;
606 #else
607     bool GPL2 = false;
608 #endif
609 #ifdef DEMOSAICING_GPL3
610     bool GPL3 = true;
611 #else
612     bool GPL3 = false;
613 #endif
614 
615     int user_quality = luminance_options.getRawUserQuality();
616     if (user_quality < 4)
617         m_Ui->user_qual_comboBox->setCurrentIndex(user_quality);
618     else if ((GPL2 && GPL3) ||
619              (GPL2 && !GPL3))  // We have both demosaicing packs or only GPL2
620         m_Ui->user_qual_comboBox->setCurrentIndex(user_quality);
621     else  // We have only GPL3
622         m_Ui->user_qual_comboBox->setCurrentIndex(4);
623 
624     m_Ui->user_qual_comboBox->setCurrentIndex(
625         luminance_options.getRawUserQuality());
626     m_Ui->med_passes_horizontalSlider->setValue(
627         luminance_options.getRawMedPasses());
628     m_Ui->med_passes_spinBox->setValue(luminance_options.getRawMedPasses());
629     m_Ui->wb_method_comboBox->setCurrentIndex(
630         luminance_options.getRawWhiteBalanceMethod());
631 
632     m_Ui->TK_horizontalSlider->setValue(
633         luminance_options.getRawTemperatureKelvin());
634     m_Ui->TK_spinBox->setValue(luminance_options.getRawTemperatureKelvin());
635     m_Ui->highlights_comboBox->setCurrentIndex(
636         luminance_options.getRawHighlightsMode());
637     m_Ui->level_horizontalSlider->setValue(luminance_options.getRawLevel());
638     m_Ui->level_spinBox->setValue(luminance_options.getRawLevel());
639     // m_Ui->false_colors_CB->setChecked(luminance_options.false_colors);
640     m_Ui->auto_bright_CB->setChecked(luminance_options.isRawAutoBrightness());
641     m_Ui->brightness_horizontalSlider->setValue(
642         (int)10.0 * luminance_options.getRawBrightness());
643     m_Ui->brightness_doubleSpinBox->setValue(
644         luminance_options.getRawBrightness());
645     m_Ui->use_black_CB->setChecked(luminance_options.isRawUseBlack());
646 
647     m_Ui->user_black_horizontalSlider->setValue(
648         luminance_options.getRawUserBlack());
649     m_Ui->user_black_spinBox->setValue(luminance_options.getRawUserBlack());
650     m_Ui->use_sat_CB->setChecked(luminance_options.isRawUseSaturation());
651 
652     m_Ui->user_sat_horizontalSlider->setValue(
653         luminance_options.getRawUserSaturation());
654     m_Ui->user_sat_spinBox->setValue(luminance_options.getRawUserSaturation());
655     m_Ui->use_noise_CB->setChecked(luminance_options.isRawUseNoiseReduction());
656 
657     m_Ui->threshold_horizontalSlider->setValue(
658         luminance_options.getRawNoiseReductionThreshold());
659     m_Ui->threshold_spinBox->setValue(
660         luminance_options.getRawNoiseReductionThreshold());
661     m_Ui->use_chroma_CB->setChecked(luminance_options.isRawUseChromaAber());
662 
663     double r_minv = m_Ui->red_doubleSpinBox->minimum();
664     double r_maxv = m_Ui->red_doubleSpinBox->maximum();
665     double r_minpos = m_Ui->red_horizontalSlider->minimum();
666     double r_maxpos = m_Ui->red_horizontalSlider->maximum();
667     double b_minv = m_Ui->blue_doubleSpinBox->minimum();
668     double b_maxv = m_Ui->blue_doubleSpinBox->maximum();
669     double b_minpos = m_Ui->blue_horizontalSlider->minimum();
670     double b_maxpos = m_Ui->blue_horizontalSlider->maximum();
671     double g_minv = m_Ui->green_doubleSpinBox->minimum();
672     double g_maxv = m_Ui->green_doubleSpinBox->maximum();
673     double g_minpos = m_Ui->green_horizontalSlider->minimum();
674     double g_maxpos = m_Ui->green_horizontalSlider->maximum();
675 
676     m_Ui->red_horizontalSlider->setValue(value2pos(
677         luminance_options.getRawAber0(), r_minpos, r_maxpos, r_minv, r_maxv));
678     m_Ui->red_doubleSpinBox->setValue(luminance_options.getRawAber0());
679     m_Ui->blue_horizontalSlider->setValue(value2pos(
680         luminance_options.getRawAber2(), b_minpos, b_maxpos, b_minv, b_maxv));
681     m_Ui->blue_doubleSpinBox->setValue(luminance_options.getRawAber2());
682     m_Ui->green_horizontalSlider->setValue(value2pos(
683         luminance_options.getRawGreen(), g_minpos, g_maxpos, g_minv, g_maxv));
684     m_Ui->green_doubleSpinBox->setValue(luminance_options.getRawGreen());
685 
686     m_Ui->user_qual_toolButton->setEnabled(
687         luminance_options.value(KEY_USER_QUAL_TOOLBUTTON).toBool());
688     m_Ui->med_passes_toolButton->setEnabled(
689         luminance_options.value(KEY_MED_PASSES_TOOLBUTTON).toBool());
690     m_Ui->wb_method_toolButton->setEnabled(
691         luminance_options.value(KEY_WB_METHOD_TOOLBUTTON).toBool());
692     m_Ui->TK_toolButton->setEnabled(
693         luminance_options.value(KEY_TK_TOOLBUTTON).toBool());
694     m_Ui->highlights_toolButton->setEnabled(
695         luminance_options.value(KEY_HIGHLIGHTS_TOOLBUTTON).toBool());
696     m_Ui->level_toolButton->setEnabled(
697         luminance_options.value(KEY_LEVEL_TOOLBUTTON).toBool());
698     m_Ui->brightness_toolButton->setEnabled(
699         luminance_options.value(KEY_BRIGHTNESS_TOOLBUTTON).toBool());
700     m_Ui->user_black_toolButton->setEnabled(
701         luminance_options.value(KEY_USER_BLACK_TOOLBUTTON).toBool());
702     m_Ui->user_sat_toolButton->setEnabled(
703         luminance_options.value(KEY_USER_SAT_TOOLBUTTON).toBool());
704     m_Ui->threshold_toolButton->setEnabled(
705         luminance_options.value(KEY_THRESHOLD_TOOLBUTTON).toBool());
706     m_Ui->red_toolButton->setEnabled(
707         luminance_options.value(KEY_RED_TOOLBUTTON).toBool());
708     m_Ui->blue_toolButton->setEnabled(
709         luminance_options.value(KEY_BLUE_TOOLBUTTON).toBool());
710     m_Ui->green_toolButton->setEnabled(
711         luminance_options.value(KEY_GREEN_TOOLBUTTON).toBool());
712 
713     m_Ui->camera_lineEdit->setText(
714         luminance_options.getCameraProfileFileName());
715     m_Ui->monitor_lineEdit->setText(
716         luminance_options.getMonitorProfileFileName());
717     m_Ui->printer_lineEdit->setText(
718         luminance_options.getPrinterProfileFileName());
719 
720     m_Ui->exportDirectoryEdit->setText(luminance_options.getExportDir());
721     m_formatHelper.loadFromSettings(KEY_FILEFORMAT_QUEUE);
722 }
723 
on_chooseCachePathButton_clicked()724 void PreferencesDialog::on_chooseCachePathButton_clicked() {
725     QString dir = QFileDialog::getExistingDirectory(
726         this, tr("Choose a directory"), QDir::currentPath(),
727         QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
728     if (!dir.isEmpty()) {
729         m_Ui->lineEditTempPath->setText(dir);
730     }
731 }
732 
enterWhatsThis()733 void PreferencesDialog::enterWhatsThis() { QWhatsThis::enterWhatsThisMode(); }
734 
on_camera_toolButton_clicked()735 void PreferencesDialog::on_camera_toolButton_clicked() {
736     openColorProfile(m_Ui->camera_lineEdit);
737 }
738 
on_monitor_toolButton_clicked()739 void PreferencesDialog::on_monitor_toolButton_clicked() {
740     openColorProfile(m_Ui->monitor_lineEdit);
741 }
742 
on_printer_toolButton_clicked()743 void PreferencesDialog::on_printer_toolButton_clicked() {
744     openColorProfile(m_Ui->printer_lineEdit);
745 }
746 
openColorProfile(QLineEdit * lineEdit)747 void PreferencesDialog::openColorProfile(QLineEdit *lineEdit) {
748     QString fileName = QFileDialog::getOpenFileName(
749         this, tr("Open ICC Profile"), ICC_PATH,
750         tr("Color profile (*.icc *.ICC *.icm *.ICM)"));
751     if (!fileName.isEmpty()) lineEdit->setText(fileName);
752 }
753 
on_exportFileButton_clicked()754 void PreferencesDialog::on_exportFileButton_clicked() {
755     QString dir = QFileDialog::getExistingDirectory(
756         this, tr("Choose a directory"), QDir::homePath(),
757         QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
758     if (!dir.isEmpty()) {
759         m_Ui->exportDirectoryEdit->setText(dir);
760     }
761 }
762 
on_themeChanged()763 void PreferencesDialog::on_themeChanged() {
764     if (m_Ui->themeComboBox->currentText() == QLatin1String("Macintosh")) {
765         m_Ui->chkDarkMode->setCheckState(Qt::Unchecked);
766         m_Ui->chkDarkMode->setDisabled(true);
767     } else {
768         m_Ui->chkDarkMode->setEnabled(true);
769     }
770 }
771