usbloadergx/source/libwiigui/gui_numpad.cpp

196 lines
6.3 KiB
C++
Raw Normal View History

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"
#include "../settings/CSettings.h"
2009-12-10 22:38:03 +01:00
#include <stdio.h>
#include <string.h>
/**
* Constructor for the GuiNumpad class.
*/
#define SAFEFREE(p) if(p){free(p);p=NULL;}
GuiNumpad::GuiNumpad( char * t, u32 max )
{
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.
*/
GuiNumpad::~GuiNumpad()
{
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
}
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 );
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
}