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

@@ -132,11 +132,46 @@ bool PtouchPrint::handlePrinting() {
return true;
}
// Build label using LabelBuilder
// Build label incrementally, appending when --new is encountered
graphics::LabelBuilder labelBuilder(printer->getPrinterInfo().pixelLines);
std::unique_ptr<graphics::ILabel> finalLabel = nullptr;
// Debug: print command sequence
spdlog::debug("Processing {} commands:", options.commands.size());
for (size_t i = 0; i < options.commands.size(); ++i) {
const auto& [cmdType, value] = options.commands[i];
spdlog::debug(" Command {}: type={}, value='{}'", i, static_cast<int>(cmdType), value);
}
for (const auto& [cmdType, value] : options.commands) {
switch (cmdType) {
case cli::CommandType::NewLabel: {
// Finish current label and append to final label
spdlog::debug("Encountered --new, finishing current label segment");
auto currentLabel = labelBuilder.build();
if (!finalLabel) {
// First label becomes the base
finalLabel = std::move(currentLabel);
} else {
// If finalLabel is empty (width=0), replace it instead of appending
if (finalLabel->getWidth() == 0) {
spdlog::debug("Final label is empty, replacing instead of appending");
finalLabel = std::move(currentLabel);
} else if (currentLabel->getWidth() == 0) {
// Current label is empty, skip appending
spdlog::debug("Current label is empty, skipping append");
} else {
// Both labels have content, append
if (!finalLabel->append(*currentLabel)) {
spdlog::error("Failed to append label");
return false;
}
}
}
// Reset builder for next label
labelBuilder = graphics::LabelBuilder(printer->getPrinterInfo().pixelLines);
break;
}
case cli::CommandType::Text:
labelBuilder.addText(value);
break;
@@ -178,9 +213,31 @@ bool PtouchPrint::handlePrinting() {
}
}
// Build and print the label
auto label = labelBuilder.build();
if (!mPrinterService->printLabel(std::move(label))) {
// Build and append final label segment
auto lastLabel = labelBuilder.build();
if (!finalLabel) {
// Only one label, no --new was used
finalLabel = std::move(lastLabel);
} else {
// Handle empty labels
if (finalLabel->getWidth() == 0) {
// Final label is empty, replace it
spdlog::debug("Final label is empty, replacing with last segment");
finalLabel = std::move(lastLabel);
} else if (lastLabel->getWidth() == 0) {
// Last segment is empty, skip appending
spdlog::debug("Last label segment is empty, skipping append");
} else {
// Both have content, append
if (!finalLabel->append(*lastLabel)) {
spdlog::error("Failed to append final label segment");
return false;
}
}
}
// Print the final label
if (!mPrinterService->printLabel(std::move(finalLabel))) {
spdlog::error("An error occurred while printing");
return false;
}