Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of el17ajf by
Menus/UI/UI.cpp@30:11838cb6979f, 2019-04-13 (annotated)
- Committer:
- el17ajf
- Date:
- Sat Apr 13 09:29:37 2019 +0000
- Revision:
- 30:11838cb6979f
- Parent:
- 27:2ed9e3c9f4e9
- Child:
- 32:7b5a864b9234
Added fancy logo
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| el17ajf | 17:cc448ab7266f | 1 | #include "UI.h" |
| el17ajf | 17:cc448ab7266f | 2 | #include "Graphics.h" |
| el17ajf | 26:baa7077449e7 | 3 | #include "Math.h" |
| el17ajf | 30:11838cb6979f | 4 | #include "Bitmap.h" |
| el17ajf | 26:baa7077449e7 | 5 | |
| el17ajf | 21:62d2b5b73160 | 6 | namespace Menus { |
| el17ajf | 30:11838cb6979f | 7 | |
| el17ajf | 30:11838cb6979f | 8 | const int logo_sprite_data[] = { |
| el17ajf | 30:11838cb6979f | 9 | 1,1,1,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 10 | 1,1,1,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 11 | 1,1,1,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 12 | 1,1,1,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 13 | 1,0,0,0,0,1,1,0,0,1, |
| el17ajf | 30:11838cb6979f | 14 | 1,0,0,0,0,1,1,0,0,1, |
| el17ajf | 30:11838cb6979f | 15 | 1,1,1,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 16 | 1,0,0,1,1,0,0,1,1,1, |
| el17ajf | 30:11838cb6979f | 17 | 1,0,0,1,1,0,0,1,1,1, |
| el17ajf | 30:11838cb6979f | 18 | 1,0,0,0,0,0,0,0,0,1, |
| el17ajf | 30:11838cb6979f | 19 | 1,0,0,0,0,0,0,0,0,1, |
| el17ajf | 30:11838cb6979f | 20 | 1,1,1,0,0,1,1,0,0,1, |
| el17ajf | 30:11838cb6979f | 21 | 1,1,1,0,0,1,1,0,0,1, |
| el17ajf | 30:11838cb6979f | 22 | 1,1,1,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 23 | 1,0,0,0,0,0,0,0,0,1, |
| el17ajf | 30:11838cb6979f | 24 | 1,0,0,0,0,0,0,0,0,1, |
| el17ajf | 30:11838cb6979f | 25 | 1,1,1,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 26 | 1,0,0,0,0,1,1,0,0,1, |
| el17ajf | 30:11838cb6979f | 27 | 1,0,0,0,0,1,1,0,0,1, |
| el17ajf | 30:11838cb6979f | 28 | 1,0,0,1,1,0,0,1,1,1, |
| el17ajf | 30:11838cb6979f | 29 | 1,0,0,1,1,0,0,1,1,1, |
| el17ajf | 30:11838cb6979f | 30 | 1,0,0,0,0,0,0,0,0,1, |
| el17ajf | 30:11838cb6979f | 31 | 1,0,0,0,0,0,0,0,0,1, |
| el17ajf | 30:11838cb6979f | 32 | 1,1,1,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 33 | 1,0,0,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 34 | 1,0,0,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 35 | 1,0,0,0,0,0,0,0,0,1, |
| el17ajf | 30:11838cb6979f | 36 | 1,0,0,0,0,0,0,0,0,1, |
| el17ajf | 30:11838cb6979f | 37 | 1,0,0,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 38 | 1,0,0,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 39 | 1,1,1,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 40 | 1,0,0,1,1,1,1,0,0,1, |
| el17ajf | 30:11838cb6979f | 41 | 1,0,0,1,1,1,1,0,0,1, |
| el17ajf | 30:11838cb6979f | 42 | 1,0,0,0,0,1,1,0,0,1, |
| el17ajf | 30:11838cb6979f | 43 | 1,0,0,0,0,1,1,0,0,1, |
| el17ajf | 30:11838cb6979f | 44 | 1,0,0,0,0,0,0,0,0,1, |
| el17ajf | 30:11838cb6979f | 45 | 1,0,0,0,0,0,0,0,0,1, |
| el17ajf | 30:11838cb6979f | 46 | 1,1,1,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 47 | 1,0,0,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 48 | 1,0,0,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 49 | 1,0,0,0,0,0,0,0,0,1, |
| el17ajf | 30:11838cb6979f | 50 | 1,0,0,0,0,0,0,0,0,1, |
| el17ajf | 30:11838cb6979f | 51 | 1,0,0,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 52 | 1,0,0,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 53 | 1,1,1,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 54 | 1,1,1,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 55 | 1,1,1,1,1,1,1,1,1,1, |
| el17ajf | 30:11838cb6979f | 56 | 1,1,1,1,1,1,1,1,1,1 |
| el17ajf | 30:11838cb6979f | 57 | }; |
| el17ajf | 30:11838cb6979f | 58 | |
| el17ajf | 30:11838cb6979f | 59 | Bitmap logo_sprite(logo_sprite_data, 48, 10); |
| el17ajf | 30:11838cb6979f | 60 | |
| el17ajf | 21:62d2b5b73160 | 61 | UI::UI() { |
| el17ajf | 21:62d2b5b73160 | 62 | reset(); |
| el17ajf | 21:62d2b5b73160 | 63 | } |
| el17ajf | 21:62d2b5b73160 | 64 | |
| el17ajf | 21:62d2b5b73160 | 65 | void UI::reset() { |
| el17ajf | 21:62d2b5b73160 | 66 | buttonCurrentlySelected = 0; |
| el17ajf | 21:62d2b5b73160 | 67 | } |
| el17ajf | 21:62d2b5b73160 | 68 | |
| el17ajf | 21:62d2b5b73160 | 69 | UI::~UI() { |
| el17ajf | 21:62d2b5b73160 | 70 | |
| el17ajf | 21:62d2b5b73160 | 71 | } |
| el17ajf | 16:3f84f2d7b910 | 72 | |
| el17ajf | 21:62d2b5b73160 | 73 | void UI::clear() { |
| el17ajf | 21:62d2b5b73160 | 74 | buttonPressedFrame = false; |
| el17ajf | 21:62d2b5b73160 | 75 | nextYPos = PADDING_Y; |
| el17ajf | 21:62d2b5b73160 | 76 | buttonCurrentlyDrawing = -1; |
| el17ajf | 27:2ed9e3c9f4e9 | 77 | frame++; |
| el17ajf | 21:62d2b5b73160 | 78 | } |
| el17ajf | 17:cc448ab7266f | 79 | |
| el17ajf | 21:62d2b5b73160 | 80 | void UI::drawTitle(const char * text) { |
| el17ajf | 21:62d2b5b73160 | 81 | drawLabel(text); |
| el17ajf | 21:62d2b5b73160 | 82 | } |
| el17ajf | 17:cc448ab7266f | 83 | |
| el17ajf | 21:62d2b5b73160 | 84 | void UI::drawLabel(const char * text) { |
| el17ajf | 21:62d2b5b73160 | 85 | Graphics::UI::drawText(PADDING_X, nextY(), text); |
| el17ajf | 21:62d2b5b73160 | 86 | } |
| el17ajf | 21:62d2b5b73160 | 87 | |
| el17ajf | 27:2ed9e3c9f4e9 | 88 | void UI::drawFlashingLabel(const char * text) { |
| el17ajf | 27:2ed9e3c9f4e9 | 89 | Graphics::UI::drawText(PADDING_X, nextY(), (frame % 16) > 8 ? text : ""); |
| el17ajf | 27:2ed9e3c9f4e9 | 90 | } |
| el17ajf | 27:2ed9e3c9f4e9 | 91 | |
| el17ajf | 21:62d2b5b73160 | 92 | void UI::newLine() { |
| el17ajf | 21:62d2b5b73160 | 93 | nextY(); |
| el17ajf | 21:62d2b5b73160 | 94 | } |
| el17ajf | 17:cc448ab7266f | 95 | |
| el17ajf | 26:baa7077449e7 | 96 | int oldBorderX1,oldBorderY1, oldBorderX2, oldBorderY2; |
| el17ajf | 26:baa7077449e7 | 97 | |
| el17ajf | 21:62d2b5b73160 | 98 | bool UI::drawAndCheckButton(const char * text) { |
| el17ajf | 21:62d2b5b73160 | 99 | buttonCurrentlyDrawing++; |
| el17ajf | 21:62d2b5b73160 | 100 | |
| el17ajf | 21:62d2b5b73160 | 101 | int y = nextY(); |
| el17ajf | 21:62d2b5b73160 | 102 | |
| el17ajf | 21:62d2b5b73160 | 103 | Graphics::UI::drawText(PADDING_X, y, text); |
| el17ajf | 21:62d2b5b73160 | 104 | |
| el17ajf | 21:62d2b5b73160 | 105 | bool selected = buttonCurrentlyDrawing == buttonCurrentlySelected; |
| el17ajf | 21:62d2b5b73160 | 106 | |
| el17ajf | 21:62d2b5b73160 | 107 | int wordWidth = strlen(text) * (Graphics::UI::CHAR_WIDTH + Graphics::UI::CHAR_SPACE) - 1; |
| el17ajf | 21:62d2b5b73160 | 108 | |
| el17ajf | 21:62d2b5b73160 | 109 | if (selected) { |
| el17ajf | 26:baa7077449e7 | 110 | int borderX1 = PADDING_X - 2; |
| el17ajf | 26:baa7077449e7 | 111 | int borderY1 = y - 2; |
| el17ajf | 26:baa7077449e7 | 112 | int borderX2 = PADDING_X + wordWidth + 2; |
| el17ajf | 26:baa7077449e7 | 113 | int borderY2 = y + Graphics::UI::CHAR_HEIGHT + 1; |
| el17ajf | 21:62d2b5b73160 | 114 | Graphics::UI::drawBorder( |
| el17ajf | 26:baa7077449e7 | 115 | Math::lerp(oldBorderX1, borderX1), |
| el17ajf | 26:baa7077449e7 | 116 | Math::lerp(oldBorderY1, borderY1), |
| el17ajf | 26:baa7077449e7 | 117 | Math::lerp(oldBorderX2, borderX2), |
| el17ajf | 26:baa7077449e7 | 118 | Math::lerp(oldBorderY2, borderY2) |
| el17ajf | 21:62d2b5b73160 | 119 | ); |
| el17ajf | 26:baa7077449e7 | 120 | oldBorderX1 = Math::lerp(oldBorderX1, borderX1); |
| el17ajf | 26:baa7077449e7 | 121 | oldBorderY1 = Math::lerp(oldBorderY1, borderY1); |
| el17ajf | 26:baa7077449e7 | 122 | oldBorderX2 = Math::lerp(oldBorderX2, borderX2); |
| el17ajf | 26:baa7077449e7 | 123 | oldBorderY2 = Math::lerp(oldBorderY2, borderY2); |
| el17ajf | 21:62d2b5b73160 | 124 | } |
| el17ajf | 18:24ce897024d0 | 125 | |
| el17ajf | 21:62d2b5b73160 | 126 | return buttonPressedFrame && selected; |
| el17ajf | 17:cc448ab7266f | 127 | } |
| el17ajf | 21:62d2b5b73160 | 128 | |
| el17ajf | 30:11838cb6979f | 129 | void UI::drawLogo() { |
| el17ajf | 30:11838cb6979f | 130 | Graphics::UI::drawSprite(&logo_sprite, 0, 0); |
| el17ajf | 30:11838cb6979f | 131 | newLine(); |
| el17ajf | 30:11838cb6979f | 132 | } |
| el17ajf | 30:11838cb6979f | 133 | |
| el17ajf | 21:62d2b5b73160 | 134 | void UI::selectNextButton() { |
| el17ajf | 21:62d2b5b73160 | 135 | if (buttonCurrentlySelected < buttonCurrentlyDrawing) { |
| el17ajf | 21:62d2b5b73160 | 136 | buttonCurrentlySelected++; |
| el17ajf | 21:62d2b5b73160 | 137 | } |
| el17ajf | 21:62d2b5b73160 | 138 | } |
| el17ajf | 21:62d2b5b73160 | 139 | |
| el17ajf | 21:62d2b5b73160 | 140 | void UI::selectPreviousButton() { |
| el17ajf | 21:62d2b5b73160 | 141 | if (buttonCurrentlySelected > 0) { |
| el17ajf | 21:62d2b5b73160 | 142 | buttonCurrentlySelected--; |
| el17ajf | 21:62d2b5b73160 | 143 | } |
| el17ajf | 17:cc448ab7266f | 144 | } |
| el17ajf | 21:62d2b5b73160 | 145 | |
| el17ajf | 21:62d2b5b73160 | 146 | void UI::pressButton() { |
| el17ajf | 21:62d2b5b73160 | 147 | buttonPressedFrame = true; |
| el17ajf | 17:cc448ab7266f | 148 | } |
| el17ajf | 21:62d2b5b73160 | 149 | |
| el17ajf | 21:62d2b5b73160 | 150 | int UI::nextY() { |
| el17ajf | 21:62d2b5b73160 | 151 | int currentYPos = nextYPos; |
| el17ajf | 21:62d2b5b73160 | 152 | nextYPos += Graphics::UI::CHAR_HEIGHT + LINE_PADDING; |
| el17ajf | 21:62d2b5b73160 | 153 | return currentYPos; |
| el17ajf | 21:62d2b5b73160 | 154 | } |
| el17ajf | 21:62d2b5b73160 | 155 | }; |
