00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "gui.h"
00012
00013 static char tmptxt[MAX_KEYBOARD_DISPLAY];
00014
00015 static char * GetDisplayText(char * t)
00016 {
00017 if(!t)
00018 return NULL;
00019
00020 int len = strlen(t);
00021
00022 if(len < MAX_KEYBOARD_DISPLAY)
00023 return t;
00024
00025 strncpy(tmptxt, &t[len-MAX_KEYBOARD_DISPLAY], MAX_KEYBOARD_DISPLAY);
00026 tmptxt[MAX_KEYBOARD_DISPLAY-1] = 0;
00027 return &tmptxt[0];
00028 }
00029
00030
00031
00032
00033
00034 GuiKeyboard::GuiKeyboard(char * t, u32 max)
00035 {
00036 width = 540;
00037 height = 400;
00038 shift = 0;
00039 caps = 0;
00040 selectable = true;
00041 focus = 0;
00042 alignmentHor = ALIGN_CENTRE;
00043 alignmentVert = ALIGN_MIDDLE;
00044 strncpy(kbtextstr, t, max);
00045 kbtextstr[max] = 0;
00046 kbtextmaxlen = max;
00047
00048 Key thekeys[4][11] = {
00049 {
00050 {'1','!'},
00051 {'2','@'},
00052 {'3','#'},
00053 {'4','$'},
00054 {'5','%'},
00055 {'6','^'},
00056 {'7','&'},
00057 {'8','*'},
00058 {'9','('},
00059 {'0',')'},
00060 {'\0','\0'}
00061 },
00062 {
00063 {'q','Q'},
00064 {'w','W'},
00065 {'e','E'},
00066 {'r','R'},
00067 {'t','T'},
00068 {'y','Y'},
00069 {'u','U'},
00070 {'i','I'},
00071 {'o','O'},
00072 {'p','P'},
00073 {'-','_'}
00074 },
00075 {
00076 {'a','A'},
00077 {'s','S'},
00078 {'d','D'},
00079 {'f','F'},
00080 {'g','G'},
00081 {'h','H'},
00082 {'j','J'},
00083 {'k','K'},
00084 {'l','L'},
00085 {';',':'},
00086 {'\'','"'}
00087 },
00088
00089 {
00090 {'z','Z'},
00091 {'x','X'},
00092 {'c','C'},
00093 {'v','V'},
00094 {'b','B'},
00095 {'n','N'},
00096 {'m','M'},
00097 {',','<'},
00098 {'.','>'},
00099 {'/','?'},
00100 {'\0','\0'}
00101 }
00102 };
00103 memcpy(keys, thekeys, sizeof(thekeys));
00104
00105 keyTextbox = new GuiImageData(keyboard_textbox_png);
00106 keyTextboxImg = new GuiImage(keyTextbox);
00107 keyTextboxImg->SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
00108 keyTextboxImg->SetPosition(0, 0);
00109 this->Append(keyTextboxImg);
00110
00111 kbText = new GuiText(GetDisplayText(kbtextstr), 20, (GXColor){0, 0, 0, 0xff});
00112 kbText->SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
00113 kbText->SetPosition(0, 13);
00114 this->Append(kbText);
00115
00116 key = new GuiImageData(keyboard_key_png);
00117 keyOver = new GuiImageData(keyboard_key_over_png);
00118 keyMedium = new GuiImageData(keyboard_mediumkey_png);
00119 keyMediumOver = new GuiImageData(keyboard_mediumkey_over_png);
00120 keyLarge = new GuiImageData(keyboard_largekey_png);
00121 keyLargeOver = new GuiImageData(keyboard_largekey_over_png);
00122
00123 keySoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, SOUND_PCM);
00124 keySoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, SOUND_PCM);
00125 trigA = new GuiTrigger;
00126
00127 trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
00128
00129 keyBackImg = new GuiImage(keyMedium);
00130 keyBackOverImg = new GuiImage(keyMediumOver);
00131 keyBackText = new GuiText("Back", 20, (GXColor){0, 0, 0, 0xff});
00132 keyBack = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight());
00133 keyBack->SetImage(keyBackImg);
00134 keyBack->SetImageOver(keyBackOverImg);
00135 keyBack->SetLabel(keyBackText);
00136 keyBack->SetSoundOver(keySoundOver);
00137 keyBack->SetSoundClick(keySoundClick);
00138 keyBack->SetTrigger(trigA);
00139 keyBack->SetPosition(10*42+40, 0*42+80);
00140 keyBack->SetEffectGrow();
00141 this->Append(keyBack);
00142
00143 keyCapsImg = new GuiImage(keyMedium);
00144 keyCapsOverImg = new GuiImage(keyMediumOver);
00145 keyCapsText = new GuiText("Caps", 20, (GXColor){0, 0, 0, 0xff});
00146 keyCaps = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight());
00147 keyCaps->SetImage(keyCapsImg);
00148 keyCaps->SetImageOver(keyCapsOverImg);
00149 keyCaps->SetLabel(keyCapsText);
00150 keyCaps->SetSoundOver(keySoundOver);
00151 keyCaps->SetSoundClick(keySoundClick);
00152 keyCaps->SetTrigger(trigA);
00153 keyCaps->SetPosition(0, 2*42+80);
00154 keyCaps->SetEffectGrow();
00155 this->Append(keyCaps);
00156
00157 keyShiftImg = new GuiImage(keyMedium);
00158 keyShiftOverImg = new GuiImage(keyMediumOver);
00159 keyShiftText = new GuiText("Shift", 20, (GXColor){0, 0, 0, 0xff});
00160 keyShift = new GuiButton(keyMedium->GetWidth(), keyMedium->GetHeight());
00161 keyShift->SetImage(keyShiftImg);
00162 keyShift->SetImageOver(keyShiftOverImg);
00163 keyShift->SetLabel(keyShiftText);
00164 keyShift->SetSoundOver(keySoundOver);
00165 keyShift->SetSoundClick(keySoundClick);
00166 keyShift->SetTrigger(trigA);
00167 keyShift->SetPosition(21, 3*42+80);
00168 keyShift->SetEffectGrow();
00169 this->Append(keyShift);
00170
00171 keySpaceImg = new GuiImage(keyLarge);
00172 keySpaceOverImg = new GuiImage(keyLargeOver);
00173 keySpace = new GuiButton(keyLarge->GetWidth(), keyLarge->GetHeight());
00174 keySpace->SetImage(keySpaceImg);
00175 keySpace->SetImageOver(keySpaceOverImg);
00176 keySpace->SetSoundOver(keySoundOver);
00177 keySpace->SetSoundClick(keySoundClick);
00178 keySpace->SetTrigger(trigA);
00179 keySpace->SetPosition(0, 4*42+80);
00180 keySpace->SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
00181 keySpace->SetEffectGrow();
00182 this->Append(keySpace);
00183
00184 char txt[2] = { 0, 0 };
00185
00186 for(int i=0; i<4; i++)
00187 {
00188 for(int j=0; j<11; j++)
00189 {
00190 if(keys[i][j].ch != '\0')
00191 {
00192 txt[0] = keys[i][j].ch;
00193 keyImg[i][j] = new GuiImage(key);
00194 keyImgOver[i][j] = new GuiImage(keyOver);
00195 keyTxt[i][j] = new GuiText(txt, 20, (GXColor){0, 0, 0, 0xff});
00196 keyTxt[i][j]->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
00197 keyTxt[i][j]->SetPosition(0, -10);
00198 keyBtn[i][j] = new GuiButton(key->GetWidth(), key->GetHeight());
00199 keyBtn[i][j]->SetImage(keyImg[i][j]);
00200 keyBtn[i][j]->SetImageOver(keyImgOver[i][j]);
00201 keyBtn[i][j]->SetSoundOver(keySoundOver);
00202 keyBtn[i][j]->SetSoundClick(keySoundClick);
00203 keyBtn[i][j]->SetTrigger(trigA);
00204 keyBtn[i][j]->SetLabel(keyTxt[i][j]);
00205 keyBtn[i][j]->SetPosition(j*42+21*i+40, i*42+80);
00206 keyBtn[i][j]->SetEffectGrow();
00207 this->Append(keyBtn[i][j]);
00208 }
00209 }
00210 }
00211 }
00212
00213
00214
00215
00216 GuiKeyboard::~GuiKeyboard()
00217 {
00218 delete kbText;
00219 delete keyTextbox;
00220 delete keyTextboxImg;
00221 delete keyCapsText;
00222 delete keyCapsImg;
00223 delete keyCapsOverImg;
00224 delete keyCaps;
00225 delete keyShiftText;
00226 delete keyShiftImg;
00227 delete keyShiftOverImg;
00228 delete keyShift;
00229 delete keyBackText;
00230 delete keyBackImg;
00231 delete keyBackOverImg;
00232 delete keyBack;
00233 delete keySpaceImg;
00234 delete keySpaceOverImg;
00235 delete keySpace;
00236 delete key;
00237 delete keyOver;
00238 delete keyMedium;
00239 delete keyMediumOver;
00240 delete keyLarge;
00241 delete keyLargeOver;
00242 delete keySoundOver;
00243 delete keySoundClick;
00244 delete trigA;
00245
00246 for(int i=0; i<4; i++)
00247 {
00248 for(int j=0; j<11; j++)
00249 {
00250 if(keys[i][j].ch != '\0')
00251 {
00252 delete keyImg[i][j];
00253 delete keyImgOver[i][j];
00254 delete keyTxt[i][j];
00255 delete keyBtn[i][j];
00256 }
00257 }
00258 }
00259 }
00260
00261 void GuiKeyboard::Update(GuiTrigger * t)
00262 {
00263 if(_elements.size() == 0 || (state == STATE_DISABLED && parentElement))
00264 return;
00265
00266 for (u8 i = 0; i < _elements.size(); i++)
00267 {
00268 try { _elements.at(i)->Update(t); }
00269 catch (const std::exception& e) { }
00270 }
00271
00272 bool update = false;
00273
00274 if(keySpace->GetState() == STATE_CLICKED)
00275 {
00276 if(strlen(kbtextstr) < kbtextmaxlen)
00277 {
00278 kbtextstr[strlen(kbtextstr)] = ' ';
00279 kbText->SetText(kbtextstr);
00280 }
00281 keySpace->SetState(STATE_SELECTED, t->chan);
00282 }
00283 else if(keyBack->GetState() == STATE_CLICKED)
00284 {
00285 kbtextstr[strlen(kbtextstr)-1] = 0;
00286 kbText->SetText(GetDisplayText(kbtextstr));
00287 keyBack->SetState(STATE_SELECTED, t->chan);
00288 }
00289 else if(keyShift->GetState() == STATE_CLICKED)
00290 {
00291 shift ^= 1;
00292 keyShift->SetState(STATE_SELECTED, t->chan);
00293 update = true;
00294 }
00295 else if(keyCaps->GetState() == STATE_CLICKED)
00296 {
00297 caps ^= 1;
00298 keyCaps->SetState(STATE_SELECTED, t->chan);
00299 update = true;
00300 }
00301
00302 char txt[2] = { 0, 0 };
00303
00304 startloop:
00305
00306 for(int i=0; i<4; i++)
00307 {
00308 for(int j=0; j<11; j++)
00309 {
00310 if(keys[i][j].ch != '\0')
00311 {
00312 if(update)
00313 {
00314 if(shift || caps)
00315 txt[0] = keys[i][j].chShift;
00316 else
00317 txt[0] = keys[i][j].ch;
00318
00319 keyTxt[i][j]->SetText(txt);
00320 }
00321
00322 if(keyBtn[i][j]->GetState() == STATE_CLICKED)
00323 {
00324 if(strlen(kbtextstr) < kbtextmaxlen)
00325 {
00326 if(shift || caps)
00327 {
00328 kbtextstr[strlen(kbtextstr)] = keys[i][j].chShift;
00329 }
00330 else
00331 {
00332 kbtextstr[strlen(kbtextstr)] = keys[i][j].ch;
00333 }
00334 }
00335 kbText->SetText(GetDisplayText(kbtextstr));
00336 keyBtn[i][j]->SetState(STATE_SELECTED, t->chan);
00337
00338 if(shift)
00339 {
00340 shift ^= 1;
00341 update = true;
00342 goto startloop;
00343 }
00344 }
00345 }
00346 }
00347 }
00348
00349 this->ToggleFocus(t);
00350
00351 if(focus)
00352 {
00353
00354 if(t->Right())
00355 this->MoveSelectionHor(1);
00356 else if(t->Left())
00357 this->MoveSelectionHor(-1);
00358 else if(t->Down())
00359 this->MoveSelectionVert(1);
00360 else if(t->Up())
00361 this->MoveSelectionVert(-1);
00362 }
00363 }