mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-12-23 10:21:55 +01:00
f3ef9104b1
*Moved all related global settings to a settings class. one for themes and individual games will follow. Probably broke some settings or theme loading, we can deal with that later and fix when someone discovers bugs.
196 lines
6.3 KiB
C++
196 lines
6.3 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.
|
|
*/
|
|
|
|
#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] );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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] )
|
|
}
|
|
}
|
|
}
|
|
|
|
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 );
|
|
}
|
|
}
|