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

@@ -32,31 +32,34 @@
namespace ptprnt::graphics {
// Custom deleters for Cairo/Pango resources
// Forward declaration
class ICairoWrapper;
// Custom deleters for Cairo/Pango resources that use the wrapper
// Implementation in Label.cpp to avoid incomplete type issues
struct CairoSurfaceDeleter {
void operator()(cairo_surface_t* surface) const {
if (surface)
cairo_surface_destroy(surface);
}
std::shared_ptr<ICairoWrapper> wrapper;
void operator()(cairo_surface_t* surface) const;
};
struct CairoDeleter {
void operator()(cairo_t* cr) const {
if (cr)
cairo_destroy(cr);
}
std::shared_ptr<ICairoWrapper> wrapper;
void operator()(cairo_t* cr) const;
};
struct GObjectDeleter {
void operator()(gpointer obj) const {
if (obj)
g_object_unref(obj);
}
std::shared_ptr<ICairoWrapper> wrapper;
void operator()(gpointer obj) const;
};
class Label : public ILabel {
public:
Label(const uint16_t heightPixel);
// Default constructor using real Cairo/Pango implementation
explicit Label(uint16_t heightPixel);
// Constructor for dependency injection (testing)
Label(uint16_t heightPixel, std::shared_ptr<ICairoWrapper> cairoWrapper);
~Label() override;
Label(const Label&) = delete;
@@ -67,9 +70,9 @@ class Label : public ILabel {
bool create(PrintableText printableText) override;
bool create(const std::string& labelText) override;
void writeToPng(const std::string& file);
[[nodiscard]] int getWidth() override;
[[nodiscard]] int getHeight() override;
[[nodiscard]] std::vector<uint8_t> getRaw() override;
[[nodiscard]] int getWidth() const override;
[[nodiscard]] int getHeight() const override;
[[nodiscard]] std::vector<uint8_t> getRaw() const override;
void setFontSize(const double fontSize) override;
void setFontFamily(const std::string& fontFamily) override;
@@ -77,6 +80,8 @@ class Label : public ILabel {
void setHAlign(HAlignPosition hpos) override;
void setVAlign(VAlignPosition vpos) override;
bool append(const ILabel& other, uint32_t spacingPx = 60) override;
private:
// methods
[[nodiscard]] uint8_t getNumLines(std::string_view str);
@@ -84,6 +89,9 @@ class Label : public ILabel {
void configureLayout(PangoLayout* layout, const std::string& text, PangoFontDescription* fontDesc);
void applyHorizontalAlignment(PangoLayout* layout);
// Cairo/Pango wrapper for dependency injection
std::shared_ptr<ICairoWrapper> mCairoWrapper;
std::unique_ptr<cairo_surface_t, CairoSurfaceDeleter> mSurface{nullptr};
std::unique_ptr<cairo_t, CairoDeleter> mCairoCtx{nullptr};
std::unique_ptr<PangoContext, GObjectDeleter> mPangoCtx{nullptr};