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 @@ -15,6 +15,24 @@ }); } +function timedConfirmation(mbWidth, mbHeight, mbMessage, mbTimeout, mbTitle, mbButtonCaptions, mbBtnCode, mbCallbackArgs) +{ + Engine.PushGuiPage( + "page_timedconfirmation.xml", + { + "width": mbWidth, + "height": mbHeight, + "message": mbMessage, + "timeout": mbTimeout, + "title": mbTitle, + "buttonCaptions": mbButtonCaptions + }, + btnCode => { + if (mbBtnCode !== undefined && mbBtnCode[btnCode]) + mbBtnCode[btnCode](mbCallbackArgs ? mbCallbackArgs[btnCode] : undefined); + }); +} + function openURL(url) { Engine.OpenURL(url); Index: binaries/data/mods/mod/gui/timedconfirmation/timedconfirmation.js =================================================================== --- /dev/null +++ binaries/data/mods/mod/gui/timedconfirmation/timedconfirmation.js @@ -0,0 +1,83 @@ +/** + * Currently limited to at most 3 buttons per message box. + * The convention is to have "cancel" appear first. + */ +function init(data) +{ + // Set title + Engine.GetGUIObjectByName("mbTitleBar").caption = data.title; + + // Set subject + let mbTextObj = Engine.GetGUIObjectByName("mbText"); + let mbTimerObj = Engine.GetGUIObjectByName("mbTimer"); + mbTextObj.caption = data.message; + + updateDisplayedTimer(data.timeout); + + mbTimerObj.caption = data.timeout; + if (data.font) { + mbTextObj.font = data.font; + } + + // Default behaviour + let mbCancelHotkey = Engine.GetGUIObjectByName("mbCancelHotkey"); + mbCancelHotkey.onPress = Engine.PopGuiPage; + + // Calculate size + let mbLRDiff = data.width / 2; + let mbUDDiff = data.height / 2; + Engine.GetGUIObjectByName("mbMain").size = "50%-" + mbLRDiff + " 50%-" + mbUDDiff + " 50%+" + mbLRDiff + " 50%+" + mbUDDiff; + + let captions = data.buttonCaptions || [translate("OK")]; + + // Set button captions and visibility + let mbButton = []; + captions.forEach((caption, i) => { + mbButton[i] = Engine.GetGUIObjectByName("mbButton" + (i + 1)); + mbButton[i].caption = caption; + mbButton[i].hidden = false; + mbButton[i].onPress = () => { + Engine.PopGuiPage(i); + }; + + // Convention: Cancel is the first button + if (i == 0) + mbCancelHotkey.onPress = mbButton[i].onPress; + }); + + // Distribute buttons horizontally + let y1 = "100%-46"; + let y2 = "100%-18"; + switch (captions.length) + { + case 1: + mbButton[0].size = "18 " + y1 + " 100%-18 " + y2; + break; + case 2: + mbButton[0].size = "18 " + y1 + " 50%-5 " + y2; + mbButton[1].size = "50%+5 " + y1 + " 100%-18 " + y2; + break; + case 3: + mbButton[0].size = "18 " + y1 + " 33%-5 " + y2; + mbButton[1].size = "33%+5 " + y1 + " 66%-5 " + y2; + mbButton[2].size = "66%+5 " + y1 + " 100%-18 " + y2; + break; + } +} + +function onTick() { + let mbTimerObj = Engine.GetGUIObjectByName("mbTimer"); + let time = +mbTimerObj.caption; + --time; + if (time < 1) { + let action = Engine.GetGUIObjectByName("mbButton1"); + action.onPress(); + } + mbTimerObj.caption = time; + updateDisplayedTimer(time); +} + +function updateDisplayedTimer(time) { + let mbTimerDisplayObj = Engine.GetGUIObjectByName("mbTimerDisplay"); + mbTimerDisplayObj.caption = Math.ceil(time/100); +} Index: binaries/data/mods/mod/gui/timedconfirmation/timedconfirmation.xml =================================================================== --- /dev/null +++ binaries/data/mods/mod/gui/timedconfirmation/timedconfirmation.xml @@ -0,0 +1,56 @@ + + + + +