File indexing completed on 2024-06-02 06:03:20
0001 /* 0002 This file is part of the Kasten Framework, made within the KDE community. 0003 0004 SPDX-FileCopyrightText: 2007-2009, 2019 Friedrich W. H. Kossebau <kossebau@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0007 */ 0008 0009 #include "modelcodecmanager_p.hpp" 0010 0011 // lib 0012 #include "modelencoderfilesystemexporter.hpp" 0013 #include "abstractmodelstreamencoder.hpp" 0014 // #include "abstractmodelstreamdecoder.hpp" 0015 #include "abstractmodeldatagenerator.hpp" 0016 #include "abstractoverwritedialog.hpp" 0017 #include "jobmanager.hpp" 0018 #include "abstractexportjob.hpp" 0019 // KF 0020 #include <KIO/StatJob> 0021 #include <KJobWidgets> 0022 #include <KLocalizedString> 0023 // Qt 0024 #include <QFileDialog> 0025 #include <QUrl> 0026 // Std 0027 #include <utility> 0028 0029 namespace Kasten { 0030 0031 ModelCodecManagerPrivate::~ModelCodecManagerPrivate() 0032 { 0033 qDeleteAll(mExporterList); 0034 qDeleteAll(mEncoderList); 0035 // qDeleteAll( mDecoderList ); 0036 qDeleteAll(mGeneratorList); 0037 } 0038 0039 QVector<AbstractModelStreamEncoder*> 0040 ModelCodecManagerPrivate::encoderList(AbstractModel* model, const AbstractModelSelection* selection) const 0041 { 0042 Q_UNUSED(selection) 0043 return model ? mEncoderList : QVector<AbstractModelStreamEncoder*>(); 0044 } 0045 0046 QVector<AbstractModelStreamDecoder*> 0047 ModelCodecManagerPrivate::decoderList() const { return mDecoderList; } 0048 0049 QVector<AbstractModelDataGenerator*> 0050 ModelCodecManagerPrivate::generatorList() const { return mGeneratorList; } 0051 0052 QVector<AbstractModelExporter*> 0053 ModelCodecManagerPrivate::exporterList(AbstractModel* model, const AbstractModelSelection* selection) const 0054 { 0055 Q_UNUSED(selection) 0056 return model ? mExporterList : QVector<AbstractModelExporter*>(); 0057 } 0058 0059 void ModelCodecManagerPrivate::setOverwriteDialog(AbstractOverwriteDialog* overwriteDialog) 0060 { 0061 mOverwriteDialog = overwriteDialog; 0062 } 0063 0064 void ModelCodecManagerPrivate::setEncoders(const QVector<AbstractModelStreamEncoder*>& encoderList) 0065 { 0066 mEncoderList = encoderList; 0067 0068 qDeleteAll(mExporterList); 0069 mExporterList.clear(); 0070 0071 mExporterList.reserve(mEncoderList.size()); 0072 for (AbstractModelStreamEncoder* encoder : std::as_const(mEncoderList)) { 0073 mExporterList << new ModelEncoderFileSystemExporter(encoder); 0074 } 0075 } 0076 0077 void ModelCodecManagerPrivate::setDecoders(const QVector<AbstractModelStreamDecoder*>& decoderList) 0078 { 0079 mDecoderList = decoderList; 0080 } 0081 0082 void ModelCodecManagerPrivate::setGenerators(const QVector<AbstractModelDataGenerator*>& generatorList) 0083 { 0084 mGeneratorList = generatorList; 0085 } 0086 0087 void ModelCodecManagerPrivate::encodeToStream(AbstractModelStreamEncoder* encoder, 0088 AbstractModel* model, const AbstractModelSelection* selection) 0089 { 0090 Q_UNUSED(selection) 0091 Q_UNUSED(model) 0092 Q_UNUSED(encoder) 0093 // AbstractDocument* model = mFactory->create(); 0094 // mManager->addDocument( model ); 0095 } 0096 0097 void ModelCodecManagerPrivate::exportDocument(AbstractModelExporter* exporter, 0098 AbstractModel* model, const AbstractModelSelection* selection) 0099 { 0100 bool exportDone = false; 0101 0102 const QString dialogTitle = 0103 i18nc("@title:window", "Export"); 0104 do { 0105 QFileDialog exportFileDialog(/*mWidget*/ nullptr, dialogTitle); 0106 0107 exportFileDialog.setAcceptMode(QFileDialog::AcceptSave); 0108 exportFileDialog.setOption(QFileDialog::DontConfirmOverwrite); 0109 exportFileDialog.setFileMode(QFileDialog::AnyFile); 0110 const QStringList mimeTypes = QStringList { exporter->remoteMimeType() }; 0111 exportFileDialog.setMimeTypeFilters(mimeTypes); 0112 0113 exportFileDialog.setLabelText(QFileDialog::Accept, i18nc("@action:button", "&Export")); 0114 0115 exportFileDialog.exec(); 0116 0117 const QList<QUrl> exportUrls = exportFileDialog.selectedUrls(); 0118 0119 if (!exportUrls.isEmpty()) { 0120 const QUrl& exportUrl = exportUrls.at(0); 0121 0122 KIO::StatJob* statJob = KIO::stat(exportUrl); 0123 statJob->setSide(KIO::StatJob::DestinationSide); 0124 KJobWidgets::setWindow(statJob, /*mWidget*/ nullptr); 0125 0126 const bool isUrlInUse = statJob->exec(); 0127 0128 if (isUrlInUse) { 0129 // TODO: care for case that file from url is already loaded by (only?) this program 0130 // const bool otherFileLoaded = mManager->documentByUrl( exportUrl ); 0131 // TODO: replace "file" with synchronizer->storageTypeName() or such 0132 // TODO: offer "Synchronize" as alternative, if supported, see below 0133 const Answer answer = 0134 mOverwriteDialog ? mOverwriteDialog->queryOverwrite(exportUrl, dialogTitle) : Cancel; 0135 if (answer == Cancel) { 0136 break; 0137 } 0138 if (answer == PreviousQuestion) { 0139 continue; 0140 } 0141 } 0142 0143 AbstractExportJob* exportJob = exporter->startExport(model, selection, exportUrl); 0144 exportDone = JobManager::executeJob(exportJob); 0145 0146 // if( exportDone ) 0147 // Q_EMIT urlUsed( exportUrl ); 0148 } else { 0149 break; 0150 } 0151 } while (!exportDone); 0152 } 0153 0154 }