diff --git a/gui.pnproj b/gui.pnproj
index 13660541..2fdea4f9 100644
--- a/gui.pnproj
+++ b/gui.pnproj
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/source/filebrowser.cpp b/source/filebrowser.cpp
new file mode 100644
index 00000000..790fc448
--- /dev/null
+++ b/source/filebrowser.cpp
@@ -0,0 +1,235 @@
+/****************************************************************************
+ * libwiigui Template
+ * Tantric 2009
+ *
+ * modified by dimok
+ *
+ * filebrowser.cpp
+ *
+ * Generic file routines - reading, writing, browsing
+ ***************************************************************************/
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "filebrowser.h"
+#include "menu.h"
+
+BROWSERINFO browser;
+BROWSERENTRY * browserList = NULL; // list of files/folders in browser
+
+/****************************************************************************
+ * ResetBrowser()
+ * Clears the file browser memory, and allocates one initial entry
+ ***************************************************************************/
+void ResetBrowser()
+{
+ browser.numEntries = 0;
+ browser.selIndex = 0;
+ browser.pageIndex = 0;
+
+ // Clear any existing values
+ if(browserList != NULL)
+ {
+ free(browserList);
+ browserList = NULL;
+ }
+ // set aside space for 1 entry
+ browserList = (BROWSERENTRY *)malloc(sizeof(BROWSERENTRY));
+ memset(browserList, 0, sizeof(BROWSERENTRY));
+}
+
+/****************************************************************************
+ * UpdateDirName()
+ * Update curent directory name for file browser
+ ***************************************************************************/
+int UpdateDirName()
+{
+ int size=0;
+ char * test;
+ char temp[1024];
+
+ /* current directory doesn't change */
+ if (strcmp(browserList[browser.selIndex].filename,".") == 0)
+ {
+ return 0;
+ }
+ /* go up to parent directory */
+ else if (strcmp(browserList[browser.selIndex].filename,"..") == 0)
+ {
+ /* determine last subdirectory namelength */
+ sprintf(temp,"%s",browser.dir);
+ test = strtok(temp,"/");
+ while (test != NULL)
+ {
+ size = strlen(test);
+ test = strtok(NULL,"/");
+ }
+
+ /* remove last subdirectory name */
+ size = strlen(browser.dir) - size - 1;
+ browser.dir[size] = 0;
+
+ return 1;
+ }
+ /* Open a directory */
+ else
+ {
+ /* test new directory namelength */
+ if ((strlen(browser.dir)+1+strlen(browserList[browser.selIndex].filename)) < MAXPATHLEN)
+ {
+ /* update current directory name */
+ sprintf(browser.dir, "%s/%s",browser.dir, browserList[browser.selIndex].filename);
+ return 1;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+}
+
+/****************************************************************************
+ * FileSortCallback
+ *
+ * Quick sort callback to sort file entries with the following order:
+ * .
+ * ..
+ *
+ *
+ ***************************************************************************/
+int FileSortCallback(const void *f1, const void *f2)
+{
+ /* Special case for implicit directories */
+ if(((BROWSERENTRY *)f1)->filename[0] == '.' || ((BROWSERENTRY *)f2)->filename[0] == '.')
+ {
+ if(strcmp(((BROWSERENTRY *)f1)->filename, ".") == 0) { return -1; }
+ if(strcmp(((BROWSERENTRY *)f2)->filename, ".") == 0) { return 1; }
+ if(strcmp(((BROWSERENTRY *)f1)->filename, "..") == 0) { return -1; }
+ if(strcmp(((BROWSERENTRY *)f2)->filename, "..") == 0) { return 1; }
+ }
+
+ /* If one is a file and one is a directory the directory is first. */
+ if(((BROWSERENTRY *)f1)->isdir && !(((BROWSERENTRY *)f2)->isdir)) return -1;
+ if(!(((BROWSERENTRY *)f1)->isdir) && ((BROWSERENTRY *)f2)->isdir) return 1;
+
+ return stricmp(((BROWSERENTRY *)f1)->filename, ((BROWSERENTRY *)f2)->filename);
+}
+
+/***************************************************************************
+ * Browse subdirectories
+ **************************************************************************/
+int
+ParseDirectory()
+{
+ DIR_ITER *dir = NULL;
+ char fulldir[MAXPATHLEN];
+ char filename[MAXPATHLEN];
+ struct stat filestat;
+
+ // reset browser
+ ResetBrowser();
+
+ // open the directory
+ sprintf(fulldir, "%s%s", browser.rootdir, browser.dir); // add currentDevice to path
+ dir = diropen(fulldir);
+
+ // if we can't open the dir, try opening the root dir
+ if (dir == NULL)
+ {
+ sprintf(browser.dir,"/");
+ dir = diropen(browser.rootdir);
+ if (dir == NULL)
+ {
+ return -1;
+ }
+ }
+
+ // index files/folders
+ int entryNum = 0;
+
+ while(dirnext(dir,filename,&filestat) == 0)
+ {
+ if(strcmp(filename,".") != 0)
+ {
+ BROWSERENTRY * newBrowserList = (BROWSERENTRY *)realloc(browserList, (entryNum+1) * sizeof(BROWSERENTRY));
+
+ if(!newBrowserList) // failed to allocate required memory
+ {
+ ResetBrowser();
+ entryNum = -1;
+ break;
+ }
+ else
+ {
+ browserList = newBrowserList;
+ }
+ memset(&(browserList[entryNum]), 0, sizeof(BROWSERENTRY)); // clear the new entry
+
+ strncpy(browserList[entryNum].filename, filename, MAXJOLIET);
+
+ if(strcmp(filename,"..") == 0)
+ {
+ sprintf(browserList[entryNum].displayname, "..");
+ }
+ else
+ {
+ strcpy(browserList[entryNum].displayname, filename); // crop name for display
+ }
+
+ browserList[entryNum].length = filestat.st_size;
+ browserList[entryNum].isdir = (filestat.st_mode & _IFDIR) == 0 ? 0 : 1; // flag this as a dir
+
+ entryNum++;
+ }
+ }
+
+ // close directory
+ dirclose(dir);
+
+ // Sort the file list
+ qsort(browserList, entryNum, sizeof(BROWSERENTRY), FileSortCallback);
+
+ browser.numEntries = entryNum;
+ return entryNum;
+}
+
+/****************************************************************************
+ * BrowserChangeFolder
+ *
+ * Update current directory and set new entry list if directory has changed
+ ***************************************************************************/
+int BrowserChangeFolder()
+{
+ if(!UpdateDirName())
+ return -1;
+
+ ParseDirectory();
+
+ return browser.numEntries;
+}
+
+/****************************************************************************
+ * BrowseDevice
+ * Displays a list of files on the selected device
+ ***************************************************************************/
+int BrowseDevice(int device)
+{
+ sprintf(browser.dir, "/");
+ switch(device)
+ {
+ case SD:
+ sprintf(browser.rootdir, "SD:");
+ break;
+ case USB:
+ sprintf(browser.rootdir, "USB:");
+ break;
+ }
+ ParseDirectory(); // Parse root directory
+ return browser.numEntries;
+}
diff --git a/source/filebrowser.h b/source/filebrowser.h
new file mode 100644
index 00000000..c4357047
--- /dev/null
+++ b/source/filebrowser.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * libwiigui Template
+ * Tantric 2009
+ *
+ * modified by dimok
+ *
+ * filebrowser.h
+ *
+ * Generic file routines - reading, writing, browsing
+ ****************************************************************************/
+
+#ifndef _FILEBROWSER_H_
+#define _FILEBROWSER_H_
+
+#include
+#include
+
+#define MAXJOLIET 255
+#define MAXDISPLAY MAXPATHLEN
+
+
+enum {
+ SD,
+ USB
+};
+
+typedef struct
+{
+ char dir[MAXPATHLEN]; // directory path of browserList
+ char rootdir[10]; // directory path of browserList
+ int numEntries; // # of entries in browserList
+ int selIndex; // currently selected index of browserList
+ int pageIndex; // starting index of browserList page display
+} BROWSERINFO;
+
+typedef struct
+{
+ u64 offset; // DVD offset
+ u64 length; // file length in 64 bytes for sizes higher than 4GB
+ char isdir; // 0 - file, 1 - directory
+ char filename[MAXJOLIET + 1]; // full filename
+ char displayname[MAXDISPLAY + 1]; // name for browser display
+} BROWSERENTRY;
+
+extern BROWSERINFO browser;
+extern BROWSERENTRY * browserList;
+
+int UpdateDirName();
+int FileSortCallback(const void *f1, const void *f2);
+void ResetBrowser();
+int ParseDirectory();
+int BrowserChangeFolder();
+int BrowseDevice(int device);
+
+#endif
diff --git a/source/filelist.h b/source/filelist.h
index 761a8efc..54f19368 100644
--- a/source/filelist.h
+++ b/source/filelist.h
@@ -101,6 +101,18 @@ extern const u32 bg_options_settings_png_size;
extern const u8 settings_background_png[];
extern const u32 settings_background_png_size;
+extern const u8 bg_browser_png[];
+extern const u32 bg_browser_png_size;
+
+extern const u8 folder_png[];
+extern const u32 folder_png_size;
+
+extern const u8 bg_browser_selection_png[];
+extern const u32 bg_browser_selection_png_size;
+
+extern const u8 addressbar_textbox_png[];
+extern const u32 addressbar_textbox_png_size;
+
extern const u8 browser_png[];
extern const u32 browser_png_size;
@@ -315,7 +327,7 @@ extern const u8 Wiimote1_png[];
extern const u32 Wiimote1_png_size;
extern const u8 Wiimote2_png[];
-extern const u32 Wiimote2_png_size;
+extern const u32 Wiimote2_png_size;
extern const u8 wifi1_png[];
extern const u32 wifi1_png_size;
diff --git a/source/getrev.c b/source/getrev.c
new file mode 100644
index 00000000..3c461f77
--- /dev/null
+++ b/source/getrev.c
@@ -0,0 +1,7 @@
+#include "svnrev.h"
+
+char *GetRev() {
+
+ return SVN_REV;
+
+}
diff --git a/source/getrev.h b/source/getrev.h
new file mode 100644
index 00000000..6138424b
--- /dev/null
+++ b/source/getrev.h
@@ -0,0 +1,14 @@
+#ifndef GETREV_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+char *GetRev();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/source/images/addressbar_textbox.png b/source/images/addressbar_textbox.png
new file mode 100644
index 00000000..856be766
Binary files /dev/null and b/source/images/addressbar_textbox.png differ
diff --git a/source/images/bg_browser.png b/source/images/bg_browser.png
new file mode 100644
index 00000000..f7796934
Binary files /dev/null and b/source/images/bg_browser.png differ
diff --git a/source/images/bg_browser_selection.png b/source/images/bg_browser_selection.png
new file mode 100644
index 00000000..54e7d9d0
Binary files /dev/null and b/source/images/bg_browser_selection.png differ
diff --git a/source/images/folder.png b/source/images/folder.png
new file mode 100644
index 00000000..269b5ca8
Binary files /dev/null and b/source/images/folder.png differ
diff --git a/source/libwiigui/gui.h b/source/libwiigui/gui.h
index 0e53a304..d88dda81 100644
--- a/source/libwiigui/gui.h
+++ b/source/libwiigui/gui.h
@@ -232,6 +232,9 @@ class GuiElement
//!Set the element's parent
//!\param e Pointer to parent element
void SetParent(GuiElement * e);
+ //!Gets the element's parent
+ //!\return Pointer to parent element
+ GuiElement * GetParent();
//!Gets the current leftmost coordinate of the element
//!Considers horizontal alignment, x offset, width, and parent element's GetLeft() / GetWidth() values
//!\return left coordinate
@@ -1029,4 +1032,52 @@ class GuiOptionBrowser : public GuiElement
GuiTrigger * trigB;
GuiTrigger * trigHeldA;
};
+
+//!Display a list of files
+class GuiFileBrowser : public GuiElement
+{
+ public:
+ GuiFileBrowser(int w, int h);
+ ~GuiFileBrowser();
+ void DisableTriggerUpdate(bool set);
+ void ResetState();
+ void SetFocus(int f);
+ void Draw();
+ void TriggerUpdate();
+ void Update(GuiTrigger * t);
+ GuiButton * fileList[PAGESIZE];
+ protected:
+ int selectedItem;
+ bool listChanged;
+ bool triggerdisabled;
+
+ GuiText * fileListText[PAGESIZE];
+ GuiText * fileListTextOver[PAGESIZE];
+ GuiImage * fileListBg[PAGESIZE];
+ GuiImage * fileListFolder[PAGESIZE];
+
+ GuiButton * arrowUpBtn;
+ GuiButton * arrowDownBtn;
+ GuiButton * scrollbarBoxBtn;
+
+ GuiImage * bgFileSelectionImg;
+ GuiImage * scrollbarImg;
+ GuiImage * arrowDownImg;
+ GuiImage * arrowUpImg;
+ GuiImage * scrollbarBoxImg;
+
+ GuiImageData * bgFileSelection;
+ GuiImageData * bgFileSelectionEntry;
+ GuiImageData * fileFolder;
+ GuiImageData * scrollbar;
+ GuiImageData * arrowDown;
+ GuiImageData * arrowUp;
+ GuiImageData * scrollbarBox;
+
+ GuiSound * btnSoundOver;
+ GuiSound * btnSoundClick;
+ GuiTrigger * trigA;
+ GuiTrigger * trigHeldA;
+};
+
#endif
diff --git a/source/libwiigui/gui_element.cpp b/source/libwiigui/gui_element.cpp
index 6b53f277..0fa825c7 100644
--- a/source/libwiigui/gui_element.cpp
+++ b/source/libwiigui/gui_element.cpp
@@ -80,6 +80,11 @@ void GuiElement::SetParent(GuiElement * e)
LOCK(this);
parentElement = e;
}
+
+GuiElement * GuiElement::GetParent()
+{
+ return parentElement;
+}
/**
* Get the left position of the GuiElement.
* @see SetLeft()
diff --git a/source/libwiigui/gui_filebrowser.cpp b/source/libwiigui/gui_filebrowser.cpp
new file mode 100644
index 00000000..c7986b0e
--- /dev/null
+++ b/source/libwiigui/gui_filebrowser.cpp
@@ -0,0 +1,402 @@
+/****************************************************************************
+ * libwiigui
+ *
+ * Tantric 2009
+ *
+ * gui_filebrowser.cpp
+ *
+ * GUI class definitions
+ ***************************************************************************/
+
+#include "gui.h"
+#include "filebrowser.h"
+
+#define FILEBROWSERSIZE 8
+/**
+ * Constructor for the GuiFileBrowser class.
+ */
+GuiFileBrowser::GuiFileBrowser(int w, int h)
+{
+ width = w;
+ height = h;
+ selectedItem = 0;
+ selectable = true;
+ listChanged = true; // trigger an initial list update
+ triggerdisabled = false; // trigger disable
+ focus = 1; // allow focus
+
+ trigA = new GuiTrigger;
+ trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
+
+ trigHeldA = new GuiTrigger;
+ trigHeldA->SetHeldTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
+
+ btnSoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, SOUND_PCM);
+ btnSoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, SOUND_PCM);
+
+ bgFileSelection = new GuiImageData(bg_browser_png);
+ bgFileSelectionImg = new GuiImage(bgFileSelection);
+ bgFileSelectionImg->SetParent(this);
+ bgFileSelectionImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
+
+ bgFileSelectionEntry = new GuiImageData(bg_browser_selection_png);
+ fileFolder = new GuiImageData(folder_png);
+
+ scrollbar = new GuiImageData(scrollbar_png);
+ scrollbarImg = new GuiImage(scrollbar);
+ scrollbarImg->SetParent(this);
+ scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
+ scrollbarImg->SetPosition(0, 30);
+
+ arrowDown = new GuiImageData(scrollbar_arrowdown_png);
+ arrowDownImg = new GuiImage(arrowDown);
+ arrowUp = new GuiImageData(scrollbar_arrowup_png);
+ arrowUpImg = new GuiImage(arrowUp);
+ scrollbarBox = new GuiImageData(scrollbar_box_png);
+ scrollbarBoxImg = new GuiImage(scrollbarBox);
+
+ arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight());
+ arrowUpBtn->SetParent(this);
+ arrowUpBtn->SetImage(arrowUpImg);
+ arrowUpBtn->SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
+ arrowUpBtn->SetSelectable(false);
+ arrowUpBtn->SetClickable(false);
+ arrowUpBtn->SetHoldable(true);
+ arrowUpBtn->SetTrigger(trigHeldA);
+ arrowUpBtn->SetSoundOver(btnSoundOver);
+ arrowUpBtn->SetSoundClick(btnSoundClick);
+
+ arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight());
+ arrowDownBtn->SetParent(this);
+ arrowDownBtn->SetImage(arrowDownImg);
+ arrowDownBtn->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
+ arrowDownBtn->SetSelectable(false);
+ arrowDownBtn->SetClickable(false);
+ arrowDownBtn->SetHoldable(true);
+ arrowDownBtn->SetTrigger(trigHeldA);
+ arrowDownBtn->SetSoundOver(btnSoundOver);
+ arrowDownBtn->SetSoundClick(btnSoundClick);
+
+ scrollbarBoxBtn = new GuiButton(scrollbarBoxImg->GetWidth(), scrollbarBoxImg->GetHeight());
+ scrollbarBoxBtn->SetParent(this);
+ scrollbarBoxBtn->SetImage(scrollbarBoxImg);
+ scrollbarBoxBtn->SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
+ scrollbarBoxBtn->SetMinY(0);
+ scrollbarBoxBtn->SetMaxY(136);
+ scrollbarBoxBtn->SetSelectable(false);
+ scrollbarBoxBtn->SetClickable(false);
+ scrollbarBoxBtn->SetHoldable(true);
+ scrollbarBoxBtn->SetTrigger(trigHeldA);
+
+ for(int i=0; iSetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
+ fileListText[i]->SetPosition(5,0);
+ fileListText[i]->SetMaxWidth(bgFileSelectionImg->GetWidth() - (arrowDownImg->GetWidth()+20), GuiText::DOTTED);
+
+ fileListTextOver[i] = new GuiText(NULL,20, (GXColor){0, 0, 0, 0xff});
+ fileListTextOver[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
+ fileListTextOver[i]->SetPosition(5,0);
+ fileListTextOver[i]->SetMaxWidth(bgFileSelectionImg->GetWidth() - (arrowDownImg->GetWidth()+20), GuiText::SCROLL);
+
+ fileListBg[i] = new GuiImage(bgFileSelectionEntry);
+ fileListFolder[i] = new GuiImage(fileFolder);
+
+ fileList[i] = new GuiButton(512,30);
+ fileList[i]->SetParent(this);
+ fileList[i]->SetLabel(fileListText[i]);
+ fileList[i]->SetLabelOver(fileListTextOver[i]);
+ fileList[i]->SetImageOver(fileListBg[i]);
+ fileList[i]->SetPosition(2,30*i+3);
+ fileList[i]->SetTrigger(trigA);
+ fileList[i]->SetRumble(false);
+ fileList[i]->SetSoundClick(btnSoundClick);
+ }
+}
+
+/**
+ * Destructor for the GuiFileBrowser class.
+ */
+GuiFileBrowser::~GuiFileBrowser()
+{
+ delete arrowUpBtn;
+ delete arrowDownBtn;
+ delete scrollbarBoxBtn;
+
+ delete bgFileSelectionImg;
+ delete scrollbarImg;
+ delete arrowDownImg;
+ delete arrowUpImg;
+ delete scrollbarBoxImg;
+
+ delete bgFileSelection;
+ delete bgFileSelectionEntry;
+ delete fileFolder;
+ delete scrollbar;
+ delete arrowDown;
+ delete arrowUp;
+ delete scrollbarBox;
+
+ delete btnSoundOver;
+ delete btnSoundClick;
+ delete trigHeldA;
+ delete trigA;
+
+ for(int i=0; iResetState();
+
+ if(f == 1)
+ fileList[selectedItem]->SetState(STATE_SELECTED);
+}
+
+void GuiFileBrowser::DisableTriggerUpdate(bool set)
+{
+ triggerdisabled = set;
+}
+
+void GuiFileBrowser::ResetState()
+{
+ state = STATE_DEFAULT;
+ stateChan = -1;
+ selectedItem = 0;
+
+ for(int i=0; iResetState();
+ }
+}
+
+void GuiFileBrowser::TriggerUpdate()
+{
+ listChanged = true;
+}
+
+/**
+ * Draw the button on screen
+ */
+void GuiFileBrowser::Draw()
+{
+ if(!this->IsVisible())
+ return;
+
+ bgFileSelectionImg->Draw();
+
+ for(int i=0; iDraw();
+ }
+
+ scrollbarImg->Draw();
+ arrowUpBtn->Draw();
+ arrowDownBtn->Draw();
+ scrollbarBoxBtn->Draw();
+
+ this->UpdateEffects();
+}
+
+void GuiFileBrowser::Update(GuiTrigger * t)
+{
+ if(state == STATE_DISABLED || !t || triggerdisabled)
+ return;
+
+ int position = 0;
+ int positionWiimote = 0;
+
+ arrowUpBtn->Update(t);
+ arrowDownBtn->Update(t);
+ scrollbarBoxBtn->Update(t);
+
+ // move the file listing to respond to wiimote cursor movement
+ if(scrollbarBoxBtn->GetState() == STATE_HELD &&
+ scrollbarBoxBtn->GetStateChan() == t->chan &&
+ t->wpad.ir.valid &&
+ browser.numEntries > FILEBROWSERSIZE
+ )
+ {
+ scrollbarBoxBtn->SetPosition(0,0);
+ positionWiimote = t->wpad.ir.y - 60 - scrollbarBoxBtn->GetTop();
+
+ if(positionWiimote < scrollbarBoxBtn->GetMinY())
+ positionWiimote = scrollbarBoxBtn->GetMinY();
+ else if(positionWiimote > scrollbarBoxBtn->GetMaxY())
+ positionWiimote = scrollbarBoxBtn->GetMaxY();
+
+ browser.pageIndex = (positionWiimote * browser.numEntries)/136.0 - selectedItem;
+
+ if(browser.pageIndex <= 0)
+ {
+ browser.pageIndex = 0;
+ }
+ else if(browser.pageIndex+FILEBROWSERSIZE >= browser.numEntries)
+ {
+ browser.pageIndex = browser.numEntries-FILEBROWSERSIZE;
+ }
+ listChanged = true;
+ focus = false;
+ }
+
+ if(arrowDownBtn->GetState() == STATE_HELD && arrowDownBtn->GetStateChan() == t->chan)
+ {
+ t->wpad.btns_h |= WPAD_BUTTON_DOWN;
+ if(!this->IsFocused())
+ ((GuiWindow *)this->GetParent())->ChangeFocus(this);
+ }
+ else if(arrowUpBtn->GetState() == STATE_HELD && arrowUpBtn->GetStateChan() == t->chan)
+ {
+ t->wpad.btns_h |= WPAD_BUTTON_UP;
+ if(!this->IsFocused())
+ ((GuiWindow *)this->GetParent())->ChangeFocus(this);
+ }
+
+ // pad/joystick navigation
+ if(!focus)
+ {
+ goto endNavigation; // skip navigation
+ listChanged = false;
+ }
+
+ if(t->Right())
+ {
+ if(browser.pageIndex < browser.numEntries && browser.numEntries > FILEBROWSERSIZE)
+ {
+ browser.pageIndex += FILEBROWSERSIZE;
+ if(browser.pageIndex+FILEBROWSERSIZE >= browser.numEntries)
+ browser.pageIndex = browser.numEntries-FILEBROWSERSIZE;
+ listChanged = true;
+ }
+ }
+ else if(t->Left())
+ {
+ if(browser.pageIndex > 0)
+ {
+ browser.pageIndex -= FILEBROWSERSIZE;
+ if(browser.pageIndex < 0)
+ browser.pageIndex = 0;
+ listChanged = true;
+ }
+ }
+ else if(t->Down())
+ {
+ if(browser.pageIndex + selectedItem + 1 < browser.numEntries)
+ {
+ if(selectedItem == FILEBROWSERSIZE-1)
+ {
+ // move list down by 1
+ browser.pageIndex++;
+ listChanged = true;
+ }
+ else if(fileList[selectedItem+1]->IsVisible())
+ {
+ fileList[selectedItem]->ResetState();
+ fileList[++selectedItem]->SetState(STATE_SELECTED, t->chan);
+ }
+ }
+ }
+ else if(t->Up())
+ {
+ if(selectedItem == 0 && browser.pageIndex + selectedItem > 0)
+ {
+ // move list up by 1
+ browser.pageIndex--;
+ listChanged = true;
+ }
+ else if(selectedItem > 0)
+ {
+ fileList[selectedItem]->ResetState();
+ fileList[--selectedItem]->SetState(STATE_SELECTED, t->chan);
+ }
+ }
+
+ endNavigation:
+
+ for(int i=0; iGetState() == STATE_DISABLED)
+ fileList[i]->SetState(STATE_DEFAULT);
+
+ fileList[i]->SetVisible(true);
+
+ fileListText[i]->SetText(browserList[browser.pageIndex+i].displayname);
+ fileListTextOver[i]->SetText(browserList[browser.pageIndex+i].displayname);
+
+ if(browserList[browser.pageIndex+i].isdir) // directory
+ {
+ fileList[i]->SetIcon(fileListFolder[i]);
+ fileListText[i]->SetPosition(30,0);
+ fileListTextOver[i]->SetPosition(30,0);
+ }
+ else
+ {
+ fileList[i]->SetIcon(NULL);
+ fileListText[i]->SetPosition(10,0);
+ fileListTextOver[i]->SetPosition(10,0);
+ }
+ }
+ else
+ {
+ fileList[i]->SetVisible(false);
+ fileList[i]->SetState(STATE_DISABLED);
+ }
+ }
+
+ if(i != selectedItem && fileList[i]->GetState() == STATE_SELECTED)
+ fileList[i]->ResetState();
+ else if(focus && i == selectedItem && fileList[i]->GetState() == STATE_DEFAULT)
+ fileList[selectedItem]->SetState(STATE_SELECTED, t->chan);
+
+ int currChan = t->chan;
+
+ if(t->wpad.ir.valid && !fileList[i]->IsInside(t->wpad.ir.x, t->wpad.ir.y))
+ t->chan = -1;
+
+ fileList[i]->Update(t);
+ t->chan = currChan;
+
+ if(fileList[i]->GetState() == STATE_SELECTED)
+ {
+ selectedItem = i;
+ browser.selIndex = browser.pageIndex + i;
+ }
+ }
+
+ // update the location of the scroll box based on the position in the file list
+ if(positionWiimote > 0)
+ {
+ position = positionWiimote; // follow wiimote cursor
+ }
+ else
+ {
+ position = 136*(browser.pageIndex + FILEBROWSERSIZE/2.0) / (browser.numEntries*1.0);
+
+ if(browser.pageIndex/(FILEBROWSERSIZE/2.0) < 1)
+ position = 0;
+ else if((browser.pageIndex+FILEBROWSERSIZE)/(FILEBROWSERSIZE*1.0) >= (browser.numEntries)/(FILEBROWSERSIZE*1.0))
+ position = 136;
+ }
+
+ scrollbarBoxBtn->SetPosition(0,position+36);
+
+ listChanged = false;
+
+ if(updateCB)
+ updateCB(this);
+}
diff --git a/source/network/networkops.cpp b/source/network/networkops.cpp
index b6c35564..b89b8beb 100644
--- a/source/network/networkops.cpp
+++ b/source/network/networkops.cpp
@@ -16,7 +16,7 @@
#include "settings/cfg.h"
#include "main.h"
#include "http.h"
-#include "svnrev.h"
+#include "getrev.h"
#define PORT 4299
@@ -271,7 +271,7 @@ int CheckUpdate()
return -1;
int revnumber = 0;
- int currentrev = atoi(SVN_REV);
+ int currentrev = atoi(GetRev());
#ifdef NOTFULLCHANNEL
struct block file = downloadfile("http://www.techjawa.com/usbloadergx/rev.txt");
diff --git a/source/prompts/PromptWindows.cpp b/source/prompts/PromptWindows.cpp
index b241fc3c..35adff89 100644
--- a/source/prompts/PromptWindows.cpp
+++ b/source/prompts/PromptWindows.cpp
@@ -28,7 +28,7 @@
#include "wad/wad.h"
#include "unzip/unzip.h"
#include "zlib.h"
-#include "svnrev.h"
+#include "getrev.h"
/*** Variables that are also used extern ***/
@@ -174,11 +174,11 @@ void WindowCredits()
#ifdef NOTFULLCHANNEL
char SvnRev[30];
- snprintf(SvnRev,sizeof(SvnRev), "Rev%s IOS%u (Rev %u)", SVN_REV, IOS_GetVersion(), IOS_GetRevision());
+ snprintf(SvnRev,sizeof(SvnRev), "Rev%s IOS%u (Rev %u)", GetRev(), IOS_GetVersion(), IOS_GetRevision());
#else
char svnTmp[4];//did this to hide the M after the rev# that is made by altering it
//to be ready to be in a full channel
- snprintf(svnTmp,sizeof(svnTmp), "%s", SVN_REV);
+ snprintf(svnTmp,sizeof(svnTmp), "%s", GetRev());
char SvnRev[30];
snprintf(SvnRev,sizeof(SvnRev), "Rev%sc IOS%u (Rev %u)", svnTmp, IOS_GetVersion(), IOS_GetRevision());
#endif
diff --git a/source/svnrev.h b/source/svnrev.h
new file mode 100644
index 00000000..d4ddf560
--- /dev/null
+++ b/source/svnrev.h
@@ -0,0 +1,4 @@
+#ifndef SVNREV_H
+ #define SVNREV_H
+ #define SVN_REV "643M"
+#endif /* SVNREV_H */
diff --git a/source/testfilebrowser.cpp b/source/testfilebrowser.cpp
new file mode 100644
index 00000000..391c1ccd
--- /dev/null
+++ b/source/testfilebrowser.cpp
@@ -0,0 +1,134 @@
+#include
+#include
+
+#include "language/gettext.h"
+#include "prompts/PromptWindows.h"
+#include "libwiigui/gui.h"
+#include "filebrowser.h"
+#include "menu.h"
+#include "sys.h"
+
+/*** Extern variables ***/
+extern GuiWindow * mainWindow;
+extern u8 shutdown;
+extern u8 reset;
+
+/*** Extern functions ***/
+extern void ResumeGui();
+extern void HaltGui();
+
+/****************************************************************************
+ * MenuBrowseDevice
+ ***************************************************************************/
+int MenuBrowseDevice()
+{
+ int i;
+ char currentdir[50];
+
+ // populate initial directory listing
+ if(BrowseDevice(SD) <= 0)
+ {
+ int choice = WindowPrompt("Error",
+ "Unable to load device.",
+ "Retry",
+ "Change Settings");
+
+ if(choice) {
+ return MENU_DISCLIST;
+ }
+ }
+
+ int menu = MENU_NONE;
+
+ GuiText titleTxt("Browse Files", 28, (GXColor){0, 0, 0, 230});
+ titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
+ titleTxt.SetPosition(70,20);
+
+ GuiTrigger trigA;
+ trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
+ GuiTrigger trigPlus;
+ trigPlus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_PLUS | WPAD_CLASSIC_BUTTON_PLUS, 0);
+ GuiTrigger trigMinus;
+ trigMinus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_MINUS | WPAD_CLASSIC_BUTTON_MINUS, 0);
+
+ GuiFileBrowser fileBrowser(552, 248);
+ fileBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
+ fileBrowser.SetPosition(0, 100);
+
+ GuiImageData btnOutline(button_dialogue_box_png);
+ GuiText ExitBtnTxt("Exit", 24, (GXColor){0, 0, 0, 255});
+ GuiImage ExitBtnImg(&btnOutline);
+ GuiButton ExitBtn(btnOutline.GetWidth(), btnOutline.GetHeight());
+ ExitBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
+ ExitBtn.SetPosition(100, -35);
+ ExitBtn.SetLabel(&ExitBtnTxt);
+ ExitBtn.SetImage(&ExitBtnImg);
+ ExitBtn.SetTrigger(&trigA);
+ ExitBtn.SetEffectGrow();
+
+ GuiImageData Address(addressbar_textbox_png);
+ snprintf(currentdir, sizeof(currentdir), "%s%s", browser.rootdir, browser.dir);
+ GuiText AdressText(currentdir, 20, (GXColor) {0, 0, 0, 255});
+ AdressText.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
+ AdressText.SetPosition(20, 0);
+ AdressText.SetMaxWidth(Address.GetWidth()-40, GuiText::SCROLL);
+ GuiImage AdressbarImg(&Address);
+ GuiButton Adressbar(Address.GetWidth(), Address.GetHeight());
+ Adressbar.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
+ Adressbar.SetPosition(60, fileBrowser.GetTop()-45);
+ Adressbar.SetImage(&AdressbarImg);
+ Adressbar.SetLabel(&AdressText);
+
+ HaltGui();
+ GuiWindow w(screenwidth, screenheight);
+ w.Append(&ExitBtn);
+ w.Append(&titleTxt);
+ w.Append(&fileBrowser);
+ w.Append(&Adressbar);
+ mainWindow->Append(&w);
+ ResumeGui();
+
+ while(menu == MENU_NONE)
+ {
+ VIDEO_WaitVSync();
+
+ if(shutdown == 1)
+ Sys_Shutdown();
+
+ if(reset == 1)
+ Sys_Reboot();
+
+ for(i=0; iGetState() == STATE_CLICKED)
+ {
+ fileBrowser.fileList[i]->ResetState();
+ // check corresponding browser entry
+ if(browserList[browser.selIndex].isdir)
+ {
+ if(BrowserChangeFolder())
+ {
+ fileBrowser.ResetState();
+ fileBrowser.fileList[0]->SetState(STATE_SELECTED);
+ fileBrowser.TriggerUpdate();
+ AdressText.SetTextf("%s%s", browser.rootdir, browser.dir);
+ } else {
+ menu = MENU_DISCLIST;
+ break;
+ }
+ } else {
+ mainWindow->SetState(STATE_DISABLED);
+ mainWindow->SetState(STATE_DEFAULT);
+ }
+ }
+ }
+
+ if(ExitBtn.GetState() == STATE_CLICKED)
+ menu = MENU_DISCLIST;
+ }
+ HaltGui();
+ mainWindow->Remove(&w);
+ ResumeGui();
+
+ return menu;
+}