From a4b2bb905f5f88b6ca442499bd5a3c59e348ad1b Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Sun, 11 Oct 2015 12:06:14 +0300 Subject: [PATCH] Fixed crash on Windows. --HG-- branch : develop --- src/app/tape/main.cpp | 7 +- src/app/tape/mapplication.cpp | 38 ++- src/app/tape/mapplication.h | 1 + src/app/tape/tmainwindow.cpp | 28 +- src/app/tape/tmainwindow.h | 2 +- src/app/valentina/core/vapplication.cpp | 14 +- .../valentina/dialogs/dialogsavelayout.cpp | 19 +- src/app/valentina/main.cpp | 49 +--- src/app/valentina/mainwindow.cpp | 246 ++++++++++-------- src/app/valentina/mainwindow.h | 16 +- src/app/valentina/mainwindowsnogui.cpp | 27 +- src/app/valentina/mainwindowsnogui.h | 2 +- src/app/valentina/xml/vpattern.cpp | 54 ++-- src/libs/vmisc/vabstractapplication.cpp | 11 + src/libs/vmisc/vabstractapplication.h | 4 + 15 files changed, 263 insertions(+), 255 deletions(-) diff --git a/src/app/tape/main.cpp b/src/app/tape/main.cpp index 197a0cb02..6e2f83a3f 100644 --- a/src/app/tape/main.cpp +++ b/src/app/tape/main.cpp @@ -28,7 +28,6 @@ #include "tmainwindow.h" #include "mapplication.h" -#include "../vmisc/vsysexits.h" #include // For QT_REQUIRE_VERSION @@ -50,6 +49,8 @@ int main(int argc, char *argv[]) MApplication app(argc, argv); app.InitOptions(); - app.ParseCommandLine(SocketConnection::Client, app.arguments()); - return app.IsTestMode() ? V_EX_OK : app.exec(); // single return point is always better than more + + QTimer::singleShot(0, &app, SLOT(ProcessCMD())); + + return app.exec(); } diff --git a/src/app/tape/mapplication.cpp b/src/app/tape/mapplication.cpp index a38e4d886..3d2a16656 100644 --- a/src/app/tape/mapplication.cpp +++ b/src/app/tape/mapplication.cpp @@ -234,31 +234,31 @@ bool MApplication::notify(QObject *receiver, QEvent *event) { qCCritical(mApp, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error parsing file. Program will be terminated.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); - std::exit(V_EX_DATAERR); + exit(V_EX_DATAERR); } catch (const VExceptionBadId &e) { qCCritical(mApp, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error bad id. Program will be terminated.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); - std::exit(V_EX_DATAERR); + exit(V_EX_DATAERR); } catch (const VExceptionConversionError &e) { qCCritical(mApp, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error can't convert value. Program will be terminated.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); - std::exit(V_EX_DATAERR); + exit(V_EX_DATAERR); } catch (const VExceptionEmptyParameter &e) { qCCritical(mApp, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error empty parameter. Program will be terminated.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); - std::exit(V_EX_DATAERR); + exit(V_EX_DATAERR); } catch (const VExceptionWrongId &e) { qCCritical(mApp, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error wrong id. Program will be terminated.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); - std::exit(V_EX_DATAERR); + exit(V_EX_DATAERR); } catch (const VException &e) { @@ -271,12 +271,12 @@ bool MApplication::notify(QObject *receiver, QEvent *event) catch (const qmu::QmuParserError &e) { qCCritical(mApp, "%s", qUtf8Printable(tr("Parser error: %1. Program will be terminated.").arg(e.GetMsg()))); - std::exit(V_EX_DATAERR); + exit(V_EX_DATAERR); } catch (std::exception &e) { qCCritical(mApp, "%s", qUtf8Printable(tr("Exception thrown: %1. Program will be terminated.").arg(e.what()))); - std::exit(V_EX_SOFTWARE); + exit(V_EX_SOFTWARE); } return false; } @@ -603,7 +603,8 @@ void MApplication::ParseCommandLine(const SocketConnection &connection, const QS stream << QCoreApplication::arguments().join(";;"); stream.flush(); socket.waitForBytesWritten(); - std::exit(V_EX_OK); + qApp->exit(V_EX_OK); + return; } qCDebug(mApp, "Can't establish connection to the server '%s'", qUtf8Printable(serverName)); @@ -640,7 +641,15 @@ void MApplication::ParseCommandLine(const SocketConnection &connection, const QS for (int i = 0; i < args.size(); ++i) { NewMainWindow(); - MainWindow()->LoadFile(args.at(i)); + if (not MainWindow()->LoadFile(args.at(i))) + { + if (testMode) + { + return; // process only one input file + } + delete MainWindow(); + continue; + } if (flagSize) { @@ -670,6 +679,11 @@ void MApplication::ParseCommandLine(const SocketConnection &connection, const QS parser.showHelp(V_EX_USAGE); } } + + if (testMode) + { + qApp->exit(V_EX_OK); // close program after processing in console mode + } } //--------------------------------------------------------------------------------------------------------------------- @@ -710,6 +724,12 @@ TMainWindow *MApplication::NewMainWindow() return tape; } +//--------------------------------------------------------------------------------------------------------------------- +void MApplication::ProcessCMD() +{ + ParseCommandLine(SocketConnection::Client, arguments()); +} + //--------------------------------------------------------------------------------------------------------------------- void MApplication::OpenFile(const QString &path) { diff --git a/src/app/tape/mapplication.h b/src/app/tape/mapplication.h index 69de119a3..39594ef58 100644 --- a/src/app/tape/mapplication.h +++ b/src/app/tape/mapplication.h @@ -82,6 +82,7 @@ public: public slots: TMainWindow *NewMainWindow(); + void ProcessCMD(); protected: virtual void InitTrVars() Q_DECL_OVERRIDE; diff --git a/src/app/tape/tmainwindow.cpp b/src/app/tape/tmainwindow.cpp index abef298c4..a8a412721 100644 --- a/src/app/tape/tmainwindow.cpp +++ b/src/app/tape/tmainwindow.cpp @@ -160,7 +160,7 @@ void TMainWindow::SetPUnit(Unit unit) } //--------------------------------------------------------------------------------------------------------------------- -void TMainWindow::LoadFile(const QString &path) +bool TMainWindow::LoadFile(const QString &path) { if (m == nullptr) { @@ -169,12 +169,9 @@ void TMainWindow::LoadFile(const QString &path) qCCritical(tMainWindow, "%s", qUtf8Printable(tr("File '%1' doesn't exist!").arg(path))); if (qApp->IsTestMode()) { - std::exit(V_EX_NOINPUT); - } - else - { - return; + qApp->exit(V_EX_NOINPUT); } + return false; } // Check if file already opened @@ -185,7 +182,7 @@ void TMainWindow::LoadFile(const QString &path) { list.at(i)->activateWindow(); close(); - return; + return false; } } @@ -196,12 +193,9 @@ void TMainWindow::LoadFile(const QString &path) qCCritical(tMainWindow, "%s", qUtf8Printable(tr("This file already opened in another window."))); if (qApp->IsTestMode()) { - std::exit(V_EX_NOINPUT); - } - else - { - return; + qApp->exit(V_EX_NOINPUT); } + return false; } try @@ -278,20 +272,18 @@ void TMainWindow::LoadFile(const QString &path) if (qApp->IsTestMode()) { - std::exit(V_EX_NOINPUT); - } - else - { - return; + qApp->exit(V_EX_NOINPUT); } + return false; } } else { qApp->NewMainWindow(); - qApp->MainWindow()->LoadFile(path); + return qApp->MainWindow()->LoadFile(path); } + return true; } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/app/tape/tmainwindow.h b/src/app/tape/tmainwindow.h index 764a0cc63..52566d089 100644 --- a/src/app/tape/tmainwindow.h +++ b/src/app/tape/tmainwindow.h @@ -63,7 +63,7 @@ public: void SetPUnit(Unit unit); public slots: - void LoadFile(const QString &path); + bool LoadFile(const QString &path); void FileNew(); void OpenIndividual(); void OpenStandard(); diff --git a/src/app/valentina/core/vapplication.cpp b/src/app/valentina/core/vapplication.cpp index c4392db34..c5a112395 100644 --- a/src/app/valentina/core/vapplication.cpp +++ b/src/app/valentina/core/vapplication.cpp @@ -294,31 +294,31 @@ bool VApplication::notify(QObject *receiver, QEvent *event) { qCCritical(vApp, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error parsing file. Program will be terminated.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); - std::exit(V_EX_DATAERR); + exit(V_EX_DATAERR); } catch (const VExceptionBadId &e) { qCCritical(vApp, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error bad id. Program will be terminated.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); - std::exit(V_EX_DATAERR); + exit(V_EX_DATAERR); } catch (const VExceptionConversionError &e) { qCCritical(vApp, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error can't convert value. Program will be terminated.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); - std::exit(V_EX_DATAERR); + exit(V_EX_DATAERR); } catch (const VExceptionEmptyParameter &e) { qCCritical(vApp, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error empty parameter. Program will be terminated.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); - std::exit(V_EX_DATAERR); + exit(V_EX_DATAERR); } catch (const VExceptionWrongId &e) { qCCritical(vApp, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error wrong id. Program will be terminated.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); - std::exit(V_EX_DATAERR); + exit(V_EX_DATAERR); } catch (const VException &e) { @@ -331,12 +331,12 @@ bool VApplication::notify(QObject *receiver, QEvent *event) catch (const qmu::QmuParserError &e) { qCCritical(vApp, "%s", qUtf8Printable(tr("Parser error: %1. Program will be terminated.").arg(e.GetMsg()))); - std::exit(V_EX_DATAERR); + exit(V_EX_DATAERR); } catch (std::exception& e) { qCCritical(vApp, "%s", qUtf8Printable(tr("Exception thrown: %1. Program will be terminated.").arg(e.what()))); - std::exit(V_EX_SOFTWARE); + exit(V_EX_SOFTWARE); } return false; } diff --git a/src/app/valentina/dialogs/dialogsavelayout.cpp b/src/app/valentina/dialogs/dialogsavelayout.cpp index 11d554fda..0e1301aa0 100644 --- a/src/app/valentina/dialogs/dialogsavelayout.cpp +++ b/src/app/valentina/dialogs/dialogsavelayout.cpp @@ -31,6 +31,7 @@ #include "../options.h" #include "../core/vapplication.h" #include "../vmisc/vsettings.h" +#include "../ifc/exception/vexception.h" #include #include @@ -88,8 +89,8 @@ DialogSaveLayout::DialogSaveLayout(int count, const QString &fileName, QWidget * } else { - qCritical() << tr("The base filename has not match regular expression."); - std::exit(V_EX_USAGE); + VException e(tr("The base filename has not match regular expression.")); + throw e; } } @@ -119,15 +120,15 @@ void DialogSaveLayout::SelectFormate(const size_t formate) { if (formate >= availFormats.size()) { - qCritical() << tr("Tried to use out of range format number."); - std::exit(V_EX_USAGE); + VException e(tr("Tried to use out of range format number.")); + throw e; } - int i = ui->comboBoxFormat->findData(availFormats[formate].pair.second); + const int i = ui->comboBoxFormat->findData(availFormats[formate].pair.second); if (i < 0) { - qCritical() << tr("Selected not present format."); - std::exit(V_EX_USAGE); + VException e(tr("Selected not present format.")); + throw e; } ui->comboBoxFormat->setCurrentIndex(i); } @@ -164,8 +165,8 @@ void DialogSaveLayout::SetDestinationPath(const QString &cmdDestinationPath) QDir dir; if (not dir.cd(cmdDestinationPath)) { - qCritical() << tr("The destination directory doesn't exists or is not readable."); - std::exit(V_EX_DATAERR); + VException e(tr("The destination directory doesn't exists or is not readable.")); + throw e; } path = dir.absolutePath(); } diff --git a/src/app/valentina/main.cpp b/src/app/valentina/main.cpp index 24eb5da11..514b86b14 100644 --- a/src/app/valentina/main.cpp +++ b/src/app/valentina/main.cpp @@ -58,52 +58,7 @@ int main(int argc, char *argv[]) app.setWindowIcon(QIcon(":/icon/64x64/icon64x64.png")); app.setMainWindow(&w); - auto args = app.CommandLine()->OptInputFileNames(); + QTimer::singleShot(0, &w, SLOT(ProcessCMD())); - //Before we load pattern show window. - if (VApplication::CheckGUI()) - { - w.show(); - w.ReopenFilesAfterCrash(args); - } - else - { - if (args.size() != 1) - { - qCritical() << QCoreApplication::translate("vmain", "Please, provide one input file."); - std::exit(V_EX_NOINPUT); - } - } - - for (int i=0, sz = args.size(); i < sz; ++i) - { - const bool loaded = w.LoadPattern(args.at(static_cast(i)), app.CommandLine()->OptMeasurePath()); - - if (app.CommandLine()->IsTestModeEnabled() || app.CommandLine()->IsExportEnabled()) - { - if (app.CommandLine()->IsSetGradationSize()) - { - w.SetSize(app.CommandLine()->OptGradationSize()); - } - - if (app.CommandLine()->IsSetGradationHeight()) - { - w.SetHeight(app.CommandLine()->OptGradationHeight()); - } - } - - if (not app.CommandLine()->IsTestModeEnabled()) - { - if (app.CommandLine()->IsExportEnabled()) - { - if (loaded) - { - w.DoExport(app.CommandLine()); - } - break; - } - } - } - - return (VApplication::CheckGUI()) ? app.exec() : V_EX_OK; // single return point is always better than more + return app.exec(); } diff --git a/src/app/valentina/mainwindow.cpp b/src/app/valentina/mainwindow.cpp index 5e2307423..9dfbc2275 100644 --- a/src/app/valentina/mainwindow.cpp +++ b/src/app/valentina/mainwindow.cpp @@ -290,14 +290,11 @@ QSharedPointer MainWindow::OpenMeasurementFile(const QString &pat qCCritical(vMainWindow, "%s\n\n%s", qUtf8Printable(tr("Wrong units.")), qUtf8Printable(tr("Application doesn't support standard table with inches."))); m->clear(); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return m; - } - else - { - std::exit(V_EX_DATAERR); + qApp->exit(V_EX_DATAERR); } + return m; } } } @@ -306,14 +303,11 @@ QSharedPointer MainWindow::OpenMeasurementFile(const QString &pat qCCritical(vMainWindow, "%s\n\n%s\n\n%s", qUtf8Printable(tr("File error.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); m->clear(); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return m; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return m; } return m; } @@ -345,14 +339,11 @@ bool MainWindow::LoadMeasurements(const QString &path) { qCCritical(vMainWindow, "%s\n\n%s\n\n%s", qUtf8Printable(tr("File error.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return false; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return false; } return true; } @@ -370,14 +361,11 @@ bool MainWindow::UpdateMeasurements(const QString &path, int size, int height) if (qApp->patternType() != m->Type()) { qCCritical(vMainWindow, "%s", qUtf8Printable(tr("Measurement files types have not match."))); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return false; - } - else - { - std::exit(V_EX_DATAERR); + qApp->exit(V_EX_DATAERR); } + return false; } if (m->Type() == MeasurementsType::Standard) @@ -395,14 +383,11 @@ bool MainWindow::UpdateMeasurements(const QString &path, int size, int height) { qCCritical(vMainWindow, "%s\n\n%s\n\n%s", qUtf8Printable(tr("File error.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return false; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return false; } return true; } @@ -2207,83 +2192,65 @@ void MainWindow::FullParseFile() qCCritical(vMainWindow, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error parsing file.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } catch (const VExceptionConversionError &e) { qCCritical(vMainWindow, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error can't convert value.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } catch (const VExceptionEmptyParameter &e) { qCCritical(vMainWindow, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error empty parameter.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } catch (const VExceptionWrongId &e) { qCCritical(vMainWindow, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error wrong id.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } catch (VException &e) { qCCritical(vMainWindow, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error parsing file.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } catch (const std::bad_alloc &) { qCCritical(vMainWindow, "%s", qUtf8Printable(tr("Error parsing file (std::bad_alloc)."))); SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } QString patternPiece = QString(); @@ -2323,28 +2290,22 @@ void MainWindow::GlobalChangePP(const QString &patternPiece) qCCritical(vMainWindow, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Bad id.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } catch (const VExceptionEmptyParameter &e) { qCCritical(vMainWindow, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error empty parameter.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } } @@ -3302,14 +3263,11 @@ bool MainWindow::LoadPattern(const QString &fileName, const QString& customMeasu qCDebug(vMainWindow, "Error type: %d", lock->GetLockError()); qCCritical(vMainWindow, "%s", qUtf8Printable(tr("This file already opened in another window."))); Clear(); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return false; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return false; } // On this stage scene empty. Fit scene size to view size @@ -3344,14 +3302,11 @@ bool MainWindow::LoadPattern(const QString &fileName, const QString& customMeasu Clear(); qCCritical(vMainWindow, "%s", qUtf8Printable(tr("The measurements file '%1' could not be found.") .arg(path))); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return false; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return false; } if (not LoadMeasurements(path)) @@ -3359,14 +3314,11 @@ bool MainWindow::LoadPattern(const QString &fileName, const QString& customMeasu qCCritical(vMainWindow, "%s", qUtf8Printable(tr("The measurements file '%1' could not be found.") .arg(path))); Clear(); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return false; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return false; } else { @@ -3382,14 +3334,11 @@ bool MainWindow::LoadPattern(const QString &fileName, const QString& customMeasu qCCritical(vMainWindow, "%s\n\n%s\n\n%s", qUtf8Printable(tr("File error.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); Clear(); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return false; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return false; } #ifdef Q_OS_WIN32 @@ -3747,15 +3696,33 @@ void MainWindow::DoExport(const VCommandLinePtr &expParams) if (details->count() == 0) { qCCritical(vMainWindow, "%s", qUtf8Printable(tr("You can't export empty scene."))); - std::exit(V_EX_DATAERR); + qApp->exit(V_EX_DATAERR); + return; } } PrepareDetailsForLayout(details); - LayoutSettings(*settings.get()); - DialogSaveLayout dialog(scenes.size(), expParams->OptBaseName(), this); - dialog.SetDestinationPath(expParams->OptDestinationPath()); - dialog.SelectFormate(expParams->OptExportType()); - ExportLayout(dialog); + if (LayoutSettings(*settings.get())) + { + try + { + DialogSaveLayout dialog(scenes.size(), expParams->OptBaseName(), this); + dialog.SetDestinationPath(expParams->OptDestinationPath()); + dialog.SelectFormate(expParams->OptExportType()); + ExportLayout(dialog); + } + catch (const VException &e) + { + qCCritical(vMainWindow, "%s\n\n%s", qUtf8Printable(tr("Export error.")), qUtf8Printable(e.ErrorMessage())); + qApp->exit(V_EX_DATAERR); + return; + } + } + else + { + return; + } + + qApp->exit(V_EX_OK); } //--------------------------------------------------------------------------------------------------------------------- @@ -3833,3 +3800,66 @@ void MainWindow::SetHeight(const QString &text) qCWarning(vMainWindow, "%s", qUtf8Printable(tr("The method %1 does nothing in GUI mode").arg(Q_FUNC_INFO))); } } + +//--------------------------------------------------------------------------------------------------------------------- +void MainWindow::ProcessCMD() +{ + auto args = qApp->CommandLine()->OptInputFileNames(); + + //Before we load pattern show window. + if (VApplication::CheckGUI()) + { + show(); + ReopenFilesAfterCrash(args); + } + else + { + if (args.size() != 1) + { + qCritical() << tr("Please, provide one input file."); + qApp->exit(V_EX_NOINPUT); + return; + } + } + + for (int i=0, sz = args.size(); i < sz; ++i) + { + const bool loaded = LoadPattern(args.at(static_cast(i)), qApp->CommandLine()->OptMeasurePath()); + + if (not loaded && not VApplication::CheckGUI()) + { + return; // process only one input file + } + + if (qApp->CommandLine()->IsTestModeEnabled() || qApp->CommandLine()->IsExportEnabled()) + { + if (qApp->CommandLine()->IsSetGradationSize()) + { + SetSize(qApp->CommandLine()->OptGradationSize()); + } + + if (qApp->CommandLine()->IsSetGradationHeight()) + { + SetHeight(qApp->CommandLine()->OptGradationHeight()); + } + } + + if (not qApp->CommandLine()->IsTestModeEnabled()) + { + if (qApp->CommandLine()->IsExportEnabled()) + { + if (loaded) + { + DoExport(qApp->CommandLine()); + return; // process only one input file + } + break; + } + } + } + + if (not VApplication::CheckGUI()) + { + qApp->exit(V_EX_OK);// close program after processing in console mode + } +} diff --git a/src/app/valentina/mainwindow.h b/src/app/valentina/mainwindow.h index c62b94c5a..e77635485 100644 --- a/src/app/valentina/mainwindow.h +++ b/src/app/valentina/mainwindow.h @@ -60,14 +60,9 @@ public: explicit MainWindow(QWidget *parent = nullptr); virtual ~MainWindow() Q_DECL_OVERRIDE; - bool LoadPattern(const QString &curFile, const QString &customMeasureFile = QString()); - void ReopenFilesAfterCrash(QStringList &args); - void DoExport(const VCommandLinePtr& expParams); - - void SetSize(const QString &text); - void SetHeight(const QString & text); - public slots: + void ProcessCMD(); + void mouseMove(const QPointF &scenePos); void ArrowTool(); @@ -309,6 +304,13 @@ private: QString RelativeMPath(const QString &patternPath, const QString &absoluteMPath) const; QString AbsoluteMPath(const QString &patternPath, const QString &relativeMPath) const; + + bool LoadPattern(const QString &curFile, const QString &customMeasureFile = QString()); + void ReopenFilesAfterCrash(QStringList &args); + void DoExport(const VCommandLinePtr& expParams); + + void SetSize(const QString &text); + void SetHeight(const QString & text); }; #endif // MAINWINDOW_H diff --git a/src/app/valentina/mainwindowsnogui.cpp b/src/app/valentina/mainwindowsnogui.cpp index e2566209f..200f14143 100644 --- a/src/app/valentina/mainwindowsnogui.cpp +++ b/src/app/valentina/mainwindowsnogui.cpp @@ -101,7 +101,7 @@ void MainWindowsNoGUI::ToolLayoutSettings(bool checked) } //--------------------------------------------------------------------------------------------------------------------- -void MainWindowsNoGUI::LayoutSettings(VLayoutGenerator& lGenerator) +bool MainWindowsNoGUI::LayoutSettings(VLayoutGenerator& lGenerator) { lGenerator.SetDetails(listDetails); DialogLayoutProgress progress(listDetails.count(), this); @@ -135,14 +135,14 @@ void MainWindowsNoGUI::LayoutSettings(VLayoutGenerator& lGenerator) isLayoutStale = false; break; case LayoutErrors::ProcessStoped: - break; case LayoutErrors::PrepareLayoutError: case LayoutErrors::EmptyPaperError: - break; + return false; default: break; } + return true; } //--------------------------------------------------------------------------------------------------------------------- void MainWindowsNoGUI::ErrorConsoleMode(const LayoutErrors &state) @@ -163,11 +163,10 @@ void MainWindowsNoGUI::ErrorConsoleMode(const LayoutErrors &state) break; } - std::exit(V_EX_DATAERR); + qApp->exit(V_EX_DATAERR); } //--------------------------------------------------------------------------------------------------------------------- - void MainWindowsNoGUI::ExportLayoutAs() { if (isLayoutStale) @@ -177,14 +176,24 @@ void MainWindowsNoGUI::ExportLayoutAs() return; } } - DialogSaveLayout dialog(scenes.size(), FileName(), this); - if (dialog.exec() == QDialog::Rejected) + try { + DialogSaveLayout dialog(scenes.size(), FileName(), this); + + if (dialog.exec() == QDialog::Rejected) + { + return; + } + + ExportLayout(dialog); + } + catch (const VException &e) + { + qCritical("%s\n\n%s\n\n%s", qUtf8Printable(tr("Export error.")), + qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); return; } - - ExportLayout(dialog); } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/app/valentina/mainwindowsnogui.h b/src/app/valentina/mainwindowsnogui.h index 9bf87984d..c1d6f191b 100644 --- a/src/app/valentina/mainwindowsnogui.h +++ b/src/app/valentina/mainwindowsnogui.h @@ -95,7 +95,7 @@ protected: virtual void CleanLayout()=0; virtual void PrepareSceneList()=0; QIcon ScenePreview(int i) const; - void LayoutSettings(VLayoutGenerator& lGenerator); + bool LayoutSettings(VLayoutGenerator& lGenerator); private: Q_DISABLE_COPY(MainWindowsNoGUI) diff --git a/src/app/valentina/xml/vpattern.cpp b/src/app/valentina/xml/vpattern.cpp index 33a1ea40b..eab12d6c5 100644 --- a/src/app/valentina/xml/vpattern.cpp +++ b/src/app/valentina/xml/vpattern.cpp @@ -358,83 +358,65 @@ void VPattern::LiteParseTree(const Document &parse) qCCritical(vXML, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error parsing file.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); emit SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } catch (const VExceptionConversionError &e) { qCCritical(vXML, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error can't convert value.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); emit SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } catch (const VExceptionEmptyParameter &e) { qCCritical(vXML, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error empty parameter.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); emit SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } catch (const VExceptionWrongId &e) { qCCritical(vXML, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error wrong id.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); emit SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } catch (VException &e) { qCCritical(vXML, "%s\n\n%s\n\n%s", qUtf8Printable(tr("Error parsing file.")), qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation())); emit SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } catch (const std::bad_alloc &) { qCCritical(vXML, "%s", qUtf8Printable(tr("Error parsing file (std::bad_alloc)."))); emit SetEnabledGUI(false); - if (VApplication::CheckGUI()) + if (not VApplication::CheckGUI()) { - return; - } - else - { - std::exit(V_EX_NOINPUT); + qApp->exit(V_EX_NOINPUT); } + return; } // Restore name current pattern piece diff --git a/src/libs/vmisc/vabstractapplication.cpp b/src/libs/vmisc/vabstractapplication.cpp index 65a90bec8..dbafdd548 100644 --- a/src/libs/vmisc/vabstractapplication.cpp +++ b/src/libs/vmisc/vabstractapplication.cpp @@ -63,6 +63,8 @@ VAbstractApplication::VAbstractApplication(int &argc, char **argv) #endif // QT_VERSION < QT_VERSION_CHECK(5, 2, 0) #endif // QT_VERSION < QT_VERSION_CHECK(5, 3, 0) + + connect(this, &QApplication::aboutToQuit, this, &VAbstractApplication::SyncSettings); } //--------------------------------------------------------------------------------------------------------------------- @@ -135,6 +137,15 @@ double VAbstractApplication::fromPixel(double pix) const return FromPixel(pix, _patternUnit); } +//--------------------------------------------------------------------------------------------------------------------- +void VAbstractApplication::SyncSettings() +{ + // If try to use the method QApplication::exit program can't sync settings and show warning about QApplication + // instance. Solution is to call sync() before quit. + // Connect this slot with VApplication::aboutToQuit. + Settings()->sync(); +} + //--------------------------------------------------------------------------------------------------------------------- void VAbstractApplication::LoadTranslation(const QString &locale) { diff --git a/src/libs/vmisc/vabstractapplication.h b/src/libs/vmisc/vabstractapplication.h index b2c3ad16d..2a1e9361e 100644 --- a/src/libs/vmisc/vabstractapplication.h +++ b/src/libs/vmisc/vabstractapplication.h @@ -50,6 +50,7 @@ class QUndoStack; class VAbstractApplication : public QApplication { + Q_OBJECT public: VAbstractApplication(int &argc, char ** argv); virtual ~VAbstractApplication() Q_DECL_OVERRIDE; @@ -92,6 +93,9 @@ public: QUndoStack *getUndoStack() const; +protected slots: + void SyncSettings(); + protected: QUndoStack *undoStack;