refactored DeckMenuItem to be a derived class of SimpleMenuItem. Not sure why I had made them distinct.

TODO: review DeckMenu and SimpleMenu to see if it would be better to have them derive from a base class rather than be distinct.
This commit is contained in:
techdragon.nguyen@gmail.com
2012-01-23 08:39:18 +00:00
parent 2b7cf505db
commit 519cd3bd69
7 changed files with 148 additions and 86 deletions

View File

@@ -62,14 +62,9 @@ public:
DeckMetaData * getSelectedDeck(); DeckMetaData * getSelectedDeck();
void enableDisplayDetailsOverride(); void enableDisplayDetailsOverride();
bool showDetailsScreen(); bool showDetailsScreen();
bool isClosed()
{ bool isClosed() const { return mClosed; }
return mClosed; int getSelectedDeckId() const { return mSelectedDeckId; }
}
int getSelectedDeckId()
{
return mSelectedDeckId;
}
void Render(); void Render();
void Update(float dt); void Update(float dt);

View File

@@ -22,13 +22,13 @@ protected:
virtual void checkUserClick(); virtual void checkUserClick();
public: public:
DeckMenuItem(DeckMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus = false, bool autoTranslate = false, DeckMetaData *meta = NULL);
~DeckMenuItem();
string imageFilename; string imageFilename;
string desc;
float mScrollerOffset; float mScrollerOffset;
DeckMetaData *meta; DeckMetaData *meta;
virtual bool hasFocus();
virtual void Relocate(float x, float y); virtual void Relocate(float x, float y);
virtual float GetWidth(); virtual float GetWidth();
virtual void Render(); virtual void Render();
@@ -38,18 +38,7 @@ public:
{ {
return SimpleMenuItem::getTopLeft(top, left); return SimpleMenuItem::getTopLeft(top, left);
} }
string GetText()
{
return mText;
}
string GetDescription()
{
return desc;
}
DeckMenuItem(DeckMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus = false, bool autoTranslate = false, DeckMetaData *meta = NULL);
~DeckMenuItem();
virtual void Entering(); virtual void Entering();
virtual bool Leaving(JButton key); virtual bool Leaving(JButton key);
virtual bool ButtonPressed(); virtual bool ButtonPressed();

View File

@@ -18,34 +18,44 @@ private:
SimpleMenu* parent; SimpleMenu* parent;
float mScale; float mScale;
float mTargetScale; float mTargetScale;
protected:
int fontId;
string mText;
bool mHasFocus; bool mHasFocus;
bool mIsValidSelection;
float mX;
float mY;
protected:
int mFontId;
string mText;
static float mYOffset; static float mYOffset;
float mXOffset; float mXOffset;
string mDescription;
bool mIsValidSelection;
virtual void checkUserClick();
public: public:
string desc;
SimpleMenuItem(int id); SimpleMenuItem(int id);
SimpleMenuItem(SimpleMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus = false, bool autoTranslate = false); SimpleMenuItem(SimpleMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus = false, bool autoTranslate = false);
float mX; virtual int getFontId() const;
float mY; virtual void setFontId( const int& fontId );
virtual void setX( const float& x ) { mX = x; };
virtual void setY( const float& y ) { mY = y; };
virtual void setIsSelectionValid( bool validSelection );
virtual void setFocus(bool value);
virtual void setDescription( const string& desc );
virtual void setText( const string& text);
virtual bool isSelectionValid() const;
virtual bool hasFocus() const;
virtual string getDescription() const;
virtual string getText() const;
float getX() const;
float getY() const;
virtual void checkUserClick();
virtual float GetWidth() const;
virtual void Relocate(float x, float y); virtual void Relocate(float x, float y);
virtual float GetWidth();
virtual bool hasFocus();
void RenderWithOffset(float yOffset); virtual void RenderWithOffset(float yOffset);
virtual void Render(); virtual void Render();
virtual void Update(float dt); virtual void Update(float dt);

View File

