mirror of
https://gitlab.com/Nanolx/homebrewfilter.git
synced 2025-02-21 11:37:10 +01:00
263 lines
6.5 KiB
C++
263 lines
6.5 KiB
C++
/****************************************************************************
|
|
* libwiigui
|
|
*
|
|
* Tantric 2009
|
|
*
|
|
* gui_keyboard.cpp
|
|
*
|
|
* GUI class definitions
|
|
***************************************************************************/
|
|
|
|
#include "gui.h"
|
|
#include "Tools/translate.h"
|
|
|
|
/**
|
|
* Constructor for the GuiKeyboard class.
|
|
*/
|
|
#include "Prompts/prompts.h"
|
|
GuiCodeboard::GuiCodeboard(char * t, u32 max)
|
|
{
|
|
width = 540;
|
|
height = 400;
|
|
selectable = true;
|
|
focus = 0; // allow focus
|
|
alignmentHor = ALIGN_CENTRE;
|
|
alignmentVert = ALIGN_MIDDLE;
|
|
strncpy(kbtextstr, t, max);
|
|
kbtextstr[max] = 0;
|
|
kbtextmaxlen = max;
|
|
|
|
Key thekeys[4][3] = {
|
|
{
|
|
{'1'},
|
|
{'2'},
|
|
{'3'}
|
|
},
|
|
{
|
|
{'4'},
|
|
{'5'},
|
|
{'6'}
|
|
},
|
|
{
|
|
{'7'},
|
|
{'8'},
|
|
{'9'}
|
|
},
|
|
{
|
|
{'\0'},
|
|
{'0'},
|
|
{'\0'}
|
|
}
|
|
};
|
|
memcpy(keys, thekeys, sizeof(thekeys));
|
|
|
|
for(int i = 0; i < 4; i++)
|
|
{
|
|
keyTextbox[i] = new GuiImageData(keyboard_key_png);
|
|
keyTextboxImg[i] = new GuiImage(keyTextbox[i]);
|
|
keyTextboxImg[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
if(i == 0)
|
|
keyTextboxImg[i]->SetPosition(-75, 0);
|
|
else if(i == 1)
|
|
keyTextboxImg[i]->SetPosition(-25, 0);
|
|
else if(i == 2)
|
|
keyTextboxImg[i]->SetPosition(25, 0);
|
|
else if(i == 3)
|
|
keyTextboxImg[i]->SetPosition(75, 0);
|
|
this->Append(keyTextboxImg[i]);
|
|
|
|
kbText[i] = new GuiText("\0", 20, (GXColor){0, 0, 0, 0xff});
|
|
kbText[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
kbText[i]->SetPosition(keyTextboxImg[i]->GetLeft() + keyTextboxImg[i]->GetWidth()/2, 13);
|
|
this->Append(kbText[i]);
|
|
}
|
|
|
|
key = new GuiImageData(keyboard_key_png);
|
|
keyOver = new GuiImageData(keyboard_key_over_png);
|
|
keyMedium = new GuiImageData(keyboard_mediumkey_png);
|
|
keyMediumOver = new GuiImageData(keyboard_mediumkey_over_png);
|
|
|
|
// keySoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, SOUND_PCM);
|
|
// keySoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, SOUND_PCM);
|
|
trigA = new GuiTrigger;
|
|
trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
trigB = new GuiTrigger;
|
|
trigB->SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
|
|
|
|
int distance = 40;
|
|
int pos = (width-(3*key->GetWidth()+2*distance))/2;
|
|
|
|
keyBackImg = new GuiImage(keyMedium);
|
|
keyBackOverImg = new GuiImage(keyMediumOver);
|
|
keyBackText = new GuiText("i", 40, (GXColor){0, 0, 0, 0xff});
|
|
keyBackText->SetFont(symbol_ttf, symbol_ttf_size);
|
|
keyBack = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight());
|
|
keyBack->SetImage(keyBackImg);
|
|
keyBack->SetImageOver(keyBackOverImg);
|
|
keyBack->SetLabel(keyBackText);
|
|
// keyBack->SetSoundOver(keySoundOver);
|
|
// keyBack->SetSoundClick(keySoundClick);
|
|
keyBack->SetTrigger(trigA);
|
|
keyBack->SetTrigger(trigB);
|
|
keyBack->SetPosition(pos-keyMedium->GetWidth()+key->GetWidth(), 3*(key->GetWidth() + 20)+80);
|
|
keyBack->SetEffectGrow();
|
|
this->Append(keyBack);
|
|
|
|
keyEmptyImg = new GuiImage(keyMedium);
|
|
keyEmptyOverImg = new GuiImage(keyMediumOver);
|
|
keyEmptyText = new GuiText(tr("Empty"), 20, (GXColor){0, 0, 0, 0xff});
|
|
keyEmpty = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight());
|
|
keyEmpty->SetImage(keyEmptyImg);
|
|
keyEmpty->SetImageOver(keyEmptyOverImg);
|
|
keyEmpty->SetLabel(keyEmptyText);
|
|
// keyEmpty->SetSoundOver(keySoundOver);
|
|
// keyEmpty->SetSoundClick(keySoundClick);
|
|
keyEmpty->SetTrigger(trigA);
|
|
keyEmpty->SetPosition(pos+2*(key->GetWidth()+distance), 3*(key->GetWidth() + 20)+80);
|
|
keyEmpty->SetEffectGrow();
|
|
this->Append(keyEmpty);
|
|
|
|
char txt[2] = { 0 };
|
|
for(int i=0; i<4; i++)
|
|
{
|
|
for(int j=0; j<3; j++)
|
|
{
|
|
if(keys[i][j].ch != '\0')
|
|
{
|
|
txt[0] = keys[i][j].ch;
|
|
keyImg[i][j] = new GuiImage(key);
|
|
keyImgOver[i][j] = new GuiImage(keyOver);
|
|
keyTxt[i][j] = new GuiText(txt, 20, (GXColor){0, 0, 0, 0xff});
|
|
keyTxt[i][j]->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
|
keyTxt[i][j]->SetPosition(0, -10);
|
|
keyBtn[i][j] = new GuiButton(key->GetWidth(), key->GetHeight());
|
|
keyBtn[i][j]->SetImage(keyImg[i][j]);
|
|
keyBtn[i][j]->SetImageOver(keyImgOver[i][j]);
|
|
// keyBtn[i][j]->SetSoundOver(keySoundOver);
|
|
// keyBtn[i][j]->SetSoundClick(keySoundClick);
|
|
keyBtn[i][j]->SetTrigger(trigA);
|
|
keyBtn[i][j]->SetLabel(keyTxt[i][j]);
|
|
keyBtn[i][j]->SetPosition(pos+j*(key->GetWidth()+distance), i*(key->GetWidth() + 20)+80);
|
|
keyBtn[i][j]->SetEffectGrow();
|
|
this->Append(keyBtn[i][j]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Destructor for the GuiKeyboard class.
|
|
*/
|
|
GuiCodeboard::~GuiCodeboard()
|
|
{
|
|
for(int i = 0; i < 4; i++)
|
|
{
|
|
delete kbText[i];
|
|
delete keyTextbox[i];
|
|
delete keyTextboxImg[i];
|
|
}
|
|
delete keyBackText;
|
|
delete keyBackImg;
|
|
delete keyBackOverImg;
|
|
delete keyBack;
|
|
delete keyEmptyText;
|
|
delete keyEmptyImg;
|
|
delete keyEmptyOverImg;
|
|
delete keyEmpty;
|
|
delete key;
|
|
delete keyOver;
|
|
delete keyMedium;
|
|
delete keyMediumOver;
|
|
// delete keySoundOver;
|
|
// delete keySoundClick;
|
|
delete trigA;
|
|
|
|
for(int i=0; i<4; i++)
|
|
{
|
|
for(int j=0; j<3; j++)
|
|
{
|
|
if(keys[i][j].ch != '\0')
|
|
{
|
|
delete keyImg[i][j];
|
|
delete keyImgOver[i][j];
|
|
delete keyTxt[i][j];
|
|
delete keyBtn[i][j];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void GuiCodeboard::Update(GuiTrigger * t)
|
|
{
|
|
if(_elements.size() == 0 || (state == STATE_DISABLED && parentElement))
|
|
return;
|
|
|
|
for (u8 i = 0; i < _elements.size(); i++)
|
|
{
|
|
try { _elements.at(i)->Update(t); }
|
|
catch (const std::exception& e) { }
|
|
}
|
|
|
|
bool update = false;
|
|
|
|
if(keyBack->GetState() == STATE_CLICKED)
|
|
{
|
|
kbtextstr[strlen(kbtextstr)-1] = 0;
|
|
kbText[strlen(kbtextstr)]->SetText("\0");
|
|
keyBack->SetState(STATE_SELECTED, t->chan);
|
|
}
|
|
else if(keyEmpty->GetState() == STATE_CLICKED)
|
|
{
|
|
while (strlen(kbtextstr) > 0)
|
|
{
|
|
kbtextstr[strlen(kbtextstr)-1] = 0;
|
|
kbText[strlen(kbtextstr)]->SetText("\0");
|
|
}
|
|
keyEmpty->SetState(STATE_SELECTED, t->chan);
|
|
}
|
|
|
|
char txt[2] = { 0 };
|
|
|
|
for(int i=0; i<4; i++)
|
|
{
|
|
for(int j=0; j<3; j++)
|
|
{
|
|
if(keys[i][j].ch != '\0')
|
|
{
|
|
if(update)
|
|
{
|
|
txt[0] = keys[i][j].ch;
|
|
|
|
keyTxt[i][j]->SetText(txt);
|
|
}
|
|
|
|
if(keyBtn[i][j]->GetState() == STATE_CLICKED)
|
|
{
|
|
if((signed)strlen(kbtextstr) < kbtextmaxlen)
|
|
kbtextstr[strlen(kbtextstr)] = keys[i][j].ch;
|
|
|
|
int letter = strlen(kbtextstr) -1;
|
|
string buffer = kbtextstr;
|
|
kbText[letter]->SetText(buffer.substr(letter, 1).c_str());
|
|
keyBtn[i][j]->SetState(STATE_SELECTED, t->chan);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
this->ToggleFocus(t);
|
|
|
|
if(focus) // only send actions to this window if it's in focus
|
|
{
|
|
// pad/joystick navigation
|
|
if(t->Right())
|
|
this->MoveSelectionHor(1);
|
|
else if(t->Left())
|
|
this->MoveSelectionHor(-1);
|
|
else if(t->Down())
|
|
this->MoveSelectionVert(1);
|
|
else if(t->Up())
|
|
this->MoveSelectionVert(-1);
|
|
}
|
|
}
|