diff --git a/Makefile b/Makefile index 811f588e..44dc95bf 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80a00 #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -ldb -lfat -lpngu -lpng -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -ltremor -lmxml +LIBS := -lfat -lpngu -lpng -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -ltremor -lmxml #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing # include and lib diff --git a/gui.pnproj b/gui.pnproj index 58a930fe..fdbd730a 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/libwiigui/gui.h b/source/libwiigui/gui.h index ba68869c..0e53a304 100644 --- a/source/libwiigui/gui.h +++ b/source/libwiigui/gui.h @@ -730,6 +730,12 @@ class GuiText : public GuiElement int GetTextWidth(); // not NULL set horizontal scale to 0.75 //added void SetWidescreen(bool w); + void SetNumLines(int n);//! these two are used to set the first line and numLine + void SetFirstLine(int n); + int GetNumLines();//! these return the line variables for this text + int GetFirstLine(); + int GetLineHeight(int n);//! returns the height of the #n of lines including spacing if wrap mode is on + int GetTotalLines(); //!Constantly called to draw the text void Draw(); protected: @@ -745,6 +751,10 @@ class GuiText : public GuiElement GXColor color; //!< Font color FreeTypeGX *font; short widescreen; //added + //!these are default until the text is drawn + int firstLine; //!these are the first line and the number of lines drawn when the text is wrapped + int numLines;//! default is -1 and it means that all lines are drawn + int totalLines; //!this is the total # of lines when in wrap mode }; //!Display, manage, and manipulate tooltips in the GUI. diff --git a/source/libwiigui/gui_text.cpp b/source/libwiigui/gui_text.cpp index 62117012..c6235d8a 100644 --- a/source/libwiigui/gui_text.cpp +++ b/source/libwiigui/gui_text.cpp @@ -37,6 +37,9 @@ GuiText::GuiText(const char * t, int s, GXColor c) scrollDelay = 0; font = NULL; widescreen = 0; //added + firstLine = 1; + numLines = -1; + totalLines = 1; alignmentHor = ALIGN_CENTRE; alignmentVert = ALIGN_MIDDLE; @@ -62,6 +65,9 @@ GuiText::GuiText(const char * t) scrollDelay = 0; font = NULL; widescreen = 0; //added + firstLine = 1; + numLines = -1; + totalLines = 1; alignmentHor = presetAlignmentHor; alignmentVert = presetAlignmentVert; @@ -82,6 +88,43 @@ GuiText::~GuiText() } } +void GuiText::SetNumLines(int n) +{ + numLines = n; +} + +void GuiText::SetFirstLine(int n) +{ + firstLine = n; +} + +int GuiText::GetNumLines() +{ + return numLines; +} + +int GuiText::GetFirstLine() +{ + return firstLine; +} + +int GuiText::GetTotalLines() +{ + return totalLines; +} + +int GuiText::GetLineHeight(int n) +{ + int newSize = size*this->GetScale(); + int lineheight = newSize + 6; + + if (numLines <0) + return totalLines*lineheight+newSize; + + else return numLines*lineheight+newSize; +} + + void GuiText::SetText(const char * t) { LOCK(this); @@ -289,15 +332,36 @@ void GuiText::Draw() ch++; i++; } - + totalLines = linenum; + if(alignmentVert == ALIGN_MIDDLE) voffset = voffset - (lineheight*linenum)/2 + lineheight/2; - for(i=0; i < linenum; i++) - { - (font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset+i*lineheight, tmptext[i], c, style); - delete tmptext[i]; + if (numLines <0){ + for(i=0; i < linenum; i++) + { + (font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset+i*lineheight, tmptext[i], c, style); + delete tmptext[i]; + } } + + //put in for txt verticle txt scrolling + else { + int j; + i=0; + for(j=firstLine-1; j < numLines+firstLine-1; j++) + { + if (jdrawText(this->GetLeft(), this->GetTop()+voffset+i*lineheight, tmptext[j], c, style); + i++; + } + for(i=0; i < linenum; i++) + { + delete tmptext[i]; + } + } + + } else if(wrapMode == GuiText::DOTTED) // text dotted { diff --git a/source/main.cpp b/source/main.cpp index db04567a..dd4c11ab 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -33,8 +33,6 @@ #include "wpad.h" #include "fat.h" -#include - /* Constants */ #define CONSOLE_XCOORD 260 #define CONSOLE_YCOORD 115 @@ -120,8 +118,6 @@ main(int argc, char *argv[]) InitVideo(); // Initialise video InitAudio(); // Initialize audio - DEBUG_Init(GDBSTUB_DEVICE_USB, 1);// for debugging - WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight); diff --git a/source/menu.cpp b/source/menu.cpp index 7c08ae9d..02df1f6f 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -932,6 +932,8 @@ int MenuDiscList() snprintf (IDfull,sizeof(IDfull),"%c%c%c%c%c%c", header->id[0], header->id[1], header->id[2],header->id[3], header->id[4], header->id[5]); choice = showGameInfo(IDfull); gameInfo.ResetState(); + if (choice==2) + homeBtn.SetState(STATE_CLICKED); } if (Settings.gameDisplay==grid){ diff --git a/source/prompts/gameinfo.cpp b/source/prompts/gameinfo.cpp index 680a9379..04fdd341 100644 --- a/source/prompts/gameinfo.cpp +++ b/source/prompts/gameinfo.cpp @@ -15,6 +15,7 @@ #include "wpad.h" #include "fatmounter.h" #include "listfiles.h" +#include "prompts/PromptWindows.h" #include "gameinfo.h" @@ -34,6 +35,9 @@ extern void HaltGui(); ***************************************************************************/ int showGameInfo(char *ID) { + HaltGui();//put this first to try to get rid of the code dump caused by loading this window at the same time as loading images from the SD card + mainWindow->SetState(STATE_DISABLED); + ResumeGui(); //load the xml shit bool databaseopened = true; OpenXMLDatabase(Settings.titlestxt_path, Settings.db_language, Settings.db_JPtoEN, true, false, true); // open file, do not load titles, keep in memory @@ -125,7 +129,7 @@ int showGameInfo(char *ID) GuiWindow txtWindow(350,270); txtWindow.SetAlignment(ALIGN_CENTRE, ALIGN_RIGHT); - txtWindow.SetPosition(85, 50); + txtWindow.SetPosition(95, 55); GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, Settings.sfxvolume); GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, Settings.sfxvolume); @@ -145,7 +149,14 @@ int showGameInfo(char *ID) trigA.SetButtonOnlyTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); GuiTrigger trigB; trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); - + GuiTrigger trigU; + trigU.SetButtonOnlyTrigger(-1, WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP, PAD_BUTTON_UP); + GuiTrigger trigD; + trigD.SetButtonOnlyTrigger(-1, WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN, PAD_BUTTON_DOWN); + GuiTrigger trigH; + trigH.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); + + //buttons for changing between synopsis and other info GuiButton backBtn(0,0); backBtn.SetPosition(-20,-20); backBtn.SetTrigger(&trigB); @@ -156,7 +167,20 @@ int showGameInfo(char *ID) nextBtn.SetTrigger(&trigA); gameinfoWindow.Append(&nextBtn); - char linebuf[1000] = ""; + //buttons for scrolling the synopsis + GuiButton upBtn(0,0); + upBtn.SetPosition(0,0); + upBtn.SetTrigger(&trigU); + + GuiButton dnBtn(0,0); + dnBtn.SetPosition(0,0); + dnBtn.SetTrigger(&trigD); + + GuiButton homeBtn(0,0); + homeBtn.SetPosition(0,0); + homeBtn.SetTrigger(&trigH); + + char linebuf[3000] = ""; char linebuf2[100] = ""; // enable icons for required accessories @@ -577,11 +601,15 @@ int showGameInfo(char *ID) } //synopsis + int pagesize=12; if (strcmp(gameinfo.synopsis,"") != 0) { snprintf(linebuf, sizeof(linebuf), "%s", gameinfo.synopsis); - synopsisTxt = new GuiText(linebuf, 16, (GXColor){0,0,0, 255}); + synopsisTxt = new GuiText(linebuf, 16, (GXColor){0,0,0, 255}); synopsisTxt->SetMaxWidth(350,GuiText::WRAP); synopsisTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); synopsisTxt->SetPosition(0,0); + synopsisTxt->SetNumLines(pagesize); + //synopsisTxt->SetFirstLine(12); + dialogBoxImg11 = new GuiImage(&dialogBox1); dialogBoxImg11->SetAlignment(0,3); dialogBoxImg11->SetPosition(-9,0); @@ -604,6 +632,8 @@ int showGameInfo(char *ID) gameinfoWindow2.Append(dialogBoxImg44); txtWindow.Append(synopsisTxt); + txtWindow.Append(&upBtn); + txtWindow.Append(&dnBtn); coverImg2 = new GuiImage(cover); coverImg2->SetWidescreen(CFG.widescreen); coverImg2->SetPosition(15,30); @@ -623,26 +653,43 @@ int showGameInfo(char *ID) gameinfoWindow.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 100); HaltGui(); - mainWindow->SetState(STATE_DISABLED); + //mainWindow->SetState(STATE_DISABLED); mainWindow->Append(&gameinfoWindow); mainWindow->ChangeFocus(&gameinfoWindow); ResumeGui(); - + while(choice == -1) { + VIDEO_WaitVSync(); + + //u32 buttonshold = ButtonsHold(); if(shutdown == 1) { wiilight(0); Sys_Shutdown(); } - if(reset == 1) + else if(reset == 1) Sys_Reboot(); - if ((backBtn.GetState()==STATE_CLICKED)||(backBtn.GetState()==STATE_HELD)){ - choice=1; + else if ((backBtn.GetState()==STATE_CLICKED)||(backBtn.GetState()==STATE_HELD)){ + if(page==1) + {choice=1; synopsisTxt = NULL; - break; + break;} + else if (page==2) + { + HaltGui(); + //backBtn.SetClickable(true); + gameinfoWindow2.SetVisible(false); + gameinfoWindow.SetVisible(true); + //gameinfoWindow.Append(&backBtn); + //gameinfoWindow.Append(&nextBtn); + //gameinfoWindow.Append(&homeBtn); + mainWindow->Remove(&gameinfoWindow2); + ResumeGui(); + page=1; + } } else if (((nextBtn.GetState()==STATE_CLICKED)||(nextBtn.GetState()==STATE_HELD))&& (strcmp(gameinfo.synopsis,"") != 0)){ @@ -654,8 +701,10 @@ int showGameInfo(char *ID) gameinfoWindow2.SetVisible(true); coverImg->SetPosition(15,30); - backBtn.SetClickable(false); + //backBtn.SetClickable(false); gameinfoWindow2.Append(&nextBtn); + gameinfoWindow2.Append(&backBtn); + gameinfoWindow2.Append(&homeBtn); mainWindow->Append(&gameinfoWindow2); ResumeGui(); page=2; @@ -663,16 +712,60 @@ int showGameInfo(char *ID) else { nextBtn.ResetState(); HaltGui(); - backBtn.SetClickable(true); + //backBtn.SetClickable(true); gameinfoWindow2.SetVisible(false); gameinfoWindow.SetVisible(true); gameinfoWindow.Append(&backBtn); gameinfoWindow.Append(&nextBtn); + gameinfoWindow.Append(&homeBtn); mainWindow->Remove(&gameinfoWindow2); ResumeGui(); page=1; } nextBtn.ResetState(); + + } + else if ((upBtn.GetState()==STATE_CLICKED||upBtn.GetState()==STATE_HELD) && page==2) + { + int l=synopsisTxt->GetFirstLine()>1?synopsisTxt->GetFirstLine()-1:1; + synopsisTxt->SetFirstLine(l); + usleep(60000); + if (!((ButtonsHold() & WPAD_BUTTON_UP)||(ButtonsHold() & PAD_BUTTON_UP))) + upBtn.ResetState(); + } + else if ((dnBtn.GetState()==STATE_CLICKED||dnBtn.GetState()==STATE_HELD) && page==2) + { + int l=0; + if(synopsisTxt->GetTotalLines()>pagesize) + l=synopsisTxt->GetFirstLine()+1; + + if (l>synopsisTxt->GetTotalLines()+1-pagesize) + l=synopsisTxt->GetTotalLines()+1-pagesize; + + synopsisTxt->SetFirstLine(l); + usleep(60000); + if (!((ButtonsHold() & WPAD_BUTTON_DOWN)||(ButtonsHold() & PAD_BUTTON_DOWN))) + dnBtn.ResetState(); + } + //took this out cause it doesnt act right when not called from the main window and I don't feel like fixing it right now + else if (homeBtn.GetState()==STATE_CLICKED) + { + if(page==1) + {choice=2; + synopsisTxt = NULL; + break;} + else if (page==2) + { + HaltGui(); + gameinfoWindow2.SetVisible(false); + gameinfoWindow.SetVisible(true); + //gameinfoWindow.Append(&backBtn); + //gameinfoWindow.Append(&nextBtn); + //gameinfoWindow.Append(&homeBtn); + mainWindow->Remove(&gameinfoWindow2); + ResumeGui(); + page=1; + } } } if (page==1){ diff --git a/source/xml/xml.h b/source/xml/xml.h index 5424d73d..e6a84ac9 100644 --- a/source/xml/xml.h +++ b/source/xml/xml.h @@ -22,9 +22,9 @@ struct gameXMLinfo char version[50]; char region[7]; char title[100]; - char synopsis[2000]; + char synopsis[3000]; char title_EN[100]; - char synopsis_EN[2000]; + char synopsis_EN[3000]; char locales[XML_ELEMMAX+1][3]; int localeCnt; char developer[75];