00001
00031 #ifndef LIBWIIGUI_H
00032 #define LIBWIIGUI_H
00033
00034 #include <gccore.h>
00035 #include <malloc.h>
00036 #include <stdlib.h>
00037 #include <string.h>
00038 #include <vector>
00039 #include <math.h>
00040 #include <asndlib.h>
00041 #include <wiiuse/wpad.h>
00042 #include "pngu/pngu.h"
00043 #include "FreeTypeGX.h"
00044 #include "video.h"
00045 #include "filelist.h"
00046 #include "input.h"
00047 #include "oggplayer.h"
00048
00049 extern FreeTypeGX *fontSystem;
00050
00051 #define SCROLL_INITIAL_DELAY 20
00052 #define SCROLL_LOOP_DELAY 3
00053 #define PAGESIZE 8
00054 #define MAX_OPTIONS 30
00055
00056 typedef void (*UpdateCallback)(void * e);
00057
00058 enum
00059 {
00060 ALIGN_LEFT,
00061 ALIGN_RIGHT,
00062 ALIGN_CENTRE,
00063 ALIGN_TOP,
00064 ALIGN_BOTTOM,
00065 ALIGN_MIDDLE
00066 };
00067
00068 enum
00069 {
00070 STATE_DEFAULT,
00071 STATE_SELECTED,
00072 STATE_CLICKED,
00073 STATE_HELD,
00074 STATE_DISABLED
00075 };
00076
00077 enum
00078 {
00079 SOUND_PCM,
00080 SOUND_OGG
00081 };
00082
00083 enum
00084 {
00085 IMAGE_TEXTURE,
00086 IMAGE_COLOR,
00087 IMAGE_DATA
00088 };
00089
00090 enum
00091 {
00092 TRIGGER_SIMPLE,
00093 TRIGGER_HELD,
00094 TRIGGER_BUTTON_ONLY,
00095 TRIGGER_BUTTON_ONLY_IN_FOCUS
00096 };
00097
00098 typedef struct _paddata {
00099 u16 btns_d;
00100 u16 btns_u;
00101 u16 btns_h;
00102 s8 stickX;
00103 s8 stickY;
00104 s8 substickX;
00105 s8 substickY;
00106 u8 triggerL;
00107 u8 triggerR;
00108 } PADData;
00109
00110 #define EFFECT_SLIDE_TOP 1
00111 #define EFFECT_SLIDE_BOTTOM 2
00112 #define EFFECT_SLIDE_RIGHT 4
00113 #define EFFECT_SLIDE_LEFT 8
00114 #define EFFECT_SLIDE_IN 16
00115 #define EFFECT_SLIDE_OUT 32
00116 #define EFFECT_FADE 64
00117 #define EFFECT_SCALE 128
00118 #define EFFECT_COLOR_TRANSITION 256
00119
00121 class GuiSound
00122 {
00123 public:
00128 GuiSound(const u8 * s, int l, int t);
00130 ~GuiSound();
00132 void Play();
00134 void Stop();
00136 void Pause();
00138 void Resume();
00141 bool IsPlaying();
00144 void SetVolume(int v);
00147 void SetLoop(bool l);
00148 protected:
00149 const u8 * sound;
00150 int type;
00151 s32 length;
00152 s32 voice;
00153 s32 volume;
00154 bool loop;
00155 };
00156
00158 class GuiTrigger
00159 {
00160 public:
00162 GuiTrigger();
00164 ~GuiTrigger();
00169 void SetSimpleTrigger(s32 ch, u32 wiibtns, u16 gcbtns);
00174 void SetHeldTrigger(s32 ch, u32 wiibtns, u16 gcbtns);
00179 void SetButtonOnlyTrigger(s32 ch, u32 wiibtns, u16 gcbtns);
00184 void SetButtonOnlyInFocusTrigger(s32 ch, u32 wiibtns, u16 gcbtns);
00189 s8 WPAD_Stick(u8 right, int axis);
00192 bool Left();
00195 bool Right();
00198 bool Up();
00201 bool Down();
00202
00203 u8 type;
00204 s32 chan;
00205 WPADData wpad;
00206 PADData pad;
00207 };
00208
00209 extern GuiTrigger userInput[4];
00210
00212 class GuiElement
00213 {
00214 public:
00216 GuiElement();
00218 ~GuiElement();
00221 void SetParent(GuiElement * e);
00225 int GetLeft();
00229 int GetTop();
00232 void SetMinY(int y);
00235 int GetMinY();
00238 void SetMaxY(int y);
00241 int GetMaxY();
00244 void SetMinX(int x);
00247 int GetMinX();
00250 void SetMaxX(int x);
00253 int GetMaxX();
00256 int GetWidth();
00259 int GetHeight();
00263 void SetSize(int w, int h);
00266 bool IsVisible();
00269 bool IsSelectable();
00272 bool IsClickable();
00275 bool IsHoldable();
00278 void SetSelectable(bool s);
00281 void SetClickable(bool c);
00284 void SetHoldable(bool d);
00287 int GetState();
00290 int GetStateChan();
00293 void SetAlpha(int a);
00297 int GetAlpha();
00300 void SetScale(float s);
00303 float GetScale();
00306 void SetTrigger(GuiTrigger * t);
00310 void SetTrigger(u8 i, GuiTrigger * t);
00313 bool Rumble();
00316 void SetRumble(bool r);
00321 void SetEffect(int e, int a, int t=0);
00326 void SetEffectOnOver(int e, int a, int t=0);
00328 void SetEffectGrow();
00331 int GetEffect();
00336 bool IsInside(int x, int y);
00340 void SetPosition(int x, int y);
00343 void UpdateEffects();
00346 void SetUpdateCallback(UpdateCallback u);
00349 int IsFocused();
00352 virtual void SetVisible(bool v);
00355 virtual void SetFocus(int f);
00359 virtual void SetState(int s, int c = -1);
00361 virtual void ResetState();
00364 virtual int GetSelected();
00368 virtual void SetAlignment(int hor, int vert);
00371 virtual void Update(GuiTrigger * t);
00373 virtual void Draw();
00374 protected:
00375 bool visible;
00376 int focus;
00377 int width;
00378 int height;
00379 int xoffset;
00380 int yoffset;
00381 int ymin;
00382 int ymax;
00383 int xmin;
00384 int xmax;
00385 int xoffsetDyn;
00386 int yoffsetDyn;
00387 int alpha;
00388 f32 scale;
00389 int alphaDyn;
00390 f32 scaleDyn;
00391 bool rumble;
00392 int effects;
00393 int effectAmount;
00394 int effectTarget;
00395 int effectsOver;
00396 int effectAmountOver;
00397 int effectTargetOver;
00398 int alignmentHor;
00399 int alignmentVert;
00400 int state;
00401 int stateChan;
00402 bool selectable;
00403 bool clickable;
00404 bool holdable;
00405 GuiTrigger * trigger[2];
00406 GuiElement * parentElement;
00407 UpdateCallback updateCB;
00408 };
00409
00411 class GuiWindow : public GuiElement
00412 {
00413 public:
00415 GuiWindow();
00419 GuiWindow(int w, int h);
00421 ~GuiWindow();
00424 void Append(GuiElement* e);
00428 void Insert(GuiElement* e, u32 i);
00431 void Remove(GuiElement* e);
00433 void RemoveAll();
00437 GuiElement* GetGuiElementAt(u32 index) const;
00440 u32 GetSize();
00443 void SetVisible(bool v);
00445 void ResetState();
00448 void SetState(int s);
00451 int GetSelected();
00454 void SetFocus(int f);
00458 void ChangeFocus(GuiElement * e);
00464 void ToggleFocus(GuiTrigger * t);
00467 void MoveSelectionHor(int d);
00470 void MoveSelectionVert(int d);
00472 void Draw();
00476 void Update(GuiTrigger * t);
00477 protected:
00478 std::vector<GuiElement*> _elements;
00479 };
00480
00482 class GuiImageData
00483 {
00484 public:
00488 GuiImageData(const u8 * i);
00490 ~GuiImageData();
00493 u8 * GetImage();
00496 int GetWidth();
00499 int GetHeight();
00500 protected:
00501 u8 * data;
00502 int height;
00503 int width;
00504 };
00505
00507 class GuiImage : public GuiElement
00508 {
00509 public:
00511 GuiImage();
00514 GuiImage(GuiImageData * img);
00520 GuiImage(u8 * img, int w, int h);
00526 GuiImage(int w, int h, GXColor c);
00528 ~GuiImage();
00531 void SetAngle(float a);
00534 void SetTile(int t);
00536 void Draw();
00539 u8 * GetImage();
00542 void SetImage(GuiImageData * img);
00547 void SetImage(u8 * img, int w, int h);
00551 GXColor GetPixel(int x, int y);
00556 void SetPixel(int x, int y, GXColor color);
00560 void ColorStripe(int s);
00564 void SetStripe(int s);
00565 protected:
00566 int imgType;
00567 u8 * image;
00568 f32 imageangle;
00569 int tile;
00570 int stripe;
00571 };
00572
00574 class GuiText : public GuiElement
00575 {
00576 public:
00581 GuiText(const char * t, int s, GXColor c);
00585 GuiText(const char * t);
00587 ~GuiText();
00590 void SetText(const char * t);
00599 void SetPresets(int sz, GXColor c, int w, u16 s, int h, int v);
00602 void SetFontSize(int s);
00606 void SetMaxWidth(int w);
00609 void SetColor(GXColor c);
00612 void SetStyle(u16 s);
00616 void SetAlignment(int hor, int vert);
00618 void Draw();
00619 protected:
00620 wchar_t* text;
00621 int size;
00622 int maxWidth;
00623 u16 style;
00624 GXColor color;
00625 };
00626
00628 class GuiButton : public GuiElement
00629 {
00630 public:
00634 GuiButton(int w, int h);
00636 ~GuiButton();
00639 void SetImage(GuiImage* i);
00642 void SetImageOver(GuiImage* i);
00645 void SetImageHold(GuiImage* i);
00648 void SetImageClick(GuiImage* i);
00651 void SetIcon(GuiImage* i);
00654 void SetIconOver(GuiImage* i);
00657 void SetIconHold(GuiImage* i);
00660 void SetIconClick(GuiImage* i);
00664 void SetLabel(GuiText* t, int n = 0);
00668 void SetLabelOver(GuiText* t, int n = 0);
00672 void SetLabelHold(GuiText* t, int n = 0);
00676 void SetLabelClick(GuiText* t, int n = 0);
00679 void SetSoundOver(GuiSound * s);
00682 void SetSoundHold(GuiSound * s);
00685 void SetSoundClick(GuiSound * s);
00687 void Draw();
00690 void Update(GuiTrigger * t);
00691 protected:
00692 GuiImage * image;
00693 GuiImage * imageOver;
00694 GuiImage * imageHold;
00695 GuiImage * imageClick;
00696 GuiImage * icon;
00697 GuiImage * iconOver;
00698 GuiImage * iconHold;
00699 GuiImage * iconClick;
00700 GuiText * label[3];
00701 GuiText * labelOver[3];
00702 GuiText * labelHold[3];
00703 GuiText * labelClick[3];
00704 GuiSound * soundOver;
00705 GuiSound * soundHold;
00706 GuiSound * soundClick;
00707 };
00708
00709 typedef struct _keytype {
00710 char ch, chShift;
00711 } Key;
00712
00714 class GuiKeyboard : public GuiWindow
00715 {
00716 public:
00717 GuiKeyboard(char * t, u32 m);
00718 ~GuiKeyboard();
00719 void Update(GuiTrigger * t);
00720 char kbtextstr[256];
00721 protected:
00722 u32 kbtextmaxlen;
00723 Key keys[4][11];
00724 int shift;
00725 int caps;
00726 GuiText * kbText;
00727 GuiImage * keyTextboxImg;
00728 GuiText * keyCapsText;
00729 GuiImage * keyCapsImg;
00730 GuiImage * keyCapsOverImg;
00731 GuiButton * keyCaps;
00732 GuiText * keyShiftText;
00733 GuiImage * keyShiftImg;
00734 GuiImage * keyShiftOverImg;
00735 GuiButton * keyShift;
00736 GuiText * keyBackText;
00737 GuiImage * keyBackImg;
00738 GuiImage * keyBackOverImg;
00739 GuiButton * keyBack;
00740 GuiImage * keySpaceImg;
00741 GuiImage * keySpaceOverImg;
00742 GuiButton * keySpace;
00743 GuiButton * keyBtn[4][11];
00744 GuiImage * keyImg[4][11];
00745 GuiImage * keyImgOver[4][11];
00746 GuiText * keyTxt[4][11];
00747 GuiImageData * keyTextbox;
00748 GuiImageData * key;
00749 GuiImageData * keyOver;
00750 GuiImageData * keyMedium;
00751 GuiImageData * keyMediumOver;
00752 GuiImageData * keyLarge;
00753 GuiImageData * keyLargeOver;
00754 GuiSound * keySoundOver;
00755 GuiSound * keySoundClick;
00756 GuiTrigger * trigA;
00757 };
00758
00759 typedef struct _optionlist {
00760 int length;
00761 char name[MAX_OPTIONS][150];
00762 char value[MAX_OPTIONS][150];
00763 } OptionList;
00764
00766 class GuiOptionBrowser : public GuiElement
00767 {
00768 public:
00769 GuiOptionBrowser(int w, int h, OptionList * l);
00770 ~GuiOptionBrowser();
00771 void SetCol2Position(int x);
00772 int FindMenuItem(int c, int d);
00773 int GetClickedOption();
00774 void ResetState();
00775 void SetFocus(int f);
00776 void Draw();
00777 void Update(GuiTrigger * t);
00778 GuiText * optionVal[PAGESIZE];
00779 protected:
00780 int selectedItem;
00781 int listOffset;
00782
00783 OptionList * options;
00784 int optionIndex[PAGESIZE];
00785 GuiButton * optionBtn[PAGESIZE];
00786 GuiText * optionTxt[PAGESIZE];
00787 GuiImage * optionBg[PAGESIZE];
00788
00789 GuiButton * arrowUpBtn;
00790 GuiButton * arrowDownBtn;
00791 GuiButton * scrollbarBoxBtn;
00792
00793 GuiImage * bgOptionsImg;
00794 GuiImage * scrollbarImg;
00795 GuiImage * arrowDownImg;
00796 GuiImage * arrowDownOverImg;
00797 GuiImage * arrowUpImg;
00798 GuiImage * arrowUpOverImg;
00799 GuiImage * scrollbarBoxImg;
00800 GuiImage * scrollbarBoxOverImg;
00801
00802 GuiImageData * bgOptions;
00803 GuiImageData * bgOptionsEntry;
00804 GuiImageData * scrollbar;
00805 GuiImageData * arrowDown;
00806 GuiImageData * arrowDownOver;
00807 GuiImageData * arrowUp;
00808 GuiImageData * arrowUpOver;
00809 GuiImageData * scrollbarBox;
00810 GuiImageData * scrollbarBoxOver;
00811
00812 GuiSound * btnSoundOver;
00813 GuiSound * btnSoundClick;
00814 GuiTrigger * trigA;
00815 };
00816 #endif