Multilabel support & Label refactoring (#17)
All checks were successful
Build ptprnt / build (push) Successful in 3m47s

Reviewed-on: moritz/ptouch-prnt#17
This commit was merged in pull request #17.
This commit is contained in:
2025-10-16 18:36:42 +00:00
parent d12fc3acb5
commit 4c94cae088
29 changed files with 1131 additions and 122 deletions

View File

@@ -43,9 +43,52 @@ int CliParser::parse(int argc, char** argv) {
mApp.exit(e);
return -1; // Signal: error
}
// Post-process: Re-order commands based on actual command line order
// This is needed because CLI11 groups options by type
reorderCommandsByArgv(argc, argv);
return 0;
}
void CliParser::reorderCommandsByArgv(int argc, char** argv) {
std::vector<Command> reorderedCommands;
// Parse argv to determine the actual order
for (int i = 1; i < argc; ++i) {
std::string arg = argv[i];
if (arg == "--new") {
reorderedCommands.emplace_back(CommandType::NewLabel, "");
} else if (arg == "-t" || arg == "--text") {
if (i + 1 < argc) {
reorderedCommands.emplace_back(CommandType::Text, argv[++i]);
}
} else if (arg == "-f" || arg == "--font") {
if (i + 1 < argc) {
reorderedCommands.emplace_back(CommandType::Font, argv[++i]);
}
} else if (arg == "-s" || arg == "--fontsize") {
if (i + 1 < argc) {
reorderedCommands.emplace_back(CommandType::FontSize, argv[++i]);
}
} else if (arg == "--valign") {
if (i + 1 < argc) {
reorderedCommands.emplace_back(CommandType::VAlign, argv[++i]);
}
} else if (arg == "--halign") {
if (i + 1 < argc) {
reorderedCommands.emplace_back(CommandType::HAlign, argv[++i]);
}
}
}
// Only replace if we found relevant commands
if (!reorderedCommands.empty()) {
mOptions.commands = std::move(reorderedCommands);
}
}
void CliParser::setupParser() {
// Version callback
auto printVersion = [this](std::size_t) {
@@ -89,6 +132,12 @@ void CliParser::setupParser() {
mApp.add_option("--halign", "Horizontal alignment of the following text occurrences")
->multi_option_policy(CLI::MultiOptionPolicy::TakeAll)
->each([this](const std::string& align) { mOptions.commands.emplace_back(CommandType::HAlign, align); });
// Label separator - use an option with multi_option_policy to maintain parse order
// We need to use a dummy string parameter since .each() expects a string callback
mApp.add_flag("--new", "Start a new label (multiple labels will be stitched together)")
->multi_option_policy(CLI::MultiOptionPolicy::TakeAll)
->each([this](const std::string&) { mOptions.commands.emplace_back(CommandType::NewLabel, ""); });
}
} // namespace ptprnt::cli