/* UTFT_Buttons.cpp - Add-on Library for UTFT: Buttons Copyright (C)2013 Henning Karlsen. All right reserved This library adds simple but easy to use buttons to extend the use of the UTFT and UTouch libraries. You can always find the latest version of the library at http://electronics.henningkarlsen.com/ If you make any modifications or improvements to the code, I would appreciate that you share the code with me so that I might include it in the next release. I can be contacted through http://electronics.henningkarlsen.com/contact.php. This library is free software; you can redistribute it and/or modify it under the terms of the CC BY-NC-SA 3.0 license. Please see the included documents for further information. */ #include "UTFT_Buttons.h" #include #include UTFT_Buttons::UTFT_Buttons(UTFT *ptrUTFT, UTouch *ptrUTouch) { _UTFT = ptrUTFT; _UTouch = ptrUTouch; deleteAllButtons(); _color_text = VGA_WHITE; _color_text_inactive = VGA_GRAY; _color_background = VGA_BLUE; _color_border = VGA_WHITE; _color_hilite = VGA_RED; _font_text = NULL; _font_symbol = NULL; } int UTFT_Buttons::addButton(uint16_t x, uint16_t y, uint16_t width, uint16_t height, char *label, uint16_t flags) { int btcnt = 0; while (((buttons[btcnt].flags & BUTTON_UNUSED) == 0) and (btcntgetFont();; word _current_color = _UTFT->getColor(); word _current_back = _UTFT->getBackColor(); if (buttons[buttonID].flags & BUTTON_BITMAP) { _UTFT->drawBitmap(buttons[buttonID].pos_x, buttons[buttonID].pos_y, buttons[buttonID].width, buttons[buttonID].height, buttons[buttonID].data); if (!(buttons[buttonID].flags & BUTTON_NO_BORDER)) { if ((buttons[buttonID].flags & BUTTON_DISABLED)) _UTFT->setColor(_color_text_inactive); else _UTFT->setColor(_color_border); _UTFT->drawRect(buttons[buttonID].pos_x, buttons[buttonID].pos_y, buttons[buttonID].pos_x+buttons[buttonID].width, buttons[buttonID].pos_y+buttons[buttonID].height); } } else { _UTFT->setColor(_color_background); _UTFT->fillRoundRect(buttons[buttonID].pos_x, buttons[buttonID].pos_y, buttons[buttonID].pos_x+buttons[buttonID].width, buttons[buttonID].pos_y+buttons[buttonID].height); _UTFT->setColor(_color_border); _UTFT->drawRoundRect(buttons[buttonID].pos_x, buttons[buttonID].pos_y, buttons[buttonID].pos_x+buttons[buttonID].width, buttons[buttonID].pos_y+buttons[buttonID].height); if (buttons[buttonID].flags & BUTTON_DISABLED) _UTFT->setColor(_color_text_inactive); else _UTFT->setColor(_color_text); if (buttons[buttonID].flags & BUTTON_SYMBOL) { _UTFT->setFont(_font_symbol); text_x = (buttons[buttonID].width/2) - (_UTFT->getFontXsize()/2) + buttons[buttonID].pos_x; text_y = (buttons[buttonID].height/2) - (_UTFT->getFontYsize()/2) + buttons[buttonID].pos_y; } else { _UTFT->setFont(_font_text); text_x = ((buttons[buttonID].width/2) - ((strlen(buttons[buttonID].label) * _UTFT->getFontXsize())/2)) + buttons[buttonID].pos_x; text_y = (buttons[buttonID].height/2) - (_UTFT->getFontYsize()/2) + buttons[buttonID].pos_y; } _UTFT->setBackColor(_color_background); _UTFT->print(buttons[buttonID].label, text_x, text_y); if ((buttons[buttonID].flags & BUTTON_SYMBOL) and (buttons[buttonID].flags & BUTTON_SYMBOL_REP_3X)) { _UTFT->print(buttons[buttonID].label, text_x-_UTFT->getFontXsize(), text_y); _UTFT->print(buttons[buttonID].label, text_x+_UTFT->getFontXsize(), text_y); } } _UTFT->setFont(_font_current); _UTFT->setColor(_current_color); _UTFT->setBackColor(_current_back); } void UTFT_Buttons::enableButton(int buttonID, boolean redraw) { if (!(buttons[buttonID].flags & BUTTON_UNUSED)) { buttons[buttonID].flags = buttons[buttonID].flags & ~BUTTON_DISABLED; if (redraw) drawButton(buttonID); } } void UTFT_Buttons::disableButton(int buttonID, boolean redraw) { if (!(buttons[buttonID].flags & BUTTON_UNUSED)) { buttons[buttonID].flags = buttons[buttonID].flags | BUTTON_DISABLED; if (redraw) drawButton(buttonID); } } void UTFT_Buttons::relabelButton(int buttonID, char *label, boolean redraw) { if (!(buttons[buttonID].flags & BUTTON_UNUSED)) { buttons[buttonID].label = label; if (redraw) drawButton(buttonID); } } boolean UTFT_Buttons::buttonEnabled(int buttonID) { return !(buttons[buttonID].flags & BUTTON_DISABLED); } void UTFT_Buttons::deleteButton(int buttonID) { if (!(buttons[buttonID].flags & BUTTON_UNUSED)) buttons[buttonID].flags = BUTTON_UNUSED; } void UTFT_Buttons::deleteAllButtons() { for (int i=0;idataAvailable() == true) { _UTouch->read(); int result = -1; int touch_x = _UTouch->getX(); int touch_y = _UTouch->getY(); word _current_color = _UTFT->getColor(); for (int i=0;i= buttons[i].pos_x) and (touch_x <= (buttons[i].pos_x + buttons[i].width)) and (touch_y >= buttons[i].pos_y) and (touch_y <= (buttons[i].pos_y + buttons[i].height))) result = i; } } if (result != -1) { if (!(buttons[result].flags & BUTTON_NO_BORDER)) { _UTFT->setColor(_color_hilite); if (buttons[result].flags & BUTTON_BITMAP) _UTFT->drawRect(buttons[result].pos_x, buttons[result].pos_y, buttons[result].pos_x+buttons[result].width, buttons[result].pos_y+buttons[result].height); else _UTFT->drawRoundRect(buttons[result].pos_x, buttons[result].pos_y, buttons[result].pos_x+buttons[result].width, buttons[result].pos_y+buttons[result].height); } } while (_UTouch->dataAvailable() == true) {}; if (result != -1) { if (!(buttons[result].flags & BUTTON_NO_BORDER)) { _UTFT->setColor(_color_border); if (buttons[result].flags & BUTTON_BITMAP) _UTFT->drawRect(buttons[result].pos_x, buttons[result].pos_y, buttons[result].pos_x+buttons[result].width, buttons[result].pos_y+buttons[result].height); else _UTFT->drawRoundRect(buttons[result].pos_x, buttons[result].pos_y, buttons[result].pos_x+buttons[result].width, buttons[result].pos_y+buttons[result].height); } } _UTFT->setColor(_current_color); return result; } else return -1; } void UTFT_Buttons::setTextFont(uint8_t* font) { _font_text = font; } void UTFT_Buttons::setSymbolFont(uint8_t* font) { _font_symbol = font; } void UTFT_Buttons::setButtonColors(word atxt, word iatxt, word brd, word brdhi, word back) { _color_text = atxt; _color_text_inactive = iatxt; _color_background = back; _color_border = brd; _color_hilite = brdhi; }