File indexing completed on 2024-06-16 08:27:25

0001 /***************************************************************************
0002  *   Copyright (C) 2003-2004 by David Saxton                               *
0003  *   david@bluehaze.org                                                    *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  ***************************************************************************/
0010 
0011 #include "outputmethoddlg.h"
0012 #include "docmanager.h"
0013 #include "filemetainfo.h"
0014 #include "microlibrary.h"
0015 #include "microselectwidget.h"
0016 #include "projectmanager.h"
0017 #include "textdocument.h"
0018 #include "filefilters.h"
0019 
0020 #include <KUrlRequester>
0021 #include <kio_version.h>
0022 
0023 #include <QCheckBox>
0024 #include <QDialogButtonBox>
0025 #include <QFile>
0026 #include <QPushButton>
0027 #include <QTemporaryFile>
0028 #include <QVBoxLayout>
0029 
0030 #include <ui_outputmethodwidget.h>
0031 #include <ktechlab_debug.h>
0032 
0033 class OutputMethodWidget : public QWidget, public Ui::OutputMethodWidget
0034 {
0035 public:
0036     OutputMethodWidget(QWidget *parent)
0037         : QWidget(parent)
0038     {
0039         setupUi(this);
0040     }
0041 };
0042 
0043 // BEGIN class OutputMethodInfo
0044 OutputMethodInfo::OutputMethodInfo()
0045 {
0046     m_method = Method::Direct;
0047     m_bAddToProject = false;
0048 }
0049 
0050 void OutputMethodInfo::initialize(OutputMethodDlg *dlg)
0051 {
0052     if (dlg->m_widget->displayDirectCheck->isChecked()) {
0053         m_method = Method::Direct;
0054         // K3TempFile f( QString(), dlg->m_outputExtension );
0055         QTemporaryFile f(QDir::tempPath() + QLatin1String("/ktechlab_XXXXXX") + dlg->m_outputExtension);
0056         f.setAutoRemove(false);
0057         if (!f.open()) {
0058             qCWarning(KTL_LOG) << "failed to open " << f.fileName() << " because " << f.errorString();
0059         }
0060         f.close();
0061         m_outputFile = QUrl::fromLocalFile(f.fileName());
0062         m_bAddToProject = false;
0063     }
0064 
0065     else {
0066         if (dlg->m_widget->loadFileCheck->isChecked())
0067             m_method = Method::SaveAndLoad;
0068 
0069         else
0070             m_method = Method::SaveAndForget;
0071 
0072         m_outputFile = dlg->m_widget->outputFileURL->url();
0073         m_bAddToProject = dlg->m_widget->addToProjectCheck->isChecked();
0074     }
0075 
0076     m_picID = dlg->m_widget->m_pMicroSelect->micro();
0077 }
0078 // END class OutputMethodInfo
0079 
0080 // BEGIN class OutputMethodDlg
0081 
0082 OutputMethodDlg::OutputMethodDlg(const QString &caption, const QUrl &inputURL, bool showPICSelect, QWidget *parent)
0083     : QDialog(parent)
0084 {
0085     setModal(true);
0086     setWindowTitle(caption);
0087 
0088     QVBoxLayout *mainLayout = new QVBoxLayout;
0089     setLayout(mainLayout);
0090 
0091     m_inputURL = inputURL;
0092     m_widget = new OutputMethodWidget(this);
0093 
0094     m_widget->addToProjectCheck->setEnabled(ProjectManager::self()->currentProject());
0095 
0096     if (!showPICSelect) {
0097         m_widget->m_pMicroSelect->hide();
0098         m_widget->adjustSize();
0099     }
0100 
0101     m_widget->outputFileURL->setMode(KFile::File | KFile::LocalOnly);
0102     m_widget->outputFileURL->setAcceptMode(QFileDialog::AcceptSave);
0103 
0104     connect(m_widget->saveFileCheck, &QRadioButton::toggled, m_widget->groupBoxSaveOptions, &QGroupBox::setEnabled);
0105 
0106     fileMetaInfo()->initializeFromMetaInfo(m_inputURL, this);
0107 
0108     mainLayout->addWidget(m_widget);
0109 
0110     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
0111     mainLayout->addWidget(buttonBox);
0112 
0113     QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
0114     okButton->setDefault(true);
0115     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0116     connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
0117     connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
0118 }
0119 
0120 OutputMethodDlg::~OutputMethodDlg()
0121 {
0122 }
0123 
0124 void OutputMethodDlg::setOutputExtension(const QString &extension)
0125 {
0126     m_outputExtension = extension;
0127 }
0128 
0129 void OutputMethodDlg::setFileFilters(const FileFilters &filters)
0130 {
0131 #if KIO_VERSION >= QT_VERSION_CHECK(5, 108, 0)
0132     m_widget->outputFileURL->setNameFilters(filters.toQtStyleStringList());
0133 #else
0134     m_widget->outputFileURL->setFilter(filters.toKDEStyleString());
0135 #endif
0136 }
0137 
0138 void OutputMethodDlg::setMethod(OutputMethodInfo::Method::Type m)
0139 {
0140     switch (m) {
0141     case OutputMethodInfo::Method::Direct:
0142         m_widget->displayDirectCheck->setChecked(true);
0143         break;
0144 
0145     case OutputMethodInfo::Method::SaveAndForget:
0146         m_widget->saveFileCheck->setChecked(true);
0147         m_widget->loadFileCheck->setChecked(false);
0148         break;
0149 
0150     case OutputMethodInfo::Method::SaveAndLoad:
0151         m_widget->saveFileCheck->setChecked(true);
0152         m_widget->loadFileCheck->setChecked(true);
0153         break;
0154     };
0155 }
0156 
0157 void OutputMethodDlg::setPicID(const QString &id)
0158 {
0159     m_widget->m_pMicroSelect->setMicro(id);
0160 }
0161 
0162 void OutputMethodDlg::setOutputFile(const QUrl &out)
0163 {
0164     m_widget->outputFileURL->setUrl(out);
0165 }
0166 
0167 void OutputMethodDlg::accept()
0168 {
0169     m_outputMethodInfo.initialize(this);
0170     fileMetaInfo()->grabMetaInfo(m_inputURL, this);
0171 
0172     QDialog::accept();
0173 }
0174 
0175 MicroSelectWidget *OutputMethodDlg::microSelect() const
0176 {
0177     return m_widget->m_pMicroSelect;
0178 }
0179 // END class OutputMethodDlg
0180 
0181 #include "moc_outputmethoddlg.cpp"