setup.cc (5781B)
1 // Copyright (c) the JPEG XL Project Authors. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 #include "tools/flicker_test/setup.h" 7 8 #include <QCompleter> 9 #include <QFileDialog> 10 #include <QFileSystemModel> 11 #include <QMessageBox> 12 #include <QPushButton> 13 14 namespace jpegxl { 15 namespace tools { 16 17 FlickerTestWizard::FlickerTestWizard(QWidget* const parent) 18 : QWizard(parent), settings_("JPEG XL project", "Flickering test") { 19 ui_.setupUi(this); 20 21 connect(ui_.grayFadingTime, SIGNAL(valueChanged(int)), this, 22 SLOT(updateTotalGrayTime())); 23 connect(ui_.grayTime, SIGNAL(valueChanged(int)), this, 24 SLOT(updateTotalGrayTime())); 25 26 ui_.timingButtonBox->button(QDialogButtonBox::RestoreDefaults) 27 ->setText(tr("Restore ISO/IEC 29170-2:2015 parameters")); 28 29 setButtonText(QWizard::FinishButton, tr("Start test")); 30 31 QCompleter* const completer = new QCompleter(this); 32 QFileSystemModel* const model = new QFileSystemModel(completer); 33 model->setRootPath("/"); 34 model->setFilter(QDir::Dirs); 35 completer->setModel(model); 36 ui_.originalFolder->setCompleter(completer); 37 ui_.alteredFolder->setCompleter(completer); 38 39 const auto parameters = FlickerTestParameters::loadFrom(&settings_); 40 ui_.originalFolder->setText(parameters.originalFolder); 41 ui_.alteredFolder->setText(parameters.alteredFolder); 42 ui_.outputFile->setText(parameters.outputFile); 43 ui_.advanceTime->setValue(parameters.advanceTimeMSecs); 44 ui_.viewingTime->setValue(parameters.viewingTimeSecs); 45 ui_.blankingTime->setValue(parameters.blankingTimeMSecs); 46 ui_.grayFlickering->setChecked(parameters.gray); 47 ui_.grayFadingTime->setValue(parameters.grayFadingTimeMSecs); 48 ui_.grayTime->setValue(parameters.grayTimeMSecs); 49 ui_.intensityTarget->setValue(parameters.intensityTarget); 50 ui_.spacing->setValue(parameters.spacing); 51 52 QImage white(256, 256, QImage::Format_RGB32); 53 white.fill(Qt::white); 54 ui_.spacingDemo->setOriginalImage(white); 55 ui_.spacingDemo->setAlteredImage(white); 56 57 connect(this, &QDialog::accepted, 58 [&] { this->parameters().saveTo(&settings_); }); 59 } 60 61 FlickerTestParameters FlickerTestWizard::parameters() const { 62 FlickerTestParameters result; 63 result.originalFolder = ui_.originalFolder->text(); 64 result.alteredFolder = ui_.alteredFolder->text(); 65 result.outputFile = ui_.outputFile->text(); 66 result.advanceTimeMSecs = ui_.advanceTime->value(); 67 result.viewingTimeSecs = ui_.viewingTime->value(); 68 result.blankingTimeMSecs = ui_.blankingTime->value(); 69 result.gray = ui_.grayFlickering->isChecked(); 70 result.grayFadingTimeMSecs = ui_.grayFadingTime->value(); 71 result.grayTimeMSecs = ui_.grayTime->value(); 72 result.intensityTarget = ui_.intensityTarget->value(); 73 result.spacing = ui_.spacing->value(); 74 return result; 75 } 76 77 void FlickerTestWizard::on_originalFolderBrowseButton_clicked() { 78 const QString path = QFileDialog::getExistingDirectory( 79 this, tr("Folder with original images"), ui_.originalFolder->text()); 80 if (!path.isEmpty()) { 81 ui_.originalFolder->setText(path); 82 } 83 } 84 85 void FlickerTestWizard::on_alteredFolderBrowseButton_clicked() { 86 const QString path = QFileDialog::getExistingDirectory( 87 this, tr("Folder with altered images"), ui_.alteredFolder->text()); 88 if (!path.isEmpty()) { 89 ui_.alteredFolder->setText(path); 90 } 91 } 92 93 void FlickerTestWizard::on_outputFileBrowseButton_clicked() { 94 // The overwrite check is disabled here because it is carried out in 95 // `validateCurrentPage` (called when the user clicks the "Next" button) so 96 // that it also applies to automatically-reloaded settings. 97 const QString path = QFileDialog::getSaveFileName( 98 this, tr("CSV file in which to save the results"), ui_.outputFile->text(), 99 tr("CSV files (*.csv)"), /*selectedFilter=*/nullptr, 100 QFileDialog::DontConfirmOverwrite); 101 if (!path.isEmpty()) { 102 ui_.outputFile->setText(path); 103 } 104 } 105 106 void FlickerTestWizard::on_timingButtonBox_clicked( 107 QAbstractButton* const button) { 108 if (ui_.timingButtonBox->standardButton(button) == 109 QDialogButtonBox::RestoreDefaults) { 110 ui_.advanceTime->setValue(100); 111 ui_.viewingTime->setValue(4); 112 ui_.blankingTime->setValue(250); 113 ui_.grayFlickering->setChecked(false); 114 } 115 } 116 117 void FlickerTestWizard::updateTotalGrayTime() { 118 ui_.totalGrayTimeLabel->setText( 119 tr("Total gray time: %L1 ms") 120 .arg(2 * ui_.grayFadingTime->value() + ui_.grayTime->value())); 121 } 122 123 bool FlickerTestWizard::validateCurrentPage() { 124 if (currentPage() == ui_.pathsPage && QFile::exists(ui_.outputFile->text())) { 125 QMessageBox messageBox(this); 126 messageBox.setIcon(QMessageBox::Warning); 127 messageBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); 128 messageBox.setWindowTitle(tr("Output file already exists")); 129 messageBox.setText(tr("The selected output file \"%1\" already exists.") 130 .arg(ui_.outputFile->text())); 131 messageBox.setInformativeText(tr("Do you wish to overwrite it?")); 132 if (messageBox.exec() == QMessageBox::Cancel) { 133 return false; 134 } 135 } else if (currentPage() == ui_.timesPage) { 136 if (ui_.grayFlickering->isChecked() && 137 2 * ui_.grayFadingTime->value() + ui_.grayTime->value() > 138 ui_.advanceTime->value()) { 139 QMessageBox messageBox(this); 140 messageBox.setIcon(QMessageBox::Warning); 141 messageBox.setStandardButtons(QMessageBox::Ok); 142 messageBox.setWindowTitle(tr("Incompatible times selected")); 143 messageBox.setText( 144 tr("The total gray time is greater than the advance time.")); 145 messageBox.exec(); 146 return false; 147 } 148 } 149 return QWizard::validateCurrentPage(); 150 } 151 152 } // namespace tools 153 } // namespace jpegxl