Skip to content

Instantly share code, notes, and snippets.

@alvesvaren
Created January 29, 2024 13:36
Show Gist options
  • Select an option

  • Save alvesvaren/767d9585f0ecbef18ef1c7c0492c4332 to your computer and use it in GitHub Desktop.

Select an option

Save alvesvaren/767d9585f0ecbef18ef1c7c0492c4332 to your computer and use it in GitHub Desktop.

Revisions

  1. alvesvaren created this gist Jan 29, 2024.
    57 changes: 57 additions & 0 deletions text_wrap.cpp
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,57 @@
    #include <vector>
    #include <string>
    #include <sstream>
    #include "esphome/components/display/display_buffer.h"
    #include "text_wrap.h"

    using namespace esphome;
    using namespace esphome::display;

    void wrap_text(DisplayBuffer* it, int x, int y, const char* text, Font* font, TextAlign align, float line_height) {
    // Calculate the bounds of a single space character
    int space_x1, space_y1, space_width, space_height;
    it->get_text_bounds(x, y, " ", font, align, &space_x1, &space_y1, &space_width, &space_height);

    // Break text into words
    std::vector<std::string> words;
    std::stringstream ss(text);
    std::string word;
    while (std::getline(ss, word, ' ')) {
    words.push_back(word);
    }

    // Initialize variables for the wrapped text
    int line_x = x;
    int line_y = y;
    int word_x1, word_y1, word_width, word_height;
    std::string line;

    // Iterate through the words and wrap them
    for (const auto& w : words) {
    it->get_text_bounds(line_x, line_y, w.c_str(), font, align, &word_x1, &word_y1, &word_width, &word_height);

    if (line_x + word_width >= it->get_width()) {
    // Print the current line and move to the next line
    it->printf(x, line_y, font, align, "%s", line.c_str());
    line_y += static_cast<int>(word_height * line_height);
    line_x = x;

    // Clear the line buffer
    line.clear();
    }

    // Add the word to the line buffer and move the cursor
    line += w;
    line_x += word_width + space_width;

    // If it's not the last word, add a space
    if (!line.empty() && &w != &words.back()) {
    line += " ";
    }
    }

    // Print the last line
    if (!line.empty()) {
    it->printf(x, line_y, font, align, "%s", line.c_str());
    }
    }
    9 changes: 9 additions & 0 deletions text_wrap.h
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,9 @@
    #pragma once

    #include "esphome/components/display/display_buffer.h"

    void wrap_text(
    esphome::display::DisplayBuffer* it, int x, int y,
    const char* text, esphome::display::Font* font,
    esphome::display::TextAlign align, float line_height
    );