File indexing completed on 2024-04-28 11:20:57
0001 /* 0002 SPDX-License-Identifier: GPL-2.0-or-later 0003 SPDX-FileCopyrightText: 2011 Martin Kuettler <martin.kuettler@gmail.com> 0004 SPDX-FileCopyrightText: 2016-2021 Alexander Semke <alexander.semke@web.de> 0005 */ 0006 0007 #include "imagesettingsdialog.h" 0008 0009 #include <QImageReader> 0010 #include <QFileDialog> 0011 #include <QWindow> 0012 #include <QUrl> 0013 0014 #include <KCompletion> 0015 #include <KConfigGroup> 0016 #include <KLocalizedString> 0017 #include <KSharedConfig> 0018 #include <KWindowConfig> 0019 #include <KUrlCompletion> 0020 0021 ImageSettingsDialog::ImageSettingsDialog(QWidget* parent) : QDialog(parent) 0022 { 0023 setWindowTitle(i18nc("@title:window", "Image Settings")); 0024 setWindowIcon(QIcon::fromTheme(QLatin1String("viewimage"))); 0025 setAttribute(Qt::WA_DeleteOnClose); 0026 0027 auto* w = new QWidget(this); 0028 m_ui.setupUi(w); 0029 0030 auto* vLayout = new QVBoxLayout(this); 0031 vLayout->setSpacing(0); 0032 vLayout->setContentsMargins(0,0,0,0); 0033 vLayout->addWidget(w); 0034 0035 m_ui.buttonBox->button(QDialogButtonBox::Ok)->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogOkButton)); 0036 m_ui.buttonBox->button(QDialogButtonBox::Apply)->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogApplyButton)); 0037 m_ui.buttonBox->button(QDialogButtonBox::Cancel)->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogCancelButton)); 0038 m_ui.openDialogButton->setIcon(QApplication::style()->standardIcon(QStyle::SP_DirOpenIcon)); 0039 0040 m_unitNames << i18n("(auto)") << i18n("px") << i18n("%"); 0041 0042 m_ui.displayWidthCombo->addItems(m_unitNames); 0043 m_ui.displayHeightCombo->addItems(m_unitNames); 0044 m_ui.printWidthCombo->addItems(m_unitNames); 0045 m_ui.printHeightCombo->addItems(m_unitNames); 0046 0047 auto* completer = new KUrlCompletion(KUrlCompletion::FileCompletion); 0048 completer->setCompletionMode(KCompletion::CompletionMan); 0049 m_ui.pathEdit->setCompletionObject(completer); 0050 m_ui.pathEdit->setAutoDeleteCompletionObject( true ); 0051 0052 m_ui.displayWidthInput->setMinimum(0); 0053 m_ui.displayHeightInput->setMinimum(0); 0054 m_ui.printWidthInput->setMinimum(0); 0055 m_ui.printHeightInput->setMinimum(0); 0056 m_ui.displayWidthInput->setSingleStep(1); 0057 m_ui.displayHeightInput->setSingleStep(1); 0058 m_ui.printWidthInput->setSingleStep(1); 0059 m_ui.printHeightInput->setSingleStep(1); 0060 0061 connect(m_ui.buttonBox, &QDialogButtonBox::accepted, this, &ImageSettingsDialog::sendChangesAndClose); 0062 connect(m_ui.buttonBox->button(QDialogButtonBox::Apply), &QPushButton::clicked, this, &ImageSettingsDialog::sendChanges); 0063 connect(m_ui.buttonBox, &QDialogButtonBox::rejected, this, &ImageSettingsDialog::close); 0064 0065 connect(m_ui.openDialogButton, &QPushButton::clicked, this, &ImageSettingsDialog::openDialog); 0066 connect(m_ui.pathEdit, &QLineEdit::textChanged, this, &ImageSettingsDialog::updatePreview); 0067 0068 connect(m_ui.displayWidthCombo, QOverload<int>::of(&KComboBox::currentIndexChanged), this, &ImageSettingsDialog::updateInputWidgets); 0069 connect(m_ui.displayHeightCombo, QOverload<int>::of(&KComboBox::currentIndexChanged), this, &ImageSettingsDialog::updateInputWidgets); 0070 connect(m_ui.printWidthCombo, QOverload<int>::of(&KComboBox::currentIndexChanged), this, &ImageSettingsDialog::updateInputWidgets); 0071 connect(m_ui.printHeightCombo, QOverload<int>::of(&KComboBox::currentIndexChanged), this, &ImageSettingsDialog::updateInputWidgets); 0072 0073 connect(m_ui.useDisplaySize, &QCheckBox::stateChanged, this, &ImageSettingsDialog::updatePrintingGroup); 0074 } 0075 0076 ImageSettingsDialog::~ImageSettingsDialog() { 0077 KConfigGroup dialogConfig = KSharedConfig::openConfig()->group("ImageSettingsDialog"); 0078 KWindowConfig::saveWindowSize(windowHandle(), dialogConfig); 0079 } 0080 0081 void ImageSettingsDialog::setData(const QString& file, const ImageSize& displaySize, const ImageSize& printSize, bool useDisplaySizeForPrinting) 0082 { 0083 m_ui.pathEdit->setText(file); 0084 if (displaySize.width >= 0) 0085 m_ui.displayWidthInput->setValue(displaySize.width); 0086 0087 if (displaySize.height >= 0) 0088 m_ui.displayHeightInput->setValue(displaySize.height); 0089 0090 if (printSize.width >= 0) 0091 m_ui.printWidthInput->setValue(printSize.width); 0092 0093 if (printSize.height >= 0) 0094 m_ui.printHeightInput->setValue(printSize.height); 0095 0096 m_ui.displayWidthCombo->setCurrentIndex(displaySize.widthUnit); 0097 m_ui.displayHeightCombo->setCurrentIndex(displaySize.heightUnit); 0098 m_ui.printWidthCombo->setCurrentIndex(printSize.widthUnit); 0099 m_ui.printHeightCombo->setCurrentIndex(printSize.heightUnit); 0100 0101 if (useDisplaySizeForPrinting) 0102 m_ui.useDisplaySize->setCheckState(Qt::Checked); 0103 else 0104 m_ui.useDisplaySize->setCheckState(Qt::Unchecked); 0105 0106 updatePreview(); 0107 updatePrintingGroup(useDisplaySizeForPrinting); 0108 //updateInputWidgets(); 0109 0110 //restore saved settings if available 0111 create(); // ensure there's a window created 0112 KConfigGroup conf(KSharedConfig::openConfig(), "ImageSettingsDialog"); 0113 if (conf.exists()) { 0114 KWindowConfig::restoreWindowSize(windowHandle(), conf); 0115 resize(windowHandle()->size()); // workaround for QTBUG-40584 0116 } else 0117 resize(QSize(0, 0).expandedTo(minimumSize())); 0118 } 0119 0120 void ImageSettingsDialog::sendChangesAndClose() 0121 { 0122 sendChanges(); 0123 close(); 0124 } 0125 0126 void ImageSettingsDialog::sendChanges() 0127 { 0128 ImageSize displaySize, printSize; 0129 displaySize.width = m_ui.displayWidthInput->value(); 0130 displaySize.height = m_ui.displayHeightInput->value(); 0131 displaySize.widthUnit = m_ui.displayWidthCombo->currentIndex(); 0132 displaySize.heightUnit = m_ui.displayHeightCombo->currentIndex(); 0133 printSize.width = m_ui.printWidthInput->value(); 0134 printSize.height = m_ui.printHeightInput->value(); 0135 printSize.widthUnit = m_ui.printWidthCombo->currentIndex(); 0136 printSize.heightUnit = m_ui.printHeightCombo->currentIndex(); 0137 0138 emit dataChanged(m_ui.pathEdit->text(), displaySize, printSize, m_ui.useDisplaySize->isChecked()); 0139 } 0140 0141 void ImageSettingsDialog::openDialog() 0142 { 0143 KConfigGroup conf(KSharedConfig::openConfig(), QLatin1String("ImageSettingsDialog")); 0144 const QString& dir = conf.readEntry(QLatin1String("LastImageDir"), QString()); 0145 0146 QString formats; 0147 for (const QByteArray& format : QImageReader::supportedImageFormats()) 0148 formats += QLatin1String("*.") + QLatin1String(format.constData()) + QLatin1Char(' '); 0149 0150 const QString& path = QFileDialog::getOpenFileName(this, 0151 i18n("Open image file"), 0152 dir, 0153 i18n("Images (%1)", formats)); 0154 if (path.isEmpty()) 0155 return; //cancel was clicked in the file-dialog 0156 0157 //save the last used directory, if changed 0158 const int pos = path.lastIndexOf(QLatin1String("/")); 0159 if (pos != -1) { 0160 const QString& newDir = path.left(pos); 0161 if (newDir != dir) 0162 conf.writeEntry(QLatin1String("LastImageDir"), newDir); 0163 } 0164 0165 m_ui.pathEdit->setText(path); 0166 updatePreview(); 0167 } 0168 0169 void ImageSettingsDialog::updatePreview() 0170 { 0171 m_ui.imagePreview->clearPreview(); 0172 if (!m_ui.pathEdit->text().isEmpty()) 0173 m_ui.imagePreview->showPreview(QUrl::fromLocalFile(m_ui.pathEdit->text())); 0174 } 0175 0176 void ImageSettingsDialog::updateInputWidgets() 0177 { 0178 if (m_ui.displayWidthCombo->currentIndex() == 0) 0179 m_ui.displayWidthInput->setEnabled(false); 0180 else 0181 m_ui.displayWidthInput->setEnabled(true); 0182 0183 if (m_ui.displayHeightCombo->currentIndex() == 0) 0184 m_ui.displayHeightInput->setEnabled(false); 0185 else 0186 m_ui.displayHeightInput->setEnabled(true); 0187 0188 if (m_ui.printWidthCombo->currentIndex() == 0 || !m_ui.printWidthCombo->isEnabled()) 0189 m_ui.printWidthInput->setEnabled(false); 0190 else 0191 m_ui.printWidthInput->setEnabled(true); 0192 0193 if (m_ui.printHeightCombo->currentIndex() == 0 || !m_ui.printHeightCombo->isEnabled()) 0194 m_ui.printHeightInput->setEnabled(false); 0195 else 0196 m_ui.printHeightInput->setEnabled(true); 0197 } 0198 0199 void ImageSettingsDialog::updatePrintingGroup(int b) 0200 { 0201 m_ui.printWidthCombo->setEnabled(!b); 0202 m_ui.printHeightCombo->setEnabled(!b); 0203 0204 updateInputWidgets(); 0205 }