Foundation classes for a basic GUI implementing simple widgets and events. (Fork for custom changes.)

Fork of SimpleGUI by Duncan McIntyre

Committer:
elh
Date:
Tue Oct 18 19:43:15 2016 +0000
Revision:
20:ef07d42ea062
Parent:
18:d849f3ada858
Initialize Textwidgets _text to NULL preventing crash if widget is draw until a text was set.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
duncanFrance 0:0a590815d51c 1 #include "TextWidget.h"
duncanFrance 0:0a590815d51c 2
duncanFrance 0:0a590815d51c 3 /**
duncanFrance 0:0a590815d51c 4 * A basic widget implementation which just draws some text.
duncanFrance 0:0a590815d51c 5 * If the text does not fit in the bounding-box it will be clipped
duncanFrance 0:0a590815d51c 6 **/
duncanFrance 12:63db16fea709 7 TextWidget::TextWidget(GraphicsContext *context) :
duncanFrance 12:63db16fea709 8 Widget(context),
elh 20:ef07d42ea062 9 _text(NULL),
duncanFrance 12:63db16fea709 10 _renderer(context->fontRenderer()),
duncanFrance 16:e9a771ecfdbe 11 _font(context->defaultFont()),
duncanFrance 16:e9a771ecfdbe 12 _halign(LEFT), _valign(TOP)
duncanFrance 8:a460cabc85ac 13 {
duncanFrance 8:a460cabc85ac 14 }
duncanFrance 8:a460cabc85ac 15
duncanFrance 12:63db16fea709 16 TextWidget::TextWidget(GraphicsContext *context, FontRenderer* renderer) :
duncanFrance 12:63db16fea709 17 Widget(context),
elh 20:ef07d42ea062 18 _text(NULL),
duncanFrance 8:a460cabc85ac 19 _renderer(renderer),
duncanFrance 16:e9a771ecfdbe 20 _font(context->defaultFont()),
duncanFrance 16:e9a771ecfdbe 21 _halign(LEFT), _valign(TOP)
duncanFrance 8:a460cabc85ac 22 {
duncanFrance 8:a460cabc85ac 23 }
duncanFrance 8:a460cabc85ac 24
duncanFrance 12:63db16fea709 25 TextWidget::TextWidget(GraphicsContext *context, FontRenderer* renderer, Font* font) :
duncanFrance 12:63db16fea709 26 Widget(context),
elh 20:ef07d42ea062 27 _text(NULL),
duncanFrance 8:a460cabc85ac 28 _renderer(renderer),
duncanFrance 16:e9a771ecfdbe 29 _font(font),
duncanFrance 16:e9a771ecfdbe 30 _halign(LEFT), _valign(TOP)
duncanFrance 7:303850a4b30c 31 {
duncanFrance 7:303850a4b30c 32 }
duncanFrance 0:0a590815d51c 33
duncanFrance 12:63db16fea709 34 void TextWidget::setText(char* text)
duncanFrance 1:48796b602c86 35 {
duncanFrance 11:b485561aa112 36 _text = text;
duncanFrance 12:63db16fea709 37 dirty();
duncanFrance 0:0a590815d51c 38 }
duncanFrance 0:0a590815d51c 39
duncanFrance 2:bb9183379488 40 void TextWidget::setFont(Font* font)
duncanFrance 1:48796b602c86 41 {
duncanFrance 2:bb9183379488 42 _font = font;
duncanFrance 12:63db16fea709 43 dirty();
duncanFrance 0:0a590815d51c 44 }
duncanFrance 0:0a590815d51c 45
duncanFrance 17:5184762fda6c 46 Font *TextWidget::getFont() {
duncanFrance 17:5184762fda6c 47 return _font;
duncanFrance 17:5184762fda6c 48 }
duncanFrance 17:5184762fda6c 49
duncanFrance 16:e9a771ecfdbe 50 void TextWidget::setHAlign(HAlign alignment) {
duncanFrance 16:e9a771ecfdbe 51 _halign = alignment;
duncanFrance 16:e9a771ecfdbe 52 dirty();
duncanFrance 16:e9a771ecfdbe 53 }
duncanFrance 16:e9a771ecfdbe 54
duncanFrance 16:e9a771ecfdbe 55 void TextWidget::setVAlign(VAlign alignment) {
duncanFrance 16:e9a771ecfdbe 56 _valign = alignment;
duncanFrance 16:e9a771ecfdbe 57 dirty();
duncanFrance 16:e9a771ecfdbe 58 }
duncanFrance 3:cb004f59b715 59
duncanFrance 8:a460cabc85ac 60 void TextWidget::_draw()
duncanFrance 3:cb004f59b715 61 {
duncanFrance 12:63db16fea709 62 Widget::_draw();
duncanFrance 12:63db16fea709 63
duncanFrance 17:5184762fda6c 64 /**
duncanFrance 17:5184762fda6c 65 * Figure out how many lines of text we have
duncanFrance 17:5184762fda6c 66 **/
duncanFrance 17:5184762fda6c 67 int numLines = 1;
duncanFrance 17:5184762fda6c 68 char *c = _text;
duncanFrance 17:5184762fda6c 69 while(*c != NULL) {
duncanFrance 17:5184762fda6c 70 if(*c == '\n') {
duncanFrance 17:5184762fda6c 71 numLines++;
duncanFrance 17:5184762fda6c 72 }
duncanFrance 17:5184762fda6c 73 c++;
duncanFrance 17:5184762fda6c 74 }
duncanFrance 17:5184762fda6c 75
duncanFrance 16:e9a771ecfdbe 76 /******************************************************************/
duncanFrance 16:e9a771ecfdbe 77 /* --------------------------------- ^ */
duncanFrance 16:e9a771ecfdbe 78 /* | | | */
duncanFrance 16:e9a771ecfdbe 79 /* | | | */
duncanFrance 16:e9a771ecfdbe 80 /* | | inner.height */
duncanFrance 16:e9a771ecfdbe 81 /* | | | */
duncanFrance 16:e9a771ecfdbe 82 /* | | | */
duncanFrance 16:e9a771ecfdbe 83 /* | | | */
duncanFrance 16:e9a771ecfdbe 84 /* | | | */
duncanFrance 16:e9a771ecfdbe 85 /* --------------------------------- | */
duncanFrance 16:e9a771ecfdbe 86 /******************************************************************/
duncanFrance 16:e9a771ecfdbe 87 /**
duncanFrance 16:e9a771ecfdbe 88 * We need a window as high as the font with it's origin:
duncanFrance 16:e9a771ecfdbe 89 * VALIGN=TOP : (0, 0)
duncanFrance 17:5184762fda6c 90 * VALIGN=MIDDLE : (0, inner.height/2 - numLines * font.height/2)
duncanFrance 17:5184762fda6c 91 * VALIGN=BOTTOM : (0, inner.height - numLines * font.height)
duncanFrance 16:e9a771ecfdbe 92 **/
duncanFrance 18:d849f3ada858 93 int offset=0;
duncanFrance 16:e9a771ecfdbe 94 switch(_valign) {
duncanFrance 18:d849f3ada858 95 case TOP: offset = 0; break;
duncanFrance 18:d849f3ada858 96 case MIDDLE: offset = (_inner.height - (numLines * _font->zoomedHeight()))/2; break;
duncanFrance 18:d849f3ada858 97 case BOTTOM: offset = (_inner.height - (numLines * _font->zoomedHeight())); break;
duncanFrance 18:d849f3ada858 98 }
duncanFrance 18:d849f3ada858 99
duncanFrance 18:d849f3ada858 100 _renderer->setForeground(_fg);
duncanFrance 18:d849f3ada858 101 _renderer->setBackground(_bg);
duncanFrance 18:d849f3ada858 102
duncanFrance 18:d849f3ada858 103 // Renderer window is only high enough for the number of lines to draw.
duncanFrance 18:d849f3ada858 104 int h = _font->zoomedHeight() * numLines;
duncanFrance 18:d849f3ada858 105 // Clip to fit within the TextWidget inner
duncanFrance 18:d849f3ada858 106 if((h + offset) > _inner.height) {
duncanFrance 18:d849f3ada858 107 h = _inner.height - offset;
duncanFrance 16:e9a771ecfdbe 108 }
duncanFrance 13:6714534e7974 109
duncanFrance 18:d849f3ada858 110 _renderer->window(_inner.x, _inner.y + offset, _inner.width, h, false);
duncanFrance 12:63db16fea709 111 _renderer->puts(_text, display(), _font);
duncanFrance 12:63db16fea709 112 display()->copy_to_lcd();
duncanFrance 8:a460cabc85ac 113 }