From 5e5199f9f6a92f5bc81c64ccac973e0bf30de58b Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Mon, 13 Apr 2020 12:48:09 +0300 Subject: [PATCH] Fix crash. Added more keys we will need in future. --- src/app/puzzle/puzzle.pri | 2 + src/app/puzzle/puzzlecommands.cpp | 88 +++++++++++++++++++++++++ src/app/puzzle/puzzlecommands.h | 63 ++++++++++++++++++ src/app/puzzle/vpuzzlecommandline.cpp | 94 ++++++++++++++++++--------- src/app/puzzle/vpuzzlecommandline.h | 9 ++- 5 files changed, 224 insertions(+), 32 deletions(-) create mode 100644 src/app/puzzle/puzzlecommands.cpp create mode 100644 src/app/puzzle/puzzlecommands.h diff --git a/src/app/puzzle/puzzle.pri b/src/app/puzzle/puzzle.pri index c8db5a556..7cb2cf959 100644 --- a/src/app/puzzle/puzzle.pri +++ b/src/app/puzzle/puzzle.pri @@ -3,6 +3,7 @@ SOURCES += \ $$PWD/main.cpp \ + $$PWD/puzzlecommands.cpp \ $$PWD/puzzlemainwindow.cpp \ $$PWD/puzzleapplication.cpp \ $$PWD/vpuzzlecommandline.cpp @@ -10,6 +11,7 @@ SOURCES += \ *msvc*:SOURCES += $$PWD/stable.cpp HEADERS += \ + $$PWD/puzzlecommands.h \ $$PWD/puzzlemainwindow.h \ $$PWD/stable.h \ $$PWD/puzzleapplication.h \ diff --git a/src/app/puzzle/puzzlecommands.cpp b/src/app/puzzle/puzzlecommands.cpp new file mode 100644 index 000000000..57134ad2d --- /dev/null +++ b/src/app/puzzle/puzzlecommands.cpp @@ -0,0 +1,88 @@ +/************************************************************************ + ** + ** @file commands.cpp + ** @author Roman Telezhynskyi + ** @date 13 4, 2020 + ** + ** @brief + ** @copyright + ** This source code is part of the Valentina project, a pattern making + ** program, whose allow create and modeling patterns of clothing. + ** Copyright (C) 2020 Valentina project + ** All Rights Reserved. + ** + ** Valentina is free software: you can redistribute it and/or modify + ** it under the terms of the GNU General Public License as published by + ** the Free Software Foundation, either version 3 of the License, or + ** (at your option) any later version. + ** + ** Valentina 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 General Public License for more details. + ** + ** You should have received a copy of the GNU General Public License + ** along with Valentina. If not, see . + ** + *************************************************************************/ +#include "puzzlecommands.h" + +#include + +const QString LONG_OPTION_EXPORT_FILE = QStringLiteral("exportFile"); +const QString SINGLE_OPTION_EXPORT_FILE = QStringLiteral("e"); + +const QString LONG_OPTION_TEST = QStringLiteral("test"); +const QString SINGLE_OPTION_TEST = QStringLiteral("t"); + +const QString LONG_OPTION_RAW_LAYOUT = QStringLiteral("rawLayout"); +const QString SINGLE_OPTION_RAW_LAYOUT = QStringLiteral("r"); + +const QString LONG_OPTION_EXP2FORMAT = QStringLiteral("format"); +const QString SINGLE_OPTION_EXP2FORMAT = QStringLiteral("f"); + +const QString LONG_OPTION_BINARYDXF = QStringLiteral("bdxf"); +const QString LONG_OPTION_TEXT2PATHS = QStringLiteral("text2paths"); + +const QString LONG_OPTION_CROP_LENGTH = QStringLiteral("crop"); +const QString SINGLE_OPTION_CROP_LENGTH = QStringLiteral("c"); + +const QString LONG_OPTION_CROP_WIDTH = QStringLiteral("cropWidth"); + +const QString LONG_OPTION_TILED_PDF_PAGE_TEMPLATE = QStringLiteral("tiledPageformat"); +const QString LONG_OPTION_TILED_PDF_LEFT_MARGIN = QStringLiteral("tiledlmargin"); +const QString LONG_OPTION_TILED_PDF_RIGHT_MARGIN = QStringLiteral("tiledrmargin"); +const QString LONG_OPTION_TILED_PDF_TOP_MARGIN = QStringLiteral("tiledtmargin"); +const QString LONG_OPTION_TILED_PDF_BOTTOM_MARGIN = QStringLiteral("tiledbmargin"); +const QString LONG_OPTION_TILED_PDF_LANDSCAPE = QStringLiteral("tiledLandscape"); + +//--------------------------------------------------------------------------------------------------------------------- +/** + * @brief AllKeys return list with all command line keys (short and long forms). Used for testing on conflicts. + * @return list with all command line keys + */ +QStringList AllKeys() +{ + return QStringList + { + LONG_OPTION_EXPORT_FILE, + SINGLE_OPTION_EXPORT_FILE, + LONG_OPTION_TEST, + SINGLE_OPTION_TEST, + LONG_OPTION_RAW_LAYOUT, + SINGLE_OPTION_RAW_LAYOUT, + LONG_OPTION_EXP2FORMAT, + SINGLE_OPTION_EXP2FORMAT, + LONG_OPTION_BINARYDXF, + LONG_OPTION_TEXT2PATHS, + LONG_OPTION_CROP_LENGTH, + SINGLE_OPTION_CROP_LENGTH, + LONG_OPTION_CROP_WIDTH, + LONG_OPTION_TILED_PDF_PAGE_TEMPLATE, + LONG_OPTION_TILED_PDF_LEFT_MARGIN, + LONG_OPTION_TILED_PDF_RIGHT_MARGIN, + LONG_OPTION_TILED_PDF_TOP_MARGIN, + LONG_OPTION_TILED_PDF_BOTTOM_MARGIN, + LONG_OPTION_TILED_PDF_LANDSCAPE + }; +} diff --git a/src/app/puzzle/puzzlecommands.h b/src/app/puzzle/puzzlecommands.h new file mode 100644 index 000000000..ae362b032 --- /dev/null +++ b/src/app/puzzle/puzzlecommands.h @@ -0,0 +1,63 @@ +/************************************************************************ + ** + ** @file commands.h + ** @author Roman Telezhynskyi + ** @date 13 4, 2020 + ** + ** @brief + ** @copyright + ** This source code is part of the Valentina project, a pattern making + ** program, whose allow create and modeling patterns of clothing. + ** Copyright (C) 2020 Valentina project + ** All Rights Reserved. + ** + ** Valentina is free software: you can redistribute it and/or modify + ** it under the terms of the GNU General Public License as published by + ** the Free Software Foundation, either version 3 of the License, or + ** (at your option) any later version. + ** + ** Valentina 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 General Public License for more details. + ** + ** You should have received a copy of the GNU General Public License + ** along with Valentina. If not, see . + ** + *************************************************************************/ +#ifndef COMMANDS_H +#define COMMANDS_H + + +#include + +extern const QString LONG_OPTION_EXPORT_FILE; +extern const QString SINGLE_OPTION_EXPORT_FILE; + +extern const QString LONG_OPTION_TEST; +extern const QString SINGLE_OPTION_TEST; + +extern const QString LONG_OPTION_RAW_LAYOUT; +extern const QString SINGLE_OPTION_RAW_LAYOUT; + +extern const QString LONG_OPTION_EXP2FORMAT; +extern const QString SINGLE_OPTION_EXP2FORMAT; + +extern const QString LONG_OPTION_BINARYDXF; +extern const QString LONG_OPTION_TEXT2PATHS; + +extern const QString LONG_OPTION_CROP_LENGTH; +extern const QString SINGLE_OPTION_CROP_LENGTH; + +extern const QString LONG_OPTION_CROP_WIDTH; + +extern const QString LONG_OPTION_TILED_PDF_PAGE_TEMPLATE; +extern const QString LONG_OPTION_TILED_PDF_LEFT_MARGIN; +extern const QString LONG_OPTION_TILED_PDF_RIGHT_MARGIN; +extern const QString LONG_OPTION_TILED_PDF_TOP_MARGIN; +extern const QString LONG_OPTION_TILED_PDF_BOTTOM_MARGIN; +extern const QString LONG_OPTION_TILED_PDF_LANDSCAPE; + +QStringList AllKeys(); + +#endif // COMMANDS_H diff --git a/src/app/puzzle/vpuzzlecommandline.cpp b/src/app/puzzle/vpuzzlecommandline.cpp index bd34962d6..0242e1356 100644 --- a/src/app/puzzle/vpuzzlecommandline.cpp +++ b/src/app/puzzle/vpuzzlecommandline.cpp @@ -1,5 +1,5 @@ #include "vpuzzlecommandline.h" -#include "../vmisc/commandoptions.h" +#include "puzzlecommands.h" #include "../vmisc/vsysexits.h" #include "../vmisc/literals.h" #include @@ -11,7 +11,7 @@ std::shared_ptr VPuzzleCommandLine::instance = nullptr; //------------------------------------------------------------------------------------------------ bool VPuzzleCommandLine::IsExportEnabled() const { - const bool result = IsOptionSet(QStringLiteral("destination")); + const bool result = IsOptionSet(LONG_OPTION_EXPORT_FILE); int argSize = parser.positionalArguments().size(); if (result && argSize != 1) { @@ -22,21 +22,27 @@ bool VPuzzleCommandLine::IsExportEnabled() const } //---------------------------------------------------------------------------------------------- -QString VPuzzleCommandLine::OptionBaseName() const +QString VPuzzleCommandLine::OptionExportFile() const { QString path; if (IsExportEnabled()) { - path = OptionValue(QStringLiteral("destination")); + path = OptionValue(LONG_OPTION_EXPORT_FILE); } return path; } +//--------------------------------------------------------------------------------------------------------------------- +QStringList VPuzzleCommandLine::OptionRawLayouts() const +{ + return OptionValues(LONG_OPTION_RAW_LAYOUT); +} + //-------------------------------------------------------------------------------------------- bool VPuzzleCommandLine::IsTestModeEnabled() const { - const bool r = IsOptionSet(QStringLiteral("test")); + const bool r = IsOptionSet(LONG_OPTION_TEST); if (r && parser.positionalArguments().size() != 1) { qCritical() << translate("VCommandLine", "Test option can be used with single input file only.") << "/n"; @@ -71,6 +77,7 @@ VPuzzleCommandLine::VPuzzleCommandLine(): parser.setApplicationDescription(translate("Puzzle", "Valentina's manual layout editor.")); parser.addHelpOption(); parser.addVersionOption(); + parser.addPositionalArgument(QStringLiteral("filename"), translate("Puzzle", "The manual layout file.")); InitCommandLineOptions(); } @@ -91,30 +98,59 @@ VPuzzleCommandLinePtr VPuzzleCommandLine::Instance(const QCoreApplication &app) //------------------------------------------------------------------------------------------- void VPuzzleCommandLine::InitCommandLineOptions() { - QStringList args = parser.positionalArguments(); - parser.setSingleDashWordOptionMode( - QCommandLineParser::SingleDashWordOptionMode(args.takeFirst().toInt())); - QString source = args.isEmpty() ? QString() : args.at(0); - QString destination = args.isEmpty() ? QString() : args.at(1); - parser.clearPositionalArguments(); - parser.addPositionalArgument(source, - translate("Puzzle", "The raw layout input file.")); - parser.addPositionalArgument(destination, - translate("Puzzle", "The destination folder")); - - QCommandLineOption forceOption(QStringList() << "f" << "force", - translate("Puzzle", "Overwrite existing files.")); - parser.addOption(forceOption); - - QCommandLineOption testOption(QStringList() << "test", - tr("Use for unit testing. Run the program and open a file without showing the main window.")); - parser.addOption(testOption); - - QCommandLineOption scalingOption(QStringList() << LONG_OPTION_NO_HDPI_SCALING, - tr("Disable high dpi scaling. Call this option if has problem with scaling (by default scaling enabled). " - "Alternatively you can use the %1 environment variable.").arg("QT_AUTO_SCREEN_SCALE_FACTOR=0")); - parser.addOption(scalingOption); - + //keep in mind order here - that is how user will see it, so group-up for usability + //================================================================================================================= + parser.addOptions({ + {{SINGLE_OPTION_EXPORT_FILE, LONG_OPTION_EXPORT_FILE}, + translate("VCommandLine", "The filename of exported layout file. Use it to enable console export mode."), + translate("VCommandLine", "The filename of layout file")}, + {{SINGLE_OPTION_RAW_LAYOUT, LONG_OPTION_RAW_LAYOUT}, + translate("VCommandLine", "Load pattern pieces form the raw layout data file."), + translate("VCommandLine", "The raw layout data file")}, + {{SINGLE_OPTION_EXP2FORMAT, LONG_OPTION_EXP2FORMAT}, + translate("VCommandLine", "Number corresponding to output format (default = 0, export mode): "), + translate("VCommandLine", "Format number"), QChar('0')}, + {LONG_OPTION_BINARYDXF, translate("VCommandLine", "Export dxf in binary form.")}, + {LONG_OPTION_TEXT2PATHS, translate("VCommandLine", "Export text as paths.")}, + //================================================================================================================= + {{SINGLE_OPTION_CROP_LENGTH, LONG_OPTION_CROP_LENGTH}, + translate("VCommandLine", "Auto crop unused length (export mode).")}, + {{LONG_OPTION_CROP_WIDTH}, + translate("VCommandLine", "Auto crop unused width (export mode).")}, + //================================================================================================================= + {LONG_OPTION_TILED_PDF_PAGE_TEMPLATE, + translate("VCommandLine", "Number corresponding to tiled pdf page template (default = 0, export mode with " + "tiled pdf format): "), + translate("VCommandLine", "Template number"), QChar('0')}, + {LONG_OPTION_TILED_PDF_LEFT_MARGIN, + translate("VCommandLine","Tiled page left margin in current units like 3.0 (export mode). If not set will be " + "used default value 1 cm."), + translate("VCommandLine", "The left margin")}, + {LONG_OPTION_TILED_PDF_RIGHT_MARGIN, + translate("VCommandLine", "Tiled page right margin in current units like 3.0 (export mode). If not set will " + "be used default value 1 cm."), + translate("VCommandLine", "The right margin")}, + {LONG_OPTION_TILED_PDF_TOP_MARGIN, + translate("VCommandLine", "Tiled page top margin in current units like 3.0 (export mode). If not set will be " + "used value default value 1 cm."), + translate("VCommandLine", "The top margin")}, + {LONG_OPTION_TILED_PDF_BOTTOM_MARGIN, + translate("VCommandLine", "Tiled page bottom margin in current units like 3.0 (export mode). If not set will " + "be used value default value 1 cm."), + translate("VCommandLine", "The bottom margin")}, + {LONG_OPTION_TILED_PDF_LANDSCAPE, + translate("VCommandLine", "Set tiled page orienatation to landscape (export mode). Default value if not set " + "portrait.")}, + //================================================================================================================= + {{SINGLE_OPTION_TEST, LONG_OPTION_TEST}, + translate("VCommandLine", "Run the program in a test mode. The program in this mode loads a single layout " + "file and silently quit without showing the main window. The key have priority " + "before key '%1'.").arg(LONG_OPTION_EXPORT_FILE)}, + {LONG_OPTION_NO_HDPI_SCALING, + translate("VCommandLine", "Disable high dpi scaling. Call this option if has problem with scaling (by default " + "scaling enabled). Alternatively you can use the %1 environment variable.") + .arg(QStringLiteral("QT_AUTO_SCREEN_SCALE_FACTOR=0"))}, + }); } //-------------------------------------------------------------------------------------------- diff --git a/src/app/puzzle/vpuzzlecommandline.h b/src/app/puzzle/vpuzzlecommandline.h index a7f403e80..52d0e6836 100644 --- a/src/app/puzzle/vpuzzlecommandline.h +++ b/src/app/puzzle/vpuzzlecommandline.h @@ -10,7 +10,6 @@ using VPuzzleCommandLinePtr = std::shared_ptr; class VPuzzleCommandLine: public QObject { - friend class PuzzleApplication; Q_OBJECT public: virtual ~VPuzzleCommandLine() = default; @@ -18,8 +17,11 @@ public: /** @brief if user enabled export from cmd */ bool IsExportEnabled() const; - /** @brief the base name of layout file or empty string if not */ - QString OptionBaseName() const; + /** @brief path to export file or empty string if not */ + QString OptionExportFile() const; + + /** @brief list with paths to the raw layout data files */ + QStringList OptionRawLayouts() const; /** @brief if user enabled test mode from cmd */ bool IsTestModeEnabled() const; @@ -42,6 +44,7 @@ private: static VPuzzleCommandLinePtr instance; QCommandLineParser parser; bool isGuiEnabled; + friend class PuzzleApplication; /** @brief add options to the QCommandLineParser that there are in the cmd can be */ void InitCommandLineOptions();