7 #include "ColorFilterMode.h"
8 #include "FittingCurveCoefficients.h"
9 #include "ImportImageExtensions.h"
11 #include "MainWindow.h"
12 #include <QApplication>
13 #include <QCoreApplication>
17 #include <QMessageBox>
19 #include <QProcessEnvironment>
20 #include <QStyleFactory>
21 #include "TranslatorContainer.h"
22 #include "ZoomFactor.h"
26 const QString CMD_DEBUG (
"debug");
27 const QString CMD_DROP_REGRESSION (
"dropregression");
28 const QString CMD_ERROR_REPORT (
"errorreport");
29 const QString CMD_EXPORT_ONLY (
"exportonly");
30 const QString CMD_EXTRACT_IMAGE_ONLY (
"extractimageonly");
31 const QString CMD_FILE_CMD_SCRIPT (
"filecmdscript");
32 const QString CMD_GNUPLOT (
"gnuplot");
33 const QString CMD_HELP (
"help");
34 const QString CMD_REGRESSION (
"regression");
35 const QString CMD_RESET (
"reset");
36 const QString CMD_STYLE (
"style");
37 const QString CMD_STYLES (
"styles");
38 const QString CMD_UPGRADE (
"upgrade");
39 const QString DASH (
"-");
40 const QString DASH_DEBUG (
"-" + CMD_DEBUG);
41 const QString DASH_DROP_REGRESSION (
"-" + CMD_DROP_REGRESSION);
42 const QString DASH_ERROR_REPORT (
"-" + CMD_ERROR_REPORT);
43 const QString DASH_EXTRACT_IMAGE_ONLY (
"-" + CMD_EXTRACT_IMAGE_ONLY);
44 const QString DASH_EXPORT_ONLY (
"-" + CMD_EXPORT_ONLY);
45 const QString DASH_FILE_CMD_SCRIPT (
"-" + CMD_FILE_CMD_SCRIPT);
46 const QString DASH_GNUPLOT (
"-" + CMD_GNUPLOT);
47 const QString DASH_HELP (
"-" + CMD_HELP);
48 const QString DASH_REGRESSION (
"-" + CMD_REGRESSION);
49 const QString DASH_RESET (
"-" + CMD_RESET);
50 const QString DASH_STYLE (
"-" + CMD_STYLE);
51 const QString DASH_STYLES (
"-" + CMD_STYLES);
52 const QString DASH_UPGRADE (
"-" + CMD_UPGRADE);
53 const QString ENGAUGE_LOG_FILE (
".engauge.log");
56 bool checkFileExists (
const QString &file);
57 QString engaugeLogFilename ();
58 bool engaugeLogFilenameAttempt (
const QString &path,
59 QString &pathAndFile);
60 void parseCmdLine (
int argc,
63 bool &isDropRegression,
65 QString &errorReportFile,
66 QString &fileCmdScriptFile,
67 bool &isErrorReportRegressionTest,
70 bool &isExtractImageOnly,
71 QString &extractImageOnlyExtension,
73 QStringList &loadStartupFiles,
74 QStringList &commandLineWithoutLoadStartupFiles);
75 void sanityCheckLoadStartupFiles (
bool isRepeatingFlag,
76 const QString &dashForRepeatingFlag,
77 const QString &errorReportFile,
78 const QString &fileCmdScriptFile,
79 const QStringList &loadStartupFiles);
80 void sanityCheckValue (
bool requiredCondition,
82 const QString &msgUnadorned);
83 void showMessageAndQuit (
const QString &msg);
84 void showStylesAndQuit ();
85 void showUsageAndQuit ();
86 void upgradeFiles (
const QStringList &loadStartupFiles);
89 bool checkFileExists (
const QString &file)
91 QFileInfo check (file);
92 return check.exists() && check.isFile();
95 QString engaugeLogFilename()
99 #if !defined(OSX_RELEASE) && !defined(WIN_RELEASE) && !defined(APPIMAGE_RELEASE)
100 QProcessEnvironment env;
103 if (!engaugeLogFilenameAttempt (QCoreApplication::applicationDirPath(), pathAndFile)) {
104 if (!engaugeLogFilenameAttempt (env.value (
"HOME"), pathAndFile)) {
105 if (!engaugeLogFilenameAttempt (env.value (
"TEMP"), pathAndFile)) {
106 pathAndFile = ENGAUGE_LOG_FILE;
115 bool engaugeLogFilenameAttempt (
const QString &path,
116 QString &pathAndFile)
118 bool success =
false;
121 pathAndFile = QString (
"%1%2%3")
123 .arg (QDir::separator())
124 .arg (ENGAUGE_LOG_FILE);
125 QFile file (pathAndFile);
126 if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
136 int main(
int argc,
char *argv[])
138 qRegisterMetaType<ColorFilterMode> (
"ColorFilterMode");
139 qRegisterMetaType<FittingCurveCoefficients> (
"FilterCurveCoefficients");
140 qRegisterMetaType<ZoomFactor> (
"ZoomFactor");
142 QApplication app(argc, argv);
148 bool isDebug, isDropRegression, isReset, isGnuplot, isErrorReportRegressionTest, isExportOnly, isExtractImageOnly, isUpgrade;
149 QString errorReportFile, extractImageOnlyExtension, fileCmdScriptFile;
150 QStringList loadStartupFiles, commandLineWithoutLoadStartupFiles;
158 isErrorReportRegressionTest,
162 extractImageOnlyExtension,
165 commandLineWithoutLoadStartupFiles);
168 initializeLogging (
"engauge",
169 engaugeLogFilename(),
171 LOG4CPP_INFO_S ((*mainCat)) <<
"main args=" << QApplication::arguments().join (
" ").toLatin1().data();
176 upgradeFiles (loadStartupFiles);
182 isErrorReportRegressionTest,
187 extractImageOnlyExtension,
189 commandLineWithoutLoadStartupFiles);
199 void parseCmdLine (
int argc,
202 bool &isDropRegression,
204 QString &errorReportFile,
205 QString &fileCmdScriptFile,
206 bool &isErrorReportRegressionTest,
209 bool &isExtractImageOnly,
210 QString &extractImageOnlyExtension,
212 QStringList &loadStartupFiles,
213 QStringList &commandLineWithoutLoadStartupFiles)
215 bool showUsage =
false;
220 bool nextIsErrorReportFile =
false;
221 bool nextIsExtractImageOnly =
false;
222 bool nextIsFileCmdScript =
false;
226 isDropRegression =
false;
228 errorReportFile =
"";
229 fileCmdScriptFile =
"";
230 isErrorReportRegressionTest =
false;
232 isExportOnly =
false;
233 isExtractImageOnly =
false;
234 extractImageOnlyExtension =
"";
237 for (
int i = 1; i < argc; i++) {
239 bool isLoadStartupFile =
false;
241 if (nextIsErrorReportFile) {
242 sanityCheckValue (checkFileExists (argv [i]),
244 QObject::tr (
"is not a valid file name"));
245 errorReportFile = argv [i];
246 nextIsErrorReportFile =
false;
247 }
else if (nextIsExtractImageOnly) {
248 sanityCheckValue (importImageExtensions.
offers (argv [i]),
250 QObject::tr (
"is not a valid image file extension"));
251 extractImageOnlyExtension = argv [i];
252 nextIsExtractImageOnly =
false;
253 }
else if (nextIsFileCmdScript) {
254 sanityCheckValue (checkFileExists (argv [i]),
256 QObject::tr (
"is not a valid file name"));
257 fileCmdScriptFile = argv [i];
258 nextIsFileCmdScript =
false;
259 }
else if (strcmp (argv [i], DASH_DEBUG.toLatin1().data()) == 0) {
261 }
else if (strcmp (argv [i], DASH_DROP_REGRESSION.toLatin1().data()) == 0) {
262 isDropRegression =
true;
263 }
else if (strcmp (argv [i], DASH_ERROR_REPORT.toLatin1().data()) == 0) {
264 nextIsErrorReportFile =
true;
265 }
else if (strcmp (argv [i], DASH_EXPORT_ONLY.toLatin1().data()) == 0) {
267 }
else if (strcmp (argv [i], DASH_EXTRACT_IMAGE_ONLY.toLatin1().data()) == 0) {
268 isExtractImageOnly =
true;
269 nextIsExtractImageOnly =
true;
270 }
else if (strcmp (argv [i], DASH_FILE_CMD_SCRIPT.toLatin1().data()) == 0) {
271 nextIsFileCmdScript =
true;
272 }
else if (strcmp (argv [i], DASH_GNUPLOT.toLatin1().data()) == 0) {
274 }
else if (strcmp (argv [i], DASH_HELP.toLatin1().data()) == 0) {
276 }
else if (strcmp (argv [i], DASH_REGRESSION.toLatin1().data()) == 0) {
277 isErrorReportRegressionTest =
true;
278 }
else if (strcmp (argv [i], DASH_RESET.toLatin1().data()) == 0) {
280 }
else if (strcmp (argv [i], DASH_STYLE.toLatin1().data()) == 0) {
283 }
else if (strcmp (argv [i], DASH_STYLES.toLatin1().data()) == 0) {
284 showStylesAndQuit ();
285 }
else if (strcmp (argv [i], DASH_UPGRADE.toLatin1().data()) == 0) {
287 }
else if (strncmp (argv [i], DASH.toLatin1().data(), 1) == 0) {
292 QString fileName = argv [i];
293 QFileInfo fInfo (fileName);
294 if (fInfo.isRelative() && !fileName.startsWith (
"http")) {
295 fileName = fInfo.absoluteFilePath();
298 isLoadStartupFile =
true;
299 loadStartupFiles << fileName;
303 if (!isLoadStartupFile) {
304 commandLineWithoutLoadStartupFiles << argv [i];
309 sanityCheckLoadStartupFiles (isExportOnly,
314 sanityCheckLoadStartupFiles (isExtractImageOnly,
315 DASH_EXTRACT_IMAGE_ONLY,
321 if (showUsage || nextIsErrorReportFile || nextIsExtractImageOnly || nextIsFileCmdScript) {
328 void sanityCheckLoadStartupFiles (
bool isRepeatingFlag,
329 const QString &dashForRepeatingFlag,
330 const QString &errorReportFile,
331 const QString &fileCmdScriptFile,
332 const QStringList &loadStartupFiles)
334 if (isRepeatingFlag && (!errorReportFile.isEmpty() ||
335 !fileCmdScriptFile.isEmpty() ||
336 loadStartupFiles.size() == 0)) {
341 QTextStream str (&msg);
342 str << dashForRepeatingFlag.toLatin1().data() <<
" " << QObject::tr (
"is used only with one or more load files");
343 showMessageAndQuit (msg);
347 void sanityCheckValue (
bool requiredCondition,
349 const QString &msgUnadorned)
351 if (!requiredCondition) {
354 QString msg = QString (
"%1 %2")
357 showMessageAndQuit (msg);
361 void showMessageAndQuit (
const QString &msg)
364 QMessageBox::critical (
nullptr,
365 QObject::tr (
"Engauge Digitizer"),
370 void showStylesAndQuit ()
373 QTextStream str (&msg);
374 str << QObject::tr (
"Available styles") <<
": " << QStyleFactory::keys ().join (
", ");
375 showMessageAndQuit (msg);
378 void showUsageAndQuit ()
381 QTextStream str (&msg);
382 str <<
"<html>Usage: engauge "
383 <<
"[" << DASH_DEBUG.toLatin1().data() <<
"] "
384 <<
"[" << DASH_DROP_REGRESSION.toLatin1().data() <<
"] "
385 <<
"[" << DASH_ERROR_REPORT.toLatin1().data() <<
" <file>] "
386 <<
"[" << DASH_EXPORT_ONLY.toLatin1().data() <<
"] "
387 <<
"[" << DASH_EXTRACT_IMAGE_ONLY.toLatin1().data() <<
" <extension>] "
388 <<
"[" << DASH_FILE_CMD_SCRIPT.toLatin1().data() <<
" <file> "
389 <<
"[" << DASH_GNUPLOT.toLatin1().data() <<
"] "
390 <<
"[" << DASH_HELP.toLatin1().data() <<
"] "
391 <<
"[" << DASH_REGRESSION.toLatin1().data() <<
"] "
392 <<
"[" << DASH_RESET.toLatin1().data () <<
"] "
393 <<
"[" << DASH_STYLE.toLatin1().data () <<
" <style>] "
394 <<
"[" << DASH_STYLES.toLatin1().data () <<
"] "
395 <<
"[<load_file1>] [<load_file2>] ..." << endl
398 <<
"<td>" << DASH_DEBUG.toLatin1().data() <<
"</td>"
400 << QObject::tr (
"Enables extra debug information. Used for debugging").toLatin1().data()
404 <<
"<td>" << DASH_DROP_REGRESSION.toLatin1().data() <<
"</td>"
406 << QObject::tr (
"Indicates files opened at startup are for testing drag and drop. Used for regression testing").toLatin1().data()
410 <<
"<td>" << DASH_ERROR_REPORT.toLatin1().data() <<
"</td>"
412 << QObject::tr (
"Specifies an error report file as input. Used for debugging and regression testing").toLatin1().data()
416 <<
"<td>" << DASH_EXPORT_ONLY.toLatin1().data() <<
"</td>"
418 << QObject::tr (
"Export each loaded startup file, which must have all axis points defined, then stop").toLatin1().data()
422 <<
"<td>" << DASH_EXTRACT_IMAGE_ONLY.toLatin1().data() <<
"</td>"
424 << QObject::tr (
"Extract image in each loaded startup file to a file with the specified extension, then stop").toLatin1().data()
428 <<
"<td>" << DASH_FILE_CMD_SCRIPT.toLatin1().data() <<
"</td>"
430 << QObject::tr (
"Specifies a file command script file as input. Used for debugging and testing").toLatin1().data()
434 <<
"<td>" << DASH_GNUPLOT.toLatin1().data() <<
"</td>"
436 << QObject::tr (
"Output diagnostic gnuplot input files. Used for debugging").toLatin1().data()
440 <<
"<td>" << DASH_HELP.toLatin1().data() <<
"</td>"
442 << QObject::tr (
"Show this help information").toLatin1().data()
446 <<
"<td>" << DASH_REGRESSION.toLatin1().data() <<
"</td>"
448 << QObject::tr (
"Executes the error report file or file command script. Used for regression testing").toLatin1().data()
452 <<
"<td>" << DASH_RESET.toLatin1().data() <<
"</td>"
454 << QObject::tr (
"Removes all stored settings, including window positions. Used when windows start up offscreen").toLatin1().data()
458 <<
"<td>" << DASH_STYLE.toLatin1().data() <<
"</td>"
461 .arg (QObject::tr (
"Set the window style to one of the styles listed by the command line option"))
462 .arg (DASH_STYLES).toLatin1().data()
466 <<
"<td>" << DASH_STYLES.toLatin1().data() <<
"</td>"
469 .arg (QObject::tr (
"Show a list of available styles that can be used with the command line option"))
470 .arg (DASH_STYLE).toLatin1().data()
474 <<
"<td>" << DASH_UPGRADE.toLatin1().data() <<
"</td>"
476 << QObject::tr (
"Upgrade files opened at startup to the most recent version").toLatin1().data()
480 <<
"<td>" << QString (
"<load file> ").toLatin1().data() <<
"</td>"
482 << QObject::tr (
"File(s) to be imported or opened at startup").toLatin1().data()
485 <<
"</table></html>";
487 showMessageAndQuit (msg);
490 void upgradeFiles (
const QStringList &loadStartupFiles)
492 QString FILE_SUFFIX (
".dig");
493 QString UPGRADE_TOKEN (
"_upgrade");
497 QStringList::const_iterator itr;
498 for (itr = loadStartupFiles.begin(); itr != loadStartupFiles.end(); itr++) {
500 QString filenameOld = *itr;
504 if (filenameOld.endsWith (FILE_SUFFIX,
505 Qt::CaseInsensitive)) {
506 QString withoutSuffix = filenameOld.left (filenameOld.size () - FILE_SUFFIX.size ());
507 filenameNew = QString (
"%1%2%3")
514 filenameNew = QString (
"%1%2")
516 .arg (UPGRADE_TOKEN);
523 QFile file (filenameNew);
524 if (!file.open (QFile::WriteOnly)) {
526 msg += QString (
"%1 %2")
527 .arg (QObject::tr (
"Could not write to"))
532 QXmlStreamWriter writer (&file);
533 writer.setAutoFormatting (
true);
534 writer.writeStartDocument();
535 writer.writeDTD (
"<!DOCTYPE engauge>");
536 document.saveXml (writer);
537 writer.writeEndDocument ();
539 msg += QString (
"%1 %2 %3 %4")
540 .arg (QObject::tr (
"Upgraded"))
542 .arg (QObject::tr (
"to"))
549 LOG4CPP_INFO_S ((*mainCat)) <<
"Upgrade results: " << msg.toLatin1().data ();
Provides list of file extensions for import.
bool offers(const QString &fileExtension) const
Return true if specified file extension is supported.
Storage of one imported image and the data attached to that image.
Class that stores QTranslator objects for the duration of application execution.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...