Advertisement
toaspzoo

Table.h

Mar 1st, 2023 (edited)
568
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.76 KB | None | 0 0
  1. #include <TFT_eSPI.h>  
  2. #include <string>
  3. #include <vector>
  4. #include <Arduino.h>
  5. #include <stdio.h>
  6. #include <functional>
  7. using namespace std;
  8.  
  9. #define AA_FONT_15b NotoSansBold15
  10.  
  11. typedef std::vector<std::vector<String>> tableContent;
  12. typedef std::function<void(int row, int col, String v, TFT_eSprite*)> callback;
  13. typedef std::function<void(int row, int col, String v)> touchCallback;
  14.  
  15. class Table {
  16. public:
  17.     TFT_eSPI* _tft;
  18.     tableContent _data;
  19.     uint16_t _x;
  20.     uint16_t _y;
  21.     uint16_t _w;
  22.     uint16_t _h;
  23.     uint16_t _colWidth;
  24.     uint16_t _padding = 5;
  25.     std::vector<int> _colWidths = {};
  26.     callback _callback;
  27.     touchCallback _touchCallback;
  28.     const uint16_t rowHeight = 30;
  29.  
  30.     Table(TFT_eSPI* tft, uint16_t x, uint16_t y, uint16_t w, uint16_t h) {
  31.         _tft = tft;
  32.         _x = x;
  33.         _y = y;
  34.         _w = w;
  35.         _h = h;
  36.     }
  37.  
  38.     void init(tableContent data) {
  39.         _data = data;
  40.         _colWidth = _w / data.front().size();
  41.     }
  42.  
  43.     void setColWidths(std::vector<int> widths) {
  44.         _colWidths = widths;
  45.     }
  46.  
  47.     void setColumnCallback(std::function<void(int, int, String, TFT_eSprite*)> callback) {
  48.         _callback = callback;
  49.     }
  50.  
  51.     void triggerCallback(int row, int col, String val, TFT_eSprite* sprite) {
  52.         _callback(row, col, val, sprite);
  53.     }
  54.  
  55.     void setTouchCallback(touchCallback callback) {
  56.         _touchCallback = callback;
  57.     }
  58.  
  59.     void setTouched(int x, int y) {
  60.         determineCellByAbsoluteCoords(x, y);
  61.     }
  62.  
  63.     void determineCellByAbsoluteCoords(int x, int y) {
  64.         int innerX = x - _x;
  65.         int innerY = y - _y;
  66.         int rows = _data.size();
  67.         int cols = _data.at(0).size();
  68.  
  69.         int maxX = _w;
  70.         int maxY = rowHeight * rows;
  71.  
  72.         int widthSum = 0;
  73.         int heightsum = 0;
  74.         int xClick = -1, yClick = -1;
  75.  
  76.         if (innerX > maxX || innerY > maxY || innerY < 0 || innerX < 0) {
  77.             return;
  78.         }
  79.  
  80.         for (int x = 0; x < cols; x++) {
  81.             if (xClick == -1) {
  82.                 if (widthSum <= innerX && widthSum + _colWidths.at(x) > innerX) {
  83.                     xClick = x;
  84.                 }
  85.                 widthSum += +_colWidths.at(x);
  86.             }
  87.         }
  88.         for (int y = 0; y < rows; y++) {
  89.             if (yClick == -1) {
  90.                 if (heightsum <= innerY && heightsum + rowHeight > innerY) {
  91.                     yClick = y;
  92.                 }
  93.                 heightsum += rowHeight;
  94.             }
  95.         }
  96.         _touchCallback(yClick, xClick, _data.at(yClick).at(xClick));
  97.     }
  98.  
  99.     void render() {
  100.         if (_data.size() == 0) {
  101.             return;
  102.         }
  103.  
  104.         auto sprite = TFT_eSprite(&*_tft);
  105.         sprite.loadFont(AA_FONT_15b);
  106.         sprite.createSprite(_w, _h);
  107.         sprite.fillSprite(TFT_WHITE);
  108.         sprite.setCursor(0, 0);
  109.        
  110.         uint16_t i = 0;
  111.         for (std::vector<String> row : _data) {
  112.             int x = _x;
  113.             int y = _y;
  114.  
  115.             int16_t j = 0;
  116.             for (String item : row) {
  117.                 int16_t distanceXsoFar = 0;
  118.                 if (_colWidths.size() == 0) {
  119.                     int equalWidth = _w / _data.at(0).size();
  120.                     for (int l = 0; l < _data.at(0).size(); l++) {
  121.                         _colWidths.push_back(equalWidth);
  122.                     }
  123.                 }
  124.                 for (auto k = 0; k < j; k++) {
  125.                     distanceXsoFar += _colWidths.at(k);
  126.                 }
  127.  
  128.                 int16_t colXstart = j == 0 ? 0 : distanceXsoFar;
  129.                 int16_t colYstartBase = (rowHeight * i);
  130.                 int16_t colYstartMiddle = colYstartBase + rowHeight / 2;
  131.  
  132.                 if (i == 0) {
  133.                     sprite.drawLine(colXstart, 0, colXstart + _colWidths.at(j), 0, TFT_LIGHTGREY);
  134.                 }
  135.                 sprite.drawLine(colXstart, colYstartBase, colXstart, colYstartBase + rowHeight, TFT_LIGHTGREY);
  136.                 sprite.drawLine(colXstart + _colWidths.at(j), colYstartBase, colXstart + _colWidths.at(j), colYstartBase + rowHeight, TFT_LIGHTGREY);
  137.                 sprite.drawLine(colXstart, colYstartBase + rowHeight, colXstart + _colWidths.at(j), colYstartBase + rowHeight, TFT_LIGHTGREY);
  138.  
  139.                 sprite.setTextDatum(CL_DATUM);
  140.                 sprite.setTextColor(TFT_DARKGREY, TFT_WHITE);
  141.                 triggerCallback(i, j, item, &sprite);
  142.                 sprite.drawString(item, colXstart + _padding, colYstartMiddle + 3);
  143.                 j++;
  144.             }
  145.  
  146.             i++;
  147.         }
  148.         sprite.pushSprite(_x, _y);
  149.         sprite.unloadFont();
  150.     }
  151. };
  152.  
  153. class TableData {
  154. public:
  155.     TableData(tableContent data) {
  156.         _data = data;
  157.     }
  158.     tableContent _data;
  159. };
  160.  
  161.  
Tags: tft_espi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement