00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "gui.h"
00012
00013 GuiWindow::GuiWindow()
00014 {
00015 width = 0;
00016 height = 0;
00017 focus = 0;
00018 }
00019
00020 GuiWindow::GuiWindow(int w, int h)
00021 {
00022 width = w;
00023 height = h;
00024 focus = 0;
00025 }
00026
00027 GuiWindow::~GuiWindow()
00028 {
00029 }
00030
00031 void GuiWindow::Append(GuiElement* e)
00032 {
00033 if (e == NULL)
00034 return;
00035
00036 Remove(e);
00037 _elements.push_back(e);
00038 e->SetParent(this);
00039 }
00040
00041 void GuiWindow::Insert(GuiElement* e, u32 index)
00042 {
00043 if (e == NULL || index > (_elements.size() - 1))
00044 return;
00045
00046 Remove(e);
00047 _elements.insert(_elements.begin()+index, e);
00048 e->SetParent(this);
00049 }
00050
00051 void GuiWindow::Remove(GuiElement* e)
00052 {
00053 if (e == NULL)
00054 return;
00055
00056 for (u8 i = 0; i < _elements.size(); i++)
00057 {
00058 if(e == _elements.at(i))
00059 {
00060 _elements.erase(_elements.begin()+i);
00061 break;
00062 }
00063 }
00064 }
00065
00066 void GuiWindow::RemoveAll()
00067 {
00068 _elements.clear();
00069 }
00070
00071 GuiElement* GuiWindow::GetGuiElementAt(u32 index) const
00072 {
00073 if (index >= _elements.size())
00074 return NULL;
00075 return _elements.at(index);
00076 }
00077
00078 u32 GuiWindow::GetSize()
00079 {
00080 return _elements.size();
00081 }
00082
00083 void GuiWindow::Draw()
00084 {
00085 if(_elements.size() == 0 || !this->IsVisible())
00086 return;
00087
00088 for (u8 i = 0; i < _elements.size(); i++)
00089 {
00090 try { _elements.at(i)->Draw(); }
00091 catch (const std::exception& e) { }
00092 }
00093
00094 this->UpdateEffects();
00095
00096 if(parentElement && state == STATE_DISABLED)
00097 Menu_DrawRectangle(0,0,screenwidth,screenheight,(GXColor){0xbe, 0xca, 0xd5, 0x70},1);
00098 }
00099
00100 void GuiWindow::ResetState()
00101 {
00102 if(state != STATE_DISABLED)
00103 state = STATE_DEFAULT;
00104
00105 for (u8 i = 0; i < _elements.size(); i++)
00106 {
00107 try { _elements.at(i)->ResetState(); }
00108 catch (const std::exception& e) { }
00109 }
00110 }
00111
00112 void GuiWindow::SetState(int s)
00113 {
00114 state = s;
00115
00116 for (u8 i = 0; i < _elements.size(); i++)
00117 {
00118 try { _elements.at(i)->SetState(s); }
00119 catch (const std::exception& e) { }
00120 }
00121 }
00122
00123 void GuiWindow::DisableChildren()
00124 {
00125 for (u8 i = 0; i < _elements.size(); i++)
00126 {
00127 try { _elements.at(i)->SetState(STATE_DISABLED); }
00128 catch (const std::exception& e) { }
00129 }
00130 }
00131
00132 void GuiWindow::SetVisible(bool v)
00133 {
00134 visible = v;
00135
00136 for (u8 i = 0; i < _elements.size(); i++)
00137 {
00138 try { _elements.at(i)->SetVisible(v); }
00139 catch (const std::exception& e) { }
00140 }
00141 }
00142
00143 void GuiWindow::SetFocus(int f)
00144 {
00145 focus = f;
00146
00147 if(f == 1)
00148 this->MoveSelectionVert(1);
00149 else
00150 this->ResetState();
00151 }
00152
00153 void GuiWindow::ChangeFocus(GuiElement* e)
00154 {
00155
00156
00157
00158 for (u8 i = 0; i < _elements.size(); i++)
00159 {
00160 if(e == _elements.at(i))
00161 _elements.at(i)->SetFocus(1);
00162 else if(_elements.at(i)->IsFocused() == 1)
00163 _elements.at(i)->SetFocus(0);
00164 }
00165 }
00166
00167 void GuiWindow::ToggleFocus(GuiTrigger * t)
00168 {
00169 if(parentElement)
00170 return;
00171
00172 int found = -1;
00173 int newfocus = -1;
00174 u8 i;
00175
00176
00177 for (i = 0; i < _elements.size(); i++)
00178 {
00179 try
00180 {
00181 if(_elements.at(i)->IsFocused() == 1)
00182 {
00183 found = i;
00184 break;
00185 }
00186 }
00187 catch (const std::exception& e) { }
00188 }
00189
00190
00191 if(found == -1)
00192 {
00193 for (i = 0; i < _elements.size(); i++)
00194 {
00195 try
00196 {
00197 if(_elements.at(i)->IsFocused() == 0 && _elements.at(i)->GetState() != STATE_DISABLED)
00198 {
00199 _elements.at(i)->SetFocus(1);
00200 break;
00201 }
00202 }
00203 catch (const std::exception& e) { }
00204 }
00205 }
00206
00207 else if(t->wpad->btns_d & (WPAD_BUTTON_1 | WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B)
00208 || t->pad.btns_d & PAD_BUTTON_B)
00209 {
00210 for (i = found; i < _elements.size(); i++)
00211 {
00212 try
00213 {
00214 if(_elements.at(i)->IsFocused() == 0 && _elements.at(i)->GetState() != STATE_DISABLED)
00215 {
00216 newfocus = i;
00217 _elements.at(i)->SetFocus(1);
00218 _elements.at(found)->SetFocus(0);
00219 break;
00220 }
00221 }
00222 catch (const std::exception& e) { }
00223 }
00224
00225 if(newfocus == -1)
00226 {
00227 for (i = 0; i < found; i++)
00228 {
00229 try
00230 {
00231 if(_elements.at(i)->IsFocused() == 0 && _elements.at(i)->GetState() != STATE_DISABLED)
00232 {
00233 _elements.at(i)->SetFocus(1);
00234 _elements.at(found)->SetFocus(0);
00235 break;
00236 }
00237 }
00238 catch (const std::exception& e) { }
00239 }
00240 }
00241 }
00242 }
00243
00244 int GuiWindow::GetSelected()
00245 {
00246
00247 int found = -1;
00248 for (u8 i = 0; i < _elements.size(); i++)
00249 {
00250 try
00251 {
00252 if(_elements.at(i)->GetState() == STATE_SELECTED)
00253 {
00254 found = i;
00255 break;
00256 }
00257 }
00258 catch (const std::exception& e) { }
00259 }
00260 return found;
00261 }
00262
00263
00264
00265 void GuiWindow::MoveSelectionHor(int dir)
00266 {
00267 int found = -1;
00268 u16 left = 0;
00269 u16 top = 0;
00270 u8 i = 0;
00271
00272 int selected = this->GetSelected();
00273
00274 if(selected >= 0)
00275 {
00276 left = _elements.at(selected)->GetLeft();
00277 top = _elements.at(selected)->GetTop();
00278 }
00279
00280
00281 for (i = 0; i < _elements.size(); i++)
00282 {
00283 try
00284 {
00285 if(_elements.at(i)->IsSelectable())
00286 {
00287 if(_elements.at(i)->GetLeft()*dir > left*dir && _elements.at(i)->GetTop() == top)
00288 {
00289 if(found == -1)
00290 found = i;
00291 else if(_elements.at(i)->GetLeft()*dir < _elements.at(found)->GetLeft()*dir)
00292 found = i;
00293 }
00294 }
00295 }
00296 catch (const std::exception& e) { }
00297 }
00298 if(found >= 0)
00299 goto matchfound;
00300
00301
00302 for (i = 0; i < _elements.size(); i++)
00303 {
00304 try
00305 {
00306 if(_elements.at(i)->IsSelectable())
00307 {
00308 if(_elements.at(i)->GetTop()*dir > top*dir)
00309 {
00310 if(found == -1)
00311 found = i;
00312 else if(_elements.at(i)->GetTop()*dir < _elements.at(found)->GetTop()*dir)
00313 found = i;
00314 else if(_elements.at(i)->GetTop()*dir == _elements.at(found)->GetTop()*dir
00315 &&
00316 _elements.at(i)->GetLeft()*dir < _elements.at(found)->GetLeft()*dir)
00317 found = i;
00318 }
00319 }
00320 }
00321 catch (const std::exception& e) { }
00322 }
00323
00324
00325 matchfound:
00326 if(found >= 0)
00327 {
00328 _elements.at(found)->SetState(STATE_SELECTED);
00329 if(selected >= 0)
00330 _elements.at(selected)->ResetState();
00331 }
00332 }
00333
00334 void GuiWindow::MoveSelectionVert(int dir)
00335 {
00336 int found = -1;
00337 u16 left = 0;
00338 u16 top = 0;
00339 u8 i = 0;
00340
00341 int selected = this->GetSelected();
00342
00343 if(selected >= 0)
00344 {
00345 left = _elements.at(selected)->GetLeft();
00346 top = _elements.at(selected)->GetTop();
00347 }
00348
00349
00350 for (i = 0; i < _elements.size(); i++)
00351 {
00352 try
00353 {
00354 if(_elements.at(i)->IsSelectable())
00355 {
00356 if(_elements.at(i)->GetTop()*dir > top*dir)
00357 {
00358 if(found == -1)
00359 found = i;
00360 else if(_elements.at(i)->GetTop()*dir < _elements.at(found)->GetTop()*dir)
00361 found = i;
00362 else if(_elements.at(i)->GetTop()*dir == _elements.at(found)->GetTop()*dir
00363 &&
00364 abs(_elements.at(i)->GetLeft() - left) <
00365 abs(_elements.at(found)->GetLeft() - left))
00366 found = i;
00367 }
00368 }
00369 }
00370 catch (const std::exception& e) { }
00371 }
00372 if(found >= 0)
00373 goto matchfound;
00374
00375
00376 matchfound:
00377 if(found >= 0)
00378 {
00379 _elements.at(found)->SetState(STATE_SELECTED);
00380 if(selected >= 0)
00381 _elements.at(selected)->ResetState();
00382 }
00383 }
00384
00385 void GuiWindow::Update(GuiTrigger * t)
00386 {
00387 if(_elements.size() == 0 || (state == STATE_DISABLED && parentElement))
00388 return;
00389
00390 for (u8 i = 0; i < _elements.size(); i++)
00391 {
00392 try { _elements.at(i)->Update(t); }
00393 catch (const std::exception& e) { }
00394 }
00395
00396 this->ToggleFocus(t);
00397
00398 if(focus)
00399 {
00400
00401 if(t->Right())
00402 this->MoveSelectionHor(1);
00403 else if(t->Left())
00404 this->MoveSelectionHor(-1);
00405 else if(t->Down())
00406 this->MoveSelectionVert(1);
00407 else if(t->Up())
00408 this->MoveSelectionVert(-1);
00409 }
00410
00411 if(updateCB)
00412 updateCB(this);
00413 }