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