Foundation classes for a basic GUI implementing simple widgets and events

Dependents:   TouchScreenGUIDemo

Committer:
duncanFrance
Date:
Sun May 22 16:35:23 2016 +0000
Revision:
17:5184762fda6c
Parent:
16:e9a771ecfdbe
Child:
18:d849f3ada858
Improved Window attach/detach handling; Improved TextWidget MIDDLE layout for multi-line

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),
duncanFrance 12:63db16fea709 9 _renderer(context->fontRenderer()),
duncanFrance 16:e9a771ecfdbe 10 _font(context->defaultFont()),
duncanFrance 16:e9a771ecfdbe 11 _halign(LEFT), _valign(TOP)
duncanFrance 8:a460cabc85ac 12 {
duncanFrance 8:a460cabc85ac 13 }
duncanFrance 8:a460cabc85ac 14
duncanFrance 12:63db16fea709 15 TextWidget::TextWidget(GraphicsContext *context, FontRenderer* renderer) :
duncanFrance 12:63db16fea709 16 Widget(context),
duncanFrance 8:a460cabc85ac 17 _renderer(renderer),
duncanFrance 16:e9a771ecfdbe 18 _font(context->defaultFont()),
duncanFrance 16:e9a771ecfdbe 19 _halign(LEFT), _valign(TOP)
duncanFrance 8:a460cabc85ac 20 {
duncanFrance 8:a460cabc85ac 21 }
duncanFrance 8:a460cabc85ac 22
duncanFrance 12:63db16fea709 23 TextWidget::TextWidget(GraphicsContext *context, FontRenderer* renderer, Font* font) :
duncanFrance 12:63db16fea709 24 Widget(context),
duncanFrance 8:a460cabc85ac 25 _renderer(renderer),
duncanFrance 16:e9a771ecfdbe 26 _font(font),
duncanFrance 16:e9a771ecfdbe 27 _halign(LEFT), _valign(TOP)
duncanFrance 7:303850a4b30c 28 {
duncanFrance 7:303850a4b30c 29 }
duncanFrance 0:0a590815d51c 30
duncanFrance 12:63db16fea709 31 void TextWidget::setText(char* text)
duncanFrance 1:48796b602c86 32 {
duncanFrance 11:b485561aa112 33 _text = text;
duncanFrance 12:63db16fea709 34 dirty();
duncanFrance 0:0a590815d51c 35 }
duncanFrance 0:0a590815d51c 36
duncanFrance 2:bb9183379488 37 void TextWidget::setFont(Font* font)
duncanFrance 1:48796b602c86 38 {
duncanFrance 2:bb9183379488 39 _font = font;
duncanFrance 12:63db16fea709 40 dirty();
duncanFrance 0:0a590815d51c 41 }
duncanFrance 0:0a590815d51c 42
duncanFrance 17:5184762fda6c 43 Font *TextWidget::getFont() {
duncanFrance 17:5184762fda6c 44 return _font;
duncanFrance 17:5184762fda6c 45 }
duncanFrance 17:5184762fda6c 46
duncanFrance 16:e9a771ecfdbe 47 void TextWidget::setHAlign(HAlign alignment) {
duncanFrance 16:e9a771ecfdbe 48 _halign = alignment;
duncanFrance 16:e9a771ecfdbe 49 dirty();
duncanFrance 16:e9a771ecfdbe 50 }
duncanFrance 16:e9a771ecfdbe 51
duncanFrance 16:e9a771ecfdbe 52 void TextWidget::setVAlign(VAlign alignment) {
duncanFrance 16:e9a771ecfdbe 53 _valign = alignment;
duncanFrance 16:e9a771ecfdbe 54 dirty();
duncanFrance 16:e9a771ecfdbe 55 }
duncanFrance 3:cb004f59b715 56
duncanFrance 8:a460cabc85ac 57 void TextWidget::_draw()
duncanFrance 3:cb004f59b715 58 {
duncanFrance 12:63db16fea709 59 Widget::_draw();
duncanFrance 12:63db16fea709 60
duncanFrance 17:5184762fda6c 61 /**
duncanFrance 17:5184762fda6c 62 * Figure out how many lines of text we have
duncanFrance 17:5184762fda6c 63 **/
duncanFrance 17:5184762fda6c 64 int numLines = 1;
duncanFrance 17:5184762fda6c 65 char *c = _text;
duncanFrance 17:5184762fda6c 66 while(*c != NULL) {
duncanFrance 17:5184762fda6c 67 if(*c == '\n') {
duncanFrance 17:5184762fda6c 68 numLines++;
duncanFrance 17:5184762fda6c 69 }
duncanFrance 17:5184762fda6c 70 c++;
duncanFrance 17:5184762fda6c 71 }
duncanFrance 17:5184762fda6c 72
duncanFrance 16:e9a771ecfdbe 73 /******************************************************************/
duncanFrance 16:e9a771ecfdbe 74 /* --------------------------------- ^ */
duncanFrance 16:e9a771ecfdbe 75 /* | | | */
duncanFrance 16:e9a771ecfdbe 76 /* | | | */
duncanFrance 16:e9a771ecfdbe 77 /* | | inner.height */
duncanFrance 16:e9a771ecfdbe 78 /* | | | */
duncanFrance 16:e9a771ecfdbe 79 /* | | | */
duncanFrance 16:e9a771ecfdbe 80 /* | | | */
duncanFrance 16:e9a771ecfdbe 81 /* | | | */
duncanFrance 16:e9a771ecfdbe 82 /* --------------------------------- | */
duncanFrance 16:e9a771ecfdbe 83 /******************************************************************/
duncanFrance 16:e9a771ecfdbe 84 /**
duncanFrance 16:e9a771ecfdbe 85 * We need a window as high as the font with it's origin:
duncanFrance 16:e9a771ecfdbe 86 * VALIGN=TOP : (0, 0)
duncanFrance 17:5184762fda6c 87 * VALIGN=MIDDLE : (0, inner.height/2 - numLines * font.height/2)
duncanFrance 17:5184762fda6c 88 * VALIGN=BOTTOM : (0, inner.height - numLines * font.height)
duncanFrance 16:e9a771ecfdbe 89 **/
duncanFrance 16:e9a771ecfdbe 90 int t=0;
duncanFrance 16:e9a771ecfdbe 91 switch(_valign) {
duncanFrance 16:e9a771ecfdbe 92 case TOP: t = 0; break;
duncanFrance 17:5184762fda6c 93 case MIDDLE: t = (_inner.height - (numLines * _font->zoomedHeight()))/2; break;
duncanFrance 17:5184762fda6c 94 case BOTTOM: t = (_inner.height - (numLines * _font->zoomedHeight())); break;
duncanFrance 16:e9a771ecfdbe 95 }
duncanFrance 13:6714534e7974 96
duncanFrance 16:e9a771ecfdbe 97 _renderer->window(_inner.x, _inner.y + t, _inner.width, _font->zoomedHeight(), false);
duncanFrance 7:303850a4b30c 98 _renderer->setForeground(_fg);
duncanFrance 7:303850a4b30c 99 _renderer->setBackground(_bg);
duncanFrance 12:63db16fea709 100 display()->fillrect(_inner.x, _inner.y, _inner.x+_inner.width, _inner.y+_inner.height, _bg);
duncanFrance 17:5184762fda6c 101 display()->rect(_inner.x, _inner.y, _inner.x+_inner.width, _inner.y+_inner.height, Red);
duncanFrance 8:a460cabc85ac 102
duncanFrance 12:63db16fea709 103 _renderer->puts(_text, display(), _font);
duncanFrance 12:63db16fea709 104 display()->copy_to_lcd();
duncanFrance 8:a460cabc85ac 105 }