Add settings screen

This commit is contained in:
2026-05-28 21:32:52 +02:00
parent f8f7c7a9b6
commit e158f50970
5 changed files with 129 additions and 1 deletions
+2
View File
@@ -60,6 +60,8 @@ void training_screenTraining2(
void menu_changeBackgroundScreen(
TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* uiSpriteData
);
void menu_settingsScreen(TFT_eSprite &bg, TFT_eSprite &mainChara, struct SpriteData *spriteData);
void menu_settingsScreen_drawEntry(uint8_t entryId, const char *textEntry);
void menu_sleepScreen_sleepAction();
void menu_sleepScreen_recalculateSleep();
+6
View File
@@ -73,6 +73,12 @@ void menu_drawCurrentMenuOption(TFT_eSprite& bg, TFT_eSprite &icon, struct Sprit
return;
break;
case SETTINGS_SCREEN_MENU:
menuKey = STATUS_SCREEN;
screenKey = SETTINGS_SCREEN;
return;
break;
default:
break;
}
+101
View File
@@ -0,0 +1,101 @@
#include "buttons/buttons.h"
#include "defs/chara_data.h"
#include "defs/defs.h"
#include "display/display.h"
#include "draw/draw.h"
#include "menu.h"
#include "vpet/vpet/vpet.h"
enum SettingsItemType {
SETTINGS_SUBMENU,
SETTINGS_ACTION
};
struct SettingsMenuItem {
const char* label;
SettingsItemType type;
uint8_t targetScreen;
void (*actionFunction)();
bool* stateValue;
};
void switchSoundState() {
if (soundEnabled) {
pinMode(SPK_PIN, INPUT);
} else {
pinMode(SPK_PIN, OUTPUT);
}
soundEnabled = !soundEnabled;
printf("[SETTINGS] soundEnabled=%i\n", soundEnabled);
}
void switchScreenState() {
alwaysOnEnabled = !alwaysOnEnabled;
printf("[SETTINGS] alwaysOnEnabled=%i\n", alwaysOnEnabled);
}
void menu_settingsScreen(TFT_eSprite &bg, TFT_eSprite &mainChara, struct SpriteData *spriteData)
{
static uint8_t arrowPosition = 0;
static SettingsMenuItem menuItems[] = {
{ "BG", SETTINGS_SUBMENU, BACKGROUND_CHANGE_SCREEN, nullptr, nullptr },
{ "SOUND", SETTINGS_ACTION, 0, switchSoundState, &soundEnabled },
{ "ALWAYS ON", SETTINGS_ACTION, 0, switchScreenState, &alwaysOnEnabled }
};
const uint8_t maxItems = sizeof(menuItems) / sizeof(menuItems[0]);
uint8_t pressedButtons = buttons_getPressedButtons();
switch (pressedButtons) {
case K1_PRESSED:
arrowPosition = (arrowPosition + 1) % maxItems;
printf("[SETTINGS] arrowPosition=%i\n", arrowPosition);
break;
case K3_PRESSED:
screenKey = MENU_SCREEN;
return;
case K2_PRESSED:
lastUpdateTime = 0;
if (menuItems[arrowPosition].type == SETTINGS_ACTION) {
if (menuItems[arrowPosition].actionFunction != nullptr) {
menuItems[arrowPosition].actionFunction();
}
} else if (menuItems[arrowPosition].type == SETTINGS_SUBMENU) {
screenKey = menuItems[arrowPosition].targetScreen;
return;
}
break;
default:
break;
}
draw_drawBackground(bg, 90, 90, 3);
const int startX = 20;
const int startY = 10;
const int spacingY = 40;
for (uint8_t i = 0; i < maxItems; i++) {
bool selected = (i == arrowPosition);
int y = startY + (i * spacingY);
tft_drawText(menuItems[i].label, 4, startX, y, selected ? TFT_BLACK : TFT_WHITE, selected ? TFT_WHITE : TFT_TRANSPARENT);
if (menuItems[i].stateValue != nullptr) {
const char* stateText = (*menuItems[i].stateValue) ? "ON" : "OFF";
tft_drawText(stateText, 4, 150, y, selected ? TFT_BLACK : TFT_WHITE, selected ? TFT_WHITE : TFT_TRANSPARENT);
}
}
tft_drawBuffer();
}