Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <TFT_eSPI.h>
- #include <string>
- #include <vector>
- #include <Arduino.h>
- #include <stdio.h>
- #include <functional>
- using namespace std;
- #define AA_FONT_15b NotoSansBold15
- typedef std::vector<std::vector<String>> tableContent;
- typedef std::function<void(int row, int col, String v, TFT_eSprite*)> callback;
- typedef std::function<void(int row, int col, String v)> touchCallback;
- class Table {
- public:
- TFT_eSPI* _tft;
- tableContent _data;
- uint16_t _x;
- uint16_t _y;
- uint16_t _w;
- uint16_t _h;
- uint16_t _colWidth;
- uint16_t _padding = 5;
- std::vector<int> _colWidths = {};
- callback _callback;
- touchCallback _touchCallback;
- const uint16_t rowHeight = 30;
- Table(TFT_eSPI* tft, uint16_t x, uint16_t y, uint16_t w, uint16_t h) {
- _tft = tft;
- _x = x;
- _y = y;
- _w = w;
- _h = h;
- }
- void init(tableContent data) {
- _data = data;
- _colWidth = _w / data.front().size();
- }
- void setColWidths(std::vector<int> widths) {
- _colWidths = widths;
- }
- void setColumnCallback(std::function<void(int, int, String, TFT_eSprite*)> callback) {
- _callback = callback;
- }
- void triggerCallback(int row, int col, String val, TFT_eSprite* sprite) {
- _callback(row, col, val, sprite);
- }
- void setTouchCallback(touchCallback callback) {
- _touchCallback = callback;
- }
- void setTouched(int x, int y) {
- determineCellByAbsoluteCoords(x, y);
- }
- void determineCellByAbsoluteCoords(int x, int y) {
- int innerX = x - _x;
- int innerY = y - _y;
- int rows = _data.size();
- int cols = _data.at(0).size();
- int maxX = _w;
- int maxY = rowHeight * rows;
- int widthSum = 0;
- int heightsum = 0;
- int xClick = -1, yClick = -1;
- if (innerX > maxX || innerY > maxY || innerY < 0 || innerX < 0) {
- return;
- }
- for (int x = 0; x < cols; x++) {
- if (xClick == -1) {
- if (widthSum <= innerX && widthSum + _colWidths.at(x) > innerX) {
- xClick = x;
- }
- widthSum += +_colWidths.at(x);
- }
- }
- for (int y = 0; y < rows; y++) {
- if (yClick == -1) {
- if (heightsum <= innerY && heightsum + rowHeight > innerY) {
- yClick = y;
- }
- heightsum += rowHeight;
- }
- }
- _touchCallback(yClick, xClick, _data.at(yClick).at(xClick));
- }
- void render() {
- if (_data.size() == 0) {
- return;
- }
- auto sprite = TFT_eSprite(&*_tft);
- sprite.loadFont(AA_FONT_15b);
- sprite.createSprite(_w, _h);
- sprite.fillSprite(TFT_WHITE);
- sprite.setCursor(0, 0);
- uint16_t i = 0;
- for (std::vector<String> row : _data) {
- int x = _x;
- int y = _y;
- int16_t j = 0;
- for (String item : row) {
- int16_t distanceXsoFar = 0;
- if (_colWidths.size() == 0) {
- int equalWidth = _w / _data.at(0).size();
- for (int l = 0; l < _data.at(0).size(); l++) {
- _colWidths.push_back(equalWidth);
- }
- }
- for (auto k = 0; k < j; k++) {
- distanceXsoFar += _colWidths.at(k);
- }
- int16_t colXstart = j == 0 ? 0 : distanceXsoFar;
- int16_t colYstartBase = (rowHeight * i);
- int16_t colYstartMiddle = colYstartBase + rowHeight / 2;
- if (i == 0) {
- sprite.drawLine(colXstart, 0, colXstart + _colWidths.at(j), 0, TFT_LIGHTGREY);
- }
- sprite.drawLine(colXstart, colYstartBase, colXstart, colYstartBase + rowHeight, TFT_LIGHTGREY);
- sprite.drawLine(colXstart + _colWidths.at(j), colYstartBase, colXstart + _colWidths.at(j), colYstartBase + rowHeight, TFT_LIGHTGREY);
- sprite.drawLine(colXstart, colYstartBase + rowHeight, colXstart + _colWidths.at(j), colYstartBase + rowHeight, TFT_LIGHTGREY);
- sprite.setTextDatum(CL_DATUM);
- sprite.setTextColor(TFT_DARKGREY, TFT_WHITE);
- triggerCallback(i, j, item, &sprite);
- sprite.drawString(item, colXstart + _padding, colYstartMiddle + 3);
- j++;
- }
- i++;
- }
- sprite.pushSprite(_x, _y);
- sprite.unloadFont();
- }
- };
- class TableData {
- public:
- TableData(tableContent data) {
- _data = data;
- }
- tableContent _data;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement