103 lines
2.7 KiB
C++
103 lines
2.7 KiB
C++
#include "OledMenuDriver.h"
|
|
#include "OledMenuPaint.h"
|
|
#include "../2025_include_user/OledMenuConfig.h"
|
|
|
|
const MenuPaint::Menu *MenuPaint::currentMenu = nullptr;
|
|
uint8_t MenuPaint::currentMenuSize = 0;
|
|
int8_t MenuPaint::selectIndex = 0;
|
|
int8_t MenuPaint::scrollOffset = 0;
|
|
bool MenuPaint::switchStates[20] = {0};
|
|
const MenuPaint::Menu *MenuPaint::menuStack[5] = {nullptr};
|
|
uint8_t MenuPaint::stackIndex = 0;
|
|
|
|
void MenuPaint::Init() {
|
|
currentMenu = menuRoot;
|
|
currentMenuSize = sizeof(menuRoot) / sizeof(Menu);
|
|
selectIndex = 0;
|
|
scrollOffset = 0;
|
|
}
|
|
|
|
void MenuPaint::Paint() {
|
|
MenuDriver::canvasClear();
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
int itemIndex = scrollOffset + i;
|
|
if (itemIndex >= currentMenuSize) break;
|
|
|
|
const Menu &item = currentMenu[itemIndex];
|
|
|
|
bool selected = (itemIndex == selectIndex);
|
|
bool checked = false;
|
|
|
|
if (item.type == MENU_TYPE_SWITCH) {
|
|
checked = switchStates[item.switchId];
|
|
}
|
|
|
|
RenderItem(16 * i, item.name, selected, checked);
|
|
}
|
|
|
|
MenuDriver::canvasUpdate();
|
|
}
|
|
|
|
void MenuPaint::RenderItem(int y, const char *text, bool selected, bool checked) {
|
|
MenuDriver::drawChinese(0, y + 12, text);
|
|
|
|
if (selected) {
|
|
MenuDriver::drawFrame(0, y, 128, 16);
|
|
}
|
|
|
|
if (checked) {
|
|
MenuDriver::drawCheckMark(128 - 12, y + 2, 10, 10);
|
|
}
|
|
}
|
|
|
|
void MenuPaint::ScrollUp() {
|
|
if (selectIndex > 0) {
|
|
selectIndex--;
|
|
if (selectIndex < scrollOffset) scrollOffset--;
|
|
Paint();
|
|
}
|
|
}
|
|
|
|
void MenuPaint::ScrollDown() {
|
|
if (selectIndex < currentMenuSize - 1) {
|
|
selectIndex++;
|
|
if (selectIndex >= scrollOffset + 4) scrollOffset++;
|
|
Paint();
|
|
}
|
|
}
|
|
|
|
void MenuPaint::Enter() {
|
|
const Menu &item = currentMenu[selectIndex];
|
|
if (item.type == MENU_TYPE_FOLDER && item.subMenus != nullptr) {
|
|
if (stackIndex < 5) {
|
|
menuStack[stackIndex++] = currentMenu;
|
|
}
|
|
currentMenu = item.subMenus;
|
|
currentMenuSize = item.subMenuCount;
|
|
selectIndex = 0;
|
|
scrollOffset = 0;
|
|
Paint();
|
|
} else if (item.type == MENU_TYPE_SWITCH) {
|
|
if (item.switchId < sizeof(switchStates)) {
|
|
switchStates[item.switchId] = !switchStates[item.switchId];
|
|
}
|
|
Paint();
|
|
}
|
|
}
|
|
|
|
void MenuPaint::Exit() {
|
|
if (stackIndex > 0) {
|
|
currentMenu = menuStack[--stackIndex];
|
|
currentMenuSize = sizeof(menuRoot) / sizeof(Menu); // 示例只返回一级
|
|
selectIndex = 0;
|
|
scrollOffset = 0;
|
|
Paint();
|
|
}
|
|
}
|
|
|
|
bool MenuPaint::GetSwitchState(uint8_t switchId) {
|
|
if (switchId >= sizeof(switchStates)) return false;
|
|
return switchStates[switchId];
|
|
}
|