/**************************************************************************** * USB Loader GX * * r-win 2009 * * gui_numpad.cpp * * GUI class definitions ***************************************************************************/ #include "gui.h" #include "../main.h" #include "../settings/cfg.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); 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); } }