+class Window; // Forward declaration...
+
+void DrawTransparentBitmap(int16 * screen, uint32 x, uint32 y, uint16 * bitmap, uint8 * alpha = NULL);
+void DrawStringTrans(int16 * screen, uint32 x, uint32 y, uint16 color, uint8 opacity, const char * text, ...);
+void DrawStringOpaque(int16 * screen, uint32 x, uint32 y, uint16 color1, uint16 color2, const char * text, ...);
+Window * LoadROM(void);
+Window * ResetJaguar(void);
+Window * RunEmu(void);
+Window * Quit(void);
+Window * About(void);
+Window * MiscOptions(void);
+
+int gzfilelength(gzFile gd);
+
+// External variables
+
+extern uint8 * jaguar_mainRam;
+extern uint8 * jaguar_bootRom;
+extern uint8 * jaguar_mainRom;
+
+// Local global variables
+
+int mouseX, mouseY;
+
+uint16 mousePic[] = {
+ 6, 8,
+
+ 0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000, // +
+ 0x0300,0x03E0,0x0000,0x0000,0x0000,0x0000, // @+
+ 0x0300,0x03E0,0x03E0,0x0000,0x0000,0x0000, // @++
+ 0x0300,0x0300,0x03E0,0x03E0,0x0000,0x0000, // @@++
+ 0x0300,0x0300,0x03E0,0x03E0,0x03E0,0x0000, // @@+++
+ 0x0300,0x0300,0x0300,0x03E0,0x03E0,0x03E0, // @@@+++
+ 0x0300,0x0300,0x0300,0x0000,0x0000,0x0000, // @@@
+ 0x0300,0x0000,0x0000,0x0000,0x0000,0x0000 // @
+/*
+ 0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000, // +
+ 0xE318,0xFFFF,0x0000,0x0000,0x0000,0x0000, // @+
+ 0xE318,0xFFFF,0xFFFF,0x0000,0x0000,0x0000, // @++
+ 0xE318,0xE318,0xFFFF,0xFFFF,0x0000,0x0000, // @@++
+ 0xE318,0xE318,0xFFFF,0xFFFF,0xFFFF,0x0000, // @@+++
+ 0xE318,0xE318,0xE318,0xFFFF,0xFFFF,0xFFFF, // @@@+++
+ 0xE318,0xE318,0xE318,0x0000,0x0000,0x0000, // @@@
+ 0xE318,0x0000,0x0000,0x0000,0x0000,0x0000 // @
+*/
+};
+// 1 111 00 11 100 1 1100 -> F39C
+// 1 100 00 10 000 1 0000 -> C210
+// 1 110 00 11 000 1 1000 -> E318
+// 0 000 00 11 111 0 0000 -> 03E0
+// 0 000 00 11 000 0 0000 -> 0300
+
+uint16 closeBox[] = {
+ 7, 7,
+
+ 0x0000,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x0000, // +++++
+ 0x4B5E,0xFFFF,0x0000,0x0000,0x0000,0xFFFF,0x0217, // +@ @.
+ 0x4B5E,0x0000,0xFFFF,0x0000,0xFFFF,0x0000,0x0217, // + @ @ .
+ 0x4B5E,0x0000,0x0000,0xFFFF,0x0000,0x0000,0x0217, // + @ .
+ 0x4B5E,0x0000,0xFFFF,0x0000,0xFFFF,0x0000,0x0217, // + @ @ .
+ 0x4B5E,0xFFFF,0x0000,0x0000,0x0000,0xFFFF,0x0217, // +@ @.
+ 0x0000,0x0217,0x0217,0x0217,0x0217,0x0217,0x0000 // .....
+};
+
+uint16 upArrowBox[] = {
+ 8, 8,
+
+ 0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E, // ++++++++
+ 0x4B5E,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0217, // + @@ .
+ 0x4B5E,0x0000,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x0000,0x0217, // + @@@@ .
+ 0x4B5E,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x0217, // +@@@@@@.
+ 0x4B5E,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0217, // + @@ .
+ 0x4B5E,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0217, // + @@ .
+ 0x4B5E,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0217, // + @@ .
+ 0x0217,0x0217,0x0217,0x0217,0x0217,0x0217,0x0217,0x0217 // ........
+};
+
+uint16 downArrowBox[] = {
+ 8, 8,
+
+ 0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E, // ++++++++
+ 0x4B5E,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0217, // + @@ .
+ 0x4B5E,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0217, // + @@ .
+ 0x4B5E,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0217, // + @@ .
+ 0x4B5E,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x0217, // +@@@@@@.
+ 0x4B5E,0x0000,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x0000,0x0217, // + @@@@ .
+ 0x4B5E,0x0000,0x0000,0xFFFF,0xFFFF,0x0000,0x0000,0x0217, // + @@ .
+ 0x0217,0x0217,0x0217,0x0217,0x0217,0x0217,0x0217,0x0217 // ........
+};
+
+uint16 pushButtonUp[] = {
+ 8, 8,
+
+ 0x0000, 0x0C63, 0x394A, 0x494A, 0x4108, 0x2CC6, 0x0421, 0x0000,
+ 0x0C63, 0x518C, 0x48E7, 0x48C6, 0x48A5, 0x48A5, 0x3CE7, 0x0421,
+ 0x3D4A, 0x48E7, 0x48C6, 0x48C6, 0x44A5, 0x48A5, 0x48A5, 0x2CC6,
+ 0x494A, 0x48C6, 0x48C6, 0x44A5, 0x44A5, 0x44A5, 0x48A5, 0x40E7,
+ 0x4529, 0x48A5, 0x44A5, 0x44A5, 0x44A5, 0x44A5, 0x4CA5, 0x40E7,
+ 0x2CC6, 0x48A5, 0x48A5, 0x44A5, 0x44A5, 0x48A5, 0x4CA5, 0x2CC6,
+ 0x0421, 0x3CE7, 0x48A5, 0x48A5, 0x4CA5, 0x4CA5, 0x44E7, 0x0421,
+ 0x0000, 0x0421, 0x28C6, 0x40E7, 0x40E7, 0x2CC6, 0x0421, 0x0000
+};
+
+uint8 pbuAlpha[] = {
+ 0xFF, 0xE4, 0xA0, 0x99, 0xA4, 0xBE, 0xF0, 0xFF,
+ 0xE3, 0x85, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xF0,
+ 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
+ 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD,
+ 0xA3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC,
+ 0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF,
+ 0xF1, 0xAD, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xF1,
+ 0xFF, 0xF2, 0xC0, 0xAD, 0xAD, 0xC0, 0xF2, 0xFF
+};
+
+uint16 pushButtonDown[] = {
+ 8, 8,
+
+ 0x0000, 0x0C63, 0x4A31, 0x5631, 0x4DCE, 0x2D4A, 0x0421, 0x0000,
+ 0x0C63, 0x6AF7, 0x714A, 0x7908, 0x7908, 0x6908, 0x418C, 0x0421,
+ 0x4A31, 0x714A, 0x7508, 0x6CE7, 0x6CE7, 0x74E7, 0x68E7, 0x2929,
+ 0x5A31, 0x7908, 0x6CE7, 0x6CE7, 0x6CE7, 0x6CE7, 0x78E7, 0x3D6B,
+ 0x4DCE, 0x7908, 0x6CE7, 0x6CE7, 0x6CE7, 0x6CE7, 0x78E7, 0x416B,
+ 0x2D4A, 0x6D08, 0x74E7, 0x6CE7, 0x6CE7, 0x74E7, 0x6CE7, 0x2929,
+ 0x0842, 0x418C, 0x6CE7, 0x78E7, 0x78E7, 0x6CE7, 0x416B, 0x0842,
+ 0x0000, 0x0842, 0x2929, 0x416B, 0x416B, 0x2929, 0x0842, 0x0000
+};
+
+uint8 pbdAlpha[] = {
+ 0xFF, 0xE4, 0x72, 0x68, 0x7E, 0xA7, 0xF0, 0xFF,
+ 0xE4, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x93, 0xF0,
+ 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB2,
+ 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A,
+ 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A,
+ 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1,
+ 0xEF, 0x91, 0x00, 0x00, 0x00, 0x00, 0x96, 0xEF,
+ 0xFF, 0xEF, 0xAE, 0x98, 0x97, 0xAF, 0xEF, 0xFF
+};
+
+uint16 slideSwitchUp[] = {
+ 8, 16,
+
+ 0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E, // ++++++++
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x0217,0x0217,0x0217,0x0217,0x0217,0x0217,0x0217,0x0217 // ........
+};
+
+uint16 slideSwitchDown[] = {
+ 8, 16,
+
+ 0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E,0x4B5E, // ++++++++
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x4B5E,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0217, // +.......
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x4B5E,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0C7F,0x0217, // + .
+ 0x0217,0x0217,0x0217,0x0217,0x0217,0x0217,0x0217,0x0217 // ........
+};
+
+/*uint16 [] = {
+ 8, 8,
+
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // ........
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // ........
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // ........
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // ........
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // ........
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // ........
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // ........
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 // ........
+};*/
+
+char separator[] = "--------------------------------------------------------";
+
+uint16 background[1280 * 240];
+
+//
+// Case insensitive string compare function
+// Taken straight out of Thinking In C++ by Bruce Eckel. Thanks Bruce!
+//
+
+int stringCmpi(const string &s1, const string &s2)
+{
+ // Select the first element of each string:
+ string::const_iterator p1 = s1.begin(), p2 = s2.begin();
+
+ while (p1 != s1.end() && p2 != s2.end()) // Don\92t run past the end
+ {
+ if (toupper(*p1) != toupper(*p2)) // Compare upper-cased chars
+ return (toupper(*p1) < toupper(*p2) ? -1 : 1);// Report which was lexically greater
+
+ p1++;
+ p2++;
+ }
+
+ // If they match up to the detected eos, say which was longer. Return 0 if the same.
+ return s2.size() - s1.size();
+}
+
+//
+// Local GUI classes
+//
+
+enum { WINDOW_CLOSE, MENU_ITEM_CHOSEN };
+
+class Element
+{
+ public:
+ Element(uint32 x = 0, uint32 y = 0, uint32 w = 0, uint32 h = 0)
+ { extents.x = x, extents.y = y, extents.w = w, extents.h = h; }
+ virtual void HandleKey(SDLKey key) = 0;
+ virtual void HandleMouseMove(uint32 x, uint32 y) = 0;
+ virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown) = 0;
+ virtual void Draw(uint32, uint32) = 0;
+ virtual void Notify(Element *) = 0;
+//Needed? virtual ~Element() = 0;
+//We're not allocating anything in the base class, so the answer would be NO.
+ bool Inside(uint32 x, uint32 y);
+ // Class method
+ static void SetScreenAndPitch(int16 * s, uint32 p) { screenBuffer = s, pitch = p; }
+
+ protected:
+ SDL_Rect extents;
+ uint32 state;
+ // Class variables...
+ static int16 * screenBuffer;
+ static uint32 pitch;
+};
+
+int16 * Element::screenBuffer = NULL;
+uint32 Element::pitch = 0;
+
+bool Element::Inside(uint32 x, uint32 y)
+{
+ return (x >= (uint32)extents.x && x < (uint32)(extents.x + extents.w)
+ && y >= (uint32)extents.y && y < (uint32)(extents.y + extents.h) ? true : false);
+}
+
+
+class Button: public Element
+{
+ public:
+ Button(uint32 x = 0, uint32 y = 0, uint32 w = 0, uint32 h = 0): Element(x, y, w, h),
+ activated(false), clicked(false), inside(false), fgColor(0xFFFF),
+ bgColor(0x03E0), pic(NULL), elementToTell(NULL) {}
+ Button(uint32 x, uint32 y, uint32 w, uint32 h, uint16 * p): Element(x, y, w, h),
+ activated(false), clicked(false), inside(false), fgColor(0xFFFF),
+ bgColor(0x03E0), pic(p), elementToTell(NULL) {}
+ Button(uint32 x, uint32 y, uint16 * p): Element(x, y, 0, 0),
+ activated(false), clicked(false), inside(false), fgColor(0xFFFF),
+ bgColor(0x03E0), pic(p), elementToTell(NULL)
+ { if (pic) extents.w = pic[0], extents.h = pic[1]; }
+ Button(uint32 x, uint32 y, uint32 w, uint32 h, string s): Element(x, y, w, h),
+ activated(false), clicked(false), inside(false), fgColor(0xFFFF),
+ bgColor(0x03E0), pic(NULL), text(s), elementToTell(NULL) {}
+ Button(uint32 x, uint32 y, string s): Element(x, y, 0, 8),
+ activated(false), clicked(false), inside(false), fgColor(0xFFFF),
+ bgColor(0x03E0), pic(NULL), text(s), elementToTell(NULL)
+ { extents.w = s.length() * 8; }
+ virtual void HandleKey(SDLKey key) {}
+ virtual void HandleMouseMove(uint32 x, uint32 y);
+ virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown);
+ virtual void Draw(uint32 offsetX = 0, uint32 offsetY = 0);
+ virtual void Notify(Element *) {}
+ bool ButtonClicked(void) { return activated; }
+ void SetNotificationElement(Element * e) { elementToTell = e; }
+
+ protected:
+ bool activated, clicked, inside;
+ uint16 fgColor, bgColor;
+ uint16 * pic;
+ string text;
+ Element * elementToTell;
+};
+
+void Button::HandleMouseMove(uint32 x, uint32 y)
+{
+ inside = Inside(x, y);
+}
+
+void Button::HandleMouseButton(uint32 x, uint32 y, bool mouseDown)
+{
+ if (inside)
+ {
+ if (mouseDown)
+ clicked = true;
+
+ if (clicked && !mouseDown)
+ {
+ clicked = false, activated = true;
+
+ // Send a message that we're activated (if there's someone to tell, that is)
+ if (elementToTell)
+ elementToTell->Notify(this);
+ }
+ }
+ else
+ clicked = activated = false;
+}
+
+void Button::Draw(uint32 offsetX/*= 0*/, uint32 offsetY/*= 0*/)
+{
+ uint32 addr = (extents.x + offsetX) + ((extents.y + offsetY) * pitch);
+
+ for(uint32 y=0; y<extents.h; y++)
+ {
+ for(uint32 x=0; x<extents.w; x++)
+ {
+ // Doesn't clip in y axis! !!! FIX !!!
+ if (extents.x + x < pitch)
+ screenBuffer[addr + x + (y * pitch)]
+ = (clicked && inside ? fgColor : (inside ? 0x43F0 : bgColor));
+ }
+ }
+
+ if (pic != NULL)
+ DrawTransparentBitmap(screenBuffer, extents.x + offsetX, extents.y + offsetY, pic);
+
+ if (text.length() > 0)
+ DrawString(screenBuffer, extents.x + offsetX, extents.y + offsetY, false, "%s", text.c_str());
+}
+
+
+class PushButton: public Element
+{
+// How to handle?
+// Save state externally?
+
+ public:
+// PushButton(uint32 x = 0, uint32 y = 0, uint32 w = 0, uint32 h = 0): Element(x, y, w, h),
+// activated(false), clicked(false), inside(false), fgColor(0xFFFF),
+// bgColor(0x03E0), pic(NULL), elementToTell(NULL) {}
+ PushButton(uint32 x, uint32 y, bool * st, string s): Element(x, y, 8, 8), state(st),
+ inside(false), text(s) { if (st == NULL) state = &internalState; }
+/* Button(uint32 x, uint32 y, uint32 w, uint32 h, uint16 * p): Element(x, y, w, h),
+ activated(false), clicked(false), inside(false), fgColor(0xFFFF),
+ bgColor(0x03E0), pic(p), elementToTell(NULL) {}
+ Button(uint32 x, uint32 y, uint16 * p): Element(x, y, 0, 0),
+ activated(false), clicked(false), inside(false), fgColor(0xFFFF),
+ bgColor(0x03E0), pic(p), elementToTell(NULL)
+ { if (pic) extents.w = pic[0], extents.h = pic[1]; }
+ Button(uint32 x, uint32 y, uint32 w, uint32 h, string s): Element(x, y, w, h),
+ activated(false), clicked(false), inside(false), fgColor(0xFFFF),
+ bgColor(0x03E0), pic(NULL), text(s), elementToTell(NULL) {}
+ PushButton(uint32 x, uint32 y, string s): Element(x, y, 0, 8),
+ activated(false), clicked(false), inside(false), fgColor(0xFFFF),
+ bgColor(0x03E0), pic(NULL), text(s), elementToTell(NULL)
+ { extents.w = s.length() * 8; }*/
+ virtual void HandleKey(SDLKey key) {}
+ virtual void HandleMouseMove(uint32 x, uint32 y);
+ virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown);
+ virtual void Draw(uint32 offsetX = 0, uint32 offsetY = 0);
+ virtual void Notify(Element *) {}
+// bool ButtonClicked(void) { return activated; }
+// void SetNotificationElement(Element * e) { elementToTell = e; }
+
+ protected:
+ bool * state;
+ bool inside;
+// bool activated, clicked, inside;
+// uint16 fgColor, bgColor;
+// uint16 * pic;
+ string text;
+// Element * elementToTell;
+ bool internalState;
+};
+
+void PushButton::HandleMouseMove(uint32 x, uint32 y)
+{
+ inside = Inside(x, y);
+}
+
+void PushButton::HandleMouseButton(uint32 x, uint32 y, bool mouseDown)
+{
+ if (inside && mouseDown)
+ {
+/* if (mouseDown)
+ clicked = true;
+
+ if (clicked && !mouseDown)
+ {
+ clicked = false, activated = true;
+
+ // Send a message that we're activated (if there's someone to tell, that is)
+ if (elementToTell)
+ elementToTell->Notify(this);
+ }*/
+ *state = !(*state);
+ }
+// else
+// clicked = activated = false;
+}
+
+void PushButton::Draw(uint32 offsetX/*= 0*/, uint32 offsetY/*= 0*/)
+{
+/* uint32 addr = (extents.x + offsetX) + ((extents.y + offsetY) * pitch);
+
+ for(uint32 y=0; y<extents.h; y++)
+ {
+ for(uint32 x=0; x<extents.w; x++)
+ {
+ // Doesn't clip in y axis! !!! FIX !!!
+ if (extents.x + x < pitch)
+ screenBuffer[addr + x + (y * pitch)]
+ = (clicked && inside ? fgColor : (inside ? 0x43F0 : bgColor));
+ }
+ }*/
+
+// DrawTransparentBitmap(screenBuffer, extents.x + offsetX, extents.y + offsetY, (*state ? pushButtonDown : pushButtonUp));
+ DrawTransparentBitmap(screenBuffer, extents.x + offsetX, extents.y + offsetY, (*state ? pushButtonDown : pushButtonUp), (*state ? pbdAlpha : pbuAlpha));
+ if (text.length() > 0)
+ DrawString(screenBuffer, extents.x + offsetX + 12, extents.y + offsetY, false, "%s", text.c_str());
+}
+
+
+class SlideSwitch: public Element
+{
+// How to handle?
+// Save state externally?
+
+ public:
+ SlideSwitch(uint32 x, uint32 y, bool * st, string s1, string s2): Element(x, y, 8, 16), state(st),
+ inside(false), text1(s1), text2(s2) {}
+ virtual void HandleKey(SDLKey key) {}
+ virtual void HandleMouseMove(uint32 x, uint32 y);
+ virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown);
+ virtual void Draw(uint32 offsetX = 0, uint32 offsetY = 0);
+ virtual void Notify(Element *) {}
+// bool ButtonClicked(void) { return activated; }
+// void SetNotificationElement(Element * e) { elementToTell = e; }