JKSV/source/ui/TitleTile.cpp
2025-10-30 18:11:16 -04:00

72 lines
2.1 KiB
C++

#include "ui/TitleTile.hpp"
#include "graphics/colors.hpp"
#include "logging/logger.hpp"
namespace
{
constexpr int UNSELECTED_WIDTH_HEIGHT = 128;
constexpr int SELECTED_WIDTH_HEIGHT = 176;
}
// ---- Construction ----
ui::TitleTile::TitleTile(bool isFavorite, int index, sdl::SharedTexture icon)
: m_transition(0,
0,
UNSELECTED_WIDTH_HEIGHT,
UNSELECTED_WIDTH_HEIGHT,
0,
0,
UNSELECTED_WIDTH_HEIGHT,
UNSELECTED_WIDTH_HEIGHT,
m_transition.DEFAULT_THRESHOLD)
, m_isFavorite(isFavorite)
, m_index(index)
, m_icon(icon) {};
// ---- Public functions ----
void ui::TitleTile::update(int selected)
{
const bool isSelected = selected == m_index;
if (isSelected)
{
m_transition.set_target_width(SELECTED_WIDTH_HEIGHT);
m_transition.set_target_height(SELECTED_WIDTH_HEIGHT);
}
else
{
m_transition.set_target_width(UNSELECTED_WIDTH_HEIGHT);
m_transition.set_target_height(UNSELECTED_WIDTH_HEIGHT);
}
m_transition.update_width_height();
}
void ui::TitleTile::render(sdl::SharedTexture &target, int x, int y)
{
static constexpr std::string_view HEART_CHAR = "\uE017";
const int width = m_transition.get_width();
const int height = m_transition.get_height();
const int renderX = x - ((width - 128) / 2);
const int renderY = y - ((width - 128) / 2);
m_icon->render_stretched(target, renderX, renderY, width, height);
if (m_isFavorite) { sdl::text::render(target, renderX + 2, renderY + 2, 28, sdl::text::NO_WRAP, colors::PINK, HEART_CHAR); }
}
void ui::TitleTile::reset() noexcept
{
m_transition.set_width(UNSELECTED_WIDTH_HEIGHT);
m_transition.set_height(UNSELECTED_WIDTH_HEIGHT);
m_transition.set_target_width(UNSELECTED_WIDTH_HEIGHT);
m_transition.set_target_height(UNSELECTED_WIDTH_HEIGHT);
}
int ui::TitleTile::get_width() const noexcept { return m_transition.get_width(); }
int ui::TitleTile::get_height() const noexcept { return m_transition.get_height(); }