diff --git a/src/Gui/Action.cpp b/src/Gui/Action.cpp index 4665f3160e..537ab7891e 100644 --- a/src/Gui/Action.cpp +++ b/src/Gui/Action.cpp @@ -28,8 +28,8 @@ # include # include # include +# include # include -# include # include # include # include @@ -50,8 +50,8 @@ #include "PreferencePages/DlgSettingsWorkbenchesImp.h" #include "Document.h" #include "EditorView.h" -#include "FileDialog.h" #include "Macro.h" +#include "ModuleIO.h" #include "MainWindow.h" #include "PythonEditor.h" #include "WhatsThis.h" @@ -902,20 +902,13 @@ void RecentFilesAction::activateFile(int id) } QString filename = files[id]; - QFileInfo fi(filename); - if (!fi.exists() || !fi.isFile()) { - QMessageBox::critical(getMainWindow(), tr("File not found"), tr("The file '%1' cannot be opened.").arg(filename)); + if (!ModuleIO::verifyFile(filename)) { files.removeAll(filename); setFiles(files); save(); } else { - // invokes appendFile() - SelectModule::Dict dict = SelectModule::importHandler(filename); - for (SelectModule::Dict::iterator it = dict.begin(); it != dict.end(); ++it) { - Application::Instance->open(it.key().toUtf8(), it.value().toLatin1()); - break; - } + ModuleIO::openFile(filename); } } @@ -1102,8 +1095,7 @@ void RecentMacrosAction::activateFile(int id) QString filename = files[id]; QFileInfo fi(filename); - if (!fi.exists() || !fi.isFile()) { - QMessageBox::critical(getMainWindow(), tr("File not found"), tr("The file '%1' cannot be opened.").arg(filename)); + if (!ModuleIO::verifyFile(filename)) { files.removeAll(filename); setFiles(files); } 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/MainWindow.cpp b/src/Gui/MainWindow.cpp index 594ec043e7..7f450b6da1 100644 --- a/src/Gui/MainWindow.cpp +++ b/src/Gui/MainWindow.cpp @@ -91,6 +91,7 @@ #include "DownloadManager.h" #include "FileDialog.h" #include "MenuManager.h" +#include "ModuleIO.h" #include "NotificationArea.h" #include "OverlayManager.h" #include "ProgressBar.h" @@ -2411,12 +2412,7 @@ void MainWindow::loadUrls(App::Document* doc, const QList& urls) } QByteArray docName = doc ? QByteArray(doc->getName()) : qApp->translate("StdCmdNew","Unnamed").toUtf8(); - SelectModule::Dict dict = SelectModule::importHandler(files); - // 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(), docName, it.value().toLatin1()); - } + ModuleIO::importFiles(files, docName); } void MainWindow::changeEvent(QEvent *e) 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 diff --git a/src/Mod/Start/Gui/StartView.cpp b/src/Mod/Start/Gui/StartView.cpp index 9a892cfbb7..67d69414cc 100644 --- a/src/Mod/Start/Gui/StartView.cpp +++ b/src/Mod/Start/Gui/StartView.cpp @@ -48,10 +48,8 @@ #include #include #include -#include #include -#include -#include +#include #include #include #include @@ -435,25 +433,10 @@ void StartView::postStart(PostStartBehavior behavior) const void StartView::fileCardSelected(const QModelIndex& index) { - auto file = index.data(static_cast(Start::DisplayedFilesModelRoles::path)).toString(); - std::string escapedstr = Base::Tools::escapedUnicodeFromUtf8(file.toStdString().c_str()); - escapedstr = Base::Tools::escapeEncodeFilename(escapedstr); try { - QString filename = QString::fromStdString(escapedstr); - 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)); - } - else { - // 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; - } - } + auto filename = + index.data(static_cast(Start::DisplayedFilesModelRoles::path)).toString(); + Gui::ModuleIO::verifyAndOpenFile(filename); } catch (Base::PyException& e) { Base::Console().Error(e.getMessage().c_str());