2020-04-05 12:32:13 +00:00
|
|
|
#include "common.h"
|
|
|
|
#include "main.h"
|
|
|
|
#include "Timer.h"
|
|
|
|
#include "Sprite2d.h"
|
|
|
|
#include "Text.h"
|
|
|
|
#include "Font.h"
|
|
|
|
#include "FrontEndControls.h"
|
|
|
|
|
2020-06-27 21:01:51 +00:00
|
|
|
#define X SCREEN_SCALE_X
|
2020-12-07 18:12:13 +00:00
|
|
|
#define Y(x) SCREEN_SCALE_Y(float(x)*(float(DEFAULT_SCREEN_HEIGHT)/float(SCREEN_HEIGHT_PAL)))
|
2020-04-05 12:32:13 +00:00
|
|
|
|
|
|
|
void
|
|
|
|
CPlaceableShText::Draw(float x, float y)
|
|
|
|
{
|
|
|
|
if(m_text == nil)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if(m_bRightJustify)
|
|
|
|
CFont::SetRightJustifyOn();
|
|
|
|
if(m_bDropShadow){
|
|
|
|
CFont::SetDropShadowPosition(m_shadowOffset.x);
|
|
|
|
CFont::SetDropColor(m_shadowColor);
|
|
|
|
}
|
|
|
|
CFont::SetColor(m_color);
|
|
|
|
CFont::PrintString(x+m_position.x, y+m_position.y, m_text);
|
|
|
|
if(m_bDropShadow)
|
|
|
|
CFont::SetDropShadowPosition(0);
|
|
|
|
if(m_bRightJustify)
|
|
|
|
CFont::SetRightJustifyOff();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CPlaceableShText::Draw(const CRGBA &color, float x, float y)
|
|
|
|
{
|
|
|
|
if(m_text == nil)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if(m_bRightJustify)
|
|
|
|
CFont::SetRightJustifyOn();
|
|
|
|
if(m_bDropShadow){
|
|
|
|
CFont::SetDropShadowPosition(m_shadowOffset.x);
|
|
|
|
CFont::SetDropColor(m_shadowColor);
|
|
|
|
}
|
|
|
|
CFont::SetColor(color);
|
|
|
|
CFont::PrintString(x+m_position.x, y+m_position.y, m_text);
|
|
|
|
if(m_bDropShadow)
|
|
|
|
CFont::SetDropShadowPosition(0);
|
|
|
|
if(m_bRightJustify)
|
|
|
|
CFont::SetRightJustifyOff();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CPlaceableShTextTwoLines::Draw(float x, float y)
|
|
|
|
{
|
|
|
|
if(m_line1.m_text == nil && m_line2.m_text == nil)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if(m_bRightJustify)
|
|
|
|
CFont::SetRightJustifyOn();
|
|
|
|
if(m_bDropShadow){
|
|
|
|
CFont::SetDropShadowPosition(m_shadowOffset.x);
|
|
|
|
CFont::SetDropColor(m_shadowColor);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_line1.m_text){
|
|
|
|
CFont::SetColor(m_line1.m_color);
|
|
|
|
CFont::PrintString(x+m_line1.m_position.x, y+m_line1.m_position.y, m_line1.m_text);
|
|
|
|
}
|
|
|
|
if(m_line2.m_text){
|
|
|
|
CFont::SetColor(m_line2.m_color);
|
|
|
|
CFont::PrintString(x+m_line2.m_position.x, y+m_line2.m_position.y, m_line2.m_text);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_bDropShadow)
|
|
|
|
CFont::SetDropShadowPosition(0);
|
|
|
|
if(m_bRightJustify)
|
|
|
|
CFont::SetRightJustifyOff();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CPlaceableShTextTwoLines::Draw(const CRGBA &color, float x, float y)
|
|
|
|
{
|
|
|
|
if(m_line1.m_text == nil && m_line2.m_text == nil)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if(m_bRightJustify)
|
|
|
|
CFont::SetRightJustifyOn();
|
|
|
|
if(m_bDropShadow){
|
|
|
|
CFont::SetDropShadowPosition(m_shadowOffset.x);
|
|
|
|
CFont::SetDropColor(m_shadowColor);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_line1.m_text){
|
|
|
|
CFont::SetColor(color);
|
|
|
|
CFont::PrintString(x+m_line1.m_position.x, y+m_line1.m_position.y, m_line1.m_text);
|
|
|
|
}
|
|
|
|
if(m_line2.m_text){
|
|
|
|
CFont::SetColor(color);
|
|
|
|
CFont::PrintString(x+m_line2.m_position.x, y+m_line2.m_position.y, m_line2.m_text);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_bDropShadow)
|
|
|
|
CFont::SetDropShadowPosition(0);
|
|
|
|
if(m_bRightJustify)
|
|
|
|
CFont::SetRightJustifyOff();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CPlaceableShOption::Draw(const CRGBA &highlightColor, float x, float y, bool bHighlight)
|
|
|
|
{
|
|
|
|
if(bHighlight)
|
|
|
|
CPlaceableShText::Draw(highlightColor, x, y);
|
|
|
|
else if(m_bSelected)
|
|
|
|
CPlaceableShText::Draw(m_selectedColor, x, y);
|
|
|
|
else
|
|
|
|
CPlaceableShText::Draw(x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CPlaceableShOptionTwoLines::Draw(const CRGBA &highlightColor, float x, float y, bool bHighlight)
|
|
|
|
{
|
|
|
|
if(bHighlight)
|
|
|
|
CPlaceableShTextTwoLines::Draw(highlightColor, x, y);
|
|
|
|
else if(m_bSelected)
|
|
|
|
CPlaceableShTextTwoLines::Draw(m_selectedColor, x, y);
|
|
|
|
else
|
|
|
|
CPlaceableShTextTwoLines::Draw(x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CPlaceableSprite::Draw(float x, float y)
|
|
|
|
{
|
|
|
|
Draw(m_color, x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CPlaceableSprite::Draw(const CRGBA &color, float x, float y)
|
|
|
|
{
|
|
|
|
if(m_pSprite)
|
|
|
|
m_pSprite->Draw(CRect(m_position.x+x, m_position.y+y,
|
|
|
|
m_position.x+x + m_size.x, m_position.y+y + m_size.y),
|
|
|
|
color);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CPlaceableShSprite::Draw(float x, float y)
|
|
|
|
{
|
|
|
|
if(m_bDropShadow)
|
|
|
|
m_shadow.Draw(m_shadow.m_color, m_sprite.m_position.x+x, m_sprite.m_position.y+y);
|
|
|
|
m_sprite.Draw(x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuPictureAndText
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPictureAndText::SetNewOldShadowWrapX(bool bWrapX, float newWrapX, float oldWrapX)
|
|
|
|
{
|
|
|
|
m_bWrap = bWrapX;
|
|
|
|
m_wrapX = newWrapX;
|
|
|
|
m_oldWrapx = oldWrapX;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPictureAndText::SetNewOldTextScale(bool bTextScale, const CVector2D &newScale, const CVector2D &oldScale)
|
|
|
|
{
|
|
|
|
m_bSetTextScale = bTextScale;
|
|
|
|
m_textScale = newScale;
|
|
|
|
m_oldTextScale = oldScale;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPictureAndText::SetTextsColor(CRGBA const &color)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < m_numTexts; i++)
|
|
|
|
m_texts[i].m_color = color;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPictureAndText::AddText(wchar *text, float positionX, float positionY, CRGBA const &color, bool bRightJustify)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
if(m_numTexts >= 20)
|
|
|
|
return;
|
|
|
|
i = m_numTexts++;
|
|
|
|
m_texts[i].m_text = text;
|
|
|
|
m_texts[i].m_position.x = positionX;
|
|
|
|
m_texts[i].m_position.y = positionY;
|
|
|
|
m_texts[i].m_color = color;
|
|
|
|
m_texts[i].m_bRightJustify = bRightJustify;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPictureAndText::AddPicture(CSprite2d *sprite, CSprite2d *shadow, float positionX, float positionY, float width, float height, CRGBA const &color)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
if(m_numSprites >= 5)
|
|
|
|
return;
|
|
|
|
i = m_numSprites++;
|
|
|
|
m_sprites[i].m_sprite.m_pSprite = sprite;
|
|
|
|
m_sprites[i].m_shadow.m_pSprite = shadow;
|
|
|
|
m_sprites[i].m_sprite.m_position.x = positionX;
|
|
|
|
m_sprites[i].m_sprite.m_position.y = positionY;
|
|
|
|
m_sprites[i].m_sprite.m_size.x = width;
|
|
|
|
m_sprites[i].m_sprite.m_size.y = height;
|
|
|
|
m_sprites[i].m_shadow.m_size.x = width;
|
|
|
|
m_sprites[i].m_shadow.m_size.y = height;
|
|
|
|
m_sprites[i].m_sprite.m_color = color;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPictureAndText::AddPicture(CSprite2d *sprite, float positionX, float positionY, float width, float height, CRGBA const &color)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
if(m_numSprites >= 5)
|
|
|
|
return;
|
|
|
|
i = m_numSprites++;
|
|
|
|
m_sprites[i].m_sprite.m_pSprite = sprite;
|
|
|
|
m_sprites[i].m_shadow.m_pSprite = nil;
|
|
|
|
m_sprites[i].m_sprite.m_position.x = positionX;
|
|
|
|
m_sprites[i].m_sprite.m_position.y = positionY;
|
|
|
|
m_sprites[i].m_sprite.m_size.x = width;
|
|
|
|
m_sprites[i].m_sprite.m_size.y = height;
|
|
|
|
m_sprites[i].m_shadow.m_size.x = width;
|
|
|
|
m_sprites[i].m_shadow.m_size.y = height;
|
|
|
|
m_sprites[i].m_sprite.m_color = color;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPictureAndText::Draw(CRGBA const &,CRGBA const &, float x, float y)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; i < m_numSprites; i++)
|
|
|
|
m_sprites[i].Draw(m_position.x+x, m_position.y+y);
|
|
|
|
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
for(i = 0; i < m_numTexts; i++)
|
|
|
|
if(m_bWrap)
|
|
|
|
m_texts[i].DrawShWrap(m_position.x+x, m_position.y+y, m_wrapX, m_oldWrapx);
|
|
|
|
else
|
|
|
|
m_texts[i].Draw(m_position.x+x, m_position.y+y);
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPictureAndText::SetAlpha(uint8 alpha)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; i < m_numSprites; i++)
|
|
|
|
m_sprites[i].SetAlpha(alpha);
|
|
|
|
for(i = 0; i < m_numTexts; i++)
|
|
|
|
m_texts[i].SetAlpha(alpha);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPictureAndText::SetShadows(bool bDropShadows, const CRGBA &shadowColor, const CVector2D &shadowOffset)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; i < 5; i++)
|
|
|
|
m_sprites[i].SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
for(i = 0; i < 20; i++)
|
|
|
|
m_texts[i].SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuMultiChoice
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoice::AddTitle(wchar *text, float positionX, float positionY, bool bRightJustify)
|
|
|
|
{
|
|
|
|
m_title.m_text = text;
|
|
|
|
m_title.SetPosition(positionX, positionY, bRightJustify);
|
|
|
|
}
|
|
|
|
|
|
|
|
CPlaceableShOption*
|
|
|
|
CMenuMultiChoice::AddOption(wchar *text, float positionX, float positionY, bool bSelected, bool bRightJustify)
|
|
|
|
{
|
|
|
|
if(m_numOptions == NUM_MULTICHOICE_OPTIONS)
|
|
|
|
return nil;
|
|
|
|
m_options[m_numOptions].m_text = text;
|
|
|
|
m_options[m_numOptions].SetPosition(positionX, positionY);
|
|
|
|
m_options[m_numOptions].m_bSelected = bSelected;
|
|
|
|
m_options[m_numOptions].m_bRightJustify = bRightJustify;
|
|
|
|
return &m_options[m_numOptions++];
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoice::SetColors(const CRGBA &title, const CRGBA &normal, const CRGBA &selected)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
m_title.SetColor(title);
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_options[i].SetColors(normal, selected);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoice::SetNewOldTextScale(bool bTextScale, const CVector2D &newScale, const CVector2D &oldScale, bool bTitleTextScale)
|
|
|
|
{
|
|
|
|
m_bSetTextScale = bTextScale;
|
|
|
|
m_textScale = newScale;
|
|
|
|
m_oldTextScale = oldScale;
|
|
|
|
m_bSetTitleTextScale = bTitleTextScale;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoice::Draw(CRGBA const &optionHighlight ,CRGBA const &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if(m_bSetTextScale && m_bSetTitleTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
if(m_cursor == -1)
|
|
|
|
m_title.Draw(m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
|
|
|
|
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
|
|
|
|
if(m_cursor == -1)
|
|
|
|
for(i = 0; i < m_numOptions; i++)
|
|
|
|
m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
|
|
|
|
else
|
|
|
|
for(i = 0; i < m_numOptions; i++){
|
|
|
|
if(i == m_cursor)
|
|
|
|
m_options[i].Draw(optionHighlight, m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_bSetTextScale){
|
|
|
|
CFont::DrawFonts();
|
|
|
|
CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoice::DrawNormal(float x, float y)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if(m_bSetTextScale && m_bSetTitleTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
m_title.Draw(m_position.x+x, m_position.y+y);
|
|
|
|
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
|
|
|
|
for(i = 0; i < m_numOptions; i++)
|
|
|
|
m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
|
|
|
|
|
|
|
|
if(m_bSetTextScale){
|
|
|
|
CFont::DrawFonts();
|
|
|
|
CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoice::DrawHighlighted(CRGBA const &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if(m_bSetTextScale && m_bSetTitleTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
if(m_cursor == -1)
|
|
|
|
m_title.Draw(m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
|
|
|
|
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
|
|
|
|
for(i = 0; i < m_numOptions; i++)
|
|
|
|
m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
|
|
|
|
|
|
|
|
if(m_bSetTextScale){
|
|
|
|
CFont::DrawFonts();
|
|
|
|
CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoice::SetAlpha(uint8 alpha)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
m_title.SetAlpha(alpha);
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_options[i].SetAlpha(alpha);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoice::SetShadows(bool bDropShadows, CRGBA const &shadowColor, CVector2D const &shadowOffset)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
m_title.SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_options[i].SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuMultiChoice::GoNext(void)
|
|
|
|
{
|
|
|
|
if(m_cursor == m_numOptions-1){
|
|
|
|
m_cursor = -1;
|
|
|
|
return false;
|
|
|
|
}else{
|
|
|
|
m_cursor++;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuMultiChoice::GoPrev(void)
|
|
|
|
{
|
|
|
|
if(m_cursor == 0){
|
|
|
|
m_cursor = -1;
|
|
|
|
return false;
|
|
|
|
}else{
|
|
|
|
m_cursor--;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoice::SelectCurrentOptionUnderCursor(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
if(m_cursor == -1)
|
|
|
|
return;
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_options[i].m_bSelected = false;
|
|
|
|
m_options[m_cursor].m_bSelected = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
CMenuMultiChoice::GetMenuSelection(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
if(m_options[i].m_bSelected)
|
|
|
|
return i;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoice::SetMenuSelection(int selection)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_options[i].m_bSelected = false;
|
|
|
|
m_options[selection%NUM_MULTICHOICE_OPTIONS].m_bSelected = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuMultiChoiceTriggered
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTriggered::Initialise(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_triggers[i] = nil;
|
|
|
|
m_defaultCancel = nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
CPlaceableShOption*
|
|
|
|
CMenuMultiChoiceTriggered::AddOption(wchar *text, float positionX, float positionY, Trigger trigger, bool bSelected, bool bRightJustify)
|
|
|
|
{
|
|
|
|
CPlaceableShOption *option;
|
|
|
|
option = CMenuMultiChoice::AddOption(text, positionX, positionY, bSelected, bRightJustify);
|
|
|
|
if(option)
|
|
|
|
m_triggers[m_numOptions-1] = trigger;
|
|
|
|
return option;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTriggered::SelectCurrentOptionUnderCursor(void)
|
|
|
|
{
|
|
|
|
CMenuMultiChoice::SelectCurrentOptionUnderCursor();
|
2020-06-27 22:57:01 +00:00
|
|
|
if(m_cursor != -1 && m_triggers[m_cursor] != nil )
|
2020-04-05 12:32:13 +00:00
|
|
|
m_triggers[m_cursor](this);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTriggered::SelectDefaultCancelAction(void)
|
|
|
|
{
|
|
|
|
if(m_defaultCancel)
|
|
|
|
m_defaultCancel(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuMultiChoiceTriggeredAlways
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTriggeredAlways::Draw(CRGBA const &optionHighlight, CRGBA const &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
if(m_alwaysTrigger)
|
|
|
|
m_alwaysTrigger(this);
|
|
|
|
CMenuMultiChoiceTriggered::Draw(optionHighlight, titleHighlight, x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTriggeredAlways::DrawNormal(float x, float y)
|
|
|
|
{
|
|
|
|
if(m_alwaysNormalTrigger)
|
|
|
|
m_alwaysNormalTrigger(this);
|
|
|
|
CMenuMultiChoiceTriggered::DrawNormal(x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTriggeredAlways::DrawHighlighted(CRGBA const &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
if(m_alwaysHighlightTrigger)
|
|
|
|
m_alwaysHighlightTrigger(this);
|
|
|
|
CMenuMultiChoiceTriggered::DrawHighlighted(titleHighlight, x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuMultiChoicePictured
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoicePictured::Initialise(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_bHasSprite[i] = false;
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_sprites[i].m_pSprite = nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
CPlaceableShOption*
|
|
|
|
CMenuMultiChoicePictured::AddOption(CSprite2d *sprite, float positionX, float positionY, const CVector2D &size, bool bSelected)
|
|
|
|
{
|
|
|
|
CPlaceableShOption *option;
|
|
|
|
option = CMenuMultiChoice::AddOption(nil, 0.0f, 0.0f, bSelected, false);
|
|
|
|
if(option){
|
|
|
|
m_sprites[m_numOptions-1].m_pSprite = sprite;
|
|
|
|
m_sprites[m_numOptions-1].SetPosition(positionX, positionY);
|
|
|
|
m_sprites[m_numOptions-1].m_size = size;
|
|
|
|
m_bHasSprite[m_numOptions-1] = true;
|
|
|
|
}
|
|
|
|
return option;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoicePictured::Draw(const CRGBA &optionHighlight, const CRGBA &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
// The title and all the text
|
|
|
|
CMenuMultiChoice::Draw(optionHighlight, titleHighlight, x, y);
|
|
|
|
|
|
|
|
CRGBA selectedColor = m_options[0].GetSelectedColor();
|
|
|
|
CRGBA color = m_options[0].GetColor();
|
|
|
|
|
|
|
|
// The sprites
|
|
|
|
if(m_cursor == -1){
|
|
|
|
for(i = 0; i < m_numOptions; i++)
|
|
|
|
if(m_bHasSprite[i]){
|
|
|
|
if(m_options[i].m_bSelected)
|
|
|
|
m_sprites[i].Draw(selectedColor, m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_sprites[i].Draw(color, m_position.x+x, m_position.y+y);
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
for(i = 0; i < m_numOptions; i++)
|
|
|
|
if(i == m_cursor){
|
|
|
|
if(m_bHasSprite[i])
|
2020-06-27 21:01:51 +00:00
|
|
|
{
|
|
|
|
uint8 color = Max(Max(optionHighlight.r, optionHighlight.g), optionHighlight.b);
|
|
|
|
m_sprites[i].Draw(CRGBA(color, color, color, optionHighlight.a), m_position.x+x, m_position.y+y);
|
|
|
|
}
|
2020-04-05 12:32:13 +00:00
|
|
|
}else{
|
|
|
|
if(m_bHasSprite[i]){
|
|
|
|
if(m_options[i].m_bSelected)
|
|
|
|
m_sprites[i].Draw(selectedColor, m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_sprites[i].Draw(color, m_position.x+x, m_position.y+y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoicePictured::DrawNormal(float x, float y)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
// The title and all the text
|
|
|
|
CMenuMultiChoice::DrawNormal(x, y);
|
|
|
|
|
|
|
|
CRGBA selectedColor = m_options[0].GetSelectedColor();
|
|
|
|
CRGBA color = m_options[0].GetColor();
|
|
|
|
|
|
|
|
// The sprites
|
|
|
|
for(i = 0; i < m_numOptions; i++)
|
|
|
|
if(m_bHasSprite[i]){
|
|
|
|
if(m_options[i].m_bSelected)
|
|
|
|
m_sprites[i].Draw(selectedColor, m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_sprites[i].Draw(color, m_position.x+x, m_position.y+y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoicePictured::DrawHighlighted(const CRGBA &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
// The title and all the text
|
|
|
|
CMenuMultiChoice::DrawHighlighted(titleHighlight, x, y);
|
|
|
|
|
|
|
|
CRGBA selectedColor = m_options[0].GetSelectedColor();
|
|
|
|
CRGBA color = m_options[0].GetColor();
|
|
|
|
|
|
|
|
// The sprites
|
|
|
|
for(i = 0; i < m_numOptions; i++)
|
|
|
|
if(m_bHasSprite[i]){
|
|
|
|
if(m_options[i].m_bSelected)
|
|
|
|
m_sprites[i].Draw(selectedColor, m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_sprites[i].Draw(color, m_position.x+x, m_position.y+y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoicePictured::SetAlpha(uint8 alpha)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
CMenuMultiChoice::SetAlpha(alpha);
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_sprites[i].SetAlpha(alpha);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuMultiChoicePicturedTriggered
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoicePicturedTriggered::Initialise(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_triggers[i] = nil;
|
|
|
|
m_defaultCancel = nil; // missing on PS2
|
|
|
|
}
|
|
|
|
|
|
|
|
CPlaceableShOption*
|
|
|
|
CMenuMultiChoicePicturedTriggered::AddOption(CSprite2d *sprite, float positionX, float positionY, const CVector2D &size, Trigger trigger, bool bSelected)
|
|
|
|
{
|
|
|
|
CPlaceableShOption *option;
|
|
|
|
option = CMenuMultiChoicePictured::AddOption(sprite, positionX, positionY, size, bSelected);
|
|
|
|
if(option)
|
|
|
|
m_triggers[m_numOptions-1] = trigger;
|
|
|
|
return option;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoicePicturedTriggered::SelectCurrentOptionUnderCursor(void)
|
|
|
|
{
|
|
|
|
CMenuMultiChoice::SelectCurrentOptionUnderCursor();
|
|
|
|
if(m_cursor != -1)
|
|
|
|
m_triggers[m_cursor](this);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoicePicturedTriggered::SelectDefaultCancelAction(void)
|
|
|
|
{
|
|
|
|
if(m_defaultCancel)
|
|
|
|
m_defaultCancel(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuMultiChoicePicturedTriggeredAnyMove
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoicePicturedTriggeredAnyMove::Initialise(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
CMenuMultiChoicePicturedTriggered::Initialise();
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++){
|
|
|
|
m_moveTab[i].right = -1;
|
|
|
|
m_moveTab[i].left = -1;
|
|
|
|
m_moveTab[i].down = -1;
|
|
|
|
m_moveTab[i].up = -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
CPlaceableShOption*
|
|
|
|
CMenuMultiChoicePicturedTriggeredAnyMove::AddOption(CSprite2d *sprite, FEC_MOVETAB *moveTab, float positionX, float positionY, const CVector2D &size, Trigger trigger, bool bSelected)
|
|
|
|
{
|
|
|
|
CPlaceableShOption *option;
|
|
|
|
option = CMenuMultiChoicePicturedTriggered::AddOption(sprite, positionX, positionY, size, trigger, bSelected);
|
|
|
|
if(option && moveTab)
|
|
|
|
m_moveTab[m_numOptions-1] = *moveTab;
|
|
|
|
return option;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuMultiChoicePicturedTriggeredAnyMove::GoDown(void)
|
|
|
|
{
|
|
|
|
int move = m_moveTab[m_cursor].down;
|
|
|
|
if(move == -1)
|
|
|
|
return GoNext();
|
|
|
|
m_cursor = move;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuMultiChoicePicturedTriggeredAnyMove::GoUp(void)
|
|
|
|
{
|
|
|
|
int move = m_moveTab[m_cursor].up;
|
|
|
|
if(move == -1)
|
|
|
|
return GoPrev();
|
|
|
|
m_cursor = move;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuMultiChoicePicturedTriggeredAnyMove::GoLeft(void)
|
|
|
|
{
|
|
|
|
int move = m_moveTab[m_cursor].left;
|
|
|
|
if(move == -1)
|
|
|
|
return GoPrev();
|
|
|
|
m_cursor = move;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuMultiChoicePicturedTriggeredAnyMove::GoRight(void)
|
|
|
|
{
|
|
|
|
int move = m_moveTab[m_cursor].right;
|
|
|
|
if(move == -1)
|
|
|
|
return GoNext();
|
|
|
|
m_cursor = move;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuMultiChoiceTwoLines
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTwoLines::AddTitle(wchar *text, float positionX, float positionY, bool bRightJustify)
|
|
|
|
{
|
|
|
|
m_title.m_text = text;
|
|
|
|
m_title.SetPosition(positionX, positionY, bRightJustify);
|
|
|
|
}
|
|
|
|
|
|
|
|
CPlaceableShOptionTwoLines*
|
|
|
|
CMenuMultiChoiceTwoLines::AddOption(wchar *text, float positionX, float positionY, bool bSelected, bool bRightJustify)
|
|
|
|
{
|
|
|
|
return AddOption(text, positionX, positionY, nil, 0.0f, 0.0f, bSelected, bRightJustify);
|
|
|
|
}
|
|
|
|
|
|
|
|
CPlaceableShOptionTwoLines*
|
|
|
|
CMenuMultiChoiceTwoLines::AddOption(wchar *text1, float positionX1, float positionY1, wchar *text2, float positionX2, float positionY2, bool bSelected, bool bRightJustify)
|
|
|
|
{
|
|
|
|
if(m_numOptions == NUM_MULTICHOICE_OPTIONS)
|
|
|
|
return nil;
|
|
|
|
m_options[m_numOptions].m_line1.m_text = text1;
|
|
|
|
m_options[m_numOptions].m_line2.m_text = text2;
|
|
|
|
m_options[m_numOptions].m_line1.SetPosition(positionX1, positionY1);
|
|
|
|
m_options[m_numOptions].m_line2.SetPosition(positionX2, positionY2);
|
|
|
|
m_options[m_numOptions].m_bSelected = bSelected;
|
|
|
|
m_options[m_numOptions].m_bRightJustify = bRightJustify;
|
|
|
|
return &m_options[m_numOptions++];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTwoLines::SetColors(const CRGBA &title, const CRGBA &normal, const CRGBA &selected)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
m_title.SetColor(title);
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_options[i].SetColors(normal, selected);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTwoLines::SetNewOldTextScale(bool bTextScale, const CVector2D &newScale, const CVector2D &oldScale, bool bTitleTextScale)
|
|
|
|
{
|
|
|
|
m_bSetTextScale = bTextScale;
|
|
|
|
m_textScale = newScale;
|
|
|
|
m_oldTextScale = oldScale;
|
|
|
|
m_bSetTitleTextScale = bTitleTextScale;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTwoLines::Draw(CRGBA const &optionHighlight ,CRGBA const &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if(m_bSetTextScale && m_bSetTitleTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
if(m_cursor == -1)
|
|
|
|
m_title.Draw(m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
|
|
|
|
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
|
|
|
|
if(m_cursor == -1)
|
|
|
|
for(i = 0; i < m_numOptions; i++)
|
|
|
|
m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
|
|
|
|
else
|
|
|
|
for(i = 0; i < m_numOptions; i++){
|
|
|
|
if(i == m_cursor)
|
|
|
|
m_options[i].Draw(optionHighlight, m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_bSetTextScale){
|
|
|
|
CFont::DrawFonts();
|
|
|
|
CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTwoLines::DrawNormal(float x, float y)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if(m_bSetTextScale && m_bSetTitleTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
m_title.Draw(m_position.x+x, m_position.y+y);
|
|
|
|
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
|
|
|
|
for(i = 0; i < m_numOptions; i++)
|
|
|
|
m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
|
|
|
|
|
|
|
|
if(m_bSetTextScale){
|
|
|
|
CFont::DrawFonts();
|
|
|
|
CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTwoLines::DrawHighlighted(CRGBA const &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if(m_bSetTextScale && m_bSetTitleTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
if(m_cursor == -1)
|
|
|
|
m_title.Draw(m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
|
|
|
|
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
|
|
|
|
for(i = 0; i < m_numOptions; i++)
|
|
|
|
m_options[i].Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
|
|
|
|
|
|
|
|
if(m_bSetTextScale){
|
|
|
|
CFont::DrawFonts();
|
|
|
|
CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTwoLines::SetAlpha(uint8 alpha)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
m_title.SetAlpha(alpha);
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_options[i].SetAlpha(alpha);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTwoLines::SetShadows(bool bDropShadows, CRGBA const &shadowColor, CVector2D const &shadowOffset)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
m_title.SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_options[i].SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuMultiChoiceTwoLines::GoNext(void)
|
|
|
|
{
|
|
|
|
if(m_cursor == m_numOptions-1){
|
|
|
|
m_cursor = -1;
|
|
|
|
return false;
|
|
|
|
}else{
|
|
|
|
m_cursor++;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuMultiChoiceTwoLines::GoPrev(void)
|
|
|
|
{
|
|
|
|
if(m_cursor == 0){
|
|
|
|
m_cursor = -1;
|
|
|
|
return false;
|
|
|
|
}else{
|
|
|
|
m_cursor--;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTwoLines::SelectCurrentOptionUnderCursor(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
if(m_cursor == -1)
|
|
|
|
return;
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_options[i].m_bSelected = false;
|
|
|
|
m_options[m_cursor].m_bSelected = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
CMenuMultiChoiceTwoLines::GetMenuSelection(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
if(m_options[i].m_bSelected)
|
|
|
|
return i;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTwoLines::SetMenuSelection(int selection)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_options[i].m_bSelected = false;
|
|
|
|
m_options[selection%NUM_MULTICHOICE_OPTIONS].m_bSelected = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuMultiChoiceTwoLinesTriggered
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTwoLinesTriggered::Initialise(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < NUM_MULTICHOICE_OPTIONS; i++)
|
|
|
|
m_triggers[i] = nil;
|
|
|
|
m_defaultCancel = nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
CPlaceableShOptionTwoLines*
|
|
|
|
CMenuMultiChoiceTwoLinesTriggered::AddOption(wchar *text, float positionX, float positionY, Trigger trigger, bool bSelected, bool bRightJustify)
|
|
|
|
{
|
|
|
|
CPlaceableShOptionTwoLines *option;
|
|
|
|
option = CMenuMultiChoiceTwoLines::AddOption(text, positionX, positionY, bSelected, bRightJustify);
|
|
|
|
if(option)
|
|
|
|
m_triggers[m_numOptions-1] = trigger;
|
|
|
|
return option;
|
|
|
|
}
|
|
|
|
|
|
|
|
CPlaceableShOptionTwoLines*
|
|
|
|
CMenuMultiChoiceTwoLinesTriggered::AddOption(wchar *text1, float positionX1, float positionY1, wchar *text2, float positionX2, float positionY2, Trigger trigger, bool bSelected, bool bRightJustify)
|
|
|
|
{
|
|
|
|
CPlaceableShOptionTwoLines *option;
|
|
|
|
option = CMenuMultiChoiceTwoLines::AddOption(text1, positionX1, positionY1, text2, positionX2, positionY2, bSelected, bRightJustify);
|
|
|
|
if(option)
|
|
|
|
m_triggers[m_numOptions-1] = trigger;
|
|
|
|
return option;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTwoLinesTriggered::SelectCurrentOptionUnderCursor(void)
|
|
|
|
{
|
|
|
|
CMenuMultiChoiceTwoLines::SelectCurrentOptionUnderCursor();
|
|
|
|
if(m_cursor != -1)
|
|
|
|
m_triggers[m_cursor](this);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuMultiChoiceTwoLinesTriggered::SelectDefaultCancelAction(void)
|
|
|
|
{
|
|
|
|
if(m_defaultCancel)
|
|
|
|
m_defaultCancel(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuOnOff
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuOnOff::SetColors(const CRGBA &title, const CRGBA &options)
|
|
|
|
{
|
|
|
|
m_title.SetColors(title, title);
|
|
|
|
m_options[0].SetColor(options);
|
|
|
|
m_options[1].SetColor(options);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuOnOff::SetNewOldTextScale(bool bTextScale, const CVector2D &newScale, const CVector2D &oldScale, bool bTitleTextScale)
|
|
|
|
{
|
|
|
|
m_bSetTextScale = bTextScale;
|
|
|
|
m_textScale = newScale;
|
|
|
|
m_oldTextScale = oldScale;
|
|
|
|
m_bSetTitleTextScale = bTitleTextScale;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuOnOff::SetOptionPosition(float x, float y, bool bRightJustify)
|
|
|
|
{
|
|
|
|
m_options[0].SetPosition(x, y, bRightJustify);
|
|
|
|
m_options[1].SetPosition(x, y, bRightJustify);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuOnOff::AddTitle(wchar *text, bool bSelected, float positionX, float positionY, bool bRightJustify)
|
|
|
|
{
|
|
|
|
m_title.m_text = text;
|
|
|
|
m_title.m_bSelected = bSelected;
|
|
|
|
m_title.SetPosition(positionX, positionY, bRightJustify);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuOnOff::Draw(CRGBA const &optionHighlight, CRGBA const &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
if(m_type == 1){
|
|
|
|
m_options[0].m_text = TheText.Get("FEM_NO");
|
|
|
|
m_options[1].m_text = TheText.Get("FEM_YES");
|
|
|
|
}else if(m_type == 0){
|
|
|
|
m_options[0].m_text = TheText.Get("FEM_OFF");
|
|
|
|
m_options[1].m_text = TheText.Get("FEM_ON");
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_bSetTextScale && m_bSetTitleTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
if(m_bActive)
|
|
|
|
m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_title.Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
|
|
|
|
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
|
|
|
|
if(m_bActive){
|
|
|
|
if(m_title.m_bSelected)
|
|
|
|
m_options[1].Draw(optionHighlight, m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_options[0].Draw(optionHighlight, m_position.x+x, m_position.y+y);
|
|
|
|
}else{
|
|
|
|
if(m_title.m_bSelected)
|
|
|
|
m_options[1].Draw(m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_options[0].Draw(m_position.x+x, m_position.y+y);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuOnOff::DrawNormal(float x, float y)
|
|
|
|
{
|
|
|
|
if(m_type == 1){
|
|
|
|
m_options[0].m_text = TheText.Get("FEM_NO");
|
|
|
|
m_options[1].m_text = TheText.Get("FEM_YES");
|
|
|
|
}else if(m_type == 0){
|
|
|
|
m_options[0].m_text = TheText.Get("FEM_OFF");
|
|
|
|
m_options[1].m_text = TheText.Get("FEM_ON");
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_bSetTextScale && m_bSetTitleTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
m_title.Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
|
|
|
|
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
|
|
|
|
if(m_title.m_bSelected)
|
|
|
|
m_options[1].Draw(m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_options[0].Draw(m_position.x+x, m_position.y+y);
|
|
|
|
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuOnOff::DrawHighlighted(CRGBA const &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
if(m_type == 1){
|
|
|
|
m_options[0].m_text = TheText.Get("FEM_NO");
|
|
|
|
m_options[1].m_text = TheText.Get("FEM_YES");
|
|
|
|
}else if(m_type == 0){
|
|
|
|
m_options[0].m_text = TheText.Get("FEM_OFF");
|
|
|
|
m_options[1].m_text = TheText.Get("FEM_ON");
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_bSetTextScale && m_bSetTitleTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
if(m_bActive)
|
|
|
|
m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_title.Draw(CRGBA(0,0,0,0), m_position.x+x, m_position.y+y, false);
|
|
|
|
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_textScale.x, m_textScale.y);
|
|
|
|
|
|
|
|
if(m_title.m_bSelected)
|
|
|
|
m_options[1].Draw(m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_options[0].Draw(m_position.x+x, m_position.y+y);
|
|
|
|
|
|
|
|
if(m_bSetTextScale)
|
|
|
|
CFont::SetScale(m_oldTextScale.x, m_oldTextScale.y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuOnOff::SetAlpha(uint8 alpha)
|
|
|
|
{
|
|
|
|
m_title.SetAlpha(alpha);
|
|
|
|
m_options[0].SetAlpha(alpha);
|
|
|
|
m_options[1].SetAlpha(alpha);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuOnOff::SetShadows(bool bDropShadows, CRGBA const &shadowColor, CVector2D const &shadowOffset)
|
|
|
|
{
|
|
|
|
m_title.SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
m_options[0].SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
m_options[1].SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuOnOffTriggered
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuOnOffTriggered::SetOptionPosition(float x, float y, Trigger trigger, bool bRightJustify)
|
|
|
|
{
|
|
|
|
CMenuOnOff::SetOptionPosition(x, y, bRightJustify);
|
|
|
|
if(trigger)
|
|
|
|
m_trigger = trigger;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuOnOffTriggered::SelectCurrentOptionUnderCursor(void)
|
|
|
|
{
|
|
|
|
CMenuOnOff::SelectCurrentOptionUnderCursor();
|
|
|
|
if(m_trigger)
|
|
|
|
m_trigger(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuSlider
|
|
|
|
*/
|
|
|
|
|
|
|
|
char CMenuSlider::Buf8[8];
|
|
|
|
wchar CMenuSlider::Buf16[8];
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuSlider::SetColors(const CRGBA &title, const CRGBA &percentage, const CRGBA &left, const CRGBA &right)
|
|
|
|
{
|
|
|
|
m_title.SetColor(title);
|
|
|
|
m_percentageText.SetColor(percentage);
|
|
|
|
m_colors[0] = left;
|
|
|
|
m_colors[1] = right;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuSlider::AddTickBox(float positionX, float positionY, float width, float heightLeft, float heightRight)
|
|
|
|
{
|
|
|
|
m_box.SetPosition(positionX, positionY);
|
|
|
|
m_size[0].x = width;
|
|
|
|
m_size[0].y = heightLeft;
|
|
|
|
m_size[1].x = width;
|
|
|
|
m_size[1].y = heightRight;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuSlider::AddTitle(wchar *text, float positionX, float positionY)
|
|
|
|
{
|
|
|
|
m_title.m_text = text;
|
|
|
|
m_title.SetPosition(positionX, positionY);
|
|
|
|
}
|
|
|
|
|
|
|
|
static CRGBA SELECTED_TEXT_COLOR_0(255, 182, 48, 255);
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuSlider::Draw(const CRGBA &optionHighlight, const CRGBA &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
if(m_bActive){
|
|
|
|
CRGBA selectionCol = m_colors[0];
|
2020-06-27 21:01:51 +00:00
|
|
|
if(optionHighlight.red == SELECTED_TEXT_COLOR_0.red &&
|
|
|
|
optionHighlight.green == SELECTED_TEXT_COLOR_0.green &&
|
|
|
|
optionHighlight.blue == SELECTED_TEXT_COLOR_0.blue &&
|
|
|
|
optionHighlight.alpha == SELECTED_TEXT_COLOR_0.alpha)
|
2020-04-05 12:32:13 +00:00
|
|
|
selectionCol = m_colors[1];
|
|
|
|
|
|
|
|
if(m_style == 1){
|
|
|
|
// solid bar
|
|
|
|
CRGBA shadowCol = m_box.GetShadowColor();
|
|
|
|
float f = m_value/1000.0f;
|
|
|
|
CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
|
|
|
|
if(m_box.m_bDropShadow)
|
|
|
|
CSprite2d::DrawRect(
|
2020-06-27 21:01:51 +00:00
|
|
|
CRect(boxPos.x + X(m_box.m_shadowOffset.x),
|
|
|
|
boxPos.y + Y(m_box.m_shadowOffset.y),
|
|
|
|
boxPos.x + X(m_box.m_shadowOffset.x) + m_size[0].x,
|
|
|
|
boxPos.y + Y(m_box.m_shadowOffset.y) + m_size[0].y),
|
2020-04-05 12:32:13 +00:00
|
|
|
shadowCol);
|
|
|
|
CSprite2d::DrawRect(
|
|
|
|
CRect(boxPos.x, boxPos.y,
|
|
|
|
boxPos.x + m_size[0].x, boxPos.y + m_size[0].y),
|
|
|
|
m_colors[1]);
|
|
|
|
CSprite2d::DrawRect(
|
|
|
|
CRect(boxPos.x, boxPos.y,
|
|
|
|
boxPos.x + m_size[0].x*f, boxPos.y + m_size[0].y),
|
|
|
|
selectionCol);
|
|
|
|
}else if(m_style == 0){
|
|
|
|
// ticks...
|
|
|
|
CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
|
|
|
|
DrawTicks(boxPos, m_size[0], m_size[1].y,
|
|
|
|
m_value/1000.0f, m_colors[0], selectionCol, m_colors[1],
|
|
|
|
m_box.m_bDropShadow, m_box.m_shadowOffset, m_box.GetShadowColor());
|
|
|
|
}
|
|
|
|
|
|
|
|
m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
|
|
|
|
|
|
|
|
if(m_bDrawPercentage){
|
|
|
|
sprintf(Buf8, "%d%%", m_value/10);
|
|
|
|
AsciiToUnicode(Buf8, Buf16);
|
|
|
|
m_percentageText.m_text = Buf16;
|
|
|
|
m_percentageText.Draw(optionHighlight, m_position.x+x, m_position.y+y);
|
|
|
|
}
|
|
|
|
}else
|
|
|
|
CMenuSlider::DrawNormal(x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuSlider::DrawNormal(float x, float y)
|
|
|
|
{
|
|
|
|
if(m_style == 1){
|
|
|
|
// solid bar
|
|
|
|
CRGBA shadowCol = m_box.GetShadowColor();
|
|
|
|
float f = m_value/1000.0f;
|
|
|
|
CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
|
|
|
|
if(m_box.m_bDropShadow)
|
|
|
|
CSprite2d::DrawRect(
|
2020-06-27 21:01:51 +00:00
|
|
|
CRect(boxPos.x + X(m_box.m_shadowOffset.x),
|
|
|
|
boxPos.y + Y(m_box.m_shadowOffset.y),
|
|
|
|
boxPos.x + X(m_box.m_shadowOffset.x) + m_size[0].x,
|
|
|
|
boxPos.y + Y(m_box.m_shadowOffset.y) + m_size[0].y),
|
2020-04-05 12:32:13 +00:00
|
|
|
shadowCol);
|
|
|
|
CSprite2d::DrawRect(
|
|
|
|
CRect(boxPos.x, boxPos.y,
|
|
|
|
boxPos.x + m_size[0].x, boxPos.y + m_size[0].y),
|
|
|
|
m_colors[1]);
|
|
|
|
CSprite2d::DrawRect(
|
|
|
|
CRect(boxPos.x, boxPos.y,
|
|
|
|
boxPos.x + m_size[0].x*f, boxPos.y + m_size[0].y),
|
|
|
|
m_colors[0]);
|
|
|
|
}else if(m_style == 0){
|
|
|
|
// ticks...
|
|
|
|
CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
|
|
|
|
DrawTicks(boxPos, m_size[0], m_size[1].y,
|
|
|
|
m_value/1000.0f, m_colors[0], m_colors[1],
|
|
|
|
m_box.m_bDropShadow, m_box.m_shadowOffset, m_box.GetShadowColor());
|
|
|
|
}
|
|
|
|
|
|
|
|
m_title.Draw(m_position.x+x, m_position.y+y);
|
|
|
|
|
|
|
|
if(m_bDrawPercentage){
|
|
|
|
sprintf(Buf8, "%d%%", m_value/10);
|
|
|
|
AsciiToUnicode(Buf8, Buf16);
|
|
|
|
m_percentageText.m_text = Buf16;
|
|
|
|
m_percentageText.Draw(m_percentageText.GetColor(), m_position.x+x, m_position.y+y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuSlider::DrawHighlighted(const CRGBA &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
if(m_bActive)
|
|
|
|
m_title.Draw(titleHighlight, m_position.x+x, m_position.y+y);
|
|
|
|
else
|
|
|
|
m_title.Draw(m_position.x+x, m_position.y+y);
|
|
|
|
|
|
|
|
if(m_style == 1){
|
|
|
|
// solid bar
|
|
|
|
CRGBA shadowCol = m_box.GetShadowColor();
|
|
|
|
float f = m_value/1000.0f;
|
|
|
|
CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
|
|
|
|
if(m_box.m_bDropShadow)
|
|
|
|
CSprite2d::DrawRect(
|
2020-06-27 21:01:51 +00:00
|
|
|
CRect(boxPos.x + X(m_box.m_shadowOffset.x),
|
|
|
|
boxPos.y + Y(m_box.m_shadowOffset.y),
|
|
|
|
boxPos.x + X(m_box.m_shadowOffset.x) + m_size[0].x,
|
|
|
|
boxPos.y + Y(m_box.m_shadowOffset.y) + m_size[0].y),
|
2020-04-05 12:32:13 +00:00
|
|
|
shadowCol);
|
|
|
|
CSprite2d::DrawRect(
|
|
|
|
CRect(boxPos.x, boxPos.y,
|
|
|
|
boxPos.x + m_size[0].x, boxPos.y + m_size[0].y),
|
|
|
|
m_colors[1]);
|
|
|
|
CSprite2d::DrawRect(
|
|
|
|
CRect(boxPos.x, boxPos.y,
|
|
|
|
boxPos.x + m_size[0].x*f, boxPos.y + m_size[0].y),
|
|
|
|
m_colors[0]);
|
|
|
|
}else if(m_style == 0){
|
|
|
|
// ticks...
|
|
|
|
CVector2D boxPos = m_box.m_position + m_position + CVector2D(x,y);
|
|
|
|
DrawTicks(boxPos, m_size[0], m_size[1].y,
|
|
|
|
m_value/1000.0f, m_colors[0], m_colors[1],
|
|
|
|
m_box.m_bDropShadow, m_box.m_shadowOffset, m_box.GetShadowColor());
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_bDrawPercentage){
|
|
|
|
sprintf(Buf8, "%d%%", m_value/10);
|
|
|
|
AsciiToUnicode(Buf8, Buf16);
|
|
|
|
m_percentageText.m_text = Buf16;
|
|
|
|
m_percentageText.Draw(m_percentageText.GetColor(), m_position.x+x, m_position.y+y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuSlider::DrawTicks(const CVector2D &position, const CVector2D &size, float heightRight, float level, const CRGBA &leftCol, const CRGBA &selCol, const CRGBA &rightCol, bool bShadow, const CVector2D &shadowOffset, const CRGBA &shadowColor)
|
|
|
|
{
|
|
|
|
int i;
|
2020-06-27 21:01:51 +00:00
|
|
|
int numTicks = size.x / X(8.0f);
|
2020-04-05 12:32:13 +00:00
|
|
|
float dy = heightRight - size.y;
|
|
|
|
float stepy = dy / numTicks;
|
|
|
|
int left = level*numTicks;
|
|
|
|
int drewSelection = 0;
|
|
|
|
for(i = 0; i < numTicks; i++){
|
2020-06-27 21:01:51 +00:00
|
|
|
CRect rect(position.x + X(8.0f)*i, position.y + dy - stepy*i,
|
|
|
|
position.x + X(8.0f)*i + X(4.0f), position.y + dy + size.y);
|
2020-04-05 12:32:13 +00:00
|
|
|
if(bShadow){
|
|
|
|
CRect shadowRect = rect;
|
2020-06-27 21:01:51 +00:00
|
|
|
shadowRect.left += X(shadowOffset.x);
|
|
|
|
shadowRect.right += X(shadowOffset.x);
|
|
|
|
shadowRect.top += Y(shadowOffset.y);
|
|
|
|
shadowRect.bottom += Y(shadowOffset.y);
|
2020-04-05 12:32:13 +00:00
|
|
|
CSprite2d::DrawRect(shadowRect, shadowColor);
|
|
|
|
}
|
|
|
|
if(i < left)
|
|
|
|
CSprite2d::DrawRect(rect, leftCol);
|
|
|
|
else if(!drewSelection){
|
|
|
|
CSprite2d::DrawRect(rect, selCol);
|
|
|
|
drewSelection = 1;
|
|
|
|
}else
|
|
|
|
CSprite2d::DrawRect(rect, rightCol);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuSlider::DrawTicks(const CVector2D &position, const CVector2D &size, float heightRight, float level, const CRGBA &leftCol, const CRGBA &rightCol, bool bShadow, const CVector2D &shadowOffset, const CRGBA &shadowColor)
|
|
|
|
{
|
|
|
|
int i;
|
2020-06-27 21:01:51 +00:00
|
|
|
int numTicks = size.x / X(8.0f);
|
2020-04-05 12:32:13 +00:00
|
|
|
float dy = heightRight - size.y;
|
|
|
|
float stepy = dy / numTicks;
|
|
|
|
int left = level*numTicks;
|
|
|
|
for(i = 0; i < numTicks; i++){
|
2020-06-27 21:01:51 +00:00
|
|
|
CRect rect(position.x + X(8.0f)*i, position.y + dy - stepy*i,
|
|
|
|
position.x + X(8.0f)*i + X(4.0f), position.y + dy + size.y);
|
2020-04-05 12:32:13 +00:00
|
|
|
if(bShadow){
|
|
|
|
CRect shadowRect = rect;
|
2020-06-27 21:01:51 +00:00
|
|
|
shadowRect.left += X(shadowOffset.x);
|
|
|
|
shadowRect.right += X(shadowOffset.x);
|
|
|
|
shadowRect.top += Y(shadowOffset.y);
|
|
|
|
shadowRect.bottom += Y(shadowOffset.y);
|
2020-04-05 12:32:13 +00:00
|
|
|
CSprite2d::DrawRect(shadowRect, shadowColor);
|
|
|
|
}
|
|
|
|
if(i < left)
|
|
|
|
CSprite2d::DrawRect(rect, leftCol);
|
|
|
|
else
|
|
|
|
CSprite2d::DrawRect(rect, rightCol);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuSlider::SetAlpha(uint8 alpha)
|
|
|
|
{
|
|
|
|
m_title.SetAlpha(alpha);
|
|
|
|
m_box.SetAlpha(alpha);
|
|
|
|
m_someAlpha = alpha;
|
|
|
|
m_percentageText.SetAlpha(alpha);
|
|
|
|
m_colors[0].alpha = alpha;
|
|
|
|
m_colors[1].alpha = alpha;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuSlider::SetShadows(bool bDropShadows, const CRGBA &shadowColor, const CVector2D &shadowOffset)
|
|
|
|
{
|
|
|
|
m_title.SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
m_box.SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
m_percentageText.SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuSliderTriggered
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuSliderTriggered::AddTickBox(float positionX, float positionY, float width, float heightLeft, float heightRight, Trigger trigger, Trigger alwaysTrigger)
|
|
|
|
{
|
|
|
|
CMenuSlider::AddTickBox(positionX, positionY, width, heightLeft, heightRight);
|
|
|
|
m_trigger = trigger;
|
|
|
|
m_alwaysTrigger = alwaysTrigger;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuSliderTriggered::Draw(const CRGBA &optionHighlight, const CRGBA &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
CMenuSlider::Draw(optionHighlight, titleHighlight, x, y);
|
|
|
|
if(m_alwaysTrigger)
|
|
|
|
m_alwaysTrigger(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuSliderTriggered::GoLeft(void)
|
|
|
|
{
|
|
|
|
CMenuSlider::GoLeft();
|
|
|
|
if(m_trigger)
|
|
|
|
m_trigger(this);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuSliderTriggered::GoRight(void)
|
|
|
|
{
|
|
|
|
CMenuSlider::GoRight();
|
|
|
|
if(m_trigger)
|
|
|
|
m_trigger(this);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuSliderTriggered::GoLeftStill(void)
|
|
|
|
{
|
|
|
|
CMenuSlider::GoLeftStill();
|
|
|
|
if(m_trigger)
|
|
|
|
m_trigger(this);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuSliderTriggered::GoRightStill(void)
|
|
|
|
{
|
|
|
|
CMenuSlider::GoRightStill();
|
|
|
|
if(m_trigger)
|
|
|
|
m_trigger(this);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuLineLister
|
|
|
|
*/
|
|
|
|
|
|
|
|
CMenuLineLister::CMenuLineLister(void)
|
|
|
|
: m_numLines(0), m_width(0.0f), m_height(0.0f),
|
|
|
|
m_scrollPosition(0.0f), m_scrollSpeed(1.0f), m_lineSpacing(15.0f), field_10E8(0)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < NUM_LINELISTER_LINES_TOTAL; i++){
|
|
|
|
m_lineAlphas[i] = 0;
|
|
|
|
m_lineFade[i] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuLineLister::SetLinesColor(const CRGBA &color)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < NUM_LINELISTER_LINES_TOTAL; i++){
|
|
|
|
m_linesLeft[i].SetColor(color);
|
|
|
|
m_linesRight[i].SetColor(color);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuLineLister::ResetNumberOfTextLines(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
m_numLines = 0;
|
|
|
|
for(i = 0; i < NUM_LINELISTER_LINES_TOTAL; i++){
|
|
|
|
m_lineAlphas[i] = 0;
|
|
|
|
m_lineFade[i] = 0;
|
|
|
|
}
|
|
|
|
for(i = 0; i < NUM_LINELISTER_LINES_TOTAL; i++){
|
|
|
|
// note this doesn't clear lines 0-14, probably an oversight
|
|
|
|
GetLeftLine(i)->m_text = nil;
|
|
|
|
GetRightLine(i)->m_text = nil;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuLineLister::AddTextLine(wchar *left, wchar *right)
|
|
|
|
{
|
|
|
|
CPlaceableShText *leftLine, *rightLine;
|
|
|
|
if(m_numLines == NUM_LINELISTER_LINES)
|
|
|
|
return false;
|
|
|
|
leftLine = GetLeftLine(m_numLines);
|
|
|
|
leftLine->m_text = left;
|
|
|
|
leftLine->SetPosition(0.0f, m_lineSpacing*(m_numLines+15));
|
|
|
|
rightLine = GetRightLine(m_numLines);
|
|
|
|
rightLine->m_text = right;
|
|
|
|
rightLine->SetPosition(leftLine->m_position.x, leftLine->m_position.y);
|
|
|
|
m_numLines++;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuLineLister::Draw(const CRGBA &optionHighlight, const CRGBA &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
int i, n;
|
|
|
|
|
|
|
|
m_scrollPosition += m_scrollSpeed;
|
|
|
|
n = m_numLines + 15;
|
|
|
|
if(m_scrollSpeed > 0.0f){
|
|
|
|
if(m_scrollPosition > n*m_lineSpacing)
|
|
|
|
m_scrollPosition = 0.0f;
|
|
|
|
}else{
|
|
|
|
if(m_scrollPosition < 0.0f)
|
|
|
|
m_scrollPosition = n*m_lineSpacing;
|
|
|
|
}
|
|
|
|
// this is a weird condition....
|
|
|
|
for(i = 0;
|
|
|
|
m_scrollPosition < i*m_lineSpacing || m_scrollPosition >= (i+1)*m_lineSpacing;
|
|
|
|
i++);
|
|
|
|
|
|
|
|
float screenPos = 0.0f;
|
|
|
|
for(; i < n; i++){
|
|
|
|
CVector2D linePos = m_linesLeft[i].m_position;
|
|
|
|
|
2020-06-27 21:01:51 +00:00
|
|
|
if(linePos.y+m_position.y - (m_scrollPosition+m_position.y) < Y(64.0f))
|
2020-04-05 12:32:13 +00:00
|
|
|
m_lineFade[i] = -4.0f*Abs(m_scrollSpeed);
|
|
|
|
else
|
|
|
|
m_lineFade[i] = 4.0f*Abs(m_scrollSpeed);
|
|
|
|
int newAlpha = m_lineAlphas[i] + m_lineFade[i];
|
|
|
|
if(newAlpha < 0) newAlpha = 0;
|
|
|
|
if(newAlpha > 255) newAlpha = 255;
|
|
|
|
m_lineAlphas[i] = newAlpha;
|
|
|
|
|
|
|
|
uint8 alpha = m_linesLeft[i].m_shadowColor.alpha;
|
|
|
|
|
|
|
|
// apply alpha
|
|
|
|
m_linesLeft[i].SetAlpha((alpha*m_lineAlphas[i])>>8);
|
|
|
|
m_linesRight[i].SetAlpha((alpha*m_lineAlphas[i])>>8);
|
|
|
|
|
|
|
|
m_linesLeft[i].Draw(m_position.x+x, m_position.y+y - m_scrollPosition);
|
|
|
|
CFont::SetRightJustifyOn();
|
|
|
|
m_linesRight[i].Draw(m_position.x+x + m_width, m_position.y+y - m_scrollPosition);
|
|
|
|
CFont::SetRightJustifyOff();
|
|
|
|
|
|
|
|
// restore alpha
|
|
|
|
m_linesLeft[i].SetAlpha(alpha);
|
|
|
|
m_linesRight[i].SetAlpha(alpha);
|
|
|
|
|
|
|
|
screenPos += m_lineSpacing;
|
|
|
|
if(screenPos >= m_height)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_scrollSpeed = 1.0f;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuLineLister::SetAlpha(uint8 alpha)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < NUM_LINELISTER_LINES_TOTAL; i++){
|
|
|
|
m_linesLeft[i].SetAlpha(alpha);
|
|
|
|
m_linesRight[i].SetAlpha(alpha);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuLineLister::SetShadows(bool bDropShadows, const CRGBA &shadowColor, const CVector2D &shadowOffset)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < NUM_LINELISTER_LINES_TOTAL; i++){
|
|
|
|
m_linesLeft[i].SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
m_linesRight[i].SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuPage
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPage::Initialise(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
m_numControls = 0;
|
|
|
|
m_pCurrentControl = nil;
|
|
|
|
m_cursor = 0;
|
|
|
|
for(i = 0; i < NUM_PAGE_WIDGETS; i++)
|
|
|
|
m_controls[i] = nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuPage::AddMenu(CMenuBase *widget)
|
|
|
|
{
|
|
|
|
if(m_numControls >= NUM_PAGE_WIDGETS)
|
|
|
|
return false;
|
|
|
|
m_controls[m_numControls] = widget;
|
|
|
|
if(m_numControls == 0){
|
|
|
|
m_pCurrentControl = widget;
|
|
|
|
m_cursor = 0;
|
|
|
|
}
|
|
|
|
m_numControls++;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuPage::IsActiveMenuTwoState(void)
|
|
|
|
{
|
|
|
|
return m_pCurrentControl && m_pCurrentControl->m_bTwoState;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPage::ActiveMenuTwoState_SelectNextPosition(void)
|
|
|
|
{
|
|
|
|
int sel;
|
|
|
|
if(m_pCurrentControl == nil || !m_pCurrentControl->m_bTwoState)
|
|
|
|
return;
|
|
|
|
m_pCurrentControl->GoFirst();
|
|
|
|
sel = m_pCurrentControl->GetMenuSelection();
|
|
|
|
if(sel == 1)
|
|
|
|
m_pCurrentControl->SelectCurrentOptionUnderCursor();
|
|
|
|
else if(sel == 0){
|
2020-06-27 21:01:51 +00:00
|
|
|
if ( m_pCurrentControl )
|
|
|
|
{
|
|
|
|
if ( !m_pCurrentControl->GoNext() )
|
|
|
|
m_pCurrentControl->GoFirst();
|
|
|
|
}
|
|
|
|
|
2020-04-05 12:32:13 +00:00
|
|
|
m_pCurrentControl->SelectCurrentOptionUnderCursor();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPage::Draw(const CRGBA &optionHighlight, const CRGBA &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < m_numControls; i++)
|
|
|
|
if(m_controls[i]){
|
|
|
|
if(i == m_cursor)
|
|
|
|
m_controls[i]->Draw(optionHighlight, titleHighlight, x, y);
|
|
|
|
else
|
|
|
|
m_controls[i]->DrawNormal(x, y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPage::DrawHighlighted(const CRGBA &titleHighlight, float x, float y)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i< m_numControls; i++)
|
|
|
|
if(m_controls[i]){
|
|
|
|
if(i == m_cursor)
|
|
|
|
m_controls[i]->DrawHighlighted(titleHighlight, x, y);
|
|
|
|
else
|
|
|
|
m_controls[i]->DrawNormal(x, y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPage::DrawNormal(float x, float y)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i< m_numControls; i++)
|
|
|
|
if(m_controls[i])
|
|
|
|
m_controls[i]->DrawNormal(x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPage::ActivatePage(void)
|
|
|
|
{
|
|
|
|
m_cursor = 0;
|
|
|
|
if(m_numControls == 0)
|
|
|
|
return;
|
|
|
|
for(;;){
|
|
|
|
m_pCurrentControl = m_controls[m_cursor];
|
|
|
|
if(m_pCurrentControl->GoFirst())
|
|
|
|
return;
|
|
|
|
if(m_cursor == m_numControls-1)
|
|
|
|
m_cursor = 0;
|
|
|
|
else
|
|
|
|
m_cursor++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPage::SetAlpha(uint8 alpha)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i< m_numControls; i++)
|
|
|
|
if(m_controls[i])
|
|
|
|
m_controls[i]->SetAlpha(alpha);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPage::SetShadows(bool bDropShadows, const CRGBA &shadowColor, const CVector2D &shadowOffset)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for(i = 0; i< m_numControls; i++)
|
|
|
|
if(m_controls[i])
|
|
|
|
m_controls[i]->SetShadows(bDropShadows, shadowColor, shadowOffset);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPage::GoUpMenuOnPage(void)
|
|
|
|
{
|
|
|
|
if(m_pCurrentControl == nil)
|
|
|
|
return;
|
|
|
|
m_pCurrentControl->DeactivateMenu();
|
|
|
|
do{
|
|
|
|
if(m_cursor == 0)
|
|
|
|
m_cursor = m_numControls-1;
|
|
|
|
else
|
|
|
|
m_cursor--;
|
|
|
|
m_pCurrentControl = m_controls[m_cursor];
|
|
|
|
}while(!m_pCurrentControl->GoLast());
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPage::GoDownMenuOnPage(void)
|
|
|
|
{
|
|
|
|
if(m_pCurrentControl == nil)
|
|
|
|
return;
|
|
|
|
m_pCurrentControl->DeactivateMenu();
|
|
|
|
do{
|
|
|
|
if(m_cursor == m_numControls-1)
|
|
|
|
m_cursor = 0;
|
|
|
|
else
|
|
|
|
m_cursor++;
|
|
|
|
m_pCurrentControl = m_controls[m_cursor];
|
|
|
|
}while(!m_pCurrentControl->GoFirst());
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPage::GoLeftMenuOnPage(void)
|
|
|
|
{
|
|
|
|
// same as up
|
|
|
|
if(m_pCurrentControl == nil)
|
|
|
|
return;
|
|
|
|
m_pCurrentControl->DeactivateMenu();
|
|
|
|
do{
|
|
|
|
if(m_cursor == 0)
|
|
|
|
m_cursor = m_numControls-1;
|
|
|
|
else
|
|
|
|
m_cursor--;
|
|
|
|
m_pCurrentControl = m_controls[m_cursor];
|
|
|
|
}while(!m_pCurrentControl->GoLast());
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPage::GoRightMenuOnPage(void)
|
|
|
|
{
|
|
|
|
// same as right
|
|
|
|
if(m_pCurrentControl == nil)
|
|
|
|
return;
|
|
|
|
m_pCurrentControl->DeactivateMenu();
|
|
|
|
do{
|
|
|
|
if(m_cursor == m_numControls-1)
|
|
|
|
m_cursor = 0;
|
|
|
|
else
|
|
|
|
m_cursor++;
|
|
|
|
m_pCurrentControl = m_controls[m_cursor];
|
|
|
|
}while(!m_pCurrentControl->GoFirst());
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMenuPageAnyMove
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPageAnyMove::Initialise(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
CMenuPage::Initialise();
|
|
|
|
for(i = 0; i < NUM_PAGE_WIDGETS; i++){
|
|
|
|
m_moveTab[i].left = -1;
|
|
|
|
m_moveTab[i].right = -1;
|
|
|
|
m_moveTab[i].up = -1;
|
|
|
|
m_moveTab[i].down = -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMenuPageAnyMove::AddMenu(CMenuBase *widget, FEC_MOVETAB *moveTab)
|
|
|
|
{
|
|
|
|
if(AddMenu(widget)){
|
|
|
|
m_moveTab[m_numControls-1] = *moveTab;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPageAnyMove::GoUpMenuOnPage(void)
|
|
|
|
{
|
|
|
|
if(m_pCurrentControl == nil)
|
|
|
|
return;
|
|
|
|
m_pCurrentControl->DeactivateMenu();
|
|
|
|
int move = m_moveTab[m_cursor].up;
|
|
|
|
if(move == -1)
|
|
|
|
CMenuPage::GoUpMenuOnPage();
|
|
|
|
else{ // BUG: no else in original code
|
|
|
|
m_cursor = move;
|
|
|
|
m_pCurrentControl = m_controls[m_cursor];
|
|
|
|
m_pCurrentControl->GoLast();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPageAnyMove::GoDownMenuOnPage(void)
|
|
|
|
{
|
|
|
|
if(m_pCurrentControl == nil)
|
|
|
|
return;
|
|
|
|
m_pCurrentControl->DeactivateMenu();
|
|
|
|
int move = m_moveTab[m_cursor].down;
|
|
|
|
if(move == -1)
|
|
|
|
CMenuPage::GoDownMenuOnPage();
|
|
|
|
else{ // BUG: no else in original code
|
|
|
|
m_cursor = move;
|
|
|
|
m_pCurrentControl = m_controls[m_cursor];
|
|
|
|
m_pCurrentControl->GoLast();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPageAnyMove::GoLeftMenuOnPage(void)
|
|
|
|
{
|
|
|
|
if(m_pCurrentControl == nil)
|
|
|
|
return;
|
|
|
|
m_pCurrentControl->DeactivateMenu();
|
|
|
|
int move = m_moveTab[m_cursor].left;
|
|
|
|
if(move == -1)
|
|
|
|
CMenuPage::GoLeftMenuOnPage();
|
|
|
|
else{ // BUG: no else in original code
|
|
|
|
m_cursor = move;
|
|
|
|
m_pCurrentControl = m_controls[m_cursor];
|
|
|
|
m_pCurrentControl->GoLast();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMenuPageAnyMove::GoRightMenuOnPage(void)
|
|
|
|
{
|
|
|
|
if(m_pCurrentControl == nil)
|
|
|
|
return;
|
|
|
|
m_pCurrentControl->DeactivateMenu();
|
|
|
|
int move = m_moveTab[m_cursor].right;
|
|
|
|
if(move == -1)
|
|
|
|
CMenuPage::GoRightMenuOnPage();
|
|
|
|
else{ // BUG: no else in original code
|
|
|
|
m_cursor = move;
|
|
|
|
m_pCurrentControl = m_controls[m_cursor];
|
|
|
|
m_pCurrentControl->GoLast();
|
|
|
|
}
|
|
|
|
}
|