2014-01-25 23:34:29 +00:00
|
|
|
#include "HelpComponent.h"
|
|
|
|
#include "../Renderer.h"
|
|
|
|
#include "../Settings.h"
|
|
|
|
#include "../Log.h"
|
2014-03-24 01:33:27 +00:00
|
|
|
#include "../Util.h"
|
|
|
|
#include "ImageComponent.h"
|
|
|
|
#include "TextComponent.h"
|
|
|
|
#include "ComponentGrid.h"
|
|
|
|
|
2014-01-25 23:34:29 +00:00
|
|
|
#include <boost/assign.hpp>
|
|
|
|
|
2014-04-07 00:15:02 +00:00
|
|
|
#define OFFSET_X 12 // move the entire thing right by this amount (px)
|
|
|
|
#define OFFSET_Y 12 // move the entire thing up by this amount (px)
|
2014-03-24 01:33:27 +00:00
|
|
|
|
|
|
|
#define ICON_TEXT_SPACING 8 // space between [icon] and [text] (px)
|
|
|
|
#define ENTRY_SPACING 16 // space between [text] and next [icon] (px)
|
|
|
|
|
|
|
|
using namespace Eigen;
|
|
|
|
|
2014-01-25 23:34:29 +00:00
|
|
|
static const std::map<std::string, const char*> ICON_PATH_MAP = boost::assign::map_list_of
|
2014-03-22 18:04:14 +00:00
|
|
|
("up/down", ":/help/dpad_updown.svg")
|
|
|
|
("left/right", ":/help/dpad_leftright.svg")
|
|
|
|
("up/down/left/right", ":/help/dpad_all.svg")
|
|
|
|
("a", ":/help/button_a.svg")
|
|
|
|
("b", ":/help/button_b.svg")
|
|
|
|
("x", ":/help/button_x.svg")
|
|
|
|
("y", ":/help/button_y.svg")
|
|
|
|
("l", ":/help/button_l.svg")
|
|
|
|
("r", ":/help/button_r.svg")
|
|
|
|
("start", ":/help/button_start.svg")
|
|
|
|
("select", ":/help/button_select.svg");
|
2014-01-25 23:34:29 +00:00
|
|
|
|
|
|
|
HelpComponent::HelpComponent(Window* window) : GuiComponent(window)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void HelpComponent::clearPrompts()
|
|
|
|
{
|
|
|
|
mPrompts.clear();
|
2014-03-24 01:33:27 +00:00
|
|
|
updateGrid();
|
2014-01-25 23:34:29 +00:00
|
|
|
}
|
|
|
|
|
2014-03-24 01:33:27 +00:00
|
|
|
void HelpComponent::setPrompts(const std::vector<HelpPrompt>& prompts)
|
2014-01-25 23:34:29 +00:00
|
|
|
{
|
2014-03-24 01:33:27 +00:00
|
|
|
mPrompts = prompts;
|
|
|
|
updateGrid();
|
|
|
|
}
|
2014-01-25 23:34:29 +00:00
|
|
|
|
2014-03-24 01:33:27 +00:00
|
|
|
void HelpComponent::updateGrid()
|
|
|
|
{
|
|
|
|
if(!Settings::getInstance()->getBool("ShowHelpPrompts") || mPrompts.empty())
|
|
|
|
{
|
|
|
|
mGrid.reset();
|
|
|
|
return;
|
|
|
|
}
|
2014-01-25 23:34:29 +00:00
|
|
|
|
2014-03-24 01:33:27 +00:00
|
|
|
mGrid = std::make_shared<ComponentGrid>(mWindow, Vector2i(mPrompts.size() * 4, 1));
|
|
|
|
// [icon] [spacer1] [text] [spacer2]
|
2014-01-25 23:34:29 +00:00
|
|
|
|
2014-03-24 01:33:27 +00:00
|
|
|
std::shared_ptr<Font> font = Font::get(FONT_SIZE_SMALL);
|
2014-01-25 23:34:29 +00:00
|
|
|
|
2014-03-24 01:33:27 +00:00
|
|
|
std::vector< std::shared_ptr<ImageComponent> > icons;
|
|
|
|
std::vector< std::shared_ptr<TextComponent> > labels;
|
2014-01-25 23:34:29 +00:00
|
|
|
|
2014-03-24 01:33:27 +00:00
|
|
|
float width = 0;
|
2014-05-16 21:26:11 +00:00
|
|
|
const float height = round(font->getLetterHeight() * 1.25f);
|
2014-03-24 01:33:27 +00:00
|
|
|
for(auto it = mPrompts.begin(); it != mPrompts.end(); it++)
|
|
|
|
{
|
|
|
|
auto icon = std::make_shared<ImageComponent>(mWindow);
|
|
|
|
icon->setImage(getIconTexture(it->first));
|
2014-03-24 21:29:56 +00:00
|
|
|
icon->setResize(0, height);
|
2014-03-24 01:33:27 +00:00
|
|
|
icons.push_back(icon);
|
2014-01-25 23:34:29 +00:00
|
|
|
|
2014-03-24 01:33:27 +00:00
|
|
|
auto lbl = std::make_shared<TextComponent>(mWindow, strToUpper(it->second), font, 0x777777FF);
|
|
|
|
labels.push_back(lbl);
|
2014-01-25 23:34:29 +00:00
|
|
|
|
2014-03-24 01:33:27 +00:00
|
|
|
width += icon->getSize().x() + lbl->getSize().x() + ICON_TEXT_SPACING + ENTRY_SPACING;
|
|
|
|
}
|
|
|
|
|
|
|
|
mGrid->setSize(width, height);
|
|
|
|
for(unsigned int i = 0; i < icons.size(); i++)
|
|
|
|
{
|
|
|
|
const int col = i*4;
|
|
|
|
mGrid->setColWidthPerc(col, icons.at(i)->getSize().x() / width);
|
|
|
|
mGrid->setColWidthPerc(col + 1, ICON_TEXT_SPACING / width);
|
|
|
|
mGrid->setColWidthPerc(col + 2, labels.at(i)->getSize().x() / width);
|
|
|
|
|
|
|
|
mGrid->setEntry(icons.at(i), Vector2i(col, 0), false, false);
|
|
|
|
mGrid->setEntry(labels.at(i), Vector2i(col + 2, 0), false, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
mGrid->setPosition(OFFSET_X, Renderer::getScreenHeight() - mGrid->getSize().y() - OFFSET_Y);
|
2014-01-25 23:34:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
std::shared_ptr<TextureResource> HelpComponent::getIconTexture(const char* name)
|
|
|
|
{
|
|
|
|
auto it = mIconCache.find(name);
|
|
|
|
if(it != mIconCache.end())
|
|
|
|
return it->second;
|
|
|
|
|
|
|
|
auto pathLookup = ICON_PATH_MAP.find(name);
|
|
|
|
if(pathLookup == ICON_PATH_MAP.end())
|
|
|
|
{
|
|
|
|
LOG(LogError) << "Unknown help icon \"" << name << "\"!";
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
if(!ResourceManager::getInstance()->fileExists(pathLookup->second))
|
|
|
|
{
|
|
|
|
LOG(LogError) << "Help icon \"" << name << "\" - corresponding image file \"" << pathLookup->second << "\" misisng!";
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::shared_ptr<TextureResource> tex = TextureResource::get(pathLookup->second);
|
|
|
|
mIconCache[std::string(name)] = tex;
|
|
|
|
return tex;
|
|
|
|
}
|
|
|
|
|
2014-05-15 01:58:16 +00:00
|
|
|
void HelpComponent::setOpacity(unsigned char opacity)
|
|
|
|
{
|
|
|
|
GuiComponent::setOpacity(opacity);
|
|
|
|
|
|
|
|
for(unsigned int i = 0; i < mGrid->getChildCount(); i++)
|
|
|
|
{
|
|
|
|
mGrid->getChild(i)->setOpacity(opacity);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-01-25 23:34:29 +00:00
|
|
|
void HelpComponent::render(const Eigen::Affine3f& parentTrans)
|
|
|
|
{
|
|
|
|
Eigen::Affine3f trans = parentTrans * getTransform();
|
|
|
|
|
2014-03-24 01:33:27 +00:00
|
|
|
if(mGrid)
|
|
|
|
mGrid->render(trans);
|
2014-01-25 23:34:29 +00:00
|
|
|
}
|