diff --git a/Core/GameEngine/Include/GameClient/GameWindowManager.h b/Core/GameEngine/Include/GameClient/GameWindowManager.h index 39602701f1f..484b0c555da 100644 --- a/Core/GameEngine/Include/GameClient/GameWindowManager.h +++ b/Core/GameEngine/Include/GameClient/GameWindowManager.h @@ -84,6 +84,8 @@ friend class GameWindow; virtual void reset() override; ///< reset the system virtual void update() override; ///< update method, called once per frame + virtual Bool isDummy() const { return false; } + virtual GameWindow *allocateNewWindow() = 0; ///< new game window void linkWindow( GameWindow *window ); ///< link into master list @@ -383,6 +385,8 @@ extern WindowMsgHandledType PassMessagesToParentSystem( GameWindow *window, class GameWindowManagerDummy : public GameWindowManager { public: + virtual Bool isDummy() const override { return true; } + virtual GameWindow *winGetWindowFromId(GameWindow *window, Int id) override; virtual GameWindow *winCreateFromScript(AsciiString filenameString, WindowLayoutInfo *info) override; diff --git a/Core/GameEngine/Source/GameClient/GUI/Gadget/GadgetPushButton.cpp b/Core/GameEngine/Source/GameClient/GUI/Gadget/GadgetPushButton.cpp index 8818806ed48..636b1d6368c 100644 --- a/Core/GameEngine/Source/GameClient/GUI/Gadget/GadgetPushButton.cpp +++ b/Core/GameEngine/Source/GameClient/GUI/Gadget/GadgetPushButton.cpp @@ -593,6 +593,9 @@ void GadgetButtonSetText( GameWindow *g, UnicodeString text ) PushButtonData * getNewPushButtonData() { + if( TheWindowManager->isDummy() ) + return nullptr; + PushButtonData *p = NEW PushButtonData; if(!p) return nullptr; @@ -604,6 +607,20 @@ PushButtonData * getNewPushButtonData() return p; } +static PushButtonData *getOrCreatePushButtonData( GameWindow *g ) +{ + PushButtonData *pData = (PushButtonData *)g->winGetUserData(); + if( pData == nullptr ) + { + pData = getNewPushButtonData(); + if( pData == nullptr ) + return nullptr; + + g->winSetUserData( pData ); + } + return pData; +} + // GadgetButtonSetBorder ====================================================== /** Set to draw the special borders in the game */ //============================================================================= @@ -612,14 +629,12 @@ void GadgetButtonSetBorder( GameWindow *g, Color color, Bool drawBorder = TRUE ) if( g == nullptr ) return; - PushButtonData *pData = (PushButtonData *)g->winGetUserData(); - if(!pData) - { - pData = getNewPushButtonData(); - } + PushButtonData *pData = getOrCreatePushButtonData( g ); + if( pData == nullptr ) + return; + pData->drawBorder = drawBorder; pData->colorBorder = color; - g->winSetUserData(pData); } // GadgetButtonDrawClock ====================================================== @@ -631,15 +646,13 @@ void GadgetButtonDrawClock( GameWindow *g, Int percent, Color color ) if( g == nullptr ) return; - PushButtonData *pData = (PushButtonData *)g->winGetUserData(); - if(!pData) - { - pData = getNewPushButtonData(); - } + PushButtonData *pData = getOrCreatePushButtonData( g ); + if( pData == nullptr ) + return; + pData->drawClock = NORMAL_CLOCK; pData->percentClock = percent; pData->colorClock = color; - g->winSetUserData(pData); } @@ -652,15 +665,13 @@ void GadgetButtonDrawInverseClock( GameWindow *g, Int percent, Color color ) if( g == nullptr ) return; - PushButtonData *pData = (PushButtonData *)g->winGetUserData(); - if(!pData) - { - pData = getNewPushButtonData(); - } + PushButtonData *pData = getOrCreatePushButtonData( g ); + if( pData == nullptr ) + return; + pData->drawClock = INVERSE_CLOCK; pData->percentClock = percent; pData->colorClock = color; - g->winSetUserData(pData); } @@ -669,13 +680,11 @@ void GadgetButtonDrawOverlayImage( GameWindow *g, const Image *image ) if( g == nullptr ) return; - PushButtonData *pData = (PushButtonData *)g->winGetUserData(); - if(!pData) - { - pData = getNewPushButtonData(); - } + PushButtonData *pData = getOrCreatePushButtonData( g ); + if( pData == nullptr ) + return; + pData->overlayImage = image; - g->winSetUserData(pData); } @@ -687,13 +696,11 @@ void GadgetButtonSetData(GameWindow *g, void *data) if( g == nullptr ) return; - PushButtonData *pData = (PushButtonData *)g->winGetUserData(); - if(!pData) - { - pData = getNewPushButtonData(); - } + PushButtonData *pData = getOrCreatePushButtonData( g ); + if( pData == nullptr ) + return; + pData->userData = data; - g->winSetUserData(pData); } // GadgetButtonGetData ======================================================