@@ -8,6 +8,8 @@
#include "Translate.h" #include "Translate.h"
#include "TextScroller.h" #include "TextScroller.h"
#include "Tasks.h" #include "Tasks.h"
#include "IconButton.h"
#include <iomanip> #include <iomanip>
namespace namespace
@@ -22,6 +24,7 @@ namespace
const float kVerticalScrollSpeed = 7.0f; const float kVerticalScrollSpeed = 7.0f;
const int DETAILED_INFO_THRESHOLD = 20; const int DETAILED_INFO_THRESHOLD = 20;
const int kDetailedInfoButtonId = 10000;
const PIXEL_TYPE kRedColor = ARGB(0xFF, 0xFF, 0x00, 0x00); const PIXEL_TYPE kRedColor = ARGB(0xFF, 0xFF, 0x00, 0x00);
} }
@@ -218,8 +221,11 @@ void DeckMenu::Render()
for (int i = startId; i < startId + maxItems; i++) for (int i = startId; i < startId + maxItems; i++)
{ {
if (i > mCount - 1) break; if (i > mCount - 1) break;
if (mObjects[i]->GetId() >= kDetailedInfoButtonId)
break; // objects with id > 9999 are clickable buttons
DeckMenuItem *currentMenuItem = static_cast<DeckMenuItem*> (mObjects[i]); DeckMenuItem *currentMenuItem = static_cast<DeckMenuItem*> (mObjects[i]);
if (currentMenuItem->mY - kLineHeight * startId < mY + height - kLineHeight + 7) if (currentMenuItem->getY() - kLineHeight * startId < mY + height - kLineHeight + 7)
{ {
// only load stats for visible items in the list // only load stats for visible items in the list
if (currentMenuItem->meta && !currentMenuItem->meta->mStatsLoaded) if (currentMenuItem->meta && !currentMenuItem->meta->mStatsLoaded)
@@ -272,7 +278,7 @@ void DeckMenu::Render()
} }
// fill in the description part of the screen // fill in the description part of the screen
string text = wordWrap(_(currentMenuItem->desc), descWidth, mainFont->mFontID ); string text = wordWrap(_(currentMenuItem->getDescription()), descWidth, mainFont->mFontID );
mainFont->DrawString(text.c_str(), descX, descY); mainFont->DrawString(text.c_str(), descX, descY);
mFont->SetColor(ARGB(255,255,255,255)); mFont->SetColor(ARGB(255,255,255,255));
@@ -347,10 +353,14 @@ void DeckMenu::Add(int id, const char * text, string desc, bool forceFocus, Deck
mY + kVerticalMargin + mCount * kLineHeight, (mCount == 0), mAutoTranslate, deckMetaData); mY + kVerticalMargin + mCount * kLineHeight, (mCount == 0), mAutoTranslate, deckMetaData);
Translator * t = Translator::GetInstance(); Translator * t = Translator::GetInstance();
map<string, string>::iterator it = t->deckValues.find(text); map<string, string>::iterator it = t->deckValues.find(text);
string deckDescription = "";
if (it != t->deckValues.end()) //translate decks desc if (it != t->deckValues.end()) //translate decks desc
menuItem->desc = it->second; deckDescription = it->second;
else else
menuItem->desc = deckMetaData ? deckMetaData->getDescription() : desc; deckDescription = deckMetaData ? deckMetaData->getDescription() : desc;
menuItem->setDescription(deckDescription);
JGuiController::Add(menuItem); JGuiController::Add(menuItem);
if (mCount <= maxItems) mHeight += kLineHeight; if (mCount <= maxItems) mHeight += kLineHeight;

View File

@@ -11,13 +11,11 @@
const int kHorizontalScrollSpeed = 30; // higher numbers mean faster scrolling const int kHorizontalScrollSpeed = 30; // higher numbers mean faster scrolling
DeckMenuItem::DeckMenuItem(DeckMenu* _parent, int id, int iFontId, string text, float x, float y, bool hasFocus, bool autoTranslate, DeckMetaData *deckMetaData): SimpleMenuItem(id) DeckMenuItem::DeckMenuItem(DeckMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus, bool autoTranslate, DeckMetaData *deckMetaData): SimpleMenuItem(NULL, id, fontId, text, x, y, hasFocus, autoTranslate)
{ {
mEngine = JGE::GetInstance(); mEngine = JGE::GetInstance();
parent = _parent; parent = _parent;
fontId = iFontId;
mY = y;
mX = x;
WFont * mFont = WResourceManager::Instance()->GetWFont(fontId); WFont * mFont = WResourceManager::Instance()->GetWFont(fontId);
meta = deckMetaData; meta = deckMetaData;
mText = trim(text); mText = trim(text);
@@ -27,7 +25,6 @@ DeckMenuItem::DeckMenuItem(DeckMenu* _parent, int id, int iFontId, string text,
mXOffset = kItemXOffset; mXOffset = kItemXOffset;
mHasFocus = hasFocus;
float newImageWidth = 0.0f; float newImageWidth = 0.0f;
if (meta && !meta->getGamesPlayed()) if (meta && !meta->getGamesPlayed())
{ {
@@ -46,7 +43,7 @@ DeckMenuItem::DeckMenuItem(DeckMenu* _parent, int id, int iFontId, string text,
if (hasFocus) if (hasFocus)
{ {
mIsValidSelection = true; setIsSelectionValid( true );
Entering(); Entering();
} }
@@ -92,15 +89,15 @@ void DeckMenuItem::RenderWithOffset(float yOffset)
{ {
SimpleMenuItem::mYOffset = yOffset; SimpleMenuItem::mYOffset = yOffset;
WFont * mFont = WResourceManager::Instance()->GetWFont(fontId); WFont * mFont = WResourceManager::Instance()->GetWFont(getFontId());
if (!( mHasFocus && mScrollEnabled )) if (!( hasFocus() && mScrollEnabled ))
mScrollerOffset = 0; mScrollerOffset = 0;
if (!mHasFocus && mScrollEnabled) if (!hasFocus() && mScrollEnabled)
mScrollerOffset = -1 * ( GetWidth() - ITEM_PX_WIDTH )/2; mScrollerOffset = -1 * ( GetWidth() - ITEM_PX_WIDTH )/2;
float offSet = mScrollerOffset; float offSet = mScrollerOffset;
mFont->DrawString(mText.c_str(), mX, mY + yOffset, JGETEXT_CENTER, offSet, ITEM_PX_WIDTH); mFont->DrawString( getText().c_str(), getX(), getY() + yOffset, JGETEXT_CENTER, offSet, ITEM_PX_WIDTH);
mDisplayInitialized = true; mDisplayInitialized = true;
//Render a "new" icon for decks that have never been played yet //Render a "new" icon for decks that have never been played yet
if (meta && !meta->getGamesPlayed()) if (meta && !meta->getGamesPlayed())
@@ -110,8 +107,9 @@ void DeckMenuItem::RenderWithOffset(float yOffset)
{ {
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 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); quad->SetHotSpot(quad->mWidth/2.0f, quad->mHeight/2.0f);
float x = mX + min(ITEM_PX_WIDTH - quad->mWidth, GetWidth() )/2 + quad->mWidth/2; float x = getX() + 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); if (quad)
JRenderer::GetInstance()->RenderQuad(quad.get(), x , getY() + yOffset + quad->mHeight/2, 0.5);
} }
} }
} }
@@ -123,15 +121,15 @@ void DeckMenuItem::Render()
void DeckMenuItem::Relocate(float x, float y) void DeckMenuItem::Relocate(float x, float y)
{ {
mX = x; setX( x );
mY = y; setY( y );
} }
void DeckMenuItem::Entering() void DeckMenuItem::Entering()
{ {
checkUserClick(); checkUserClick();
mHasFocus = true; setFocus(true);
parent->mSelectionTargetY = mY; parent->mSelectionTargetY = getY();
} }
@@ -151,33 +149,28 @@ void DeckMenuItem::checkUserClick()
int x1 = -1, y1 = -1; int x1 = -1, y1 = -1;
if (mEngine->GetLeftClickCoordinates(x1, y1)) if (mEngine->GetLeftClickCoordinates(x1, y1))
{ {
mIsValidSelection = false; SimpleMenuItem::setIsSelectionValid( false );
int x2 = static_cast<int>(mXOffset), y2 = static_cast<int>(mY + mYOffset); int x2 = static_cast<int>(mXOffset), y2 = static_cast<int>(getY() + mYOffset);
if ( (x1 >= x2) && (x1 <= (x2 + 200)) && (y1 >= y2) && (y1 < (y2 + 30))) if ( (x1 >= x2) && (x1 <= (x2 + 200)) && (y1 >= y2) && (y1 < (y2 + 30)))
mIsValidSelection = true; setIsSelectionValid( true );
} }
else else
mIsValidSelection = true; setIsSelectionValid( true );
} }
// Accessors // Accessors
float DeckMenuItem::GetWidth() float DeckMenuItem::GetWidth()
{ {
WFont * mFont = WResourceManager::Instance()->GetWFont(fontId); WFont * mFont = WResourceManager::Instance()->GetWFont(getFontId());
return mFont->GetStringWidth(mText.c_str()); return mFont->GetStringWidth(getText().c_str());
}
bool DeckMenuItem::hasFocus()
{
return mHasFocus;
} }
ostream& DeckMenuItem::toString(ostream& out) const ostream& DeckMenuItem::toString(ostream& out) const
{ {
return out << "DeckMenuItem ::: mHasFocus : " << mHasFocus return out << "DeckMenuItem ::: mHasFocus : " << hasFocus()
<< " ; parent : " << parent << " ; parent : " << parent
<< " ; mText : " << mText << " ; mText : " << getText()
<< " ; mX,mY : " << mX << "," << mY; << " ; mX,mY : " << getX() << "," << getY();
} }
DeckMenuItem::~DeckMenuItem() DeckMenuItem::~DeckMenuItem()

View File

@@ -177,11 +177,11 @@ void SimpleMenu::Render()
for (int i = startId; i < startId + maxItems; i++) for (int i = startId; i < startId + maxItems; i++)
{ {
if (i > mCount - 1) break; if (i > mCount - 1) break;
if ((static_cast<SimpleMenuItem*> (mObjects[i]))->mY - kLineHeight * startId < mY + height - kLineHeight + 7) if ((static_cast<SimpleMenuItem*> (mObjects[i]))->getY() - kLineHeight * startId < mY + height - kLineHeight + 7)
{ {
if (static_cast<SimpleMenuItem*> (mObjects[i])->hasFocus()) if (static_cast<SimpleMenuItem*> (mObjects[i])->hasFocus())
{ {
WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT)->DrawString(static_cast<SimpleMenuItem*> (mObjects[i])->desc.c_str(), mX WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT)->DrawString(static_cast<SimpleMenuItem*> (mObjects[i])->getDescription().c_str(), mX
+ mWidth + 10, mY + 15); + mWidth + 10, mY + 15);
mFont->SetColor(ARGB(255,255,255,0)); mFont->SetColor(ARGB(255,255,255,0));
} }
@@ -225,7 +225,7 @@ void SimpleMenu::Add(int id, const char * text, string desc, bool forceFocus)
SimpleMenuItem * smi = NEW SimpleMenuItem(this, id, fontId, text, 0, mY + kVerticalMargin + mCount * kLineHeight, SimpleMenuItem * smi = NEW SimpleMenuItem(this, id, fontId, text, 0, mY + kVerticalMargin + mCount * kLineHeight,
(mCount == 0), autoTranslate); (mCount == 0), autoTranslate);
smi->desc = desc; smi->setDescription(desc);
JGuiController::Add(smi); JGuiController::Add(smi);
if (mCount <= maxItems) mHeight += kLineHeight; if (mCount <= maxItems) mHeight += kLineHeight;
if (forceFocus) if (forceFocus)

View File

@@ -12,12 +12,15 @@ SimpleMenuItem::SimpleMenuItem(int id): JGuiObject(id)
} }
SimpleMenuItem::SimpleMenuItem(SimpleMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus, bool autoTranslate) : SimpleMenuItem::SimpleMenuItem(SimpleMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus, bool autoTranslate) :
JGuiObject(id), parent(_parent), fontId(fontId), mX(x), mY(y) JGuiObject(id), parent(_parent), mFontId(fontId), mX(x), mY(y)
{ {
if (autoTranslate) if (autoTranslate)
mText = _(text); mText = _(text);
else else
mText = text; mText = text;
mDescription = "";
mHasFocus = hasFocus; mHasFocus = hasFocus;
mScale = 1.0f; mScale = 1.0f;
@@ -27,15 +30,19 @@ SimpleMenuItem::SimpleMenuItem(SimpleMenu* _parent, int id, int fontId, string t
if (hasFocus) if (hasFocus)
{ {
mIsValidSelection = true; setIsSelectionValid(true);
Entering(); Entering();
} }
else
{
setIsSelectionValid(false);
}
} }
void SimpleMenuItem::RenderWithOffset(float yOffset) void SimpleMenuItem::RenderWithOffset(float yOffset)
{ {
mYOffset = yOffset; mYOffset = yOffset;
WFont * mFont = WResourceManager::Instance()->GetWFont(fontId); WFont * mFont = WResourceManager::Instance()->GetWFont(mFontId);
mFont->DrawString(mText.c_str(), mX, mY + yOffset, JGETEXT_CENTER); mFont->DrawString(mText.c_str(), mX, mY + yOffset, JGETEXT_CENTER);
} }
@@ -60,14 +67,15 @@ void SimpleMenuItem::Update(float dt)
void SimpleMenuItem::checkUserClick() void SimpleMenuItem::checkUserClick()
{ {
mIsValidSelection = true; setIsSelectionValid(true);
} }
void SimpleMenuItem::Entering() void SimpleMenuItem::Entering()
{ {
checkUserClick(); checkUserClick();
mHasFocus = true; mHasFocus = true;
parent->selectionTargetY = mY; if (parent != NULL)
parent->selectionTargetY = mY;
} }
bool SimpleMenuItem::Leaving(JButton key) bool SimpleMenuItem::Leaving(JButton key)
@@ -90,18 +98,75 @@ void SimpleMenuItem::Relocate(float x, float y)
mY = y; mY = y;
} }
float SimpleMenuItem::GetWidth()
/* Accessors */
float SimpleMenuItem::getX() const
{ {
WFont * mFont = WResourceManager::Instance()->GetWFont(fontId); return mX;
mFont->SetScale(1.0);
return mFont->GetStringWidth(mText.c_str());
} }
bool SimpleMenuItem::hasFocus() float SimpleMenuItem::getY() const
{
return mY;
}
void SimpleMenuItem::setFontId(const int &fontId)
{
mFontId = fontId;
}
int SimpleMenuItem::getFontId() const
{
return mFontId;
}
void SimpleMenuItem::setIsSelectionValid( bool validSelection )
{
mIsValidSelection = validSelection;
}
bool SimpleMenuItem::isSelectionValid() const
{
return mIsValidSelection;
}
void SimpleMenuItem::setFocus(bool value)
{
mHasFocus = value;
}
bool SimpleMenuItem::hasFocus() const
{ {
return mHasFocus; return mHasFocus;
} }
string SimpleMenuItem::getDescription() const
{
return mDescription;
}
void SimpleMenuItem::setDescription( const string& desc )
{
mDescription = desc;
}
string SimpleMenuItem::getText() const
{
return mText;
}
void SimpleMenuItem::setText( const string& text)
{
mText = text;
}
float SimpleMenuItem::GetWidth() const
{
WFont * mFont = WResourceManager::Instance()->GetWFont(mFontId);
mFont->SetScale(1.0);
return mFont->GetStringWidth(mText.c_str());
}
ostream& SimpleMenuItem::toString(ostream& out) const ostream& SimpleMenuItem::toString(ostream& out) const
{ {
return out << "SimpleMenuItem ::: mHasFocus : " << mHasFocus return out << "SimpleMenuItem ::: mHasFocus : " << mHasFocus