mirror of
https://github.com/J-D-K/JKSV.git
synced 2026-07-14 07:01:05 -05:00
115 lines
4.6 KiB
C++
115 lines
4.6 KiB
C++
#include "appStates/confirmState.hpp"
|
|
#include "appStates/taskState.hpp"
|
|
#include "appStates/progressState.hpp"
|
|
#include "graphics/graphics.hpp"
|
|
#include "ui/ui.hpp"
|
|
#include "system/input.hpp"
|
|
#include "jksv.hpp"
|
|
#include "log.hpp"
|
|
|
|
namespace
|
|
{
|
|
// How many ticks are required when confirmation requires holding down the A button
|
|
constexpr int HOLD_TICKS = 1000;
|
|
// Strings used here
|
|
const std::string DIALOG_YES = "dialogYes";
|
|
const std::string DIALOG_NO = "dialogNo";
|
|
const std::string HOLDING_TEXT = "holdingText";
|
|
}
|
|
|
|
confirmState::confirmState(const std::string &message, sys::taskFunction onConfirmation, sys::sharedTaskData sharedData, sys::taskTypes taskType) : m_Message(message),
|
|
m_Yes(ui::strings::getString(DIALOG_YES, 0)),
|
|
m_No(ui::strings::getString(DIALOG_NO, 0)),
|
|
m_HoldTimer(std::make_unique<sys::timer>(HOLD_TICKS)),
|
|
m_OnConfirmation(onConfirmation),
|
|
m_SharedData(sharedData),
|
|
m_TaskType(taskType) {}
|
|
|
|
confirmState::~confirmState() {}
|
|
|
|
// To do: I don't like the way this looks, but not sure if it can get much better
|
|
void confirmState::update(void)
|
|
{
|
|
// If A is first pressed, and stage is 0, restart timer
|
|
if (sys::input::buttonDown(HidNpadButton_A) && m_HoldStage == 0)
|
|
{
|
|
m_HoldTimer->restartTimer();
|
|
}
|
|
else if (sys::input::buttonHeld(HidNpadButton_A) && m_HoldStage < 3 && m_HoldTimer->triggered())
|
|
{
|
|
// Confirmed, create new task.
|
|
if (++m_HoldStage == 3)
|
|
{
|
|
// Spawn task according to m_TaskType
|
|
switch (m_TaskType)
|
|
{
|
|
case sys::taskTypes::TASK_TYPE_TASK:
|
|
{
|
|
sharedAppState newTaskState = createNewTask(m_OnConfirmation, m_SharedData);
|
|
jksv::pushState(newTaskState);
|
|
}
|
|
break;
|
|
|
|
case sys::taskTypes::TASK_TYPE_PROGRESS:
|
|
{
|
|
sharedAppState newProgressState = createNewProgressTask(m_OnConfirmation, m_SharedData);
|
|
jksv::pushState(newProgressState);
|
|
}
|
|
break;
|
|
}
|
|
// Deactivate
|
|
appState::deactivateState();
|
|
}
|
|
else
|
|
{
|
|
// Switch and update yes accordingly
|
|
switch (m_HoldStage)
|
|
{
|
|
case 0:
|
|
{
|
|
m_Yes = ui::strings::getString(HOLDING_TEXT, 0);
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
{
|
|
m_Yes = ui::strings::getString(HOLDING_TEXT, 1);
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
{
|
|
m_Yes = ui::strings::getString(HOLDING_TEXT, 2);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if (sys::input::buttonReleased(HidNpadButton_A))
|
|
{
|
|
m_Yes = ui::strings::getString(DIALOG_YES, 0);
|
|
}
|
|
else if (sys::input::buttonDown(HidNpadButton_B))
|
|
{
|
|
// Party's over. Just stop
|
|
appState::deactivateState();
|
|
}
|
|
}
|
|
|
|
void confirmState::render(void)
|
|
{
|
|
// Dim screen
|
|
graphics::renderRect(NULL, 0, 0, 1280, 720, COLOR_DIM_BACKGROUND);
|
|
|
|
// Calculate X position of m_Yes because it changes on hold
|
|
int yesXPosition = 458 - (graphics::systemFont::getTextWidth(m_Yes, 18) / 2);
|
|
|
|
// Render dialog box
|
|
ui::renderDialogBox(NULL, 280, 262, 720, 256);
|
|
graphics::systemFont::renderTextWrap(m_Message, NULL, 312, 288, 18, 656, COLOR_WHITE);
|
|
graphics::renderLine(NULL, 280, 454, 999, 454, COLOR_DARK_GRAY);
|
|
graphics::renderLine(NULL, 640, 454, 640, 517, COLOR_DARK_GRAY);
|
|
graphics::systemFont::renderText(m_Yes, NULL, yesXPosition, 478, 18, COLOR_WHITE);
|
|
graphics::systemFont::renderText(m_No, NULL, 782, 478, 18, COLOR_WHITE);
|
|
}
|