/* Copyright (C) 2015-2019 Parallel Realities This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "modalDialog.h" static int enableTimer; static Widget *ok; static Widget *okCancelOK; static Widget *okCancelCancel; static char textBuffer[MAX_DESCRIPTION_LENGTH]; void initModalDialog(void) { ok = getWidget("ok", "ok"); ok->action = NULL; ok->isModal = 1; okCancelOK = getWidget("ok", "okCancel"); okCancelOK->action = NULL; okCancelOK->isModal = 1; okCancelCancel = getWidget("cancel", "okCancel"); okCancelCancel->action = NULL; okCancelCancel->isModal = 1; enableTimer = 0; } void showOKDialog(void (*callback)(void), const char *format, ...) { va_list args; memset(&textBuffer, '\0', sizeof(textBuffer)); va_start(args, format); vsprintf(textBuffer, format, args); va_end(args); STRNCPY(app.modalDialog.message, textBuffer, MAX_DESCRIPTION_LENGTH); app.modalDialog.type = MD_OK; ok->action = callback; enableTimer = FPS; ok->enabled = okCancelOK->enabled = okCancelCancel->enabled = 0; } void showOKCancelDialog(void (*okCallback)(void), void (*cancelCallback)(void), const char *format, ...) { va_list args; memset(&textBuffer, '\0', sizeof(textBuffer)); va_start(args, format); vsprintf(textBuffer, format, args); va_end(args); STRNCPY(app.modalDialog.message, textBuffer, MAX_DESCRIPTION_LENGTH); app.modalDialog.type = MD_OK_CANCEL; okCancelOK->action = okCallback; okCancelCancel->action = cancelCallback; enableTimer = FPS / 4; ok->enabled = okCancelOK->enabled = okCancelCancel->enabled = 0; } void doModalDialog(void) { doWidgets(); clearInput(); enableTimer = MAX(enableTimer - 1, 0); if (!enableTimer) { ok->enabled = okCancelOK->enabled = okCancelCancel->enabled = 1; } } void drawModalDialog(void) { SDL_Rect r; app.textWidth = 700; SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 96); SDL_RenderFillRect(app.renderer, NULL); SDL_SetRenderTarget(app.renderer, app.uiBuffer); r.w = 800; r.h = getWrappedTextHeight(app.modalDialog.message, 24) + 100; r.x = (UI_WIDTH / 2) - (r.w / 2); r.y = (UI_HEIGHT / 2) - (r.h / 2); ok->rect.y = okCancelOK->rect.y = okCancelCancel->rect.y = r.y + r.h - 50; SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 225); SDL_RenderFillRect(app.renderer, &r); SDL_SetRenderDrawColor(app.renderer, 255, 255, 255, 200); SDL_RenderDrawRect(app.renderer, &r); SDL_SetRenderDrawBlendMode(app.renderer, SDL_BLENDMODE_NONE); drawText(UI_WIDTH / 2, r.y + 10, 24, TA_CENTER, colors.white, app.modalDialog.message); switch (app.modalDialog.type) { case MD_OK: drawWidgets("ok"); break; case MD_OK_CANCEL: drawWidgets("okCancel"); break; } app.textWidth = 0; SDL_SetRenderTarget(app.renderer, app.backBuffer); }