Fixed crash on Windows.

--HG--
branch : develop
This commit is contained in:
Roman Telezhynskyi 2015-10-11 12:06:14 +03:00
parent b46e384ca7
commit a4b2bb905f
15 changed files with 263 additions and 255 deletions

View file

@ -28,7 +28,6 @@
#include "tmainwindow.h"
#include "mapplication.h"
#include "../vmisc/vsysexits.h"
#include <QMessageBox> // 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();
}

View file

@ -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)
{

View file

@ -82,6 +82,7 @@ public:
public slots:
TMainWindow *NewMainWindow();
void ProcessCMD();
protected:
virtual void InitTrVars() Q_DECL_OVERRIDE;

View file

@ -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;
}
//---------------------------------------------------------------------------------------------------------------------

View file

@ -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();

View file

@ -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;
}

View file

@ -31,6 +31,7 @@
#include "../options.h"
#include "../core/vapplication.h"
#include "../vmisc/vsettings.h"
#include "../ifc/exception/vexception.h"
#include <QDir>
#include <QFileDialog>
@ -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();
}

View file

@ -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<int>(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();
}

View file

@ -290,14 +290,11 @@ QSharedPointer<VMeasurements> 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<VMeasurements> 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<int>(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
}
}

View file

@ -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

View file

@ -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);
}
//---------------------------------------------------------------------------------------------------------------------

View file

@ -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)

View file

@ -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

View file

@ -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)
{

View file

@ -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;