From e6a2af100ae25259d3c049d37570f37f2ef4d980 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 15 Oct 2024 14:04:46 +0200 Subject: [PATCH] Core: Add convenience class ModuleIO to open files --- src/Gui/CMakeLists.txt | 2 ++ src/Gui/ModuleIO.cpp | 79 ++++++++++++++++++++++++++++++++++++++++++ src/Gui/ModuleIO.h | 72 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 src/Gui/ModuleIO.cpp create mode 100644 src/Gui/ModuleIO.h diff --git a/src/Gui/CMakeLists.txt b/src/Gui/CMakeLists.txt index 8c7a2ffb36..17539bf28f 100644 --- a/src/Gui/CMakeLists.txt +++ b/src/Gui/CMakeLists.txt @@ -1231,6 +1231,7 @@ SET(FreeCADGui_CPP_SRCS GuiConsole.cpp Macro.cpp MergeDocuments.cpp + ModuleIO.cpp Namespace.h resource.cpp Control.cpp @@ -1266,6 +1267,7 @@ SET(FreeCADGui_SRCS Macro.h MergeDocuments.h MetaTypes.h + ModuleIO.h Notifications.h PreCompiled.cpp PreCompiled.h diff --git a/src/Gui/ModuleIO.cpp b/src/Gui/ModuleIO.cpp new file mode 100644 index 0000000000..b404e1944a --- /dev/null +++ b/src/Gui/ModuleIO.cpp @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Werner Mayer * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +#include "PreCompiled.h" +#ifndef _PreComp_ +#include +#include +#endif + + +#include "ModuleIO.h" +#include "Application.h" +#include "FileDialog.h" +#include "MainWindow.h" + + +using namespace Gui; + +/* TRANSLATOR Gui::ModuleIO */ + +bool ModuleIO::verifyFile(const QString& filename) +{ + QFileInfo fi(filename); + if (!fi.exists() || !fi.isFile()) { + QMessageBox::critical(Gui::getMainWindow(), + tr("File not found"), + tr("The file '%1' cannot be opened.").arg(filename)); + return false; + } + + return true; +} + +void ModuleIO::openFile(const QString& filename) +{ + // invokes appendFile() + Gui::SelectModule::Dict dict = Gui::SelectModule::importHandler(filename); + for (Gui::SelectModule::Dict::iterator it = dict.begin(); it != dict.end(); ++it) { + Gui::Application::Instance->open(it.key().toUtf8(), it.value().toLatin1()); + break; + } +} + +void ModuleIO::verifyAndOpenFile(const QString& filename) +{ + if (verifyFile(filename)) { + openFile(filename); + } +} + +void ModuleIO::importFiles(const QStringList& filenames, const char* document) +{ + SelectModule::Dict dict = SelectModule::importHandler(filenames); + // load the files with the associated modules + for (SelectModule::Dict::iterator it = dict.begin(); it != dict.end(); ++it) { + // if the passed document name doesn't exist the module should create it, if needed + Application::Instance->importFrom(it.key().toUtf8(), document, it.value().toLatin1()); + } +} diff --git a/src/Gui/ModuleIO.h b/src/Gui/ModuleIO.h new file mode 100644 index 0000000000..ae1b99e675 --- /dev/null +++ b/src/Gui/ModuleIO.h @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Werner Mayer * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +#ifndef GUI_MODULE_IO_H +#define GUI_MODULE_IO_H + +#include +#include + +namespace Gui { + +class GuiExport ModuleIO +{ + Q_DECLARE_TR_FUNCTIONS(Gui::ModuleIO) + +public: + /*! + * \brief verifyFile + * Verifies the existence of the file. If it doesn't exist an error dialog + * pops up and false is returned, otherwise true is returned. + * \param filename + * \return + */ + static bool verifyFile(const QString& filename); + /*! + * \brief openFile + * Opens the file. + * The handling module is supposed to create a new document. + * \param filename + */ + static void openFile(const QString& filename); + /*! + * \brief verifyAndOpenFile + * Verifies the existence of the file and opens it. + * The handling module is supposed to create a new document. + * \param filename + */ + static void verifyAndOpenFile(const QString& filename); + /*! + * \brief importFile + * Imports the files into the given document. + * The handling module is supposed to create a new document if the passed + * document doesn't exist. + * \param filename + * \param document + */ + static void importFiles(const QStringList& filenames, const char* document); +}; + +} + +#endif // GUI_MODULE_IO_H