108 lines
3.1 KiB
C++
108 lines
3.1 KiB
C++
/***************************************************************************************
|
|
** Code for the GFX button UI element
|
|
** Grabbed from Adafruit_GFX library and enhanced to handle any label font
|
|
***************************************************************************************/
|
|
TFT_eSPI_Button::TFT_eSPI_Button(void) {
|
|
_gfx = nullptr;
|
|
_xd = 0;
|
|
_yd = 0;
|
|
_textdatum = MC_DATUM;
|
|
_label[9] = '\0';
|
|
currstate = false;
|
|
laststate = false;
|
|
}
|
|
|
|
// Classic initButton() function: pass center & size
|
|
void TFT_eSPI_Button::initButton(
|
|
TFT_eSPI *gfx, int16_t x, int16_t y, uint16_t w, uint16_t h,
|
|
uint16_t outline, uint16_t fill, uint16_t textcolor,
|
|
char *label, uint8_t textsize)
|
|
{
|
|
// Tweak arguments and pass to the newer initButtonUL() function...
|
|
initButtonUL(gfx, x - (w / 2), y - (h / 2), w, h, outline, fill,
|
|
textcolor, label, textsize);
|
|
}
|
|
|
|
// Newer function instead accepts upper-left corner & size
|
|
void TFT_eSPI_Button::initButtonUL(
|
|
TFT_eSPI *gfx, int16_t x1, int16_t y1, uint16_t w, uint16_t h,
|
|
uint16_t outline, uint16_t fill, uint16_t textcolor,
|
|
char *label, uint8_t textsize)
|
|
{
|
|
_x1 = x1;
|
|
_y1 = y1;
|
|
_w = w;
|
|
_h = h;
|
|
_outlinecolor = outline;
|
|
_fillcolor = fill;
|
|
_textcolor = textcolor;
|
|
_textsize = textsize;
|
|
_gfx = gfx;
|
|
strncpy(_label, label, 9);
|
|
}
|
|
|
|
// Adjust text datum and x, y deltas
|
|
void TFT_eSPI_Button::setLabelDatum(int16_t x_delta, int16_t y_delta, uint8_t datum)
|
|
{
|
|
_xd = x_delta;
|
|
_yd = y_delta;
|
|
_textdatum = datum;
|
|
}
|
|
|
|
void TFT_eSPI_Button::drawButton(bool inverted, String long_name) {
|
|
uint16_t fill, outline, text;
|
|
|
|
if(!inverted) {
|
|
fill = _fillcolor;
|
|
outline = _outlinecolor;
|
|
text = _textcolor;
|
|
} else {
|
|
fill = _textcolor;
|
|
outline = _outlinecolor;
|
|
text = _fillcolor;
|
|
}
|
|
|
|
uint8_t r = min(_w, _h) / 4; // Corner radius
|
|
_gfx->fillRoundRect(_x1, _y1, _w, _h, r, fill);
|
|
_gfx->drawRoundRect(_x1, _y1, _w, _h, r, outline);
|
|
|
|
if (_gfx->textfont == 255) {
|
|
_gfx->setCursor(_x1 + (_w / 8),
|
|
_y1 + (_h / 4));
|
|
_gfx->setTextColor(text);
|
|
_gfx->setTextSize(_textsize);
|
|
_gfx->print(_label);
|
|
}
|
|
else {
|
|
_gfx->setTextColor(text, fill);
|
|
_gfx->setTextSize(_textsize);
|
|
|
|
uint8_t tempdatum = _gfx->getTextDatum();
|
|
_gfx->setTextDatum(_textdatum);
|
|
uint16_t tempPadding = _gfx->getTextPadding();
|
|
_gfx->setTextPadding(0);
|
|
|
|
if (long_name == "")
|
|
_gfx->drawString(_label, _x1 + (_w/2) + _xd, _y1 + (_h/2) - 4 + _yd);
|
|
else
|
|
_gfx->drawString(long_name, _x1 + (_w/2) + _xd, _y1 + (_h/2) - 4 + _yd);
|
|
|
|
_gfx->setTextDatum(tempdatum);
|
|
_gfx->setTextPadding(tempPadding);
|
|
}
|
|
}
|
|
|
|
bool TFT_eSPI_Button::contains(int16_t x, int16_t y) {
|
|
return ((x >= _x1) && (x < (_x1 + _w)) &&
|
|
(y >= _y1) && (y < (_y1 + _h)));
|
|
}
|
|
|
|
void TFT_eSPI_Button::press(bool p) {
|
|
laststate = currstate;
|
|
currstate = p;
|
|
}
|
|
|
|
bool TFT_eSPI_Button::isPressed() { return currstate; }
|
|
bool TFT_eSPI_Button::justPressed() { return (currstate && !laststate); }
|
|
bool TFT_eSPI_Button::justReleased() { return (!currstate && laststate); }
|