#ifndef VALUEDGUIELEMENT_H #define VALUEDGUIELEMENT_H #include #include "GuiElement.h" #include "constant.h" extern int installMouseReturnValue; extern int layerCount; extern bool forgotScreen; extern volatile bool heartBeat; extern void unload(); extern void drawSpritesForBlitting(); extern void showFrame(); extern void createGraphicsBackup(int layersWanted); extern void restoreGraphicsBackup(int layersWanted); extern void drawFrame(); extern void setHeartBeat(); template class ValuedGuiElement : public GuiElement { bool committed; T commitment; protected: bool blocking; ValuedGuiElement(BITMAP *desiredCanvas, bool desiredBlocking, bool desiredActive = false) : GuiElement(desiredCanvas, desiredActive), blocking(desiredBlocking), committed(false) {} public: bool getCommitted() const { return committed; } T getCommitment() const { return commitment; } virtual T getValue() = 0; void commit(T desiredCommitment) { if (!committed) { committed = true; commitment = desiredCommitment; } } void uncommit() { committed = false; } T block(bool blinking) { if (!getCommitted()) { erase(); createGraphicsBackup(layerCount); heartBeat = false; if (blinking) remove_int(setHeartBeat); install_int(setHeartBeat, cursorBlinkDelay); focus(); clear_keybuf(); while (!getCommitted()) { erase(); draw(); drawFrame(); showFrame(); bool somethingHappened = false; do { if (forgotScreen) { drawSpritesForBlitting(); restoreGraphicsBackup(layerCount); draw(); drawFrame(); showFrame(); forgotScreen = false; } rest(0); if (keyboard_needs_poll()) if (poll_keyboard()) { unload(); allegro_message("Couldn't poll the keyboard!"); exit(0); } if (mouse_needs_poll()) if (poll_mouse()) { unload(); allegro_message("Couldn't poll the mouse!"); exit(0); } if (keypressed() && acknowledgeKeyStroke(readkey())) somethingHappened = true; if (acknowledgeKeyArray()) somethingHappened = true; if (installMouseReturnValue != -1 && acknowledgeMouse()) somethingHappened = true; } while (!(somethingHappened || heartBeat)); if (somethingHappened) { heartBeat = false; remove_int(setHeartBeat); install_int(setHeartBeat, cursorBlinkDelay); } if (heartBeat) { acknowledgeHeartBeat(); heartBeat = false; } } remove_int(setHeartBeat); if (blinking) install_int(setHeartBeat, cursorBlinkDelay); } return getCommitment(); } }; #endif