More generic Approach for TextBox, same for Components that will be containg Boxes

This commit is contained in:
Yohan Boujon 2023-11-28 21:30:37 +01:00
parent f7d7bd7688
commit 629bae5fd5
4 changed files with 67 additions and 77 deletions

View file

@ -15,30 +15,21 @@ Screen::Screen()
} }
Screen::~Screen() Screen::~Screen()
{ {}
}
void Screen::Setup(uint8_t *font) void Screen::Setup(uint8_t *font)
{ {
_font = font; _font = font;
_screen->setFont(_font); _screen->setFont(_font);
headerSetup = TextBox("Clover Setup", StyleWidth::LEFT, StyleHeight::TOP, U8G2_BTN_INV);
// Static Components // Static Components
connectingWindow.Add(TextBox("connect", StyleWidth::CENTERED, U8G2_BTN_BW0)); connectingWindow.Add({headerSetup, TextBox("connect", StyleWidth::CENTERED, StyleHeight::CENTERED, U8G2_BTN_BW0)});
connectedWindow.Add({TextBox("Connected to Wi-Fi !", StyleWidth::LEFT, U8G2_BTN_BW0), connectedWindow.Add({headerSetup,
TextBox("IP address: ", StyleWidth::LEFT, U8G2_BTN_BW0), TextBox("Connected to Wi-Fi !", StyleWidth::LEFT, StyleHeight::CENTERED, U8G2_BTN_BW0),
TextBox("addr", StyleWidth::CENTERED, U8G2_BTN_BW0)}); TextBox("IP address: ", StyleWidth::LEFT, StyleHeight::CENTERED, U8G2_BTN_BW0),
loopWindow.Add(TextBox("Hello, Plant!", StyleWidth::CENTERED, U8G2_BTN_BW1)); TextBox("addr", StyleWidth::CENTERED, StyleHeight::CENTERED, U8G2_BTN_BW0)});
} loopWindow.Add(TextBox("Hello, Plant!", StyleWidth::CENTERED, StyleHeight::CENTERED, U8G2_BTN_BW1));
uint16_t Screen::setupHeader(const uint16_t w_padding, const uint16_t h_padding)
{
_screen->setFont(u8g2_font_helvB08_tr);
// calculating y position
const uint16_t y = FONT_SIZE + ((w_padding + 1) * 2);
_screen->drawButtonUTF8(w_padding, y, U8G2_BTN_INV, _screen->getDisplayWidth(), h_padding, w_padding, "Clover Setup");
_screen->setFont(_font);
return y;
} }
void Screen::connecting(uint8_t state) void Screen::connecting(uint8_t state)
@ -49,7 +40,6 @@ void Screen::connecting(uint8_t state)
// Connecting dot dot dot (depending on state) // Connecting dot dot dot (depending on state)
strncpy(connectText, "Connecting", connectSize); strncpy(connectText, "Connecting", connectSize);
size_t currentLength = strlen(connectText); size_t currentLength = strlen(connectText);
for (uint8_t i = 0; i < state; i++) for (uint8_t i = 0; i < state; i++)
{ {
// Checking space // Checking space
@ -60,35 +50,28 @@ void Screen::connecting(uint8_t state)
} }
} }
// Displaying connecting text and setup bar.
_screen->clearBuffer(); _screen->clearBuffer();
const auto setupPadding = setupHeader(); // Component
connectingWindow.Update(1, connectText);
// Reactive Component connectingWindow.Display();
connectingWindow.Update(0, connectText);
// Displaying // Displaying
connectingWindow.Display(StyleHeight::CENTERED, setupPadding);
_screen->sendBuffer(); _screen->sendBuffer();
} }
void Screen::connected(const char *ipaddress, uint8_t timing) void Screen::connected(const char *ipaddress, uint8_t timing)
{ {
// Displaying connecting text and setup bar.
_screen->clearBuffer(); _screen->clearBuffer();
const auto setupPadding = setupHeader(); // Component
connectedWindow.Update(3, ipaddress);
// Reactive Component
connectedWindow.Update(2, ipaddress);
// Displaying // Displaying
connectedWindow.Display(StyleHeight::CENTERED, setupPadding, 4); connectedWindow.Display();
// Creating loading bar
// Creating loading timing if (timing != 0)
if(timing !=0)
{ {
_screen->setFont(u8g2_font_3x3basic_tr); _screen->setFont(u8g2_font_3x3basic_tr);
_loading.concat(" "); _loading.concat(" ");
_screen->drawButtonUTF8(0, _screen->getDisplayHeight()-5, U8G2_BTN_INV, _screen->getStrWidth(_loading.c_str()), 0, 0, _loading.c_str()); _screen->drawButtonUTF8(0, _screen->getDisplayHeight() - 5, U8G2_BTN_INV, _screen->getStrWidth(_loading.c_str()), 0, 0, _loading.c_str());
_screen->setFont(_font); _screen->setFont(_font);
} }
_screen->sendBuffer(); _screen->sendBuffer();
@ -97,10 +80,9 @@ void Screen::connected(const char *ipaddress, uint8_t timing)
void Screen::loop() void Screen::loop()
{ {
_screen->clearBuffer(); _screen->clearBuffer();
_screen->setFont(_font); // Component
loopWindow.Display();
loopWindow.Display(StyleHeight::CENTERED); // Displaying
_screen->sendBuffer(); _screen->sendBuffer();
} }

View file

@ -34,9 +34,6 @@ namespace Display
~Screen(); ~Screen();
Screen(const Screen &) = delete; Screen(const Screen &) = delete;
Screen &operator=(const Screen &) = delete; Screen &operator=(const Screen &) = delete;
// Fonctions
uint16_t setupHeader(const uint16_t w_padding = 2, const uint16_t h_padding = 5);
// Variables // Variables
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *_screen; U8G2_SSD1306_128X64_NONAME_F_HW_I2C *_screen;
@ -46,6 +43,7 @@ namespace Display
String _loading; String _loading;
// Static Components // Static Components
TextBox headerSetup;
Components connectingWindow; Components connectingWindow;
Components connectedWindow; Components connectedWindow;
Components loopWindow; Components loopWindow;

View file

@ -23,37 +23,38 @@ void Components::Add(std::vector<TextBox> boxes)
void Components::Update(size_t index, String text) void Components::Update(size_t index, String text)
{ {
_boxes[index].updateString(text); _boxes[index].Update(text);
} }
void Components::Display(StyleHeight sh, uint16_t offset, uint16_t padding) void Components::Display()
{ {
const auto totalTextSize = _boxes.size() * FONT_SIZE; const auto size_boxes = _boxes.size();
const auto centeredOffset = (Screen::GetInstance().getHeight() - totalTextSize) - offset; size_t i(0);
for (size_t i = 0; i < _boxes.size(); i++) for(auto it = _boxes.begin() ; it!= _boxes.end() ;it++)
{ {
const auto x = (_boxes[i].getStyleWidth() == StyleWidth::CENTERED) ? _boxes[i].getX() : _boxes[i].getX()+padding*i; it->Display(size_boxes,i);
switch (sh) if (it+1 != _boxes.end() && ((it+1)->getStyleHeight() == it->getStyleHeight()))
{ i++;
case StyleHeight::TOP: else
Screen::GetInstance().getScreen().drawButtonUTF8(x, (i * FONT_SIZE)+offset+padding*i, _boxes[i].getStyle(), _boxes[i].getTextWidth(), padding, padding, _boxes[i].getString()); i=0;
break;
case StyleHeight::CENTERED:
Screen::GetInstance().getScreen().drawButtonUTF8(x, ((centeredOffset / 2)+i*FONT_SIZE)+offset+padding*i, _boxes[i].getStyle(), _boxes[i].getTextWidth(), padding, padding, _boxes[i].getString());
break;
case StyleHeight::BOTTOM:
Screen::GetInstance().getScreen().drawButtonUTF8(x, (centeredOffset + i * FONT_SIZE)+offset+padding*i, _boxes[i].getStyle(), _boxes[i].getTextWidth(), padding, padding, _boxes[i].getString());
break;
}
} }
} }
TextBox::TextBox(String str, StyleWidth sw, u8g2_uint_t style) TextBox::TextBox()
: _text(str), _style(style), _styleWidth(sw) {}
TextBox::TextBox(String str, StyleWidth sw, StyleHeight sh, u8g2_uint_t style)
: _text(str), _style(style), _styleWidth(sw), _styleHeight(sh)
{ {
Calculate(); Calculate();
} }
void TextBox::Update(String str)
{
_text = str;
Calculate();
}
void TextBox::Calculate() void TextBox::Calculate()
{ {
const auto width = Screen::GetInstance().getWidth(); const auto width = Screen::GetInstance().getWidth();
@ -72,13 +73,23 @@ void TextBox::Calculate()
} }
} }
uint16_t TextBox::getX() { return _x; } void TextBox::Display(size_t size, size_t position)
const char *TextBox::getString() { return _text.c_str(); }
void TextBox::updateString(String str)
{ {
_text = str; const auto centeredOffset = (Screen::GetInstance().getHeight() - (size * FONT_SIZE));
Calculate(); // Later will be used with padding/margin
const auto x = (_styleWidth == StyleWidth::CENTERED) ? _x : _x;
switch (_styleHeight)
{
case StyleHeight::TOP:
Screen::GetInstance().getScreen().drawButtonUTF8(x, (position+1)*FONT_SIZE, _style, _textWidth, 0, 0, _text.c_str());
break;
case StyleHeight::CENTERED:
Screen::GetInstance().getScreen().drawButtonUTF8(x, static_cast<uint16_t>((centeredOffset/2)) + (position+1)*FONT_SIZE, _style, _textWidth, 0, 0, _text.c_str());
break;
case StyleHeight::BOTTOM:
Screen::GetInstance().getScreen().drawButtonUTF8(x, centeredOffset + (position+1)*FONT_SIZE, _style, _textWidth, 0, 0, _text.c_str());
break;
}
} }
u8g2_uint_t TextBox::getStyle() { return _style; }
uint16_t TextBox::getTextWidth() { return _textWidth; } StyleHeight TextBox::getStyleHeight() { return _styleHeight; }
StyleWidth TextBox::getStyleWidth() { return _styleWidth; }

