UVControl/src/screen/menu.cpp

164 lines
2.7 KiB
C++

#include "screen/menu.h"
#include "config.h"
#include "buzzer.h"
#include "display.h"
#include "menu/start.h"
#include "menu/time.h"
#include "menu/intensity.h"
MenuScreen::MenuScreen(ScreenManager* screenManager) : BaseScreen(screenManager)
{
mCount = 3;
mItems = new MenuItem*[mCount];
mItems[0] = new StartMenuItem();
mItems[1] = new TimeMenuItem();
mItems[2] = new IntensityMenuItem();
}
MenuScreen::~MenuScreen()
{
for (uint8_t i = 0; i < mCount; i++)
delete mItems[i];
delete[] mItems;
}
void MenuScreen::onShow()
{
printFullUpdate();
}
void MenuScreen::onHide()
{
}
void MenuScreen::printFullUpdate()
{
printTitle();
printScrollIndicators();
printValue();
}
void MenuScreen::printTitle()
{
const char* title = mItems[mSelected]->getTitle();
LCDPrintLineCentered(getDisplay(), 0, title, 1);
if (title != NULL)
delete[] title;
}
void MenuScreen::printScrollIndicators()
{
LiquidCrystal* display = getDisplay();
display->setCursor(0, 0);
if (mSelected > 0)
display->write(mEditing ? LCDCharArrowLeftHollow : LCDCharArrowLeft);
else
display->write(' ');
display->setCursor(LCDWidth - 1, 0);
if (mSelected < mCount - 1)
display->write(mEditing ? LCDCharArrowRightHollow : LCDCharArrowRight);
else
display->write(' ');
}
void MenuScreen::printValue()
{
LiquidCrystal* display = getDisplay();
const char* value = mItems[mSelected]->getValue();
if (mEditing && value != NULL)
{
uint8_t valueLength = strlen(value);
char* editingValue = new char[valueLength + 5];
editingValue[0] = ' ';
editingValue[1] = ' ';
strcpy(editingValue + 2, value);
editingValue[valueLength + 2] = ' ';
editingValue[valueLength + 3] = LCDCharUpDown;
editingValue[valueLength + 4] = 0;
LCDPrintLineCentered(display, 1, editingValue);
delete[] editingValue;
}
else
LCDPrintLineCentered(display, 1, value);
if (value != NULL)
delete[] value;
}
void MenuScreen::onButton()
{
if (mItems[mSelected]->editable())
{
mEditing = !mEditing;
printScrollIndicators();
printValue();
}
else
{
mItems[mSelected]->execute(getScreenManager());
}
}
void MenuScreen::onEncoder(long lastPosition, long newPosition)
{
if (mEditing)
{
if (newPosition > lastPosition)
mItems[mSelected]->incValue();
else
mItems[mSelected]->decValue();
printValue();
}
else
{
if (newPosition > lastPosition)
{
if (mSelected < mCount - 1)
{
Buzzer::select();
mSelected++;
printFullUpdate();
}
}
else
{
if (mSelected > 0)
{
Buzzer::select();
mSelected--;
printFullUpdate();
}
}
}
}
void MenuScreen::onTick()
{
}