92 lines
2.7 KiB
C++
92 lines
2.7 KiB
C++
#include "Menu.h"
|
|
#include "Programs/Snake/Snake.h"
|
|
#include "Programs/Settings/Settings.h"
|
|
#include "Programs/Asteroids/Asteroids.h"
|
|
#include "Programs/Calculator/Calculator.h"
|
|
|
|
// ... include headers for your other programs here
|
|
void requestProgramChange(Program* program);
|
|
|
|
namespace Menu {
|
|
|
|
// --- 1. Define the MenuItem struct ---
|
|
struct MenuItem {
|
|
const char* text;
|
|
Program* program;
|
|
};
|
|
|
|
// --- 2. Create the menuItems array ---
|
|
MenuItem menuItems[] = {
|
|
{"Snake", new Snake::Snake()},
|
|
{"Settings", new Settings::Settings()},
|
|
{"Asteroids", new Asteroids::Asteroids()},
|
|
{"Calculator", new Calculator::Calculator()}
|
|
};
|
|
|
|
const int TOTAL_MENU_ITEMS = sizeof(menuItems) / sizeof(menuItems[0]);
|
|
const int MAX_VISIBLE_ITEMS = 6;
|
|
const int FONT_HEIGHT = 8;
|
|
|
|
// --- 3. Implement the Menu class methods ---
|
|
|
|
int selectedIndex = 0;
|
|
int viewOffset = 0;
|
|
|
|
void Menu::setup() {
|
|
// Not needed for the menu
|
|
}
|
|
|
|
void Menu::onEnter(Adafruit_SSD1351 *tft) {
|
|
// Reset the menu state when we enter it
|
|
selectedIndex = 0;
|
|
viewOffset = 0;
|
|
Menu::disableInfoBar = false;
|
|
tft->fillRect(0, 0, 128, 128, BLACK);
|
|
}
|
|
|
|
void Menu::onExit() {
|
|
// Not needed for the menu
|
|
}
|
|
|
|
void Menu::loop(Adafruit_SSD1351 *tft, inputData *userInputs) {
|
|
// --- Input Handling ---
|
|
static int previousJoystickCommand = COMMAND_NO;
|
|
int currentJoystickCommand = userInputs->joystickCommand;
|
|
|
|
if ((currentJoystickCommand & COMMAND_DOWN) && !(previousJoystickCommand & COMMAND_DOWN)) {
|
|
selectedIndex++;
|
|
if (selectedIndex >= TOTAL_MENU_ITEMS) {
|
|
selectedIndex = 0;
|
|
}
|
|
}
|
|
if ((currentJoystickCommand & COMMAND_UP) && !(previousJoystickCommand & COMMAND_UP)) {
|
|
selectedIndex--;
|
|
if (selectedIndex < 0) {
|
|
selectedIndex = TOTAL_MENU_ITEMS - 1;
|
|
}
|
|
}
|
|
|
|
previousJoystickCommand = currentJoystickCommand;
|
|
|
|
// --- Drawing ---
|
|
for (int i = 0; i < MAX_VISIBLE_ITEMS; i++) {
|
|
int itemIndex = i + viewOffset;
|
|
if (itemIndex < TOTAL_MENU_ITEMS) {
|
|
int yPos = 20 + i * (FONT_HEIGHT + 2);
|
|
tft->setCursor(10, yPos);
|
|
if (itemIndex == selectedIndex) {
|
|
tft->setTextColor(BLACK, WHITE);
|
|
} else {
|
|
tft->setTextColor(WHITE, BLACK);
|
|
}
|
|
tft->println(menuItems[itemIndex].text);
|
|
}
|
|
}
|
|
|
|
// --- Program Switching ---
|
|
if (userInputs->buttonTop.isReleased()) {
|
|
requestProgramChange(menuItems[selectedIndex].program);
|
|
}
|
|
}
|
|
|
|
} |