2014-06-25 16:29:58 +00:00
|
|
|
#include "guis/GuiGameScraper.h"
|
2017-11-01 22:21:10 +00:00
|
|
|
|
2014-06-25 16:29:58 +00:00
|
|
|
#include "components/ButtonComponent.h"
|
|
|
|
#include "components/MenuComponent.h"
|
2017-11-01 22:21:10 +00:00
|
|
|
#include "components/TextComponent.h"
|
|
|
|
#include "FileData.h"
|
2017-07-20 07:07:02 +00:00
|
|
|
#include "PowerSaver.h"
|
2017-11-01 22:21:10 +00:00
|
|
|
#include "SystemData.h"
|
2014-06-25 16:29:58 +00:00
|
|
|
|
2017-08-11 17:03:12 +00:00
|
|
|
GuiGameScraper::GuiGameScraper(Window* window, ScraperSearchParams params, std::function<void(const ScraperSearchResult&)> doneFunc) : GuiComponent(window),
|
2017-10-28 20:24:35 +00:00
|
|
|
mGrid(window, Vector2i(1, 7)),
|
2014-06-25 16:29:58 +00:00
|
|
|
mBox(window, ":/frame.png"),
|
|
|
|
mSearchParams(params),
|
|
|
|
mClose(false)
|
|
|
|
{
|
2017-08-11 17:03:12 +00:00
|
|
|
PowerSaver::pause();
|
2014-06-25 16:29:58 +00:00
|
|
|
addChild(&mBox);
|
|
|
|
addChild(&mGrid);
|
|
|
|
|
|
|
|
// row 0 is a spacer
|
|
|
|
|
2017-08-11 17:03:12 +00:00
|
|
|
mGameName = std::make_shared<TextComponent>(mWindow, strToUpper(mSearchParams.game->getPath().filename().generic_string()),
|
2014-06-25 16:29:58 +00:00
|
|
|
Font::get(FONT_SIZE_MEDIUM), 0x777777FF, ALIGN_CENTER);
|
2017-10-28 20:24:35 +00:00
|
|
|
mGrid.setEntry(mGameName, Vector2i(0, 1), false, true);
|
2014-06-25 16:29:58 +00:00
|
|
|
|
|
|
|
// row 2 is a spacer
|
|
|
|
|
2017-08-11 17:03:12 +00:00
|
|
|
mSystemName = std::make_shared<TextComponent>(mWindow, strToUpper(mSearchParams.system->getFullName()), Font::get(FONT_SIZE_SMALL),
|
2014-06-25 16:29:58 +00:00
|
|
|
0x888888FF, ALIGN_CENTER);
|
2017-10-28 20:24:35 +00:00
|
|
|
mGrid.setEntry(mSystemName, Vector2i(0, 3), false, true);
|
2014-06-25 16:29:58 +00:00
|
|
|
|
|
|
|
// row 4 is a spacer
|
|
|
|
|
|
|
|
// ScraperSearchComponent
|
|
|
|
mSearch = std::make_shared<ScraperSearchComponent>(window, ScraperSearchComponent::NEVER_AUTO_ACCEPT);
|
2017-10-28 20:24:35 +00:00
|
|
|
mGrid.setEntry(mSearch, Vector2i(0, 5), true);
|
2014-06-25 16:29:58 +00:00
|
|
|
|
|
|
|
// buttons
|
|
|
|
std::vector< std::shared_ptr<ButtonComponent> > buttons;
|
|
|
|
|
2017-08-11 17:03:12 +00:00
|
|
|
buttons.push_back(std::make_shared<ButtonComponent>(mWindow, "INPUT", "search", [&] {
|
|
|
|
mSearch->openInputScreen(mSearchParams);
|
|
|
|
mGrid.resetCursor();
|
2014-06-25 16:29:58 +00:00
|
|
|
}));
|
|
|
|
buttons.push_back(std::make_shared<ButtonComponent>(mWindow, "CANCEL", "cancel", [&] { delete this; }));
|
|
|
|
mButtonGrid = makeButtonGrid(mWindow, buttons);
|
|
|
|
|
2017-10-28 20:24:35 +00:00
|
|
|
mGrid.setEntry(mButtonGrid, Vector2i(0, 6), true, false);
|
2014-06-25 16:29:58 +00:00
|
|
|
|
|
|
|
// we call this->close() instead of just delete this; in the accept callback:
|
|
|
|
// this is because of how GuiComponent::update works. if it was just delete this, this would happen when the metadata resolver is done:
|
|
|
|
// GuiGameScraper::update()
|
|
|
|
// GuiComponent::update()
|
2017-11-11 14:56:22 +00:00
|
|
|
// it = mChildren.cbegin();
|
2014-06-25 16:29:58 +00:00
|
|
|
// mBox::update()
|
|
|
|
// it++;
|
|
|
|
// mSearchComponent::update()
|
|
|
|
// acceptCallback -> delete this
|
|
|
|
// it++; // error, mChildren has been deleted because it was part of this
|
|
|
|
|
|
|
|
// so instead we do this:
|
|
|
|
// GuiGameScraper::update()
|
|
|
|
// GuiComponent::update()
|
2017-11-11 14:56:22 +00:00
|
|
|
// it = mChildren.cbegin();
|
2014-06-25 16:29:58 +00:00
|
|
|
// mBox::update()
|
|
|
|
// it++;
|
|
|
|
// mSearchComponent::update()
|
|
|
|
// acceptCallback -> close() -> mClose = true
|
|
|
|
// it++; // ok
|
|
|
|
// if(mClose)
|
|
|
|
// delete this;
|
|
|
|
mSearch->setAcceptCallback([this, doneFunc](const ScraperSearchResult& result) { doneFunc(result); close(); });
|
|
|
|
mSearch->setCancelCallback([&] { delete this; });
|
|
|
|
|
|
|
|
setSize(Renderer::getScreenWidth() * 0.95f, Renderer::getScreenHeight() * 0.747f);
|
|
|
|
setPosition((Renderer::getScreenWidth() - mSize.x()) / 2, (Renderer::getScreenHeight() - mSize.y()) / 2);
|
|
|
|
|
|
|
|
mGrid.resetCursor();
|
|
|
|
mSearch->search(params); // start the search
|
|
|
|
}
|
|
|
|
|
|
|
|
void GuiGameScraper::onSizeChanged()
|
|
|
|
{
|
2017-10-28 20:24:35 +00:00
|
|
|
mBox.fitTo(mSize, Vector3f::Zero(), Vector2f(-32, -32));
|
2014-06-25 16:29:58 +00:00
|
|
|
|
|
|
|
mGrid.setRowHeightPerc(0, 0.04f, false);
|
|
|
|
mGrid.setRowHeightPerc(1, mGameName->getFont()->getLetterHeight() / mSize.y(), false); // game name
|
|
|
|
mGrid.setRowHeightPerc(2, 0.04f, false);
|
|
|
|
mGrid.setRowHeightPerc(3, mSystemName->getFont()->getLetterHeight() / mSize.y(), false); // system name
|
|
|
|
mGrid.setRowHeightPerc(4, 0.04f, false);
|
|
|
|
mGrid.setRowHeightPerc(6, mButtonGrid->getSize().y() / mSize.y(), false); // buttons
|
|
|
|
mGrid.setSize(mSize);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool GuiGameScraper::input(InputConfig* config, Input input)
|
|
|
|
{
|
|
|
|
if(config->isMappedTo("b", input) && input.value)
|
|
|
|
{
|
2017-08-11 17:03:12 +00:00
|
|
|
PowerSaver::resume();
|
2014-06-25 16:29:58 +00:00
|
|
|
delete this;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return GuiComponent::input(config, input);
|
|
|
|
}
|
|
|
|
|
|
|
|
void GuiGameScraper::update(int deltaTime)
|
|
|
|
{
|
|
|
|
GuiComponent::update(deltaTime);
|
|
|
|
|
|
|
|
if(mClose)
|
|
|
|
delete this;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::vector<HelpPrompt> GuiGameScraper::getHelpPrompts()
|
|
|
|
{
|
|
|
|
return mGrid.getHelpPrompts();
|
|
|
|
}
|
|
|
|
|
|
|
|
void GuiGameScraper::close()
|
|
|
|
{
|
|
|
|
mClose = true;
|
2017-08-11 17:03:12 +00:00
|
|
|
}
|