00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "gui.h"
00012 #include "filebrowser.h"
00013
00014
00015
00016
00017 GuiFileBrowser::GuiFileBrowser(int w, int h)
00018 {
00019 width = w;
00020 height = h;
00021 numEntries = 0;
00022 selectedItem = 0;
00023 selectable = true;
00024 listChanged = true;
00025 focus = 0;
00026
00027 trigA = new GuiTrigger;
00028 trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
00029
00030 trigHeldA = new GuiTrigger;
00031 trigHeldA->SetHeldTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
00032
00033 btnSoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, SOUND_PCM);
00034 btnSoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, SOUND_PCM);
00035
00036 bgFileSelection = new GuiImageData(bg_file_selection_png);
00037 bgFileSelectionImg = new GuiImage(bgFileSelection);
00038 bgFileSelectionImg->SetParent(this);
00039 bgFileSelectionImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
00040
00041 bgFileSelectionEntry = new GuiImageData(bg_file_selection_entry_png);
00042 fileFolder = new GuiImageData(folder_png);
00043
00044 scrollbar = new GuiImageData(scrollbar_png);
00045 scrollbarImg = new GuiImage(scrollbar);
00046 scrollbarImg->SetParent(this);
00047 scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
00048 scrollbarImg->SetPosition(0, 30);
00049
00050 arrowDown = new GuiImageData(scrollbar_arrowdown_png);
00051 arrowDownImg = new GuiImage(arrowDown);
00052 arrowDownOver = new GuiImageData(scrollbar_arrowdown_over_png);
00053 arrowDownOverImg = new GuiImage(arrowDownOver);
00054 arrowUp = new GuiImageData(scrollbar_arrowup_png);
00055 arrowUpImg = new GuiImage(arrowUp);
00056 arrowUpOver = new GuiImageData(scrollbar_arrowup_over_png);
00057 arrowUpOverImg = new GuiImage(arrowUpOver);
00058 scrollbarBox = new GuiImageData(scrollbar_box_png);
00059 scrollbarBoxImg = new GuiImage(scrollbarBox);
00060 scrollbarBoxOver = new GuiImageData(scrollbar_box_over_png);
00061 scrollbarBoxOverImg = new GuiImage(scrollbarBoxOver);
00062
00063 arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight());
00064 arrowUpBtn->SetParent(this);
00065 arrowUpBtn->SetImage(arrowUpImg);
00066 arrowUpBtn->SetImageOver(arrowUpOverImg);
00067 arrowUpBtn->SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
00068 arrowUpBtn->SetPosition(0, -2);
00069 arrowUpBtn->SetSelectable(false);
00070 arrowUpBtn->SetClickable(false);
00071 arrowUpBtn->SetHoldable(true);
00072 arrowUpBtn->SetTrigger(trigHeldA);
00073 arrowUpBtn->SetSoundOver(btnSoundOver);
00074 arrowUpBtn->SetSoundClick(btnSoundClick);
00075
00076 arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight());
00077 arrowDownBtn->SetParent(this);
00078 arrowDownBtn->SetImage(arrowDownImg);
00079 arrowDownBtn->SetImageOver(arrowDownOverImg);
00080 arrowDownBtn->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
00081 arrowDownBtn->SetSelectable(false);
00082 arrowDownBtn->SetClickable(false);
00083 arrowDownBtn->SetHoldable(true);
00084 arrowDownBtn->SetTrigger(trigHeldA);
00085 arrowDownBtn->SetSoundOver(btnSoundOver);
00086 arrowDownBtn->SetSoundClick(btnSoundClick);
00087
00088 scrollbarBoxBtn = new GuiButton(scrollbarBoxImg->GetWidth(), scrollbarBoxImg->GetHeight());
00089 scrollbarBoxBtn->SetParent(this);
00090 scrollbarBoxBtn->SetImage(scrollbarBoxImg);
00091 scrollbarBoxBtn->SetImageOver(scrollbarBoxOverImg);
00092 scrollbarBoxBtn->SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
00093 scrollbarBoxBtn->SetMinY(0);
00094 scrollbarBoxBtn->SetMaxY(130);
00095 scrollbarBoxBtn->SetSelectable(false);
00096 scrollbarBoxBtn->SetClickable(false);
00097 scrollbarBoxBtn->SetHoldable(true);
00098 scrollbarBoxBtn->SetTrigger(trigHeldA);
00099
00100 for(int i=0; i<FILE_PAGESIZE; i++)
00101 {
00102 fileListText[i] = new GuiText(NULL, 20, (GXColor){0, 0, 0, 0xff});
00103 fileListText[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
00104 fileListText[i]->SetPosition(5,0);
00105 fileListText[i]->SetMaxWidth(512);
00106
00107 fileListBg[i] = new GuiImage(bgFileSelectionEntry);
00108 fileListFolder[i] = new GuiImage(fileFolder);
00109
00110 fileList[i] = new GuiButton(512,30);
00111 fileList[i]->SetParent(this);
00112 fileList[i]->SetLabel(fileListText[i]);
00113 fileList[i]->SetImageOver(fileListBg[i]);
00114 fileList[i]->SetPosition(2,30*i+3);
00115 fileList[i]->SetTrigger(trigA);
00116 fileList[i]->SetSoundClick(btnSoundClick);
00117 }
00118 }
00119
00120
00121
00122
00123 GuiFileBrowser::~GuiFileBrowser()
00124 {
00125 delete arrowUpBtn;
00126 delete arrowDownBtn;
00127 delete scrollbarBoxBtn;
00128
00129 delete bgFileSelectionImg;
00130 delete scrollbarImg;
00131 delete arrowDownImg;
00132 delete arrowDownOverImg;
00133 delete arrowUpImg;
00134 delete arrowUpOverImg;
00135 delete scrollbarBoxImg;
00136 delete scrollbarBoxOverImg;
00137
00138 delete bgFileSelection;
00139 delete bgFileSelectionEntry;
00140 delete fileFolder;
00141 delete scrollbar;
00142 delete arrowDown;
00143 delete arrowDownOver;
00144 delete arrowUp;
00145 delete arrowUpOver;
00146 delete scrollbarBox;
00147 delete scrollbarBoxOver;
00148
00149 delete btnSoundOver;
00150 delete btnSoundClick;
00151 delete trigHeldA;
00152 delete trigA;
00153
00154 for(int i=0; i<FILE_PAGESIZE; i++)
00155 {
00156 delete fileListText[i];
00157 delete fileList[i];
00158 delete fileListBg[i];
00159 delete fileListFolder[i];
00160 }
00161 }
00162
00163 void GuiFileBrowser::SetFocus(int f)
00164 {
00165 focus = f;
00166
00167 for(int i=0; i<FILE_PAGESIZE; i++)
00168 fileList[i]->ResetState();
00169
00170 if(f == 1)
00171 fileList[selectedItem]->SetState(STATE_SELECTED);
00172 }
00173
00174 void GuiFileBrowser::ResetState()
00175 {
00176 state = STATE_DEFAULT;
00177 stateChan = -1;
00178 selectedItem = 0;
00179
00180 for(int i=0; i<FILE_PAGESIZE; i++)
00181 {
00182 fileList[i]->ResetState();
00183 }
00184 }
00185
00186 void GuiFileBrowser::TriggerUpdate()
00187 {
00188 listChanged = true;
00189 }
00190
00191
00192
00193
00194 void GuiFileBrowser::Draw()
00195 {
00196 if(!this->IsVisible())
00197 return;
00198
00199 bgFileSelectionImg->Draw();
00200
00201 for(int i=0; i<FILE_PAGESIZE; i++)
00202 {
00203 fileList[i]->Draw();
00204 }
00205
00206 scrollbarImg->Draw();
00207 arrowUpBtn->Draw();
00208 arrowDownBtn->Draw();
00209 scrollbarBoxBtn->Draw();
00210
00211 this->UpdateEffects();
00212 }
00213
00214 void GuiFileBrowser::Update(GuiTrigger * t)
00215 {
00216 if(state == STATE_DISABLED || !t)
00217 return;
00218
00219 int position = 0;
00220 int positionWiimote = 0;
00221
00222 arrowUpBtn->Update(t);
00223 arrowDownBtn->Update(t);
00224 scrollbarBoxBtn->Update(t);
00225
00226
00227 if(scrollbarBoxBtn->GetState() == STATE_HELD &&
00228 scrollbarBoxBtn->GetStateChan() == t->chan &&
00229 t->wpad->ir.valid &&
00230 browser.numEntries > FILE_PAGESIZE
00231 )
00232 {
00233 scrollbarBoxBtn->SetPosition(0,0);
00234 positionWiimote = t->wpad->ir.y - 60 - scrollbarBoxBtn->GetTop();
00235
00236 if(positionWiimote < scrollbarBoxBtn->GetMinY())
00237 positionWiimote = scrollbarBoxBtn->GetMinY();
00238 else if(positionWiimote > scrollbarBoxBtn->GetMaxY())
00239 positionWiimote = scrollbarBoxBtn->GetMaxY();
00240
00241 browser.pageIndex = (positionWiimote * browser.numEntries)/130.0 - selectedItem;
00242
00243 if(browser.pageIndex <= 0)
00244 {
00245 browser.pageIndex = 0;
00246 }
00247 else if(browser.pageIndex+FILE_PAGESIZE >= browser.numEntries)
00248 {
00249 browser.pageIndex = browser.numEntries-FILE_PAGESIZE;
00250 }
00251 listChanged = true;
00252 focus = false;
00253 }
00254
00255 if(arrowDownBtn->GetState() == STATE_HELD && arrowDownBtn->GetStateChan() == t->chan)
00256 {
00257 t->wpad->btns_h |= WPAD_BUTTON_DOWN;
00258 if(!this->IsFocused())
00259 ((GuiWindow *)this->GetParent())->ChangeFocus(this);
00260 }
00261 else if(arrowUpBtn->GetState() == STATE_HELD && arrowUpBtn->GetStateChan() == t->chan)
00262 {
00263 t->wpad->btns_h |= WPAD_BUTTON_UP;
00264 if(!this->IsFocused())
00265 ((GuiWindow *)this->GetParent())->ChangeFocus(this);
00266 }
00267
00268
00269 if(!focus)
00270 {
00271 goto endNavigation;
00272 listChanged = false;
00273 }
00274
00275 if(t->Right())
00276 {
00277 if(browser.pageIndex < browser.numEntries && browser.numEntries > FILE_PAGESIZE)
00278 {
00279 browser.pageIndex += FILE_PAGESIZE;
00280 if(browser.pageIndex+FILE_PAGESIZE >= browser.numEntries)
00281 browser.pageIndex = browser.numEntries-FILE_PAGESIZE;
00282 listChanged = true;
00283 }
00284 }
00285 else if(t->Left())
00286 {
00287 if(browser.pageIndex > 0)
00288 {
00289 browser.pageIndex -= FILE_PAGESIZE;
00290 if(browser.pageIndex < 0)
00291 browser.pageIndex = 0;
00292 listChanged = true;
00293 }
00294 }
00295 else if(t->Down())
00296 {
00297 if(browser.pageIndex + selectedItem + 1 < browser.numEntries)
00298 {
00299 if(selectedItem == FILE_PAGESIZE-1)
00300 {
00301
00302 browser.pageIndex++;
00303 listChanged = true;
00304 }
00305 else if(fileList[selectedItem+1]->IsVisible())
00306 {
00307 fileList[selectedItem]->ResetState();
00308 fileList[++selectedItem]->SetState(STATE_SELECTED, t->chan);
00309 }
00310 }
00311 }
00312 else if(t->Up())
00313 {
00314 if(selectedItem == 0 && browser.pageIndex + selectedItem > 0)
00315 {
00316
00317 browser.pageIndex--;
00318 listChanged = true;
00319 }
00320 else if(selectedItem > 0)
00321 {
00322 fileList[selectedItem]->ResetState();
00323 fileList[--selectedItem]->SetState(STATE_SELECTED, t->chan);
00324 }
00325 }
00326
00327 endNavigation:
00328
00329 for(int i=0; i<FILE_PAGESIZE; i++)
00330 {
00331 if(listChanged || numEntries != browser.numEntries)
00332 {
00333 if(browser.pageIndex+i < browser.numEntries)
00334 {
00335 if(fileList[i]->GetState() == STATE_DISABLED)
00336 fileList[i]->SetState(STATE_DEFAULT);
00337
00338 fileList[i]->SetVisible(true);
00339
00340 fileListText[i]->SetText(browserList[browser.pageIndex+i].displayname);
00341
00342 if(browserList[browser.pageIndex+i].isdir)
00343 {
00344 fileList[i]->SetIcon(fileListFolder[i]);
00345 fileListText[i]->SetPosition(30,0);
00346 }
00347 else
00348 {
00349 fileList[i]->SetIcon(NULL);
00350 fileListText[i]->SetPosition(10,0);
00351 }
00352 }
00353 else
00354 {
00355 fileList[i]->SetVisible(false);
00356 fileList[i]->SetState(STATE_DISABLED);
00357 }
00358 }
00359
00360 if(i != selectedItem && fileList[i]->GetState() == STATE_SELECTED)
00361 fileList[i]->ResetState();
00362 else if(focus && i == selectedItem && fileList[i]->GetState() == STATE_DEFAULT)
00363 fileList[selectedItem]->SetState(STATE_SELECTED, t->chan);
00364
00365 int currChan = t->chan;
00366
00367 if(t->wpad->ir.valid && !fileList[i]->IsInside(t->wpad->ir.x, t->wpad->ir.y))
00368 t->chan = -1;
00369
00370 fileList[i]->Update(t);
00371 t->chan = currChan;
00372
00373 if(fileList[i]->GetState() == STATE_SELECTED)
00374 {
00375 selectedItem = i;
00376 browser.selIndex = browser.pageIndex + i;
00377 }
00378
00379 if(selectedItem == i)
00380 fileListText[i]->SetScroll(SCROLL_HORIZONTAL);
00381 else
00382 fileListText[i]->SetScroll(SCROLL_NONE);
00383 }
00384
00385
00386 if(positionWiimote > 0)
00387 {
00388 position = positionWiimote;
00389 }
00390 else
00391 {
00392 position = 130*(browser.pageIndex + FILE_PAGESIZE/2.0) / (browser.numEntries*1.0);
00393
00394 if(browser.pageIndex/(FILE_PAGESIZE/2.0) < 1)
00395 position = 0;
00396 else if((browser.pageIndex+FILE_PAGESIZE)/(FILE_PAGESIZE*1.0) >= (browser.numEntries)/(FILE_PAGESIZE*1.0))
00397 position = 130;
00398 }
00399
00400 scrollbarBoxBtn->SetPosition(0,position+36);
00401
00402 listChanged = false;
00403 numEntries = browser.numEntries;
00404
00405 if(updateCB)
00406 updateCB(this);
00407 }