mirror of
https://github.com/J-D-K/JKSV.git
synced 2026-07-14 23:21:17 -05:00
122 lines
3.1 KiB
C++
122 lines
3.1 KiB
C++
#include "UI/TitleView.hpp"
|
|
#include "Colors.hpp"
|
|
#include "Config.hpp"
|
|
#include "Input.hpp"
|
|
#include "Logger.hpp"
|
|
#include "UI/RenderFunctions.hpp"
|
|
#include <cmath>
|
|
|
|
namespace
|
|
{
|
|
constexpr int ICON_ROW_SIZE = 7;
|
|
}
|
|
|
|
UI::TitleView::TitleView(Data::User *User) : m_User(User)
|
|
{
|
|
for (size_t i = 0; i < m_User->GetTotalDataEntries(); i++)
|
|
{
|
|
// Get pointer to data from user save index I.
|
|
Data::TitleInfo *CurrentTitleInfo = Data::GetTitleInfoByID(m_User->GetApplicationIDAt(i));
|
|
// Emplace is faster than push
|
|
m_TitleTiles.emplace_back(Config::IsFavorite(m_User->GetApplicationIDAt(i)), CurrentTitleInfo->GetIcon());
|
|
}
|
|
}
|
|
|
|
void UI::TitleView::Update(bool HasFocus)
|
|
{
|
|
if (m_TitleTiles.empty())
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Update pulse
|
|
if (HasFocus)
|
|
{
|
|
m_ColorMod.Update();
|
|
}
|
|
|
|
// Input.
|
|
int TotalTiles = m_TitleTiles.size() - 1;
|
|
if (Input::ButtonPressed(HidNpadButton_AnyUp) && (m_Selected -= ICON_ROW_SIZE) < 0)
|
|
{
|
|
m_Selected = 0;
|
|
}
|
|
else if (Input::ButtonPressed(HidNpadButton_AnyDown) && (m_Selected += ICON_ROW_SIZE) > TotalTiles)
|
|
{
|
|
m_Selected = TotalTiles;
|
|
}
|
|
else if (Input::ButtonPressed(HidNpadButton_AnyLeft) && m_Selected > 0)
|
|
{
|
|
--m_Selected;
|
|
}
|
|
else if (Input::ButtonPressed(HidNpadButton_AnyRight) && m_Selected < TotalTiles)
|
|
{
|
|
++m_Selected;
|
|
}
|
|
|
|
double Scaling = Config::GetAnimationScaling();
|
|
if (m_SelectedY > 280.0f)
|
|
{
|
|
m_Y += std::ceil((280.0f - m_SelectedY) / Scaling);
|
|
}
|
|
else if (m_SelectedY < 38.0f)
|
|
{
|
|
m_Y += std::ceil((38.0f - m_SelectedY) / Scaling);
|
|
}
|
|
|
|
for (size_t i = 0; i < m_TitleTiles.size(); i++)
|
|
{
|
|
m_TitleTiles.at(i).Update(m_Selected == i ? true : false);
|
|
}
|
|
}
|
|
|
|
void UI::TitleView::Render(SDL_Texture *Target, bool HasFocus)
|
|
{
|
|
if (m_TitleTiles.empty())
|
|
{
|
|
return;
|
|
}
|
|
|
|
for (int i = 0, TempY = m_Y; i < static_cast<int>(m_TitleTiles.size()); TempY += 144)
|
|
{
|
|
int EndRow = i + 7;
|
|
for (int j = i, TempX = 32; j < EndRow; j++, i++, TempX += 144)
|
|
{
|
|
if (i >= static_cast<int>(m_TitleTiles.size()))
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Save the X and Y to render the selected tile over the rest.
|
|
if (i == m_Selected)
|
|
{
|
|
m_SelectedX = TempX;
|
|
m_SelectedY = TempY;
|
|
continue;
|
|
}
|
|
// Just render
|
|
m_TitleTiles.at(i).Render(Target, TempX, TempY);
|
|
}
|
|
}
|
|
// Now render the selected title.
|
|
if (HasFocus)
|
|
{
|
|
SDL::RenderRectFill(Target, m_SelectedX - 23, m_SelectedY - 23, 174, 174, Colors::ClearColor);
|
|
UI::RenderBoundingBox(Target, m_SelectedX - 24, m_SelectedY - 24, 176, 176, m_ColorMod);
|
|
}
|
|
m_TitleTiles.at(m_Selected).Render(Target, m_SelectedX, m_SelectedY);
|
|
}
|
|
|
|
int UI::TitleView::GetSelected(void) const
|
|
{
|
|
return m_Selected;
|
|
}
|
|
|
|
void UI::TitleView::Reset(void)
|
|
{
|
|
for (UI::TitleTile &CurrentTile : m_TitleTiles)
|
|
{
|
|
CurrentTile.Reset();
|
|
}
|
|
}
|