/**************************************************************************** * USB Loader GX * * r-win 2009 * * gui_numpad.cpp * * GUI class definitions ***************************************************************************/ #include "gui.h" #include "../main.h" #include "../settings/CSettings.h" #include #include /** * 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, keyboard_textbox_png_size); 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, keyboard_mediumkey_over_png_size); keyMediumOver = new GuiImageData(keyboard_mediumkey_over_png, keyboard_mediumkey_over_png_size); 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( 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); } }