200 lines
5.3 KiB
C++
200 lines
5.3 KiB
C++
#include "PrecompiledHeader.h"
|
|
|
|
#include "DeckMenuItem.h"
|
|
#include "Translate.h"
|
|
#include "WResourceManager.h"
|
|
#include <algorithm>
|
|
|
|
#define ITEM_PX_WIDTH 190.0f
|
|
#define kItemXOffset 22
|
|
#define kItemYHeight 30
|
|
|
|
const int kHorizontalScrollSpeed = 30; // higher numbers mean faster scrolling
|
|
|
|
float DeckMenuItem::mYOffset = 0;
|
|
|
|
DeckMenuItem::DeckMenuItem(DeckMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus, bool autoTranslate, DeckMetaData *deckMetaData)
|
|
: JGuiObject(id), parent(_parent), fontId(fontId), mX(x), mY(y)
|
|
{
|
|
WFont * mFont = WResourceManager::Instance()->GetWFont(fontId);
|
|
mMetaData = deckMetaData;
|
|
mText = trim(text);
|
|
mIsValidSelection = false;
|
|
|
|
if (autoTranslate)
|
|
mText = _(mText);
|
|
|
|
|
|
mHasFocus = hasFocus;
|
|
float newImageWidth = 0.0f;
|
|
if (mMetaData && !mMetaData->getGamesPlayed())
|
|
{
|
|
JTexture * tex = WResourceManager::Instance()->RetrieveTexture("new.png");
|
|
if (tex)
|
|
{
|
|
JQuadPtr quad = WResourceManager::Instance()->RetrieveQuad("new.png", 2.0f, 2.0f, tex->mWidth - 4.0f, tex->mHeight - 4.0f); //avoids weird rectangle around the texture because of bilinear filtering
|
|
newImageWidth = quad->mWidth;
|
|
}
|
|
}
|
|
|
|
float titleStringWidth = mFont->GetStringWidth( mText.c_str() );
|
|
mTitleResetWidth = (titleStringWidth - newImageWidth )/ 2;
|
|
mScrollEnabled = titleStringWidth > ( ITEM_PX_WIDTH - newImageWidth );
|
|
mScrollerOffset = 0.0f;
|
|
|
|
if (hasFocus)
|
|
{
|
|
mIsValidSelection = true;
|
|
Entering();
|
|
}
|
|
|
|
if (mMetaData && mMetaData->getAvatarFilename().size() > 0)
|
|
mImageFilename = mMetaData->getAvatarFilename();
|
|
else
|
|
{
|
|
// this is a non-deck menu item (ie "Random", "Cancel", etc
|
|
switch(id)
|
|
{
|
|
case kRandomPlayerMenuID:
|
|
mImageFilename = "noavatar.jpg";
|
|
break;
|
|
case kRandomAIPlayerMenuID:
|
|
mImageFilename = "noavatar.jpg";
|
|
break;
|
|
case kEvilTwinMenuID:
|
|
{
|
|
mImageFilename = "avatar.jpg";
|
|
break;
|
|
}
|
|
default:
|
|
mImageFilename = "noavatar.jpg";
|
|
// do nothing.
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
mDisplayInitialized = false;
|
|
|
|
}
|
|
|
|
void DeckMenuItem::Update(float dt)
|
|
{
|
|
mScrollerOffset += kHorizontalScrollSpeed * dt;
|
|
if ( (mScrollerOffset) > mTitleResetWidth )
|
|
mScrollerOffset = -ITEM_PX_WIDTH;
|
|
}
|
|
|
|
|
|
void DeckMenuItem::RenderWithOffset(float yOffset)
|
|
{
|
|
mYOffset = yOffset;
|
|
|
|
WFont * mFont = WResourceManager::Instance()->GetWFont(fontId);
|
|
|
|
if (!( mHasFocus && mScrollEnabled ))
|
|
mScrollerOffset = 0;
|
|
if (!mHasFocus && mScrollEnabled)
|
|
mScrollerOffset = -1 * ( getWidth() - ITEM_PX_WIDTH )/2;
|
|
float offSet = mScrollerOffset;
|
|
|
|
if (mHasFocus)
|
|
mFont->SetScale(SCALE_SELECTED);
|
|
else
|
|
mFont->SetScale(SCALE_NORMAL);
|
|
|
|
mFont->DrawString(mText.c_str(), mX, mY + yOffset, JGETEXT_CENTER, offSet, ITEM_PX_WIDTH);
|
|
mDisplayInitialized = true;
|
|
//Render a "new" icon for decks that have never been played yet
|
|
if (mMetaData && !mMetaData->getGamesPlayed())
|
|
{
|
|
JTexture * tex = WResourceManager::Instance()->RetrieveTexture("new.png");
|
|
if (tex)
|
|
{
|
|
JQuadPtr quad = WResourceManager::Instance()->RetrieveQuad("new.png", 2.0f, 2.0f, tex->mWidth - 4.0f, tex->mHeight - 4.0f); //avoids weird rectangle aroudn the texture because of bilinear filtering
|
|
quad->SetHotSpot(quad->mWidth/2.0f, quad->mHeight/2.0f);
|
|
float x = mX + min(ITEM_PX_WIDTH - quad->mWidth, getWidth() )/2 + quad->mWidth/2;
|
|
if (quad) JRenderer::GetInstance()->RenderQuad(quad.get(), x , mY + yOffset + quad->mHeight/2, 0.5);
|
|
}
|
|
}
|
|
mFont->SetScale(SCALE_NORMAL);
|
|
}
|
|
|
|
void DeckMenuItem::Render()
|
|
{
|
|
RenderWithOffset(0);
|
|
}
|
|
|
|
void DeckMenuItem::checkUserClick()
|
|
{
|
|
int x1 = -1, y1 = -1;
|
|
if (mEngine->GetLeftClickCoordinates(x1, y1))
|
|
{
|
|
mIsValidSelection = false;
|
|
int x2 = kItemXOffset, y2 = static_cast<int>(mY + mYOffset);
|
|
if ( (x1 >= x2) && (x1 <= (x2 + ITEM_PX_WIDTH)) && (y1 >= y2) && (y1 < (y2 + kItemYHeight)))
|
|
mIsValidSelection = true;
|
|
}
|
|
else
|
|
mIsValidSelection = true;
|
|
}
|
|
|
|
|
|
void DeckMenuItem::Entering()
|
|
{
|
|
checkUserClick();
|
|
mHasFocus = true;
|
|
parent->mSelectionTargetY = mY;
|
|
}
|
|
|
|
bool DeckMenuItem::Leaving(JButton)
|
|
{
|
|
// check to see if the user clicked on the object, if so return true.
|
|
checkUserClick();
|
|
mHasFocus = false;
|
|
return true;
|
|
}
|
|
|
|
bool DeckMenuItem::ButtonPressed()
|
|
{
|
|
return mIsValidSelection;
|
|
}
|
|
|
|
void DeckMenuItem::Relocate(float x, float y)
|
|
{
|
|
mX = x;
|
|
mY = y;
|
|
}
|
|
|
|
float DeckMenuItem::getWidth() const
|
|
{
|
|
WFont * mFont = WResourceManager::Instance()->GetWFont(fontId);
|
|
return mFont->GetStringWidth(mText.c_str());
|
|
}
|
|
|
|
string DeckMenuItem::getDeckName() const
|
|
{
|
|
if (mMetaData)
|
|
return mMetaData->getName();
|
|
|
|
std::string s;
|
|
std::stringstream out;
|
|
out << mMetaData->getDeckId();
|
|
s = out.str();
|
|
return "[deck" + s + "]";
|
|
}
|
|
|
|
ostream& DeckMenuItem::toString(ostream& out) const
|
|
{
|
|
return out << "DeckMenuItem ::: mHasFocus : " << mHasFocus
|
|
<< " ; parent : " << parent
|
|
<< " ; mText : " << mText
|
|
<< " ; mX,mY : " << mX << "," << mY;
|
|
}
|
|
|
|
DeckMenuItem::~DeckMenuItem()
|
|
{
|
|
mMetaData = NULL;
|
|
}
|