2013-09-23 19:58:28 +00:00
|
|
|
#include "RatingComponent.h"
|
|
|
|
#include "../Renderer.h"
|
|
|
|
#include "../Window.h"
|
|
|
|
|
|
|
|
RatingComponent::RatingComponent(Window* window) : GuiComponent(window)
|
|
|
|
{
|
2014-01-19 22:06:13 +00:00
|
|
|
mFilledTexture = TextureResource::get(":/star_filled.png", true);
|
|
|
|
mUnfilledTexture = TextureResource::get(":/star_unfilled.png", true);
|
2013-09-23 19:58:28 +00:00
|
|
|
mValue = 0.5f;
|
|
|
|
mSize << 64 * 5.0f, 64;
|
|
|
|
updateVertices();
|
|
|
|
}
|
|
|
|
|
|
|
|
void RatingComponent::setValue(const std::string& value)
|
|
|
|
{
|
2013-10-16 22:05:02 +00:00
|
|
|
if(value.empty())
|
|
|
|
{
|
|
|
|
mValue = 0.0f;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-09-23 19:58:28 +00:00
|
|
|
mValue = stof(value);
|
2013-09-24 02:02:41 +00:00
|
|
|
if(mValue > 1.0f)
|
|
|
|
mValue = 1.0f;
|
|
|
|
else if(mValue < 0.0f)
|
|
|
|
mValue = 0.0f;
|
2013-09-23 19:58:28 +00:00
|
|
|
updateVertices();
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string RatingComponent::getValue() const
|
|
|
|
{
|
2013-09-24 02:02:41 +00:00
|
|
|
return std::to_string((long double)mValue);
|
2013-09-23 19:58:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void RatingComponent::onSizeChanged()
|
|
|
|
{
|
2014-01-20 18:23:39 +00:00
|
|
|
if(mSize.y() == 0)
|
|
|
|
mSize[1] = mSize.x() / 5.0f;
|
|
|
|
else if(mSize.x() == 0)
|
|
|
|
mSize[0] = mSize.y() * 5.0f;
|
|
|
|
|
2013-09-23 19:58:28 +00:00
|
|
|
updateVertices();
|
|
|
|
}
|
|
|
|
|
|
|
|
void RatingComponent::updateVertices()
|
|
|
|
{
|
|
|
|
const float numStars = 5.0f;
|
|
|
|
|
2013-09-24 02:02:41 +00:00
|
|
|
const float h = getSize().y();
|
|
|
|
const float w = h * mValue * numStars;
|
|
|
|
const float fw = h * numStars;
|
2013-09-23 19:58:28 +00:00
|
|
|
|
2013-09-24 02:02:41 +00:00
|
|
|
mVertices[0].pos << 0.0f, 0.0f;
|
|
|
|
mVertices[0].tex << 0.0f, 1.0f;
|
2013-09-23 19:58:28 +00:00
|
|
|
mVertices[1].pos << w, h;
|
2013-09-24 02:02:41 +00:00
|
|
|
mVertices[1].tex << mValue * numStars, 0.0f;
|
|
|
|
mVertices[2].pos << 0.0f, h;
|
|
|
|
mVertices[2].tex << 0.0f, 0.0f;
|
2013-09-23 19:58:28 +00:00
|
|
|
|
|
|
|
mVertices[3] = mVertices[0];
|
2013-09-24 02:02:41 +00:00
|
|
|
mVertices[4].pos << w, 0.0f;
|
|
|
|
mVertices[4].tex << mValue * numStars, 1.0f;
|
2013-09-23 19:58:28 +00:00
|
|
|
mVertices[5] = mVertices[1];
|
|
|
|
|
|
|
|
mVertices[6] = mVertices[4];
|
|
|
|
mVertices[7].pos << fw, h;
|
2013-09-24 02:02:41 +00:00
|
|
|
mVertices[7].tex << numStars, 0.0f;
|
2013-09-23 19:58:28 +00:00
|
|
|
mVertices[8] = mVertices[1];
|
|
|
|
|
|
|
|
mVertices[9] = mVertices[6];
|
2013-09-24 02:02:41 +00:00
|
|
|
mVertices[10].pos << fw, 0.0f;
|
|
|
|
mVertices[10].tex << numStars, 1.0f;
|
2013-09-23 19:58:28 +00:00
|
|
|
mVertices[11] = mVertices[7];
|
|
|
|
}
|
|
|
|
|
|
|
|
void RatingComponent::render(const Eigen::Affine3f& parentTrans)
|
|
|
|
{
|
|
|
|
Eigen::Affine3f trans = parentTrans * getTransform();
|
|
|
|
Renderer::setMatrix(trans);
|
|
|
|
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
|
2014-01-25 00:10:13 +00:00
|
|
|
glColor4ub(255, 255, 255, getOpacity());
|
|
|
|
|
2013-09-23 19:58:28 +00:00
|
|
|
glEnableClientState(GL_VERTEX_ARRAY);
|
|
|
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
2013-09-24 02:02:41 +00:00
|
|
|
|
2013-09-23 19:58:28 +00:00
|
|
|
glVertexPointer(2, GL_FLOAT, sizeof(Vertex), &mVertices[0].pos);
|
|
|
|
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &mVertices[0].tex);
|
2013-09-24 02:02:41 +00:00
|
|
|
|
2013-09-23 19:58:28 +00:00
|
|
|
mFilledTexture->bind();
|
|
|
|
glDrawArrays(GL_TRIANGLES, 0, 6);
|
|
|
|
|
|
|
|
mUnfilledTexture->bind();
|
|
|
|
glDrawArrays(GL_TRIANGLES, 6, 6);
|
|
|
|
|
|
|
|
glDisableClientState(GL_VERTEX_ARRAY);
|
|
|
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
2013-09-24 02:02:41 +00:00
|
|
|
|
2013-09-23 19:58:28 +00:00
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
|
2014-01-25 00:10:13 +00:00
|
|
|
glColor4ub(255, 255, 255, 255);
|
|
|
|
|
2013-09-23 19:58:28 +00:00
|
|
|
renderChildren(trans);
|
|
|
|
}
|
|
|
|
|
2013-09-24 19:44:18 +00:00
|
|
|
bool RatingComponent::input(InputConfig* config, Input input)
|
|
|
|
{
|
|
|
|
if(config->isMappedTo("a", input) && input.value != 0)
|
|
|
|
{
|
|
|
|
mValue += 0.2f;
|
|
|
|
if(mValue > 1.0f)
|
|
|
|
mValue = 0.0f;
|
|
|
|
|
|
|
|
updateVertices();
|
|
|
|
}
|
|
|
|
|
|
|
|
return GuiComponent::input(config, input);
|
|
|
|
}
|
2014-01-19 23:37:08 +00:00
|
|
|
|
|
|
|
void RatingComponent::applyTheme(const std::shared_ptr<ThemeData>& theme, const std::string& view, const std::string& element, unsigned int properties)
|
|
|
|
{
|
|
|
|
GuiComponent::applyTheme(theme, view, element, properties);
|
|
|
|
|
|
|
|
using namespace ThemeFlags;
|
|
|
|
|
|
|
|
const ThemeData::ThemeElement* elem = theme->getElement(view, element, "rating");
|
|
|
|
if(!elem)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if(properties & PATH && elem->has("filledPath"))
|
|
|
|
mFilledTexture = TextureResource::get(elem->get<std::string>("filledPath"), true);
|
|
|
|
if(properties & PATH && elem->has("unfilledPath"))
|
|
|
|
mUnfilledTexture = TextureResource::get(elem->get<std::string>("unfilledPath"), true);
|
|
|
|
}
|
2014-01-25 23:34:29 +00:00
|
|
|
|
|
|
|
std::vector<HelpPrompt> RatingComponent::getHelpPrompts()
|
|
|
|
{
|
|
|
|
std::vector<HelpPrompt> prompts;
|
|
|
|
prompts.push_back(HelpPrompt("a", "+1 star"));
|
|
|
|
return prompts;
|
|
|
|
}
|