File evabScreen.h¶
File List > src > evabScreen.h
Go to the documentation of this file
#pragma once
#include "evabCoor.h"
#include <Arduino.h>
#include <evabTextTraits.h>
#include <evabTextAlign.h>
namespace evab
{
class Screen
{
public:
template <typename TAlign, typename TText>
void Text(Coor aPosition, Coor aSize, TText aText, unsigned char aColor = 0)
{
Coor displaySize = Size();
if (!aText || aSize.Y == 0 || aPosition.X >= displaySize.X || aPosition.Y >= displaySize.Y)
return;
unsigned char textLen = TextTraits::Length(aText);
unsigned char offset = TAlign::Offset(aSize, textLen);
unsigned char scale = aSize.Y;
unsigned char maxSymbols = min((int)aSize.X, (int)(displaySize.X - aPosition.X)) / scale;
for (uint8_t i = 0; i < maxSymbols; i++)
{
Coor symbolPos(aPosition.X + i * scale, aPosition.Y);
uint8_t textIndex = i - offset;
if (textIndex < textLen)
{
char symbol = TextTraits::Read(aText, textIndex);
DrawSymbol(symbolPos, Coor(scale, scale), symbol, aColor);
}
else
{
Clear(symbolPos, Coor(scale, scale), aColor);
}
}
unsigned char drawnWidth = maxSymbols * scale;
if (drawnWidth < aSize.X)
{
Coor tailPos(aPosition.X + drawnWidth, aPosition.Y);
Coor tailSize(aSize.X - drawnWidth, aSize.Y);
Clear(tailPos, tailSize, aColor);
}
}
template <typename T>
void TextLeft(Coor aPosition, Coor aSize, T aText, unsigned char aColor = 0)
{
Text<LeftAlign>(aPosition, aSize, aText, aColor);
}
template <typename T>
void TextCenter(Coor aPosition, Coor aSize, T aText, unsigned char aColor = 0)
{
Text<CenterAlign>(aPosition, aSize, aText, aColor);
}
template <typename T>
void TextRight(Coor aPosition, Coor aSize, T aText, unsigned char aColor = 0)
{
Text<RightAlign>(aPosition, aSize, aText, aColor);
}
virtual void Picto(Coor aPosition, const unsigned char *aPictogram, unsigned char aColor = 0);
virtual void DrawSymbol(Coor aPosition, Coor aSize, char aSymbol, unsigned char aColor = 0) = 0;
virtual void Clear(Coor aPosition, Coor aSize, unsigned char aColor = 0);
virtual Coor Size() = 0;
virtual unsigned short Serialize(const Coor &aPosition, const Coor &aSize, bool isFocused) = 0;
virtual void Deserialize(unsigned short aSerialized, Coor &aPosition, Coor &aSize, bool &isFocused) = 0;
private:
virtual void clearTile(Coor position, unsigned char aColor);
};
}