2026-01-13 02:36:25 -05:00

99 lines
2.0 KiB
C++

#include "icons.h"
#include "menu.h"
#include "pixelstream.h"
using namespace menus;
CMCMenu::CMCMenu(lib::Display& display, uint8_t color) :
Menu(display),
color(color),
current(2),
previous(1),
progress(0.7f)
{
display.clear();
}
void CMCMenu::onTick(float dt)
{
constexpr float CENTER_X = 120;
constexpr float CENTER_Y = 160;
constexpr float DT_SCALE = 1.4f;
constexpr uint8_t STEP = 48;
constexpr uint8_t ERASE_DATA[39 * 5 * 3] = {};
if (progress < 1.0f)
{
for (int8_t dcmc = -1; dcmc <= 1; dcmc++)
{
const int8_t dir = (previous > current ? 1 : -1);
const int8_t cmc_to_draw = current + dir * dcmc;
if (cmc_to_draw < 0 || cmc_to_draw > 20)
{
continue;
}
const float offset
= dir * ease::outElastic(progress) * STEP + (dir * (dcmc - 1)) * STEP;
// left
{
display->set_update_area(CENTER_X - 20 + offset, CENTER_Y - 20, 5, 39);
auto pixels = display->pixels();
pixels.write(ERASE_DATA, 39 * 5 * 3);
}
// right
{
display->set_update_area(CENTER_X - 20 + offset + 37, CENTER_Y - 20, 5,
39);
auto pixels = display->pixels();
pixels.write(ERASE_DATA, 39 * 5 * 3);
}
// draw new
{
display->set_update_area(CENTER_X - 15 + offset, CENTER_Y - 15, 31,
32);
auto pixels = display->pixels();
pixels.write(icon::NUMBER_ICONS[cmc_to_draw], icon::LENGTH);
}
}
progress += dt * DT_SCALE;
if (progress >= 0.75f)
{
progress = 1.0f;
}
}
}
void CMCMenu::onResume() {}
void CMCMenu::onLeftPressed()
{
if (progress >= 1 && current > 0)
{
previous = current;
current -= 1;
progress = 0;
}
}
void CMCMenu::onLeftHeld() {}
void CMCMenu::onMenuPressed() { pop_menu(); }
void CMCMenu::onMenuHeld() {}
void CMCMenu::onRightPressed()
{
if (progress >= 1 && current < 20)
{
previous = current;
current += 1;
progress = 0;
}
}
void CMCMenu::onRightHeld() {}