Multilabel support & Label refactoring (#17)
All checks were successful
Build ptprnt / build (push) Successful in 3m47s
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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user