File indexing completed on 2025-03-09 05:20:57
0001 /* 0002 This file is part of the Kasten Framework, made within the KDE community. 0003 0004 SPDX-FileCopyrightText: 2011 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 "singledocumentstrategy_p.hpp" 0010 0011 // lib 0012 #include "createdialog.hpp" 0013 // Kasten gui 0014 #include <abstractmodeldatageneratorconfigeditor.hpp> 0015 #include <modelcodecviewmanager.hpp> 0016 #include <viewmanager.hpp> 0017 // Kasten core 0018 #include <Kasten/ModelDataGenerateThread> 0019 #include <Kasten/DocumentSyncManager> 0020 #include <Kasten/DocumentCreateManager> 0021 #include <Kasten/AbstractModelDataGenerator> 0022 #include <Kasten/AbstractModel> 0023 // KF 0024 #include <KProcess> 0025 // Qt 0026 #include <QMimeData> 0027 #include <QClipboard> 0028 #include <QUrl> 0029 #include <QApplication> 0030 0031 namespace Kasten { 0032 0033 void SingleDocumentStrategyPrivate::init() 0034 { 0035 Q_Q(SingleDocumentStrategy); 0036 // setup 0037 QObject::connect(mDocumentManager, &DocumentManager::added, 0038 mViewManager, &ViewManager::createViewsFor); 0039 QObject::connect(mDocumentManager, &DocumentManager::closing, 0040 mViewManager, &ViewManager::removeViewsFor); 0041 QObject::connect(mDocumentManager, &DocumentManager::added, 0042 q, &SingleDocumentStrategy::added); 0043 QObject::connect(mDocumentManager, &DocumentManager::closing, 0044 q, &SingleDocumentStrategy::closing); 0045 QObject::connect(mDocumentManager->syncManager(), &DocumentSyncManager::urlUsed, 0046 q, &SingleDocumentStrategy::urlUsed); 0047 } 0048 0049 void SingleDocumentStrategyPrivate::createNew() 0050 { 0051 if (mDocumentManager->isEmpty()) { 0052 mDocumentManager->createManager()->createNew(); 0053 } else { 0054 const QString executable = QCoreApplication::applicationFilePath(); 0055 // TODO: get parameters from common place with KCmdLineOptions 0056 // TODO: forward also interesting parameters passed to this program 0057 const QStringList parameters { QStringLiteral("-c") }; 0058 KProcess::startDetached(executable, parameters); 0059 } 0060 } 0061 0062 void SingleDocumentStrategyPrivate::createNewFromClipboard() 0063 { 0064 if (mDocumentManager->isEmpty()) { 0065 const QMimeData* mimeData = 0066 QApplication::clipboard()->mimeData(QClipboard::Clipboard); 0067 0068 mDocumentManager->createManager()->createNewFromData(mimeData, true); 0069 } else { 0070 const QString executable = QCoreApplication::applicationFilePath(); 0071 // TODO: get parameters from common place with KCmdLineOptions 0072 // TODO: forward also interesting parameters passed to this program 0073 const QStringList parameters { 0074 QStringLiteral("-c"), 0075 QStringLiteral("-g"), 0076 QStringLiteral("FromClipboard"), 0077 }; 0078 KProcess::startDetached(executable, parameters); 0079 } 0080 } 0081 0082 void SingleDocumentStrategyPrivate::createNewWithGenerator(AbstractModelDataGenerator* generator) 0083 { 0084 Q_Q(SingleDocumentStrategy); 0085 0086 // TODO: show dialog in this process, meanwhile start other process, but hidden, 0087 // on result of dialog pass on the parameters 0088 if (!mDocumentManager->isEmpty()) { 0089 const QString executable = QCoreApplication::applicationFilePath(); 0090 // TODO: get parameters from common place with KCmdLineOptions 0091 // TODO: forward also interesting parameters passed to this program 0092 // TODO: add id to AbstractModelDataGenerator, to use instead of className 0093 const QStringList parameters { 0094 QStringLiteral("-c"), 0095 QStringLiteral("-g"), 0096 QLatin1String(generator->metaObject()->className()), 0097 }; 0098 KProcess::startDetached(executable, parameters); 0099 return; 0100 } 0101 0102 AbstractModelDataGeneratorConfigEditor* configEditor = 0103 mViewManager->codecViewManager()->createConfigEditor(generator); 0104 0105 if (configEditor) { 0106 // TODO: make dialog abstract for different UIs 0107 auto* dialog = new CreateDialog(configEditor, generator, QApplication::activeWindow()); 0108 // dialog->setData( mModel, selection ); TODO 0109 QObject::connect(dialog, &CreateDialog::createAccepted, q, [this](AbstractModelDataGenerator* generator) { 0110 triggerGeneration(generator); 0111 }); 0112 dialog->open(); 0113 return; 0114 } 0115 0116 triggerGeneration(generator); 0117 } 0118 0119 void SingleDocumentStrategyPrivate::triggerGeneration(AbstractModelDataGenerator* generator) 0120 { 0121 Q_Q(SingleDocumentStrategy); 0122 0123 QApplication::setOverrideCursor(Qt::WaitCursor); 0124 0125 auto* generateThread = new ModelDataGenerateThread(q, generator); 0126 generateThread->start(); 0127 while (!generateThread->wait(100)) { 0128 QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers); 0129 } 0130 0131 QMimeData* mimeData = generateThread->data(); 0132 0133 delete generateThread; 0134 0135 const bool setModified = (generator->flags() & AbstractModelDataGenerator::DynamicGeneration); 0136 mDocumentManager->createManager()->createNewFromData(mimeData, setModified); 0137 0138 QApplication::restoreOverrideCursor(); 0139 } 0140 0141 void SingleDocumentStrategyPrivate::load(const QUrl& url) 0142 { 0143 if (mDocumentManager->isEmpty()) { 0144 mDocumentManager->syncManager()->load(url); 0145 } else { 0146 const QString executable = QCoreApplication::applicationFilePath(); 0147 // TODO: get parameters from common place with KCmdLineOptions 0148 // TODO: forward also interesting parameters passed to this program 0149 const QStringList parameters { url.url() }; 0150 KProcess::startDetached(executable, parameters); 0151 } 0152 } 0153 0154 }