Foundation classes for a basic GUI implementing simple widgets and events
Dependents: TouchScreenGUIDemo
Widgets/TextWidget.cpp@18:d849f3ada858, 2016-05-28 (annotated)
- Committer:
- duncanFrance
- Date:
- Sat May 28 14:50:14 2016 +0000
- Revision:
- 18:d849f3ada858
- Parent:
- 17:5184762fda6c
Moved the event queue into the EventDispatcher; Improved event handling across Window/Widget
Who changed what in which revision?
User | Revision | Line number | New 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 | 18:d849f3ada858 | 90 | int offset=0; |
duncanFrance | 16:e9a771ecfdbe | 91 | switch(_valign) { |
duncanFrance | 18:d849f3ada858 | 92 | case TOP: offset = 0; break; |
duncanFrance | 18:d849f3ada858 | 93 | case MIDDLE: offset = (_inner.height - (numLines * _font->zoomedHeight()))/2; break; |
duncanFrance | 18:d849f3ada858 | 94 | case BOTTOM: offset = (_inner.height - (numLines * _font->zoomedHeight())); break; |
duncanFrance | 18:d849f3ada858 | 95 | } |
duncanFrance | 18:d849f3ada858 | 96 | |
duncanFrance | 18:d849f3ada858 | 97 | _renderer->setForeground(_fg); |
duncanFrance | 18:d849f3ada858 | 98 | _renderer->setBackground(_bg); |
duncanFrance | 18:d849f3ada858 | 99 | |
duncanFrance | 18:d849f3ada858 | 100 | // Renderer window is only high enough for the number of lines to draw. |
duncanFrance | 18:d849f3ada858 | 101 | int h = _font->zoomedHeight() * numLines; |
duncanFrance | 18:d849f3ada858 | 102 | // Clip to fit within the TextWidget inner |
duncanFrance | 18:d849f3ada858 | 103 | if((h + offset) > _inner.height) { |
duncanFrance | 18:d849f3ada858 | 104 | h = _inner.height - offset; |
duncanFrance | 16:e9a771ecfdbe | 105 | } |
duncanFrance | 13:6714534e7974 | 106 | |
duncanFrance | 18:d849f3ada858 | 107 | _renderer->window(_inner.x, _inner.y + offset, _inner.width, h, false); |
duncanFrance | 12:63db16fea709 | 108 | _renderer->puts(_text, display(), _font); |
duncanFrance | 12:63db16fea709 | 109 | display()->copy_to_lcd(); |
duncanFrance | 8:a460cabc85ac | 110 | } |