2009-12-10 22:38:03 +01:00
|
|
|
/****************************************************************************
|
|
|
|
* USB Loader GX
|
|
|
|
*
|
|
|
|
* r-win 2009
|
|
|
|
*
|
|
|
|
* gui_numpad.cpp
|
|
|
|
*
|
|
|
|
* GUI class definitions
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
#include "gui.h"
|
|
|
|
#include "../main.h"
|
2010-09-19 22:25:12 +02:00
|
|
|
#include "../settings/CSettings.h"
|
2009-12-10 22:38:03 +01:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
/**
|
|
|
|
* Constructor for the GuiNumpad class.
|
|
|
|
*/
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
|
|
#define SAFEFREE(p) if(p){free(p);p=NULL;}
|
|
|
|
|
|
|
|
GuiNumpad::GuiNumpad( char * t, u32 max )
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
width = 400;
|
|
|
|
height = 370;
|
|
|
|
selectable = true;
|
|
|
|
focus = 0; // allow focus
|
|
|
|
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 );
|
|
|
|
keyMediumOver = new GuiImageData( keyboard_mediumkey_over_png );
|
|
|
|
|
|
|
|
keySoundOver = new GuiSound( button_over_pcm, button_over_pcm_size, Settings.sfxvolume );
|
|
|
|
keySoundClick = new GuiSound( button_click_pcm, button_click_pcm_size, Settings.sfxvolume );
|
|
|
|
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( keyMediumOver );
|
|
|
|
keyBackText = new GuiText( "Back", 20, ( GXColor ) {0, 0, 0, 0xff} );
|
|
|
|
|
|
|
|
keyBack = new GuiButton( keyBackImg, keyBackOverImg, ALIGN_CENTRE, ALIGN_MIDDLE, 90, 80, trigA, keySoundOver, keySoundClick, 1 );
|
|
|
|
keyBack->SetLabel( keyBackText );
|
|
|
|
keyBack->SetTrigger( trigB );
|
|
|
|
this->Append( keyBack );
|
|
|
|
|
|
|
|
keyClearImg = new GuiImage( keyMedium );
|
|
|
|
keyClearOverImg = new GuiImage( keyMediumOver );
|
|
|
|
keyClearText = new GuiText( "Clear", 20, ( GXColor ) {0, 0, 0, 0xff} );
|
|
|
|
keyClear = new GuiButton( keyClearImg, keyClearOverImg, ALIGN_CENTRE, ALIGN_MIDDLE, -90, 80, trigA, keySoundOver, keySoundClick, 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( keyMediumOver );
|
|
|
|
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, keySoundOver, keySoundClick, 1 );
|
|
|
|
keyBtn[i]->SetLabel( keyTxt[i] );
|
|
|
|
|
|
|
|
this->Append( keyBtn[i] );
|
|
|
|
}
|
|
|
|
}
|
2009-12-10 22:38:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Destructor for the GuiKeyboard class.
|
|
|
|
*/
|
2010-02-09 11:59:55 +01:00
|
|
|
GuiNumpad::~GuiNumpad()
|
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
SAFEFREE( kbText )
|
|
|
|
SAFEFREE( keyTextbox )
|
|
|
|
SAFEFREE( keyTextboxImg )
|
|
|
|
SAFEFREE( keyBackText )
|
|
|
|
SAFEFREE( keyBackImg )
|
|
|
|
SAFEFREE( keyBackOverImg )
|
|
|
|
SAFEFREE( keyBack )
|
|
|
|
SAFEFREE( keyClear )
|
|
|
|
SAFEFREE( keyClearImg )
|
|
|
|
SAFEFREE( keyClearOverImg )
|
|
|
|
SAFEFREE( keyClearText )
|
|
|
|
SAFEFREE( keyMedium )
|
|
|
|
SAFEFREE( keyMediumOver )
|
|
|
|
SAFEFREE( keySoundOver )
|
|
|
|
SAFEFREE( keySoundClick )
|
|
|
|
SAFEFREE( trigA )
|
|
|
|
SAFEFREE( trigB )
|
|
|
|
|
|
|
|
for ( int i = 0; i < 11; i++ )
|
|
|
|
{
|
|
|
|
if ( keys[i] != '\0' )
|
|
|
|
{
|
|
|
|
SAFEFREE( keyImg[i] )
|
|
|
|
SAFEFREE( keyImgOver[i] )
|
|
|
|
SAFEFREE( keyTxt[i] )
|
|
|
|
SAFEFREE( keyBtn[i] )
|
|
|
|
}
|
|
|
|
}
|
2009-12-10 22:38:03 +01:00
|
|
|
}
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
void GuiNumpad::Update( GuiTrigger * t )
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
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 );
|
|
|
|
|
|
|
|
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 );
|
|
|
|
}
|
2009-12-10 22:38:03 +01:00
|
|
|
}
|