+ if (text.length() > 0) // Simple text button
+// if (pic == NULL)
+ {
+ 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));
+//43F0 -> 010000 11111 10000 -> 0100 0001 1111 1111 1000 0100 -> 41 FF 84
+ = (clicked && inside ? fgColor : (inside ? 0xFF84FF41 : bgColor));
+ }
+ }
+
+ DrawString(screenBuffer, extents.x + offsetX, extents.y + offsetY, false, "%s", text.c_str());
+ }
+ else // Graphical button
+ {
+ uint32 * picToShow = pic;
+
+ if (picHover != NULL && inside && !clicked)
+ picToShow = picHover;
+
+ if (picDown != NULL && inside && clicked)
+ picToShow = picDown;
+
+ DrawTransparentBitmapDeprecated(screenBuffer, extents.x + offsetX, extents.y + offsetY, picToShow);
+ }
+}
+
+
+//
+// PushButton class
+//
+
+class PushButton: public Element
+{
+// How to handle?
+// Save state externally?
+//We pass in a state variable if we want to track it externally, otherwise we use our own
+//internal state var. Still need to do some kind of callback for pushbuttons that do things
+//like change from fullscreen to windowed... !!! FIX !!!
+
+ 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; }
+ PushButton(uint32 x, uint32 y, bool * st, string s): Element(x, y, 16, 16), state(st),
+ inside(false), text(s) { if (st == NULL) state = &internalState; }
+/* Button(uint32 x, uint32 y, uint32 w, uint32 h, uint32 * 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, uint32 * 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;
+// uint32 * 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);
+