Warning, file /office/calligra/gemini/desktopviewproxy.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 * <one line to give the library's name and an idea of what it does.> 0003 * SPDX-FileCopyrightText: 2013 Dan Leinir Turthra Jensen <admin@leinir.dk> 0004 * 0005 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0006 * 0007 */ 0008 0009 #include "desktopviewproxy.h" 0010 0011 #include <QProcess> 0012 #include <QDir> 0013 #include <QApplication> 0014 #include <QUrl> 0015 0016 #include <klocalizedstring.h> 0017 #include <krecentfilesaction.h> 0018 #include <kactioncollection.h> 0019 #include <KConfigGroup> 0020 #include <KSharedConfig> 0021 0022 #include <KoMainWindow.h> 0023 #include <KoFilterManager.h> 0024 #include <KoFileDialog.h> 0025 #include <KoDocumentEntry.h> 0026 0027 #include "MainWindow.h" 0028 #include <DocumentManager.h> 0029 #include <RecentFileManager.h> 0030 #include <Settings.h> 0031 #include <KoDocument.h> 0032 #include <KWView.h> 0033 0034 class DesktopViewProxy::Private 0035 { 0036 public: 0037 Private(MainWindow* mainWindow, KoMainWindow* desktopView) 0038 : mainWindow(mainWindow) 0039 , desktopView(desktopView) 0040 , isImporting(false) 0041 {} 0042 MainWindow* mainWindow; 0043 KoMainWindow* desktopView; 0044 bool isImporting; 0045 }; 0046 0047 DesktopViewProxy::DesktopViewProxy(MainWindow* mainWindow, KoMainWindow* parent) 0048 : QObject(parent) 0049 , d(new Private(mainWindow, parent)) 0050 { 0051 Q_ASSERT(parent); // "There MUST be a KoMainWindow assigned, otherwise everything will blow up"); 0052 0053 // Hide this one... as it doesn't work at all well and release happens :P 0054 QAction* closeAction = d->desktopView->actionCollection()->action("file_close"); 0055 closeAction->setVisible(false); 0056 0057 // Concept is simple - simply steal all the actions we require to work differently, and reconnect them to local functions 0058 QAction* newAction = d->desktopView->actionCollection()->action("file_new"); 0059 newAction->disconnect(d->desktopView); 0060 connect(newAction, &QAction::triggered, this, &DesktopViewProxy::fileNew); 0061 QAction* openAction = d->desktopView->actionCollection()->action("file_open"); 0062 openAction->disconnect(d->desktopView); 0063 connect(openAction, &QAction::triggered, this, &DesktopViewProxy::fileOpen); 0064 QAction* saveAction = d->desktopView->actionCollection()->action("file_save"); 0065 saveAction->disconnect(d->desktopView); 0066 connect(saveAction, &QAction::triggered, this, &DesktopViewProxy::fileSave); 0067 QAction* saveasAction = d->desktopView->actionCollection()->action("file_save_as"); 0068 saveasAction->disconnect(d->desktopView); 0069 connect(saveasAction, &QAction::triggered, this, &DesktopViewProxy::fileSaveAs); 0070 QAction* reloadAction = d->desktopView->actionCollection()->action("file_reload_file"); 0071 reloadAction->disconnect(d->desktopView); 0072 connect(reloadAction, &QAction::triggered, this, &DesktopViewProxy::reload); 0073 QAction* loadExistingAsNewAction = d->desktopView->actionCollection()->action("file_import_file"); 0074 loadExistingAsNewAction->disconnect(d->desktopView); 0075 connect(loadExistingAsNewAction, &QAction::triggered, this, &DesktopViewProxy::loadExistingAsNew); 0076 0077 // Recent files need a touch more work, as they aren't simply an action. 0078 KRecentFilesAction* recent = qobject_cast<KRecentFilesAction*>(d->desktopView->actionCollection()->action("file_open_recent")); 0079 recent->disconnect(d->desktopView); 0080 connect(recent, &KRecentFilesAction::urlSelected, this, &DesktopViewProxy::slotFileOpenRecent); 0081 recent->clear(); 0082 recent->loadEntries(KSharedConfig::openConfig()->group("RecentFiles")); 0083 0084 connect(d->desktopView, &KoMainWindow::documentSaved, this, &DesktopViewProxy::documentSaved); 0085 } 0086 0087 DesktopViewProxy::~DesktopViewProxy() 0088 { 0089 delete d; 0090 } 0091 0092 void DesktopViewProxy::fileNew() 0093 { 0094 QProcess::startDetached(qApp->applicationFilePath(), QStringList(), QDir::currentPath()); 0095 } 0096 0097 void DesktopViewProxy::fileOpen() 0098 { 0099 QStringList mimeFilter; 0100 KoDocumentEntry entry = KoDocumentEntry::queryByMimeType(DocumentManager::instance()->settingsManager()->currentFileClass().toLatin1()); 0101 if (!entry.isEmpty()) { 0102 QJsonObject json = entry.metaData(); 0103 QStringList mimeTypes = json.value("X-KDE-ExtraNativeMimeTypes").toVariant().toStringList(); 0104 mimeFilter << KoFilterManager::mimeFilter(DocumentManager::instance()->settingsManager()->currentFileClass().toLatin1(), 0105 KoFilterManager::Import, 0106 mimeTypes); 0107 } 0108 0109 KoFileDialog dialog(d->desktopView, KoFileDialog::OpenFile, "OpenDocument"); 0110 dialog.setCaption(i18n("Open Document")); 0111 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); 0112 dialog.setMimeTypeFilters(mimeFilter); 0113 QString filename = dialog.filename(); 0114 if (filename.isEmpty()) return; 0115 0116 DocumentManager::instance()->recentFileManager()->addRecent(filename); 0117 0118 QProcess::startDetached(qApp->applicationFilePath(), QStringList() << filename, QDir::currentPath()); 0119 } 0120 0121 void DesktopViewProxy::fileSave() 0122 { 0123 if(DocumentManager::instance()->isTemporaryFile()) { 0124 if(d->desktopView->saveDocument(true)) { 0125 if (KoDocument* document = DocumentManager::instance()->document()) { 0126 DocumentManager::instance()->recentFileManager()->addRecent(document->url().toLocalFile()); 0127 DocumentManager::instance()->settingsManager()->setCurrentFile(document->url().toLocalFile()); 0128 DocumentManager::instance()->setTemporaryFile(false); 0129 emit documentSaved(); 0130 } 0131 } 0132 } else { 0133 DocumentManager::instance()->save(); 0134 emit documentSaved(); 0135 } 0136 } 0137 0138 bool DesktopViewProxy::fileSaveAs() 0139 { 0140 KoDocument* document = DocumentManager::instance()->document(); 0141 if (!document) 0142 return false; 0143 0144 if(d->desktopView->saveDocument(true)) { 0145 DocumentManager::instance()->recentFileManager()->addRecent(document->url().toLocalFile()); 0146 DocumentManager::instance()->settingsManager()->setCurrentFile(document->url().toLocalFile()); 0147 DocumentManager::instance()->setTemporaryFile(false); 0148 emit documentSaved(); 0149 return true; 0150 } 0151 0152 DocumentManager::instance()->settingsManager()->setCurrentFile(document->url().toLocalFile()); 0153 return false; 0154 } 0155 0156 void DesktopViewProxy::reload() 0157 { 0158 DocumentManager::instance()->reload(); 0159 } 0160 0161 void DesktopViewProxy::loadExistingAsNew() 0162 { 0163 d->isImporting = true; 0164 fileOpen(); 0165 d->isImporting = false; 0166 } 0167 0168 void DesktopViewProxy::slotFileOpenRecent(const QUrl& url) 0169 { 0170 QProcess::startDetached(qApp->applicationFilePath(), QStringList() << url.toLocalFile(), QDir::currentPath()); 0171 }