Index: binaries/data/mods/mod/gui/common/functions_msgbox.js =================================================================== --- binaries/data/mods/mod/gui/common/functions_msgbox.js +++ binaries/data/mods/mod/gui/common/functions_msgbox.js @@ -1,50 +1,18 @@ -// We want to pass callback functions for the different buttons in a convenient way. -// Because passing functions accross compartment boundaries is a pain, we just store them here together with some optional arguments. -// The messageBox page will return the code of the pressed button and the according function will be called. -var g_MessageBoxBtnFunctions = []; -var g_MessageBoxCallbackArgs = []; - -function messageBoxCallbackFunction(btnCode) -{ - if (btnCode !== undefined && g_MessageBoxBtnFunctions[btnCode]) - { - // Cache the variables to make it possible to call a messageBox from a callback function. - let callbackFunction = g_MessageBoxBtnFunctions[btnCode]; - let callbackArgs = g_MessageBoxCallbackArgs[btnCode]; - - g_MessageBoxBtnFunctions = []; - g_MessageBoxCallbackArgs = []; - - if (callbackArgs !== undefined) - callbackFunction(callbackArgs); - else - callbackFunction(); - return; - } - - g_MessageBoxBtnFunctions = []; - g_MessageBoxCallbackArgs = []; -} - function messageBox(mbWidth, mbHeight, mbMessage, mbTitle, mbButtonCaptions, mbBtnCode, mbCallbackArgs) { - if (g_MessageBoxBtnFunctions && g_MessageBoxBtnFunctions.length) - { - warn("A messagebox was called when a previous callback function is still set, aborting!"); - return; - } - - g_MessageBoxBtnFunctions = mbBtnCode; - g_MessageBoxCallbackArgs = mbCallbackArgs || g_MessageBoxCallbackArgs; - - Engine.PushGuiPage("page_msgbox.xml", { - "width": mbWidth, - "height": mbHeight, - "message": mbMessage, - "title": mbTitle, - "buttonCaptions": mbButtonCaptions, - "callback": mbBtnCode && "messageBoxCallbackFunction" - }); + Engine.PushGuiPage( + "page_msgbox.xml", + { + "width": mbWidth, + "height": mbHeight, + "message": mbMessage, + "title": mbTitle, + "buttonCaptions": mbButtonCaptions + }, + btnCode => { + if (mbBtnCode !== undefined && mbBtnCode[btnCode]) + mbBtnCode[btnCode](mbCallbackArgs ? mbCallbackArgs[btnCode] : undefined); + }); } function openURL(url) Index: binaries/data/mods/mod/gui/common/terms.js =================================================================== --- binaries/data/mods/mod/gui/common/terms.js +++ binaries/data/mods/mod/gui/common/terms.js @@ -7,24 +7,29 @@ function openTerms(page) { - Engine.PushGuiPage("page_termsdialog.xml", { - "file": g_Terms[page].file, - "title": g_Terms[page].title, - "sprintf": g_Terms[page].sprintf, - "urlButtons": g_Terms[page].urlButtons || [], - "termsURL": g_Terms[page].termsURL || undefined, - "page": page, - "callback": "acceptTerms" - }); -} - -function acceptTerms(data) -{ - g_Terms[data.page].accepted = data.accepted; - Engine.ConfigDB_CreateAndWriteValueToFile("user", g_Terms[data.page].config, data.accepted ? getTermsHash(data.page) : "0", "config/user.cfg"); - - if (g_Terms[data.page].callback) - g_Terms[data.page].callback(data); + Engine.PushGuiPage( + "page_termsdialog.xml", + { + "file": g_Terms[page].file, + "title": g_Terms[page].title, + "sprintf": g_Terms[page].sprintf, + "urlButtons": g_Terms[page].urlButtons || [], + "termsURL": g_Terms[page].termsURL || undefined, + "page": page + }, + data => { + g_Terms[data.page].accepted = data.accepted; + + Engine.ConfigDB_CreateAndWriteValueToFile( + "user", + g_Terms[data.page].config, + data.accepted ? getTermsHash(data.page) : "0", + "config/user.cfg"); + + if (g_Terms[data.page].callback) + g_Terms[data.page].callback(data); + } + ); } function checkTerms() Index: binaries/data/mods/mod/gui/modio/modio.js =================================================================== --- binaries/data/mods/mod/gui/modio/modio.js +++ binaries/data/mods/mod/gui/modio/modio.js @@ -268,9 +268,9 @@ hideDialog(); } -function closePage(data) +function closePage() { - Engine.PopGuiPageCB(undefined); + Engine.PopGuiPage(); } function showErrorMessageBox(caption, title, buttonCaptions, buttonActions) Index: binaries/data/mods/mod/gui/modmod/modmodio.js =================================================================== --- binaries/data/mods/mod/gui/modmod/modmodio.js +++ binaries/data/mods/mod/gui/modmod/modmodio.js @@ -26,7 +26,5 @@ function openModIo(data) { if (data.accepted) - Engine.PushGuiPage("page_modio.xml", { - "callback": "initMods" - }); + Engine.PushGuiPage("page_modio.xml", {}, initMods); } Index: binaries/data/mods/mod/gui/msgbox/msgbox.js =================================================================== --- binaries/data/mods/mod/gui/msgbox/msgbox.js +++ binaries/data/mods/mod/gui/msgbox/msgbox.js @@ -28,22 +28,15 @@ let mbButton = []; captions.forEach((caption, i) => { mbButton[i] = Engine.GetGUIObjectByName("mbButton" + (i + 1)); - - let action = function() - { - if (data.callback) - Engine.PopGuiPageCB(i); - else - Engine.PopGuiPage(); - }; - mbButton[i].caption = caption; - mbButton[i].onPress = action; mbButton[i].hidden = false; + mbButton[i].onPress = () => { + Engine.PopGuiPage(i); + }; // Convention: Cancel is the first button if (i == 0) - mbCancelHotkey.onPress = action; + mbCancelHotkey.onPress = mbButton[i].onPress; }); // Distribute buttons horizontally Index: binaries/data/mods/mod/gui/termsdialog/termsdialog.js =================================================================== --- binaries/data/mods/mod/gui/termsdialog/termsdialog.js +++ binaries/data/mods/mod/gui/termsdialog/termsdialog.js @@ -82,7 +82,7 @@ function closeTerms(accepted) { - Engine.PopGuiPageCB({ + Engine.PopGuiPage({ "page": g_TermsPage, "accepted": accepted }); Index: binaries/data/mods/public/gui/aiconfig/aiconfig.js =================================================================== --- binaries/data/mods/public/gui/aiconfig/aiconfig.js +++ binaries/data/mods/public/gui/aiconfig/aiconfig.js @@ -69,10 +69,7 @@ function returnAI(save = true) { let idx = Engine.GetGUIObjectByName("aiSelection").selected; - - // Pop the page before calling the callback, so the callback runs - // in the parent GUI page's context - Engine.PopGuiPageCB({ + Engine.PopGuiPage({ "save": save, "id": g_AIDescriptions[idx].id, "name": g_AIDescriptions[idx].data.name, Index: binaries/data/mods/public/gui/civinfo/civinfo.js =================================================================== --- binaries/data/mods/public/gui/civinfo/civinfo.js +++ binaries/data/mods/public/gui/civinfo/civinfo.js @@ -3,11 +3,6 @@ */ const g_CivData = loadCivData(true, false); -/** - * Callback function name on closing gui via Engine.PopGuiPage(). - */ -var g_Callback = ""; - var g_SelectedCiv = ""; /** @@ -15,9 +10,6 @@ */ function init(data = {}) { - if (data.callback) - g_Callback = data.callback; - var civList = Object.keys(g_CivData).map(civ => ({ "name": g_CivData[civ].Name, "code": civ })).sort(sortNameIgnoreCase); var civSelection = Engine.GetGUIObjectByName("civSelection"); @@ -94,16 +86,12 @@ function switchToStrucTreePage() { - Engine.PopGuiPage(); - Engine.PushGuiPage("page_structree.xml", { "civ": g_SelectedCiv, "callback": g_Callback }); + Engine.PopGuiPage({ "civ": g_SelectedCiv, "nextPage": "page_structree.xml" }); } function closePage() { - if (g_Callback) - Engine.PopGuiPageCB({ "civ": g_SelectedCiv, "page": "page_civinfo.xml" }); - else - Engine.PopGuiPage(); + Engine.PopGuiPage({ "civ": g_SelectedCiv, "page": "page_civinfo.xml" }); } /** Index: binaries/data/mods/public/gui/gamesetup/gamesetup.js =================================================================== --- binaries/data/mods/public/gui/gamesetup/gamesetup.js +++ binaries/data/mods/public/gui/gamesetup/gamesetup.js @@ -22,7 +22,7 @@ * Store civilization code and page (structree or history) opened in civilization info. */ var g_CivInfo = { - "code": "", + "civ": "", "page": "page_civinfo.xml" }; @@ -1047,10 +1047,10 @@ "hotkey_structree": colorizeHotkey("%(hotkey)s", "structree") }), "onPress": () => function() { - Engine.PushGuiPage(g_CivInfo.page, { - "civ": g_CivInfo.code, - "callback": "storeCivInfoPage" - }); + Engine.PushGuiPage( + g_CivInfo.page, + { "civ": g_CivInfo.civ }, + storeCivInfoPage); } }, "civResetButton": { @@ -2423,30 +2423,26 @@ { g_LastViewedAIPlayer = playerSlot; - Engine.PushGuiPage("page_aiconfig.xml", { - "callback": "AIConfigCallback", - "playerSlot": playerSlot, - "id": g_GameAttributes.settings.PlayerData[playerSlot].AI, - "difficulty": g_GameAttributes.settings.PlayerData[playerSlot].AIDiff, - "behavior": g_GameAttributes.settings.PlayerData[playerSlot].AIBehavior - }); -} - -/** - * Called after closing the dialog. - */ -function AIConfigCallback(ai) -{ - g_LastViewedAIPlayer = -1; - - if (!ai.save || !g_IsController) - return; - - g_GameAttributes.settings.PlayerData[ai.playerSlot].AI = ai.id; - g_GameAttributes.settings.PlayerData[ai.playerSlot].AIDiff = ai.difficulty; - g_GameAttributes.settings.PlayerData[ai.playerSlot].AIBehavior = ai.behavior; + Engine.PushGuiPage( + "page_aiconfig.xml", + { + "playerSlot": playerSlot, + "id": g_GameAttributes.settings.PlayerData[playerSlot].AI, + "difficulty": g_GameAttributes.settings.PlayerData[playerSlot].AIDiff, + "behavior": g_GameAttributes.settings.PlayerData[playerSlot].AIBehavior + }, + ai => { + g_LastViewedAIPlayer = -1; + + if (!ai.save || !g_IsController) + return; + + g_GameAttributes.settings.PlayerData[ai.playerSlot].AI = ai.id; + g_GameAttributes.settings.PlayerData[ai.playerSlot].AIDiff = ai.difficulty; + g_GameAttributes.settings.PlayerData[ai.playerSlot].AIBehavior = ai.behavior; - updateGameAttributes(); + updateGameAttributes(); + }); } function reloadPlayerAssignmentChoices() @@ -2775,6 +2771,11 @@ function storeCivInfoPage(data) { - g_CivInfo.code = data.civ; - g_CivInfo.page = data.page; + if (data.nextPage) + Engine.PushGuiPage( + data.nextPage, + { "civ": data.civ }, + storeCivInfoPage); + else + g_CivInfo = data; } Index: binaries/data/mods/public/gui/gamesetup/gamesetup.xml =================================================================== --- binaries/data/mods/public/gui/gamesetup/gamesetup.xml +++ binaries/data/mods/public/gui/gamesetup/gamesetup.xml @@ -6,15 +6,11 @@