Jeck - Daily build, deck renaming, small keypad bugfix, profileFile() fix, proposed new iconspsp.png.
* Decks now support naming and renaming. Also added a "Switch decks without saving" option. * Removed unused static const char * menuTexts, from old 6-deck limited system * Keypad didn't display correctly when not given a title, and was never destructed. Fixed. * profileFile() default behavior was to fall back to RESPATH/player. Fixed. * New iconspsp.png, updated look to seem like PSP buttons, added some extra (unused) button icons.
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 27 KiB |
Binary file not shown.
@@ -116,7 +116,7 @@ public:
|
||||
//These return a filepath accurate to the current mode/profile/theme, and can
|
||||
//optionally fallback to a file within a certain directory.
|
||||
//The sanity=false option returns the adjusted path even if the file doesn't exist.
|
||||
string profileFile(string filename="", string fallback="", bool sanity=true,bool relative=false);
|
||||
string profileFile(string filename="", string fallback="", bool sanity=false,bool relative=false);
|
||||
|
||||
void reloadProfile(bool images = true); //Reloads profile using current options[ACTIVE_PROFILE]
|
||||
void checkProfile(); //Confirms that a profile is loaded and contains a collection.
|
||||
|
||||
@@ -30,8 +30,6 @@ class GameState
|
||||
JGE* mEngine;
|
||||
|
||||
public:
|
||||
|
||||
static const char * const menuTexts[];
|
||||
GameState(GameApp* parent);
|
||||
virtual ~GameState() {}
|
||||
|
||||
|
||||
@@ -53,7 +53,8 @@ private:
|
||||
float mSlide;
|
||||
int mAlpha;
|
||||
int mStage;
|
||||
|
||||
int nbDecks;
|
||||
int deckNum;
|
||||
int colorFilter;
|
||||
JMusic * bgMusic;
|
||||
JQuad * backQuad;
|
||||
@@ -74,11 +75,12 @@ private:
|
||||
int hudAlpha;
|
||||
float scrollSpeed;
|
||||
int delSellMenu;
|
||||
string newDeckname;
|
||||
|
||||
public:
|
||||
GameStateDeckViewer(GameApp* parent);
|
||||
virtual ~GameStateDeckViewer();
|
||||
|
||||
void updateDecks();
|
||||
void rotateCards(int direction);
|
||||
void loadIndexes(MTGCard * current = NULL);
|
||||
void switchDisplay();
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#include "../include/DeckStats.h"
|
||||
#include "../include/Translate.h"
|
||||
|
||||
const char * const GameState::menuTexts[]= {"--NEW--","Deck 1", "Deck 2", "Deck 3", "Deck 4", "Deck 5", "Deck 6"} ;
|
||||
hgeParticleSystem* GameApp::Particles[] = {NULL,NULL,NULL,NULL,NULL,NULL};
|
||||
int GameApp::HasMusic = 1;
|
||||
JMusic * GameApp::music = NULL;
|
||||
|
||||
@@ -203,6 +203,7 @@ GameSettings::~GameSettings(){
|
||||
SAFE_DELETE(globalOptions);
|
||||
SAFE_DELETE(profileOptions);
|
||||
SAFE_DELETE(themeOptions);
|
||||
SAFE_DELETE(keypad);
|
||||
}
|
||||
|
||||
GameOption& GameSettings::operator[](string option_name){
|
||||
@@ -223,11 +224,11 @@ int GameSettings::save(){
|
||||
if(profileOptions){
|
||||
//Force our directories to exist.
|
||||
MAKEDIR(RESPATH"/profiles");
|
||||
string temp = profileFile("","",false,false);
|
||||
string temp = profileFile();
|
||||
MAKEDIR(temp.c_str());
|
||||
temp+="/stats";
|
||||
MAKEDIR(temp.c_str());
|
||||
temp = profileFile(PLAYER_SETTINGS,"",false);
|
||||
temp = profileFile(PLAYER_SETTINGS);
|
||||
|
||||
profileOptions->save();
|
||||
}
|
||||
@@ -289,7 +290,7 @@ void GameSettings::checkProfile(){
|
||||
|
||||
//If it doesn't exist, load current profile.
|
||||
if(!profileOptions)
|
||||
profileOptions = NEW GameOptions(profileFile(PLAYER_SETTINGS,"",false));
|
||||
profileOptions = NEW GameOptions(profileFile(PLAYER_SETTINGS));
|
||||
|
||||
//Load theme options
|
||||
if(!themeOptions){
|
||||
@@ -343,7 +344,7 @@ void GameSettings::createUsersFirstDeck(int setId){
|
||||
if(theGame == NULL || theGame->collection == NULL)
|
||||
return;
|
||||
|
||||
MTGDeck *mCollection = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), theGame->collection);
|
||||
MTGDeck *mCollection = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), theGame->collection);
|
||||
//10 lands of each
|
||||
int sets[] = {setId};
|
||||
if (!mCollection->addRandomCards(10, sets,1, Constants::RARITY_L,"Forest")){
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
GameStateDeckViewer::GameStateDeckViewer(GameApp* parent): GameState(parent) {
|
||||
bgMusic = NULL;
|
||||
scrollSpeed = MED_SPEED;
|
||||
nbDecks = 0;
|
||||
deckNum = 0;
|
||||
}
|
||||
|
||||
GameStateDeckViewer::~GameStateDeckViewer() {
|
||||
@@ -67,14 +69,27 @@ void GameStateDeckViewer::switchDisplay(){
|
||||
loadIndexes();
|
||||
}
|
||||
|
||||
void GameStateDeckViewer::updateDecks(){
|
||||
SAFE_DELETE(welcome_menu);
|
||||
|
||||
welcome_menu = NEW SimpleMenu(10,this,menuFont,20,20);
|
||||
nbDecks = fillDeckMenu(welcome_menu,options.profileFile());
|
||||
deckNum = 0;
|
||||
newDeckname = "";
|
||||
welcome_menu->Add(nbDecks+1, "--NEW--");
|
||||
welcome_menu->Add(-1, "Cancel");
|
||||
|
||||
}
|
||||
|
||||
void GameStateDeckViewer::Start()
|
||||
{
|
||||
newDeckname = "";
|
||||
hudAlpha = 0;
|
||||
delSellMenu = 0;
|
||||
pricelist = NEW PriceList(RESPATH"/settings/prices.dat",mParent->collection);
|
||||
playerdata = NEW PlayerData(mParent->collection);
|
||||
sellMenu = NULL;
|
||||
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), mParent->collection));
|
||||
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), mParent->collection));
|
||||
displayed_deck = myCollection;
|
||||
myDeck = NULL;
|
||||
menuFont = resources.GetJLBFont(Constants::MENU_FONT);
|
||||
@@ -83,8 +98,10 @@ void GameStateDeckViewer::Start()
|
||||
|
||||
menu = NEW SimpleMenu(11,this,menuFont,SCREEN_WIDTH/2-100,20);
|
||||
menu->Add(11,"Save");
|
||||
menu->Add(12,"Back to main menu");
|
||||
menu->Add(13, "Cancel");
|
||||
menu->Add(12,"Rename deck");
|
||||
menu->Add(13,"Switch decks without saving");
|
||||
menu->Add(14,"Back to main menu");
|
||||
menu->Add(15,"Cancel");
|
||||
|
||||
|
||||
//icon images
|
||||
@@ -114,7 +131,8 @@ void GameStateDeckViewer::Start()
|
||||
//menuFont = NEW JLBFont("graphics/f3",16);
|
||||
menuFont = resources.GetJLBFont("f3");
|
||||
welcome_menu = NEW SimpleMenu(10,this,menuFont,20,20);
|
||||
int nbDecks = fillDeckMenu(welcome_menu,options.profileFile());
|
||||
nbDecks = fillDeckMenu(welcome_menu,options.profileFile());
|
||||
deckNum = 0;
|
||||
welcome_menu->Add(nbDecks+1, "--NEW--");
|
||||
welcome_menu->Add(-1, "Cancel");
|
||||
|
||||
@@ -135,6 +153,7 @@ void GameStateDeckViewer::Start()
|
||||
mRotation = 0;
|
||||
mSlide = 0;
|
||||
mAlpha = 255;
|
||||
newDeckname = "";
|
||||
//mEngine->ResetPrivateVRAM();
|
||||
//mEngine->EnableVSync(true);
|
||||
currentCard = NULL;
|
||||
@@ -189,6 +208,22 @@ int GameStateDeckViewer::Remove(MTGCard * card){
|
||||
|
||||
void GameStateDeckViewer::Update(float dt)
|
||||
{
|
||||
if(options.keypadActive()){
|
||||
options.keypadUpdate(dt);
|
||||
|
||||
if(newDeckname != ""){
|
||||
newDeckname = options.keypadFinish();
|
||||
|
||||
if(newDeckname != ""){
|
||||
loadDeck(deckNum);
|
||||
if(myDeck && myDeck->parent)
|
||||
myDeck->parent->meta_name = newDeckname;
|
||||
}
|
||||
newDeckname = "";
|
||||
}
|
||||
//Prevent screen from updating.
|
||||
return;
|
||||
}
|
||||
// mParent->effect->UpdateBig(dt);
|
||||
hudAlpha = 255-(last_user_activity * 500);
|
||||
if (hudAlpha < 0) hudAlpha = 0;
|
||||
@@ -660,13 +695,15 @@ void GameStateDeckViewer::Render()
|
||||
}
|
||||
if (sellMenu) sellMenu->Render();
|
||||
|
||||
if(options.keypadActive())
|
||||
options.keypadRender();
|
||||
}
|
||||
|
||||
|
||||
int GameStateDeckViewer::loadDeck(int deckid){
|
||||
SAFE_DELETE(myCollection);
|
||||
string profile = options[Options::ACTIVE_PROFILE].str;
|
||||
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), mParent->collection));
|
||||
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), mParent->collection));
|
||||
displayed_deck = myCollection;
|
||||
char deckname[256];
|
||||
sprintf(deckname,"deck%i.txt",deckid);
|
||||
@@ -692,11 +729,20 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
|
||||
case 10:
|
||||
if (controlId == -1){
|
||||
mParent->SetNextState(GAME_STATE_MENU);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
else if(controlId == nbDecks+1){
|
||||
char buf[512];
|
||||
deckNum = controlId;
|
||||
sprintf(buf,"deck%i",deckNum);
|
||||
options.keypadStart(buf,&newDeckname);
|
||||
options.keypadTitle("Deck name");
|
||||
//Fallthrough to deck editing.
|
||||
}
|
||||
loadDeck(controlId);
|
||||
mStage = STAGE_WAITING;
|
||||
return;
|
||||
deckNum = controlId;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (controlId)
|
||||
@@ -709,9 +755,19 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
|
||||
mStage = STAGE_WAITING;
|
||||
break;
|
||||
case 12:
|
||||
mParent->SetNextState(GAME_STATE_MENU);
|
||||
if(myDeck && myDeck->parent){
|
||||
options.keypadStart(myDeck->parent->meta_name,&newDeckname);
|
||||
options.keypadTitle("Rename deck");
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
updateDecks();
|
||||
mStage = STAGE_WELCOME;
|
||||
break;
|
||||
case 14:
|
||||
mParent->SetNextState(GAME_STATE_MENU);
|
||||
break;
|
||||
case 15:
|
||||
mStage = STAGE_WAITING;
|
||||
break;
|
||||
case 20:
|
||||
@@ -735,5 +791,4 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
|
||||
delSellMenu = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -139,12 +139,12 @@ void GameStateDuel::loadPlayerRandom(int playerId, int isAI, int mode){
|
||||
void GameStateDuel::loadPlayerMomir(int playerId, int isAI){
|
||||
string deckFileSmall = "momir";
|
||||
char empty[] = "";
|
||||
MTGDeck * tempDeck = NEW MTGDeck(options.profileFile("momir.txt").c_str(), mParent->collection);
|
||||
MTGDeck * tempDeck = NEW MTGDeck(options.profileFile("momir.txt","",true).c_str(), mParent->collection);
|
||||
deck[playerId] = NEW MTGPlayerCards(mParent->collection, tempDeck);
|
||||
if (!isAI) // Human Player
|
||||
mPlayers[playerId] = NEW HumanPlayer(deck[playerId], options.profileFile("momir.txt").c_str(), deckFileSmall);
|
||||
mPlayers[playerId] = NEW HumanPlayer(deck[playerId], options.profileFile("momir.txt","",true).c_str(), deckFileSmall);
|
||||
else
|
||||
mPlayers[playerId] = NEW AIMomirPlayer(deck[playerId], options.profileFile("momir.txt").c_str(), deckFileSmall, empty);
|
||||
mPlayers[playerId] = NEW AIMomirPlayer(deck[playerId], options.profileFile("momir.txt","",true).c_str(), deckFileSmall, empty);
|
||||
delete tempDeck;
|
||||
}
|
||||
|
||||
|
||||
@@ -231,7 +231,7 @@ void GameStateMenu::fillScroller(){
|
||||
sprintf(buff2, _("You have unlocked %i expansions out of %i").c_str(),nbunlocked, MtgSets::SetsList->nb_items);
|
||||
scroller->Add(buff2);
|
||||
|
||||
DeckDataWrapper* ddw = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), mParent->collection));
|
||||
DeckDataWrapper* ddw = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), mParent->collection));
|
||||
int totalCards = ddw->getCount();
|
||||
if (totalCards){
|
||||
sprintf(buff2, _("You have a total of %i cards in your collection").c_str(),totalCards);
|
||||
@@ -319,7 +319,7 @@ void GameStateMenu::Update(float dt)
|
||||
options[Options::ACTIVE_PROFILE].str = "Default";
|
||||
|
||||
//check for deleted collection / first-timer
|
||||
std::ifstream file(options.profileFile(PLAYER_COLLECTION,"",false).c_str());
|
||||
std::ifstream file(options.profileFile(PLAYER_COLLECTION).c_str());
|
||||
if(file){
|
||||
file.close();
|
||||
resources.Release(mSplash);
|
||||
|
||||
@@ -23,7 +23,6 @@ void GameStateShop::Create(){
|
||||
}
|
||||
|
||||
|
||||
|
||||
void GameStateShop::Start()
|
||||
{
|
||||
menu = NULL;
|
||||
|
||||
@@ -9,7 +9,7 @@ PlayerData::PlayerData(MTGAllCards * allcards){
|
||||
//CREDITS
|
||||
credits = 3000; //Default value
|
||||
|
||||
std::ifstream file(options.profileFile(PLAYER_SAVEFILE,"",false).c_str());
|
||||
std::ifstream file(options.profileFile(PLAYER_SAVEFILE).c_str());
|
||||
std::string s;
|
||||
if(file){
|
||||
if(std::getline(file,s)){
|
||||
@@ -21,12 +21,12 @@ PlayerData::PlayerData(MTGAllCards * allcards){
|
||||
}
|
||||
|
||||
//COLLECTION
|
||||
collection = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), allcards);
|
||||
collection = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), allcards);
|
||||
}
|
||||
|
||||
|
||||
int PlayerData::save(){
|
||||
std::ofstream file(options.profileFile(PLAYER_SAVEFILE,"",false).c_str());
|
||||
std::ofstream file(options.profileFile(PLAYER_SAVEFILE).c_str());
|
||||
char writer[64];
|
||||
if (file){
|
||||
sprintf(writer,"%i\n", credits);
|
||||
|
||||
@@ -1,410 +1,421 @@
|
||||
#include "../include/config.h"
|
||||
#include "../include/SimplePad.h"
|
||||
#include "JTypes.h"
|
||||
#include "../include/GameApp.h"
|
||||
#include "../include/Translate.h"
|
||||
|
||||
|
||||
#define ALPHA_COLUMNS 8
|
||||
#define ALPHA_ROWS 8
|
||||
|
||||
#define KPD_UP 0
|
||||
#define KPD_DOWN 1
|
||||
#define KPD_LEFT 2
|
||||
#define KPD_RIGHT 3
|
||||
|
||||
SimpleKey::SimpleKey( string _ds, int _id){
|
||||
displayValue = _ds; id = _id;
|
||||
for(int x=0;x<4;x++)
|
||||
adjacency[x] = KPD_NOWHERE;
|
||||
}
|
||||
|
||||
void SimplePad::linkKeys(int from, int to, int dir){
|
||||
|
||||
if(keys[from] && keys[to]){
|
||||
keys[from]->adjacency[dir] = to;
|
||||
switch(dir){
|
||||
case KPD_UP:
|
||||
case KPD_LEFT:
|
||||
dir++;
|
||||
break;
|
||||
default:
|
||||
dir--;
|
||||
}
|
||||
keys[to]->adjacency[dir] = from;
|
||||
}
|
||||
}
|
||||
|
||||
SimplePad::SimplePad(){
|
||||
nbitems = 0;
|
||||
bActive = false;
|
||||
selected = 0;
|
||||
priorKey = 0;
|
||||
cursor = 0;
|
||||
bShowCancel = false;
|
||||
bShowNumpad = false;
|
||||
bCapslock = true;
|
||||
char buf[2];
|
||||
buf[1] = '\0';
|
||||
SimpleKey * k;
|
||||
|
||||
for(int x=0;x<KPD_MAX;x++)
|
||||
keys[x] = NULL;
|
||||
|
||||
//Add the alphabet. We cheat a bit here.
|
||||
for(int x='a';x<='z';x++)
|
||||
{
|
||||
buf[0] = x;
|
||||
k=Add(buf,x);
|
||||
int idx = x-'a';
|
||||
|
||||
if(idx > KPD_A)
|
||||
k->adjacency[KPD_LEFT] = idx-1;
|
||||
if(idx < KPD_Z)
|
||||
k->adjacency[KPD_RIGHT] = idx+1;
|
||||
if(idx > ALPHA_COLUMNS)
|
||||
k->adjacency[KPD_UP] = idx-1-ALPHA_COLUMNS;
|
||||
else
|
||||
k->adjacency[KPD_UP] = KPD_INPUT;
|
||||
if(idx < 25-ALPHA_COLUMNS)
|
||||
k->adjacency[KPD_DOWN] = idx+1+ALPHA_COLUMNS;
|
||||
}
|
||||
|
||||
Add("Spacebar",KPD_SPACE);
|
||||
|
||||
for(int x=25-ALPHA_COLUMNS;x<26;x++)
|
||||
keys[x]->adjacency[KPD_DOWN] = KPD_SPACE;
|
||||
|
||||
k=Add("Confirm",KPD_OK);
|
||||
keys[KPD_Z]->adjacency[KPD_RIGHT] = KPD_OK;
|
||||
k->adjacency[KPD_UP] = KPD_CAPS;
|
||||
k->adjacency[KPD_LEFT] = KPD_Z;
|
||||
k->adjacency[KPD_DOWN] = KPD_CANCEL;
|
||||
|
||||
k=Add("Cancel",KPD_CANCEL);
|
||||
k->adjacency[KPD_UP] = KPD_OK;
|
||||
k->adjacency[KPD_LEFT] = KPD_SPACE;
|
||||
|
||||
k=Add("Del",KPD_DEL);
|
||||
keys[KPD_I]->adjacency[KPD_RIGHT] = KPD_DEL;
|
||||
k->adjacency[KPD_UP] = KPD_9;
|
||||
k->adjacency[KPD_DOWN] = KPD_CAPS;
|
||||
k->adjacency[KPD_LEFT] = KPD_I;
|
||||
|
||||
k=Add("Caps",KPD_CAPS);
|
||||
keys[KPD_R]->adjacency[KPD_RIGHT] = KPD_CAPS;
|
||||
keys[KPD_R]->adjacency[KPD_DOWN] = KPD_Z;
|
||||
k->adjacency[KPD_UP] = KPD_DEL;
|
||||
k->adjacency[KPD_DOWN] = KPD_OK;
|
||||
k->adjacency[KPD_LEFT] = KPD_R;
|
||||
|
||||
|
||||
for(int x=0;x<10;x++){
|
||||
buf[0] = '0'+x;
|
||||
Add(buf,KPD_0+x);
|
||||
if(x < 8)
|
||||
linkKeys(KPD_0+x,KPD_A+x,KPD_DOWN);
|
||||
if(x > 0)
|
||||
linkKeys(KPD_0+x,KPD_0+x-1,KPD_LEFT);
|
||||
}
|
||||
|
||||
keys[KPD_8]->adjacency[KPD_DOWN] = KPD_DEL;
|
||||
keys[KPD_9]->adjacency[KPD_DOWN] = KPD_DEL;
|
||||
|
||||
keys[KPD_0]->adjacency[KPD_LEFT] = KPD_NOWHERE;
|
||||
keys[KPD_A]->adjacency[KPD_LEFT] = KPD_NOWHERE;
|
||||
keys[KPD_J]->adjacency[KPD_LEFT] = KPD_NOWHERE;
|
||||
keys[KPD_S]->adjacency[KPD_LEFT] = KPD_NOWHERE;
|
||||
|
||||
}
|
||||
|
||||
SimplePad::~SimplePad()
|
||||
{
|
||||
for(int x=0;x<KPD_MAX;x++)
|
||||
SAFE_DELETE(keys[x]);
|
||||
}
|
||||
|
||||
|
||||
SimpleKey * SimplePad::Add(string display, unsigned char id){
|
||||
if(nbitems >= KPD_MAX)
|
||||
return NULL;
|
||||
|
||||
keys[nbitems++] = NEW SimpleKey(display,id);
|
||||
return keys[nbitems-1];
|
||||
}
|
||||
void SimplePad::pressKey(unsigned char key){
|
||||
string input = "";
|
||||
|
||||
if(isalpha(key)) {
|
||||
if(bCapslock)
|
||||
input += toupper(key);
|
||||
else
|
||||
input += key;
|
||||
|
||||
if(cursor < buffer.size())
|
||||
cursor++;
|
||||
|
||||
buffer.insert(cursor,input);
|
||||
}
|
||||
else if(key == KPD_CAPS)
|
||||
bCapslock = !bCapslock;
|
||||
else if(key == KPD_DEL) {
|
||||
if(!buffer.size())
|
||||
return;
|
||||
|
||||
if(cursor >= buffer.size()) {
|
||||
cursor = buffer.size();
|
||||
buffer = buffer.substr(0,cursor-1);
|
||||
}
|
||||
else
|
||||
buffer = buffer.substr(0,cursor) + buffer.substr(cursor+1);
|
||||
|
||||
cursor--;
|
||||
}
|
||||
else if(key == KPD_OK)
|
||||
Finish();
|
||||
else if(key == KPD_CANCEL) {
|
||||
bCanceled = true;
|
||||
Finish();
|
||||
}
|
||||
|
||||
}
|
||||
void SimplePad::MoveSelection(unsigned char moveto)
|
||||
{
|
||||
if(!bShowNumpad && moveto >= KPD_0 && moveto <= KPD_9 )
|
||||
moveto = KPD_INPUT;
|
||||
else if(!bShowCancel && moveto == KPD_CANCEL )
|
||||
moveto = KPD_SPACE;
|
||||
|
||||
if(selected < KPD_MAX && selected >= 0)
|
||||
priorKey = selected;
|
||||
|
||||
if(moveto < KPD_MAX) {
|
||||
selected = moveto;
|
||||
}
|
||||
else if(moveto == KPD_INPUT)
|
||||
selected = KPD_INPUT;
|
||||
}
|
||||
|
||||
void SimplePad::Update(float dt){
|
||||
JGE * mEngine = JGE::GetInstance();
|
||||
|
||||
//We can always confirm!
|
||||
if(mEngine->GetButtonClick(PSP_CTRL_START))
|
||||
{
|
||||
if(selected != KPD_OK)
|
||||
selected = KPD_OK;
|
||||
else
|
||||
Finish();
|
||||
return;
|
||||
}
|
||||
|
||||
if(selected == KPD_SPACE){
|
||||
if(bShowCancel && mEngine->GetButtonClick(PSP_CTRL_RIGHT))
|
||||
selected = KPD_CANCEL;
|
||||
else if (mEngine->GetButtonClick(PSP_CTRL_LEFT)||mEngine->GetButtonClick(PSP_CTRL_RIGHT)
|
||||
||mEngine->GetButtonClick(PSP_CTRL_UP)||mEngine->GetButtonClick(PSP_CTRL_DOWN))
|
||||
selected = priorKey;
|
||||
} //Moving within/from the text field.
|
||||
else if(selected == KPD_INPUT){
|
||||
if (mEngine->GetButtonClick(PSP_CTRL_DOWN) )
|
||||
selected = priorKey;
|
||||
if (mEngine->GetButtonClick(PSP_CTRL_LEFT)){
|
||||
if(cursor > 0)
|
||||
cursor--;
|
||||
}
|
||||
else if (mEngine->GetButtonClick(PSP_CTRL_RIGHT)){
|
||||
if(cursor < buffer.size())
|
||||
cursor++;
|
||||
}
|
||||
}
|
||||
else if(selected >= 0 && keys[selected]){
|
||||
if (mEngine->GetButtonClick(PSP_CTRL_LEFT))
|
||||
MoveSelection(keys[selected]->adjacency[KPD_LEFT]);
|
||||
else if (mEngine->GetButtonClick(PSP_CTRL_RIGHT))
|
||||
MoveSelection(keys[selected]->adjacency[KPD_RIGHT]);
|
||||
if (mEngine->GetButtonClick(PSP_CTRL_DOWN))
|
||||
MoveSelection(keys[selected]->adjacency[KPD_DOWN]);
|
||||
else if (mEngine->GetButtonClick(PSP_CTRL_UP))
|
||||
MoveSelection(keys[selected]->adjacency[KPD_UP]);
|
||||
}
|
||||
|
||||
|
||||
//These bits require a valid key...
|
||||
if(selected >= 0 && selected < nbitems && keys[selected]){
|
||||
if (mEngine->GetButtonClick(PSP_CTRL_CIRCLE))
|
||||
pressKey(keys[selected]->id);
|
||||
}
|
||||
if (buffer.size() > 0 && mEngine->GetButtonClick(PSP_CTRL_CROSS))
|
||||
buffer = buffer.substr(0,buffer.size() - 1);
|
||||
if (buffer.size() && mEngine->GetButtonClick(PSP_CTRL_LTRIGGER)){
|
||||
if(cursor > 0)
|
||||
cursor--;
|
||||
}
|
||||
else if (mEngine->GetButtonClick(PSP_CTRL_RTRIGGER)){
|
||||
if(cursor < buffer.size())
|
||||
cursor++;
|
||||
else{
|
||||
buffer += ' ';
|
||||
cursor = buffer.size();
|
||||
}
|
||||
}
|
||||
|
||||
mX = 50;
|
||||
mY = 50;
|
||||
|
||||
}
|
||||
void SimplePad::Start(string value, string * _dest) {
|
||||
bActive = true;
|
||||
bCanceled=false;
|
||||
buffer = value;
|
||||
original = buffer;
|
||||
dest = _dest;
|
||||
cursor = buffer.size();
|
||||
}
|
||||
|
||||
string SimplePad::Finish() {
|
||||
bActive = false;
|
||||
if(bCanceled){
|
||||
dest = NULL;
|
||||
return original;
|
||||
}
|
||||
if(dest != NULL){
|
||||
dest->clear(); dest->insert(0,buffer);
|
||||
dest = NULL;
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void SimplePad::Render(){
|
||||
//This could use some cleaning up to make margins more explicit
|
||||
JLBFont * mFont = resources.GetJLBFont("f3");
|
||||
|
||||
int offX = 0, offY = 0;
|
||||
int kH = mFont->GetHeight();
|
||||
int hSpacing = mFont->GetStringWidth("W");
|
||||
int rowLen = mFont->GetStringWidth("JKLMNOPQR") + 14*7;
|
||||
int vSpacing = 0;
|
||||
int kW = hSpacing;
|
||||
|
||||
JRenderer * renderer = JRenderer::GetInstance();
|
||||
|
||||
|
||||
if(title != "")
|
||||
vSpacing = kH+8;
|
||||
else
|
||||
vSpacing = 0;
|
||||
|
||||
offY = vSpacing;
|
||||
if(bShowNumpad)
|
||||
offY += kH+14;
|
||||
//Draw Keypad Background.
|
||||
renderer->FillRoundRect(mX-kW,mY-kH,(kW+12)*11,(kH+14)*5+offY,2,options[Metrics::POPUP_MENU_FC].asColor(ARGB(180,0,0,0)));
|
||||
offY = vSpacing;
|
||||
//Draw text entry bubble
|
||||
renderer->FillRoundRect(mX-kW/2,mY+offY,(kW+12)*9+kW/2,kH,2,options[Metrics::KEYPAD_FCH].asColor(ARGB(255,255,255,255)));
|
||||
|
||||
//Draw text-entry title, if we've got one.
|
||||
if(title != ""){
|
||||
mFont->DrawString(title.c_str(),mX,mY);
|
||||
mY+=kH+12;
|
||||
}
|
||||
|
||||
//Draw cursor.
|
||||
if(cursor < buffer.size())
|
||||
{
|
||||
kW = mFont->GetStringWidth(buffer.substr(cursor,1).c_str());
|
||||
renderer->FillRoundRect(mX+mFont->GetStringWidth(buffer.substr(0,cursor).c_str()),mY+kH-4,
|
||||
kW,4,2,options[Metrics::KEY_FCH].asColor(ARGB(150,150,150,0)));
|
||||
}
|
||||
else
|
||||
{
|
||||
cursor = buffer.size();
|
||||
renderer->FillRoundRect(mX+mFont->GetStringWidth(buffer.substr(0,cursor).c_str()),mY+kH-4,
|
||||
kW,4,2,options[Metrics::KEY_FCH].asColor(ARGB(150,150,150,0)));
|
||||
}
|
||||
|
||||
mFont->SetColor(options[Metrics::KEYPAD_TC].asColor(ARGB(255,0,0,0)));
|
||||
mFont->DrawString(buffer.c_str(),mX,mY);
|
||||
offY += kH + 12;
|
||||
|
||||
if(!bShowNumpad)
|
||||
vSpacing -= kH + 12;
|
||||
|
||||
for(int x=0;x<nbitems;x++)
|
||||
if(keys[x]){
|
||||
|
||||
if((x == KPD_CANCEL && !bShowCancel) || (x >= KPD_0 && x <= KPD_9 && !bShowNumpad))
|
||||
continue;
|
||||
|
||||
switch(x){
|
||||
case KPD_0:
|
||||
offX = 0;
|
||||
offY = vSpacing;
|
||||
break;
|
||||
case KPD_A:
|
||||
offX = 0;
|
||||
offY = vSpacing+(kH+12)*1;
|
||||
break;
|
||||
case KPD_J:
|
||||
offX = 0;
|
||||
offY = vSpacing+(kH+12)*2;
|
||||
break;
|
||||
case KPD_S:
|
||||
offX = 0;
|
||||
offY = vSpacing+(kH+12)*3;
|
||||
break;
|
||||
case KPD_SPACE:
|
||||
offX = 0;
|
||||
offY = vSpacing+(kH+12)*4;
|
||||
break;
|
||||
case KPD_OK:
|
||||
offX = rowLen + hSpacing;
|
||||
offY = vSpacing+(kH+12)*3;
|
||||
break;
|
||||
case KPD_CANCEL:
|
||||
offX = rowLen + hSpacing;
|
||||
offY = vSpacing+(kH+12)*4;
|
||||
break;
|
||||
case KPD_DEL:
|
||||
offX = rowLen + hSpacing;
|
||||
offY = vSpacing+(kH+12)*1;
|
||||
break;
|
||||
case KPD_CAPS:
|
||||
offX = rowLen + hSpacing;
|
||||
offY = vSpacing+(kH+12)*2;
|
||||
break;
|
||||
}
|
||||
|
||||
kW = mFont->GetStringWidth(keys[x]->displayValue.c_str());
|
||||
//Render a key.
|
||||
if(x != selected){
|
||||
renderer->FillRoundRect(mX+offX-4,mY+offY-4,kW+8,kH+4,2,options[Metrics::POPUP_MENU_FC].asColor(ARGB(180,50,50,50)));
|
||||
mFont->SetColor(options[Metrics::POPUP_MENU_TCH].asColor(ARGB(255,255,255,0)));
|
||||
}
|
||||
else{
|
||||
renderer->FillRoundRect(mX+offX-4,mY+offY-4,kW+8,kH+4,2,options[Metrics::POPUP_MENU_FC].asColor(ARGB(255,100,100,100)));
|
||||
mFont->SetColor(options[Metrics::POPUP_MENU_TC].asColor(ARGB(255,255,255,255)));
|
||||
}
|
||||
|
||||
char vkey[2];
|
||||
vkey[1] = '\0';
|
||||
vkey[0] = keys[x]->id;
|
||||
|
||||
|
||||
if(isalpha(vkey[0])) {
|
||||
if(bCapslock) vkey[0] = toupper(vkey[0]);
|
||||
mFont->DrawString(vkey,mX+offX,mY+offY);
|
||||
}
|
||||
else
|
||||
mFont->DrawString(keys[x]->displayValue.c_str(),mX+offX,mY+offY);
|
||||
offX += kW + 14;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SimplePad::cursorPos(){
|
||||
if(cursor > buffer.size())
|
||||
return buffer.size();
|
||||
|
||||
return cursor;
|
||||
}
|
||||
#include "../include/config.h"
|
||||
#include "../include/SimplePad.h"
|
||||
#include "JTypes.h"
|
||||
#include "../include/GameApp.h"
|
||||
#include "../include/Translate.h"
|
||||
|
||||
|
||||
#define ALPHA_COLUMNS 8
|
||||
#define ALPHA_ROWS 8
|
||||
|
||||
#define KPD_UP 0
|
||||
#define KPD_DOWN 1
|
||||
#define KPD_LEFT 2
|
||||
#define KPD_RIGHT 3
|
||||
|
||||
SimpleKey::SimpleKey( string _ds, int _id){
|
||||
displayValue = _ds; id = _id;
|
||||
for(int x=0;x<4;x++)
|
||||
adjacency[x] = KPD_NOWHERE;
|
||||
}
|
||||
|
||||
void SimplePad::linkKeys(int from, int to, int dir){
|
||||
|
||||
if(keys[from] && keys[to]){
|
||||
keys[from]->adjacency[dir] = to;
|
||||
switch(dir){
|
||||
case KPD_UP:
|
||||
case KPD_LEFT:
|
||||
dir++;
|
||||
break;
|
||||
default:
|
||||
dir--;
|
||||
}
|
||||
keys[to]->adjacency[dir] = from;
|
||||
}
|
||||
}
|
||||
|
||||
SimplePad::SimplePad(){
|
||||
nbitems = 0;
|
||||
bActive = false;
|
||||
selected = 0;
|
||||
priorKey = 0;
|
||||
cursor = 0;
|
||||
bShowCancel = false;
|
||||
bShowNumpad = false;
|
||||
bCapslock = true;
|
||||
char buf[2];
|
||||
buf[1] = '\0';
|
||||
SimpleKey * k;
|
||||
|
||||
for(int x=0;x<KPD_MAX;x++)
|
||||
keys[x] = NULL;
|
||||
|
||||
//Add the alphabet. We cheat a bit here.
|
||||
for(int x='a';x<='z';x++)
|
||||
{
|
||||
buf[0] = x;
|
||||
k=Add(buf,x);
|
||||
int idx = x-'a';
|
||||
|
||||
if(idx > KPD_A)
|
||||
k->adjacency[KPD_LEFT] = idx-1;
|
||||
if(idx < KPD_Z)
|
||||
k->adjacency[KPD_RIGHT] = idx+1;
|
||||
if(idx > ALPHA_COLUMNS)
|
||||
k->adjacency[KPD_UP] = idx-1-ALPHA_COLUMNS;
|
||||
else
|
||||
k->adjacency[KPD_UP] = KPD_INPUT;
|
||||
if(idx < 25-ALPHA_COLUMNS)
|
||||
k->adjacency[KPD_DOWN] = idx+1+ALPHA_COLUMNS;
|
||||
}
|
||||
|
||||
Add("Spacebar",KPD_SPACE);
|
||||
|
||||
for(int x=25-ALPHA_COLUMNS;x<26;x++)
|
||||
keys[x]->adjacency[KPD_DOWN] = KPD_SPACE;
|
||||
|
||||
k=Add("Confirm",KPD_OK);
|
||||
keys[KPD_Z]->adjacency[KPD_RIGHT] = KPD_OK;
|
||||
k->adjacency[KPD_UP] = KPD_CAPS;
|
||||
k->adjacency[KPD_LEFT] = KPD_Z;
|
||||
k->adjacency[KPD_DOWN] = KPD_CANCEL;
|
||||
|
||||
k=Add("Cancel",KPD_CANCEL);
|
||||
k->adjacency[KPD_UP] = KPD_OK;
|
||||
k->adjacency[KPD_LEFT] = KPD_SPACE;
|
||||
|
||||
k=Add("Del",KPD_DEL);
|
||||
keys[KPD_I]->adjacency[KPD_RIGHT] = KPD_DEL;
|
||||
k->adjacency[KPD_UP] = KPD_9;
|
||||
k->adjacency[KPD_DOWN] = KPD_CAPS;
|
||||
k->adjacency[KPD_LEFT] = KPD_I;
|
||||
|
||||
k=Add("Caps",KPD_CAPS);
|
||||
keys[KPD_R]->adjacency[KPD_RIGHT] = KPD_CAPS;
|
||||
keys[KPD_R]->adjacency[KPD_DOWN] = KPD_Z;
|
||||
k->adjacency[KPD_UP] = KPD_DEL;
|
||||
k->adjacency[KPD_DOWN] = KPD_OK;
|
||||
k->adjacency[KPD_LEFT] = KPD_R;
|
||||
|
||||
|
||||
for(int x=0;x<10;x++){
|
||||
buf[0] = '0'+x;
|
||||
Add(buf,KPD_0+x);
|
||||
if(x < 8)
|
||||
linkKeys(KPD_0+x,KPD_A+x,KPD_DOWN);
|
||||
if(x > 0)
|
||||
linkKeys(KPD_0+x,KPD_0+x-1,KPD_LEFT);
|
||||
}
|
||||
|
||||
keys[KPD_8]->adjacency[KPD_DOWN] = KPD_DEL;
|
||||
keys[KPD_9]->adjacency[KPD_DOWN] = KPD_DEL;
|
||||
|
||||
keys[KPD_0]->adjacency[KPD_LEFT] = KPD_NOWHERE;
|
||||
keys[KPD_A]->adjacency[KPD_LEFT] = KPD_NOWHERE;
|
||||
keys[KPD_J]->adjacency[KPD_LEFT] = KPD_NOWHERE;
|
||||
keys[KPD_S]->adjacency[KPD_LEFT] = KPD_NOWHERE;
|
||||
|
||||
}
|
||||
|
||||
SimplePad::~SimplePad()
|
||||
{
|
||||
for(int x=0;x<KPD_MAX;x++)
|
||||
SAFE_DELETE(keys[x]);
|
||||
}
|
||||
|
||||
|
||||
SimpleKey * SimplePad::Add(string display, unsigned char id){
|
||||
if(nbitems >= KPD_MAX)
|
||||
return NULL;
|
||||
|
||||
keys[nbitems++] = NEW SimpleKey(display,id);
|
||||
return keys[nbitems-1];
|
||||
}
|
||||
void SimplePad::pressKey(unsigned char key){
|
||||
string input = "";
|
||||
|
||||
if(isalpha(key)) {
|
||||
if(bCapslock)
|
||||
input += toupper(key);
|
||||
else
|
||||
input += key;
|
||||
|
||||
if(cursor < buffer.size())
|
||||
cursor++;
|
||||
|
||||
buffer.insert(cursor,input);
|
||||
}
|
||||
else if(key == KPD_CAPS)
|
||||
bCapslock = !bCapslock;
|
||||
else if(key == KPD_DEL) {
|
||||
if(!buffer.size())
|
||||
return;
|
||||
|
||||
if(cursor >= buffer.size()) {
|
||||
cursor = buffer.size();
|
||||
buffer = buffer.substr(0,cursor-1);
|
||||
}
|
||||
else
|
||||
buffer = buffer.substr(0,cursor) + buffer.substr(cursor+1);
|
||||
|
||||
cursor--;
|
||||
}
|
||||
else if(key == KPD_OK)
|
||||
Finish();
|
||||
else if(key == KPD_CANCEL) {
|
||||
bCanceled = true;
|
||||
Finish();
|
||||
}
|
||||
|
||||
}
|
||||
void SimplePad::MoveSelection(unsigned char moveto)
|
||||
{
|
||||
if(!bShowNumpad && moveto >= KPD_0 && moveto <= KPD_9 )
|
||||
moveto = KPD_INPUT;
|
||||
else if(!bShowCancel && moveto == KPD_CANCEL )
|
||||
moveto = KPD_SPACE;
|
||||
|
||||
if(selected < KPD_MAX && selected >= 0)
|
||||
priorKey = selected;
|
||||
|
||||
if(moveto < KPD_MAX) {
|
||||
selected = moveto;
|
||||
}
|
||||
else if(moveto == KPD_INPUT)
|
||||
selected = KPD_INPUT;
|
||||
}
|
||||
|
||||
void SimplePad::Update(float dt){
|
||||
JGE * mEngine = JGE::GetInstance();
|
||||
|
||||
//Start button changes capslock setting.
|
||||
if(mEngine->GetButtonClick(PSP_CTRL_START))
|
||||
{
|
||||
if(selected != KPD_OK)
|
||||
selected = KPD_OK;
|
||||
else
|
||||
Finish();
|
||||
}
|
||||
else if(mEngine->GetButtonClick(PSP_CTRL_SELECT)){
|
||||
bCapslock = !bCapslock;
|
||||
}
|
||||
|
||||
if(selected == KPD_SPACE){
|
||||
if(bShowCancel && mEngine->GetButtonClick(PSP_CTRL_RIGHT))
|
||||
selected = KPD_CANCEL;
|
||||
else if (mEngine->GetButtonClick(PSP_CTRL_LEFT)||mEngine->GetButtonClick(PSP_CTRL_RIGHT)
|
||||
||mEngine->GetButtonClick(PSP_CTRL_UP)||mEngine->GetButtonClick(PSP_CTRL_DOWN))
|
||||
selected = priorKey;
|
||||
} //Moving within/from the text field.
|
||||
else if(selected == KPD_INPUT){
|
||||
if (mEngine->GetButtonClick(PSP_CTRL_DOWN) )
|
||||
selected = priorKey;
|
||||
if (mEngine->GetButtonClick(PSP_CTRL_LEFT)){
|
||||
if(cursor > 0)
|
||||
cursor--;
|
||||
}
|
||||
else if (mEngine->GetButtonClick(PSP_CTRL_RIGHT)){
|
||||
if(cursor < buffer.size())
|
||||
cursor++;
|
||||
}
|
||||
}
|
||||
else if(selected >= 0 && keys[selected]){
|
||||
if (mEngine->GetButtonClick(PSP_CTRL_LEFT))
|
||||
MoveSelection(keys[selected]->adjacency[KPD_LEFT]);
|
||||
else if (mEngine->GetButtonClick(PSP_CTRL_RIGHT))
|
||||
MoveSelection(keys[selected]->adjacency[KPD_RIGHT]);
|
||||
if (mEngine->GetButtonClick(PSP_CTRL_DOWN))
|
||||
MoveSelection(keys[selected]->adjacency[KPD_DOWN]);
|
||||
else if (mEngine->GetButtonClick(PSP_CTRL_UP))
|
||||
MoveSelection(keys[selected]->adjacency[KPD_UP]);
|
||||
}
|
||||
|
||||
|
||||
//These bits require a valid key...
|
||||
if(selected >= 0 && selected < nbitems && keys[selected]){
|
||||
if (mEngine->GetButtonClick(PSP_CTRL_CIRCLE))
|
||||
pressKey(keys[selected]->id);
|
||||
}
|
||||
if (buffer.size() > 0 && mEngine->GetButtonClick(PSP_CTRL_CROSS))
|
||||
buffer = buffer.substr(0,buffer.size() - 1);
|
||||
if (buffer.size() && mEngine->GetButtonClick(PSP_CTRL_LTRIGGER)){
|
||||
if(cursor > 0)
|
||||
cursor--;
|
||||
}
|
||||
else if (mEngine->GetButtonClick(PSP_CTRL_RTRIGGER)){
|
||||
if(cursor < buffer.size())
|
||||
cursor++;
|
||||
else{
|
||||
buffer += ' ';
|
||||
cursor = buffer.size();
|
||||
}
|
||||
}
|
||||
|
||||
mX = 50;
|
||||
mY = 50;
|
||||
|
||||
//Clear input buffer.
|
||||
mEngine->ResetInput();
|
||||
}
|
||||
void SimplePad::Start(string value, string * _dest) {
|
||||
bActive = true;
|
||||
bCanceled=false;
|
||||
buffer = value;
|
||||
original = buffer;
|
||||
dest = _dest;
|
||||
cursor = buffer.size();
|
||||
//Clear input buffer.
|
||||
JGE * mEngine = JGE::GetInstance();
|
||||
mEngine->ResetInput();
|
||||
}
|
||||
|
||||
string SimplePad::Finish() {
|
||||
bActive = false;
|
||||
|
||||
//Clear input buffer.
|
||||
JGE * mEngine = JGE::GetInstance();
|
||||
mEngine->ResetInput();
|
||||
|
||||
//Return result.
|
||||
if(bCanceled){
|
||||
dest = NULL;
|
||||
return original;
|
||||
}
|
||||
if(dest != NULL){
|
||||
dest->clear(); dest->insert(0,buffer);
|
||||
dest = NULL;
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void SimplePad::Render(){
|
||||
//This could use some cleaning up to make margins more explicit
|
||||
JLBFont * mFont = resources.GetJLBFont("f3");
|
||||
|
||||
int offX = 0, offY = 0;
|
||||
int kH = mFont->GetHeight();
|
||||
int hSpacing = mFont->GetStringWidth("W");
|
||||
int rowLen = mFont->GetStringWidth("JKLMNOPQR") + 14*7;
|
||||
int vSpacing = 0;
|
||||
int kW = hSpacing;
|
||||
|
||||
JRenderer * renderer = JRenderer::GetInstance();
|
||||
|
||||
|
||||
vSpacing = kH+8;
|
||||
|
||||
|
||||
offY = vSpacing;
|
||||
if(bShowNumpad)
|
||||
offY += kH+14;
|
||||
//Draw Keypad Background.
|
||||
renderer->FillRoundRect(mX-kW,mY-kH,(kW+12)*11,(kH+14)*5+offY,2,options[Metrics::POPUP_MENU_FC].asColor(ARGB(180,0,0,0)));
|
||||
offY = vSpacing;
|
||||
//Draw text entry bubble
|
||||
renderer->FillRoundRect(mX-kW/2,mY+offY,(kW+12)*9+kW/2,kH,2,options[Metrics::KEYPAD_FCH].asColor(ARGB(255,255,255,255)));
|
||||
|
||||
//Draw text-entry title, if we've got one.
|
||||
if(title != ""){
|
||||
mFont->DrawString(title.c_str(),mX,mY);
|
||||
}
|
||||
mY+=kH+12;
|
||||
|
||||
//Draw cursor.
|
||||
if(cursor < buffer.size())
|
||||
{
|
||||
kW = mFont->GetStringWidth(buffer.substr(cursor,1).c_str());
|
||||
renderer->FillRoundRect(mX+mFont->GetStringWidth(buffer.substr(0,cursor).c_str()),mY+kH-4,
|
||||
kW,4,2,options[Metrics::KEY_FCH].asColor(ARGB(150,150,150,0)));
|
||||
}
|
||||
else
|
||||
{
|
||||
cursor = buffer.size();
|
||||
renderer->FillRoundRect(mX+mFont->GetStringWidth(buffer.substr(0,cursor).c_str()),mY+kH-4,
|
||||
kW,4,2,options[Metrics::KEY_FCH].asColor(ARGB(150,150,150,0)));
|
||||
}
|
||||
|
||||
mFont->SetColor(options[Metrics::KEYPAD_TC].asColor(ARGB(255,0,0,0)));
|
||||
mFont->DrawString(buffer.c_str(),mX,mY);
|
||||
offY += kH + 12;
|
||||
|
||||
if(!bShowNumpad)
|
||||
vSpacing -= kH + 12;
|
||||
|
||||
for(int x=0;x<nbitems;x++)
|
||||
if(keys[x]){
|
||||
|
||||
if((x == KPD_CANCEL && !bShowCancel) || (x >= KPD_0 && x <= KPD_9 && !bShowNumpad))
|
||||
continue;
|
||||
|
||||
switch(x){
|
||||
case KPD_0:
|
||||
offX = 0;
|
||||
offY = vSpacing;
|
||||
break;
|
||||
case KPD_A:
|
||||
offX = 0;
|
||||
offY = vSpacing+(kH+12)*1;
|
||||
break;
|
||||
case KPD_J:
|
||||
offX = 0;
|
||||
offY = vSpacing+(kH+12)*2;
|
||||
break;
|
||||
case KPD_S:
|
||||
offX = 0;
|
||||
offY = vSpacing+(kH+12)*3;
|
||||
break;
|
||||
case KPD_SPACE:
|
||||
offX = 0;
|
||||
offY = vSpacing+(kH+12)*4;
|
||||
break;
|
||||
case KPD_OK:
|
||||
offX = rowLen + hSpacing;
|
||||
offY = vSpacing+(kH+12)*3;
|
||||
break;
|
||||
case KPD_CANCEL:
|
||||
offX = rowLen + hSpacing;
|
||||
offY = vSpacing+(kH+12)*4;
|
||||
break;
|
||||
case KPD_DEL:
|
||||
offX = rowLen + hSpacing;
|
||||
offY = vSpacing+(kH+12)*1;
|
||||
break;
|
||||
case KPD_CAPS:
|
||||
offX = rowLen + hSpacing;
|
||||
offY = vSpacing+(kH+12)*2;
|
||||
break;
|
||||
}
|
||||
|
||||
kW = mFont->GetStringWidth(keys[x]->displayValue.c_str());
|
||||
//Render a key.
|
||||
if(x != selected){
|
||||
renderer->FillRoundRect(mX+offX-4,mY+offY-4,kW+8,kH+4,2,options[Metrics::POPUP_MENU_FC].asColor(ARGB(180,50,50,50)));
|
||||
mFont->SetColor(options[Metrics::POPUP_MENU_TCH].asColor(ARGB(255,255,255,0)));
|
||||
}
|
||||
else{
|
||||
renderer->FillRoundRect(mX+offX-4,mY+offY-4,kW+8,kH+4,2,options[Metrics::POPUP_MENU_FC].asColor(ARGB(255,100,100,100)));
|
||||
mFont->SetColor(options[Metrics::POPUP_MENU_TC].asColor(ARGB(255,255,255,255)));
|
||||
}
|
||||
|
||||
char vkey[2];
|
||||
vkey[1] = '\0';
|
||||
vkey[0] = keys[x]->id;
|
||||
|
||||
|
||||
if(isalpha(vkey[0])) {
|
||||
if(bCapslock) vkey[0] = toupper(vkey[0]);
|
||||
mFont->DrawString(vkey,mX+offX,mY+offY);
|
||||
}
|
||||
else
|
||||
mFont->DrawString(keys[x]->displayValue.c_str(),mX+offX,mY+offY);
|
||||
offX += kW + 14;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SimplePad::cursorPos(){
|
||||
if(cursor > buffer.size())
|
||||
return buffer.size();
|
||||
|
||||
return cursor;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user