mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2024-11-23 22:55:39 +00:00
114 lines
2.9 KiB
C++
114 lines
2.9 KiB
C++
|
#include "guis/GuiInfoPopup.h"
|
||
|
#include "Renderer.h"
|
||
|
#include "components/TextComponent.h"
|
||
|
#include "Log.h"
|
||
|
|
||
|
GuiInfoPopup::GuiInfoPopup(Window* window, std::string message, int duration) :
|
||
|
GuiComponent(window), mMessage(message), mDuration(duration), running(true)
|
||
|
{
|
||
|
mFrame = new NinePatchComponent(window);
|
||
|
float maxWidth = Renderer::getScreenWidth() * 0.9f;
|
||
|
float maxHeight = Renderer::getScreenHeight() * 0.2f;
|
||
|
|
||
|
std::shared_ptr<TextComponent> s = std::make_shared<TextComponent>(mWindow,
|
||
|
"",
|
||
|
Font::get(FONT_SIZE_MINI),
|
||
|
0x444444FF,
|
||
|
ALIGN_CENTER);
|
||
|
|
||
|
// we do this to force the text container to resize and return an actual expected popup size
|
||
|
s->setSize(0,0);
|
||
|
s->setText(message);
|
||
|
mSize = s->getSize();
|
||
|
|
||
|
// confirm the size isn't larger than the screen width, otherwise cap it
|
||
|
if (mSize.x() > maxWidth) {
|
||
|
s->setSize(maxWidth, mSize[1]);
|
||
|
mSize[0] = maxWidth;
|
||
|
}
|
||
|
if (mSize.y() > maxHeight) {
|
||
|
s->setSize(mSize[0], maxHeight);
|
||
|
mSize[1] = maxHeight;
|
||
|
}
|
||
|
|
||
|
// add a padding to the box
|
||
|
int paddingX = Renderer::getScreenWidth() * 0.03f;
|
||
|
int paddingY = Renderer::getScreenHeight() * 0.02f;
|
||
|
mSize[0] = mSize.x() + paddingX;
|
||
|
mSize[1] = mSize.y() + paddingY;
|
||
|
|
||
|
float posX = Renderer::getScreenWidth()*0.5f - mSize.x()*0.5f;
|
||
|
float posY = Renderer::getScreenHeight() * 0.02f;
|
||
|
|
||
|
setPosition(posX, posY, 0);
|
||
|
|
||
|
mFrame->setImagePath(":/frame.png");
|
||
|
mFrame->fitTo(mSize, Eigen::Vector3f::Zero(), Eigen::Vector2f(-32, -32));
|
||
|
addChild(mFrame);
|
||
|
|
||
|
// we only init the actual time when we first start to render
|
||
|
mStartTime = 0;
|
||
|
|
||
|
mGrid = new ComponentGrid(window, Eigen::Vector2i(1, 3));
|
||
|
mGrid->setSize(mSize);
|
||
|
mGrid->setEntry(s, Eigen::Vector2i(0, 1), false, true);
|
||
|
addChild(mGrid);
|
||
|
}
|
||
|
|
||
|
GuiInfoPopup::~GuiInfoPopup()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
void GuiInfoPopup::render(const Eigen::Affine3f& parentTrans)
|
||
|
{
|
||
|
// we use identity as we want to render on a specific window position, not on the view
|
||
|
Eigen::Affine3f trans = getTransform() * Eigen::Affine3f::Identity();
|
||
|
if(running && updateState())
|
||
|
{
|
||
|
// if we're still supposed to be rendering it
|
||
|
Renderer::setMatrix(trans);
|
||
|
renderChildren(trans);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool GuiInfoPopup::updateState()
|
||
|
{
|
||
|
int curTime = SDL_GetTicks();
|
||
|
|
||
|
// we only init the actual time when we first start to render
|
||
|
if(mStartTime == 0)
|
||
|
{
|
||
|
mStartTime = curTime;
|
||
|
}
|
||
|
|
||
|
// compute fade in effect
|
||
|
if (curTime - mStartTime > mDuration)
|
||
|
{
|
||
|
// we're past the popup duration, no need to render
|
||
|
running = false;
|
||
|
return false;
|
||
|
}
|
||
|
else if (curTime < mStartTime) {
|
||
|
// if SDL reset
|
||
|
running = false;
|
||
|
return false;
|
||
|
}
|
||
|
else if (curTime - mStartTime <= 500) {
|
||
|
alpha = ((curTime - mStartTime)*255/500);
|
||
|
}
|
||
|
else if (curTime - mStartTime < mDuration - 500)
|
||
|
{
|
||
|
alpha = 255;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
alpha = ((-(curTime - mStartTime - mDuration)*255)/500);
|
||
|
}
|
||
|
mGrid->setOpacity(alpha);
|
||
|
|
||
|
// apply fade in effect to popup frame
|
||
|
mFrame->setEdgeColor(0xFFFFFF00 | (unsigned char)(alpha));
|
||
|
mFrame->setCenterColor(0xFFFFFF00 | (unsigned char)(alpha));
|
||
|
return true;
|
||
|
}
|