usbloadergx/source/GUI/gui_numpad.cpp
strtoul a66a30a771 *removed buggy focus system completely (it was never working correct)
*added support to control screen pointer with gc pad or classic controller. you are always able to control as long as the corresponding wii control does not point to the screen (e.g. wiimote 1 not pointing to screen -> gcpad/classic controller 1 can control pointer 1). a speed factor is added to the gui option. need feedback about a proper default value, currently 15% (only tested gc pad on dolphin-emu)
*fix reinit of cheatcount on download of new file
*moved installation window to be on top of main window
*added game installation cancel
*added nand extract cancel
*added back extract of save feature for a real nand channels
*added auto position of progress window messages in vertical direction depending of how many are used at the same time
2011-12-28 16:27:30 +00:00

181 lines
4.5 KiB
C++

/****************************************************************************
* USB Loader GX
*
* r-win 2009
*
* gui_numpad.cpp
*
* GUI class definitions
***************************************************************************/
#include "gui.h"
#include "../main.h"
#include "../settings/CSettings.h"
#include <stdio.h>
#include <string.h>
/**
* Constructor for the GuiNumpad class.
*/
GuiNumpad::GuiNumpad(char * t, u32 max)
{
width = 400;
height = 370;
selectable = true;
alignmentHor = ALIGN_CENTRE;
alignmentVert = ALIGN_MIDDLE;
kbtextmaxlen = max > sizeof(kbtextstr) ? sizeof(kbtextstr) : max; // limit max up to sizeof(kbtextstr)
// strlcpy(kbtextstr, t, kbtextmaxlen);
strncpy(kbtextstr, t, kbtextmaxlen); // strncpy is needed to fill the rest with \0
kbtextstr[sizeof(kbtextstr) - 1] = 0; // terminate with \0
char thekeys[11] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '\0', '0' };
memcpy(keys, thekeys, sizeof(thekeys));
keyTextbox = new GuiImageData("keyboard_textbox.png");
keyTextboxImg = new GuiImage(keyTextbox);
keyTextboxImg->SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
keyTextboxImg->SetPosition(0, 40);//(0,0);
this->Append(keyTextboxImg);
kbText = new GuiText(kbtextstr, 20, ( GXColor )
{ 0, 0, 0, 0xff});
kbText->SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
kbText->SetPosition(0, 53);//(0, 13);
kbText->SetPassChar('*');
this->Append(kbText);
keyMedium = new GuiImageData("keyboard_mediumkey_over.png");
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);
keyBackImg = new GuiImage(keyMedium);
keyBackOverImg = new GuiImage(keyMedium);
keyBackText = new GuiText("Back", 20, ( GXColor )
{ 0, 0, 0, 0xff});
keyBack = new GuiButton(keyBackImg, keyBackOverImg, ALIGN_CENTRE, ALIGN_MIDDLE, 90, 80, trigA, btnSoundOver, btnSoundClick, 1);
keyBack->SetLabel(keyBackText);
keyBack->SetTrigger(trigB);
this->Append(keyBack);
keyClearImg = new GuiImage(keyMedium);
keyClearOverImg = new GuiImage(keyMedium);
keyClearText = new GuiText("Clear", 20, ( GXColor )
{ 0, 0, 0, 0xff});
keyClear = new GuiButton(keyClearImg, keyClearOverImg, ALIGN_CENTRE, ALIGN_MIDDLE, -90, 80, trigA, btnSoundOver, btnSoundClick, 1);
keyClear->SetLabel(keyClearText);
this->Append(keyClear);
char txt[2] = { 0, 0 };
for (int i = 0; i < 11; i++)
{
if (keys[i] != '\0')
{
int col = i % 3;
int row = i / 3;
keyImg[i] = new GuiImage(keyMedium);
keyImgOver[i] = new GuiImage(keyMedium);
txt[0] = keys[i];
keyTxt[i] = new GuiText(txt, 20, ( GXColor )
{ 0, 0, 0, 0xff});
keyTxt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
keyTxt[i]->SetPosition(0, -10);
keyBtn[i] = new GuiButton(keyImg[i], keyImgOver[i], ALIGN_CENTRE, ALIGN_MIDDLE, -90 + 90 * col, -70 + 50
* row, trigA, btnSoundOver, btnSoundClick, 1);
keyBtn[i]->SetLabel(keyTxt[i]);
this->Append(keyBtn[i]);
}
}
}
/**
* Destructor for the GuiKeyboard class.
*/
GuiNumpad::~GuiNumpad()
{
delete kbText;
delete keyTextbox;
delete keyTextboxImg;
delete keyBackText;
delete keyBackImg;
delete keyBackOverImg;
delete keyBack;
delete keyClear;
delete keyClearImg;
delete keyClearOverImg;
delete keyClearText;
delete keyMedium;
delete trigA;
delete trigB;
for (int i = 0; i < 11; i++)
{
if (keys[i] != '\0')
{
delete keyImg[i];
delete keyImgOver[i];
delete keyTxt[i];
delete keyBtn[i];
}
}
}
void GuiNumpad::Update(GuiTrigger * t)
{
LOCK( this );
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)
{
}
}
if (keyBack->GetState() == STATE_CLICKED)
{
if (strlen(kbtextstr) > 0)
{
kbtextstr[strlen(kbtextstr) - 1] = 0;
kbText->SetText(kbtextstr);
}
keyBack->SetState(STATE_SELECTED, t->chan);
}
else if (keyClear->GetState() == STATE_CLICKED)
{
memset(kbtextstr, 0, sizeof(kbtextstr));
kbText->SetText(kbtextstr);
keyClear->SetState(STATE_SELECTED, t->chan);
}
char txt[2] = { 0, 0 };
for (int i = 0; i < 11; i++)
{
if (keys[i] != '\0')
{
if (keyBtn[i]->GetState() == STATE_CLICKED)
{
txt[0] = keys[i];
if (strlen(kbtextstr) < kbtextmaxlen - 1) // -1 --> kbtextmaxlen means with term. '\0'
{
kbtextstr[strlen(kbtextstr)] = txt[0];
kbText->SetText(kbtextstr);
}
keyBtn[i]->SetState(STATE_SELECTED, t->chan);
}
}
}
kbText->SetPosition(0, 53);
}