ELEC2645 (2018/19) / Mbed 2 deprecated el17ajf

Dependencies:   mbed

Fork of el17ajf by Angus Findlay

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?

UserRevisionLine numberNew 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 };