#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() {}