99 lines
2.0 KiB
C++
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() {}
|