View file

@ -25,19 +25,18 @@ namespace Display
class TextBox class TextBox
{ {
public: public:
TextBox(String str, StyleWidth sw, u8g2_uint_t style); TextBox();
uint16_t getX(); TextBox(String str, StyleWidth sw, StyleHeight sh, u8g2_uint_t style);
const char * getString(); void Display(size_t size, size_t position);
void updateString(String str); void Update(String str);
u8g2_uint_t getStyle(); StyleHeight getStyleHeight();
uint16_t getTextWidth();
StyleWidth getStyleWidth();
private: private:
void Calculate(); void Calculate();
String _text; String _text;
uint8_t *_font; uint8_t *_font;
u8g2_uint_t _style; u8g2_uint_t _style;
StyleWidth _styleWidth; StyleWidth _styleWidth;
StyleHeight _styleHeight;
uint16_t _x; uint16_t _x;
uint16_t _textWidth; uint16_t _textWidth;
}; };
@ -50,7 +49,7 @@ namespace Display
void Add(TextBox box); void Add(TextBox box);
void Add(std::vector<TextBox> boxes); void Add(std::vector<TextBox> boxes);
void Update(size_t index, String text); void Update(size_t index, String text);
void Display(StyleHeight sh=StyleHeight::TOP, uint16_t offset=0, uint16_t padding=0); void Display();
private: private:
// Boxes // Boxes
std::vector<TextBox> _boxes; std::vector<TextBox> _boxes;