#include "vpuzzlecommandline.h" #include "../vmisc/commandoptions.h" #include "../vmisc/vsysexits.h" #include #include std::shared_ptr VPuzzleCommandLine::instance = nullptr; #define translate(context, source) QCoreApplication::translate((context), source) //------------------------------------------------------------------------------------------------ bool VPuzzleCommandLine::IsExportEnabled() const { const bool result = IsOptionSet(QStringLiteral("destination")); int argSize = parser.positionalArguments().size(); if (result && argSize != 1) { qCritical() << translate("Puzzle", "Export options can be used with single input file only.") << "/n"; const_cast(this)->parser.showHelp(V_EX_USAGE); } return result; } //---------------------------------------------------------------------------------------------- QString VPuzzleCommandLine::OptionBaseName() const { QString path; if (IsExportEnabled()) { path = OptionValue(QStringLiteral("destination")); } return path; } //-------------------------------------------------------------------------------------------- bool VPuzzleCommandLine::IsTestModeEnabled() const { const bool r = IsOptionSet(QStringLiteral("test")); if (r && parser.positionalArguments().size() != 1) { qCritical() << translate("VCommandLine", "Test option can be used with single input file only.") << "/n"; const_cast(this)->parser.showHelp(V_EX_USAGE); } return r; } //-------------------------------------------------------------------------------------------- bool VPuzzleCommandLine::IsGuiEnabled() const { return isGuiEnabled; } //-------------------------------------------------------------------------------------------- QStringList VPuzzleCommandLine::OptionFileNames() const { return parser.positionalArguments(); } //---------------------------------------------------------------------------------------------- VPuzzleCommandLine::VPuzzleCommandLine(): parser(), isGuiEnabled(false) { parser.setApplicationDescription(translate("Puzzle", "Valentina's manual layout editor.")); parser.addHelpOption(); parser.addVersionOption(); InitCommandLineOptions(); } //------------------------------------------------------------------------------------------- std::shared_ptr VPuzzleCommandLine::Instance(const QCoreApplication &app) { if (instance == nullptr) { instance.reset(new VPuzzleCommandLine); } instance->parser.process(app); instance->isGuiEnabled = not (instance->IsGuiEnabled() || instance->IsExportEnabled()); return instance; } //------------------------------------------------------------------------------------------- void VPuzzleCommandLine::InitCommandLineOptions() { if (IsExportEnabled()) { 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); } //-------------------------------------------------------------------------------------------- bool VPuzzleCommandLine::IsOptionSet(const QString &option) const { return parser.isSet(option); } //------------------------------------------------------------------------------------------- QString VPuzzleCommandLine::OptionValue(const QString &option) const { return parser.value(option); } //-------------------------------------------------------------------------------------------- QStringList VPuzzleCommandLine::OptionValues(const QString &option) const { return parser.values(option); }