mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-16 05:13:58 -07:00
Return a promise from most page-inits
Adopt the new interface by all pages which close themself. (Not thous using `Engine.SwitchGuiPage`.)
This commit is contained in:
parent
4f62e9f6f0
commit
094a7c2268
57 changed files with 287 additions and 246 deletions
|
|
@ -4,10 +4,7 @@
|
|||
*/
|
||||
class ColorMixer
|
||||
{
|
||||
/**
|
||||
* @param {String} color - initial color as RGB string e.g. 100 0 200
|
||||
*/
|
||||
constructor(color)
|
||||
constructor()
|
||||
{
|
||||
this.panel = Engine.GetGUIObjectByName("main");
|
||||
this.colorDisplay = Engine.GetGUIObjectByName("colorDisplay");
|
||||
|
|
@ -15,10 +12,11 @@ class ColorMixer
|
|||
this.color = [0, 0, 0];
|
||||
this.sliders = [];
|
||||
this.valuesText = [];
|
||||
|
||||
this.run(color);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {String} color - initial color as RGB string e.g. 100 0 200
|
||||
*/
|
||||
async run(color)
|
||||
{
|
||||
Engine.GetGUIObjectByName("titleBar").caption = translate("Color");
|
||||
|
|
@ -64,7 +62,7 @@ class ColorMixer
|
|||
// Update return color on cancel to prevent malformed values from initial input.
|
||||
color = this.color.join(" ");
|
||||
|
||||
Engine.PopGuiPage(await closePromise === 0 ? color : this.color.join(" "));
|
||||
return await closePromise === 0 ? color : this.color.join(" ");
|
||||
}
|
||||
|
||||
updateFromSlider(index)
|
||||
|
|
@ -85,5 +83,5 @@ ColorMixer.prototype.captions = [translate("Cancel"), translate("Save")];
|
|||
|
||||
function init(color)
|
||||
{
|
||||
new ColorMixer(color);
|
||||
return new ColorMixer().run(color);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,9 +3,7 @@ var g_IncompatibleModsFile = "gui/incompatible_mods/incompatible_mods.txt";
|
|||
function init(data)
|
||||
{
|
||||
Engine.GetGUIObjectByName("mainText").caption = Engine.TranslateLines(Engine.ReadFile(g_IncompatibleModsFile));
|
||||
}
|
||||
|
||||
function closePage()
|
||||
{
|
||||
Engine.PopGuiPage();
|
||||
return new Promise(closePageCallback => {
|
||||
Engine.GetGUIObjectByName("btnClose").onPress = closePageCallback;
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@
|
|||
|
||||
<object name="btnClose" type="button" style="ModernButtonRed" size="18 100%-45 100%-18 100%-17" hotkey="cancel">
|
||||
<translatableAttribute id="caption">Ok</translatableAttribute>
|
||||
<action on="Press">closePage();</action>
|
||||
</object>
|
||||
|
||||
</object>
|
||||
|
|
|
|||
|
|
@ -27,10 +27,10 @@ var g_ModIOState = {
|
|||
/**
|
||||
* Finished status indicators
|
||||
*/
|
||||
"ready": progressData => {
|
||||
"ready": (progressData, closePageCallback) => {
|
||||
// GameID acquired, ready to fetch mod list
|
||||
if (!g_RequestCancelled)
|
||||
updateModList();
|
||||
updateModList(closePageCallback);
|
||||
},
|
||||
"listed": progressData => {
|
||||
// List of available mods acquired
|
||||
|
|
@ -65,7 +65,7 @@ var g_ModIOState = {
|
|||
/**
|
||||
* Error/Failure status indicators.
|
||||
*/
|
||||
"failed_gameid": async(progressData) => {
|
||||
"failed_gameid": async(progressData, closePageCallback) => {
|
||||
// Game ID couldn't be retrieved
|
||||
const promise = showErrorMessageBox(
|
||||
sprintf(translateWithContext("mod.io error message", "Game ID could not be retrieved.\n\n%(technicalDetails)s"), {
|
||||
|
|
@ -76,11 +76,11 @@ var g_ModIOState = {
|
|||
if (!promise)
|
||||
return;
|
||||
if (await promise === 0)
|
||||
closePage();
|
||||
closePageCallback();
|
||||
else
|
||||
init();
|
||||
},
|
||||
"failed_listing": async(progressData) => {
|
||||
"failed_listing": async(progressData, closePageCallback) => {
|
||||
// Mod list couldn't be retrieved
|
||||
const promise = showErrorMessageBox(
|
||||
sprintf(translateWithContext("mod.io error message", "Mod List could not be retrieved.\n\n%(technicalDetails)s"), {
|
||||
|
|
@ -91,9 +91,9 @@ var g_ModIOState = {
|
|||
if (!promise)
|
||||
return;
|
||||
if (await promise === 0)
|
||||
cancelModListUpdate();
|
||||
cancelModListUpdate(closePageCallback);
|
||||
else
|
||||
updateModList();
|
||||
updateModList(closePageCallback);
|
||||
},
|
||||
"failed_downloading": async(progressData) => {
|
||||
// File couldn't be retrieved
|
||||
|
|
@ -131,7 +131,7 @@ var g_ModIOState = {
|
|||
}
|
||||
};
|
||||
|
||||
async function init(data)
|
||||
function init(data)
|
||||
{
|
||||
const promise = progressDialog(
|
||||
translate("Initializing mod.io interface."),
|
||||
|
|
@ -142,11 +142,16 @@ async function init(data)
|
|||
g_Failure = false;
|
||||
Engine.ModIoStartGetGameId();
|
||||
|
||||
await promise;
|
||||
closePage();
|
||||
return Promise.race([
|
||||
promise,
|
||||
new Promise(closePageCallback => {
|
||||
Engine.GetGUIObjectByName("backButton").onPress = closePageCallback;
|
||||
Engine.GetGUIObjectByName("modio").onTick = onTick.bind(null, closePageCallback);
|
||||
})
|
||||
]);
|
||||
}
|
||||
|
||||
function onTick()
|
||||
function onTick(closePageCallback)
|
||||
{
|
||||
let progressData = Engine.ModIoGetDownloadProgress();
|
||||
|
||||
|
|
@ -157,7 +162,7 @@ function onTick()
|
|||
return;
|
||||
}
|
||||
|
||||
handler(progressData);
|
||||
handler(progressData, closePageCallback);
|
||||
if (!progressData.status.startsWith("failed"))
|
||||
Engine.ModIoAdvanceRequest();
|
||||
}
|
||||
|
|
@ -230,13 +235,13 @@ function showModDescription()
|
|||
Engine.GetGUIObjectByName("modError").caption = isSelected && isInvalid ? sprintf(translate("Invalid mod: %(error)s"), {"error": g_ModsAvailableOnline[selected].error }) : "";
|
||||
}
|
||||
|
||||
function cancelModListUpdate()
|
||||
function cancelModListUpdate(closePageCallback)
|
||||
{
|
||||
cancelRequest();
|
||||
|
||||
if (!g_ModsAvailableOnline.length)
|
||||
{
|
||||
closePage();
|
||||
closePageCallback();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -244,7 +249,7 @@ function cancelModListUpdate()
|
|||
Engine.GetGUIObjectByName('refreshButton').enabled = true;
|
||||
}
|
||||
|
||||
async function updateModList()
|
||||
async function updateModList(closePageCallback)
|
||||
{
|
||||
clearModList();
|
||||
Engine.GetGUIObjectByName("refreshButton").enabled = false;
|
||||
|
|
@ -260,7 +265,7 @@ async function updateModList()
|
|||
Engine.ModIoStartListMods();
|
||||
|
||||
await promise;
|
||||
cancelModListUpdate();
|
||||
cancelModListUpdate(closePageCallback);
|
||||
}
|
||||
|
||||
async function downloadMod()
|
||||
|
|
@ -296,11 +301,6 @@ function cancelRequest()
|
|||
hideDialog();
|
||||
}
|
||||
|
||||
function closePage()
|
||||
{
|
||||
Engine.PopGuiPage();
|
||||
}
|
||||
|
||||
function showErrorMessageBox(caption, title, buttonCaptions)
|
||||
{
|
||||
if (g_Failure)
|
||||
|
|
|
|||
|
|
@ -8,11 +8,6 @@
|
|||
<object type="image" sprite="ModernFade"/>
|
||||
|
||||
<object name="modio" type="image" style="ModernDialog" size="10% 10% 90% 90%">
|
||||
|
||||
<action on="Tick">
|
||||
onTick();
|
||||
</action>
|
||||
|
||||
<!-- Page Title -->
|
||||
<object style="ModernLabelText" type="text" size="50%-128 -18 50%+128 14">
|
||||
<translatableAttribute id="caption">mod.io Mods</translatableAttribute>
|
||||
|
|
@ -84,9 +79,8 @@
|
|||
</object>
|
||||
|
||||
<!-- Buttons -->
|
||||
<object type="button" style="ModernButtonRed" size="100%-552 100%-44 100%-372 100%-16">
|
||||
<object name="backButton" type="button" style="ModernButtonRed" size="100%-552 100%-44 100%-372 100%-16">
|
||||
<translatableAttribute id="caption">Back</translatableAttribute>
|
||||
<action on="Press">closePage();</action>
|
||||
</object>
|
||||
|
||||
<object name="refreshButton" type="button" style="ModernButtonRed" size="100%-368 100%-44 100%-188 100%-16" enabled="false">
|
||||
|
|
|
|||
|
|
@ -1,4 +1,7 @@
|
|||
function init(data)
|
||||
{
|
||||
Engine.GetGUIObjectByName("mainText").caption = Engine.TranslateLines(Engine.ReadFile("gui/modmod/help/help.txt"));
|
||||
return new Promise(closePageCallback => {
|
||||
Engine.GetGUIObjectByName("closeButton").onPress = closePageCallback;
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,9 +17,8 @@
|
|||
<object name="mainText" type="text" style="ModernTextPanel"/>
|
||||
</object>
|
||||
|
||||
<object type="button" style="ModernButtonRed" tooltip_style="snToolTip" size="0%+24 100%-52 33%-4 100%-24" hotkey="cancel">
|
||||
<object name="closeButton" type="button" style="ModernButtonRed" tooltip_style="snToolTip" size="0%+24 100%-52 33%-4 100%-24" hotkey="cancel">
|
||||
<translatableAttribute id="caption">Close</translatableAttribute>
|
||||
<action on="Press">Engine.PopGuiPage();</action>
|
||||
</object>
|
||||
<object type="button" style="ModernButtonRed" size="33%+4 100%-52 66%-4 100%-24">
|
||||
<translatableAttribute id="caption">Modding Guide</translatableAttribute>
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ var g_TermsPage;
|
|||
var g_TermsFile;
|
||||
var g_TermsSprintf;
|
||||
|
||||
function init(data)
|
||||
async function init(data)
|
||||
{
|
||||
g_TermsPage = data.page;
|
||||
g_TermsFile = data.file;
|
||||
|
|
@ -20,6 +20,15 @@ function init(data)
|
|||
Engine.GetGUIObjectByName("title").caption = data.title;
|
||||
initURLButtons(data.termsURL, data.urlButtons);
|
||||
initLanguageSelection();
|
||||
|
||||
const accepted = await new Promise(resolve => {
|
||||
Engine.GetGUIObjectByName("cancelButton").onPress = resolve.bind(null, false);
|
||||
Engine.GetGUIObjectByName("connectButton").onPress = resolve.bind(null, true);
|
||||
});
|
||||
return {
|
||||
"page": g_TermsPage,
|
||||
"accepted": accepted
|
||||
};
|
||||
}
|
||||
|
||||
function initURLButtons(termsURL, urlButtons)
|
||||
|
|
@ -82,11 +91,3 @@ function initLanguageSelection()
|
|||
|
||||
languageDropdown.selected = languageDropdown.list.length - 1;
|
||||
}
|
||||
|
||||
function closeTerms(accepted)
|
||||
{
|
||||
Engine.PopGuiPage({
|
||||
"page": g_TermsPage,
|
||||
"accepted": accepted
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,14 +29,12 @@
|
|||
<object size="170 0 330 100%" type="button" name="button[1]" style="ModernButtonRed" hidden="true"/>
|
||||
|
||||
<object size="100%-355 0 100% 100%">
|
||||
<object type="button" style="ModernButtonRed" size="0 0 160 100%" hotkey="cancel">
|
||||
<object name="cancelButton" type="button" style="ModernButtonRed" size="0 0 160 100%" hotkey="cancel">
|
||||
<translatableAttribute id="caption">Decline</translatableAttribute>
|
||||
<action on="Press">closeTerms(false);</action>
|
||||
</object>
|
||||
|
||||
<object name="connectButton" type="button" style="ModernButtonRed" size="170 0 330 100%">
|
||||
<translatableAttribute id="caption">Accept</translatableAttribute>
|
||||
<action on="Press">closeTerms(true);</action>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
|
|
|
|||
|
|
@ -4,6 +4,14 @@
|
|||
*/
|
||||
class TimedConfirmation
|
||||
{
|
||||
messageObject = Engine.GetGUIObjectByName("tmcText");
|
||||
panel = Engine.GetGUIObjectByName("tmcMain");
|
||||
|
||||
constructor()
|
||||
{
|
||||
this.panel.onTick = this.onTick.bind(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Object} data
|
||||
* @param {Number} data.width - The width of the confirmation box
|
||||
|
|
@ -15,15 +23,7 @@ class TimedConfirmation
|
|||
* @param {String|undefined} data.buttonCaptions - The captions used for buttons (if not defined, defaults to 'OK')
|
||||
* @param {String|undefined} data.font - The used font
|
||||
*/
|
||||
constructor(data)
|
||||
{
|
||||
this.messageObject = Engine.GetGUIObjectByName("tmcText");
|
||||
this.panel = Engine.GetGUIObjectByName("tmcMain");
|
||||
this.panel.onTick = this.onTick.bind(this);
|
||||
this.setup(data);
|
||||
}
|
||||
|
||||
async setup(data)
|
||||
setup(data)
|
||||
{
|
||||
Engine.GetGUIObjectByName("tmcTitleBar").caption = data.title;
|
||||
|
||||
|
|
@ -37,7 +37,6 @@ class TimedConfirmation
|
|||
this.updateDisplayedTimer(data.timeout);
|
||||
|
||||
const cancelHotkey = Engine.GetGUIObjectByName("tmcCancelHotkey");
|
||||
cancelHotkey.onPress = Engine.PopGuiPage;
|
||||
|
||||
const lRDiff = data.width / 2;
|
||||
const uDDiff = data.height / 2;
|
||||
|
|
@ -49,8 +48,7 @@ class TimedConfirmation
|
|||
const closePromise =
|
||||
setButtonCaptionsAndVisibility(button, captions, cancelHotkey, "tmcButton");
|
||||
distributeButtonsHorizontally(button, captions);
|
||||
|
||||
Engine.PopGuiPage(await closePromise);
|
||||
return closePromise;
|
||||
}
|
||||
|
||||
onTick()
|
||||
|
|
@ -73,5 +71,5 @@ class TimedConfirmation
|
|||
|
||||
function init(data)
|
||||
{
|
||||
new TimedConfirmation(data);
|
||||
return new TimedConfirmation().setup(data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,11 +5,11 @@
|
|||
*/
|
||||
class NewCampaignModal
|
||||
{
|
||||
constructor(campaignTemplate)
|
||||
constructor(campaignTemplate, closePageCallback)
|
||||
{
|
||||
this.template = campaignTemplate;
|
||||
|
||||
Engine.GetGUIObjectByName('cancelButton').onPress = () => Engine.PopGuiPage();
|
||||
Engine.GetGUIObjectByName('cancelButton').onPress = closePageCallback;
|
||||
Engine.GetGUIObjectByName('startButton').onPress = () => this.createAndStartCampaign();
|
||||
Engine.GetGUIObjectByName('runDescription').caption = translateWithContext("Campaign Template", this.template.Name);
|
||||
Engine.GetGUIObjectByName('runDescription').onTextEdit = () => {
|
||||
|
|
@ -38,5 +38,7 @@ var g_NewCampaignModal;
|
|||
|
||||
function init(campaign_template_data)
|
||||
{
|
||||
g_NewCampaignModal = new NewCampaignModal(campaign_template_data);
|
||||
return new Promise(closePageCallback => {
|
||||
g_NewCampaignModal = new NewCampaignModal(campaign_template_data, closePageCallback);
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,6 +59,10 @@ function init()
|
|||
category => {
|
||||
Engine.GetGUIObjectByName("creditsText").caption = g_PanelData[category].content;
|
||||
});
|
||||
|
||||
return new Promise(closePageCallback => {
|
||||
Engine.GetGUIObjectByName("closeButton").onPress = closePageCallback;
|
||||
});
|
||||
}
|
||||
|
||||
// Run through a "Content" list and parse elements for formatting and translation
|
||||
|
|
|
|||
|
|
@ -28,11 +28,8 @@
|
|||
</object>
|
||||
|
||||
<!-- Close dialog -->
|
||||
<object type="button" style="ModernButtonRed" size="100%-200 100%-45 100%-17 100%-17" hotkey="cancel">
|
||||
<object name="closeButton" type="button" style="ModernButtonRed" size="100%-200 100%-45 100%-17 100%-17" hotkey="cancel">
|
||||
<translatableAttribute id="caption">Close</translatableAttribute>
|
||||
<action on="Press">
|
||||
Engine.PopGuiPage();
|
||||
</action>
|
||||
</object>
|
||||
</object>
|
||||
</objects>
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ var g_IsRejoining = false;
|
|||
var g_PlayerAssignments; // used when rejoining
|
||||
var g_UserRating;
|
||||
|
||||
function init(attribs)
|
||||
async function init(attribs)
|
||||
{
|
||||
g_UserRating = attribs.rating;
|
||||
|
||||
|
|
@ -45,6 +45,8 @@ function init(attribs)
|
|||
}
|
||||
else if (startJoinFromLobby(attribs.name, attribs.hostJID, ""))
|
||||
switchSetupPage("pageConnecting");
|
||||
else if (cancelSetup())
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case "host":
|
||||
|
|
@ -66,8 +68,26 @@ function init(attribs)
|
|||
break;
|
||||
}
|
||||
|
||||
Engine.GetGUIObjectByName("multiplayerPages").onTick = onTick.bind(null, attribs.loadSavedGame);
|
||||
Engine.GetGUIObjectByName("continueButton").onPress = confirmSetup.bind(null, attribs.loadSavedGame);
|
||||
while (true)
|
||||
{
|
||||
await new Promise(resolve => {
|
||||
Engine.GetGUIObjectByName("cancelButton").onPress = resolve;
|
||||
Engine.GetGUIObjectByName("multiplayerPages").onTick = async() => {
|
||||
if (await onTick(attribs.loadSavedGame))
|
||||
resolve();
|
||||
};
|
||||
Engine.GetGUIObjectByName("continueButton").onPress = () => {
|
||||
if (confirmSetup(attribs.loadSavedGame))
|
||||
resolve();
|
||||
};
|
||||
Engine.GetGUIObjectByName("confirmPasswordButton").onPress = () => {
|
||||
if (confirmPassword())
|
||||
resolve();
|
||||
};
|
||||
});
|
||||
if (cancelSetup())
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
function cancelSetup()
|
||||
|
|
@ -80,10 +100,7 @@ function cancelSetup()
|
|||
|
||||
// Keep the page open if an attempt to join/host by ip failed
|
||||
if (!g_IsConnecting || (Engine.HasXmppClient() && g_GameType == "client"))
|
||||
{
|
||||
Engine.PopGuiPage();
|
||||
return;
|
||||
}
|
||||
return true;
|
||||
|
||||
g_IsConnecting = false;
|
||||
Engine.GetGUIObjectByName("hostFeedback").caption = "";
|
||||
|
|
@ -94,14 +111,19 @@ function cancelSetup()
|
|||
switchSetupPage("pageHost");
|
||||
else
|
||||
error("cancelSetup: Unrecognised multiplayer game type: " + g_GameType);
|
||||
return false;
|
||||
}
|
||||
|
||||
function confirmPassword()
|
||||
{
|
||||
if (Engine.GetGUIObjectByName("pagePassword").hidden)
|
||||
return;
|
||||
return false;
|
||||
if (startJoinFromLobby(g_ServerName, g_ServerId, Engine.GetGUIObjectByName("clientPassword").caption))
|
||||
{
|
||||
switchSetupPage("pageConnecting");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function confirmSetup(loadSavedGame)
|
||||
|
|
@ -113,15 +135,20 @@ function confirmSetup(loadSavedGame)
|
|||
let joinPort = Engine.GetGUIObjectByName("joinPort").caption;
|
||||
|
||||
if (startJoin(joinPlayerName, joinServer, getValidPort(joinPort)))
|
||||
{
|
||||
switchSetupPage("pageConnecting");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (!Engine.GetGUIObjectByName("pageHost").hidden)
|
||||
|
||||
if (!Engine.GetGUIObjectByName("pageHost").hidden)
|
||||
{
|
||||
let hostServerName = Engine.GetGUIObjectByName("hostServerName").caption;
|
||||
if (!hostServerName)
|
||||
{
|
||||
Engine.GetGUIObjectByName("hostFeedback").caption = translate("Please enter a valid server name.");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
let hostPort = Engine.GetGUIObjectByName("hostPort").caption;
|
||||
|
|
@ -132,7 +159,7 @@ function confirmSetup(loadSavedGame)
|
|||
"min": g_ValidPorts.min,
|
||||
"max": g_ValidPorts.max
|
||||
});
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
let hostPlayerName = Engine.GetGUIObjectByName("hostPlayerName").caption;
|
||||
|
|
@ -141,8 +168,12 @@ function confirmSetup(loadSavedGame)
|
|||
loadSavedGame))
|
||||
{
|
||||
switchSetupPage("pageConnecting");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function startConnectionStatus(type)
|
||||
|
|
@ -156,9 +187,9 @@ function startConnectionStatus(type)
|
|||
function onTick(loadSavedGame)
|
||||
{
|
||||
if (!g_IsConnecting)
|
||||
return;
|
||||
return false;
|
||||
|
||||
pollAndHandleNetworkClient(loadSavedGame);
|
||||
return pollAndHandleNetworkClient(loadSavedGame);
|
||||
}
|
||||
|
||||
function getConnectionFailReason(reason)
|
||||
|
|
@ -191,7 +222,7 @@ function pollAndHandleNetworkClient(loadSavedGame)
|
|||
{
|
||||
var message = Engine.PollNetworkClient();
|
||||
if (!message)
|
||||
break;
|
||||
return false;
|
||||
|
||||
log(sprintf("Net message: %(message)s", { "message": uneval(message) }));
|
||||
// If we're rejoining an active game, we don't want to actually display
|
||||
|
|
@ -205,9 +236,8 @@ function pollAndHandleNetworkClient(loadSavedGame)
|
|||
switch (message.status)
|
||||
{
|
||||
case "failed":
|
||||
cancelSetup();
|
||||
reportConnectionFail(message.reason, false);
|
||||
return;
|
||||
return true;
|
||||
|
||||
default:
|
||||
error("Unrecognised netstatus type: " + message.status);
|
||||
|
|
@ -219,12 +249,11 @@ function pollAndHandleNetworkClient(loadSavedGame)
|
|||
switch (message.status)
|
||||
{
|
||||
case "disconnected":
|
||||
cancelSetup();
|
||||
if (message.reason === 16)
|
||||
reportHandshakeDisconnect(message.mismatch_type, message.client_mismatch, message.server_mismatch);
|
||||
else
|
||||
reportDisconnect(message.reason, false);
|
||||
return;
|
||||
return true;
|
||||
|
||||
default:
|
||||
error("Unrecognised netstatus type: " + message.status);
|
||||
|
|
@ -244,7 +273,7 @@ function pollAndHandleNetworkClient(loadSavedGame)
|
|||
});
|
||||
|
||||
// Process further pending netmessages in the session page
|
||||
return;
|
||||
return false;
|
||||
|
||||
case "chat":
|
||||
break;
|
||||
|
|
@ -265,9 +294,8 @@ function pollAndHandleNetworkClient(loadSavedGame)
|
|||
switch (message.status)
|
||||
{
|
||||
case "failed":
|
||||
cancelSetup();
|
||||
reportConnectionFail(message.reason, false);
|
||||
return;
|
||||
return true;
|
||||
|
||||
default:
|
||||
error("Unrecognised netstatus type: " + message.status);
|
||||
|
|
@ -283,16 +311,14 @@ function pollAndHandleNetworkClient(loadSavedGame)
|
|||
break;
|
||||
|
||||
case "authenticated":
|
||||
handleAuthenticated(message, loadSavedGame);
|
||||
return;
|
||||
return handleAuthenticated(message, loadSavedGame);
|
||||
|
||||
case "disconnected":
|
||||
cancelSetup();
|
||||
if (message.reason === 16)
|
||||
reportHandshakeDisconnect(message.mismatch_type, message.client_mismatch_component, message.server_mismatch_component);
|
||||
else
|
||||
reportDisconnect(message.reason, false);
|
||||
return;
|
||||
return true;
|
||||
|
||||
default:
|
||||
error("Unrecognised netstatus type: " + message.status);
|
||||
|
|
@ -318,7 +344,7 @@ async function handleAuthenticated(message, loadSavedGame)
|
|||
Engine.GetGUIObjectByName("connectionStatus").caption =
|
||||
translate("Game has already started, rejoining...");
|
||||
g_IsRejoining = true;
|
||||
return; // we'll process the game setup messages in the next tick
|
||||
return false; // we'll process the game setup messages in the next tick
|
||||
}
|
||||
g_IsConnecting = false;
|
||||
|
||||
|
|
@ -328,7 +354,7 @@ async function handleAuthenticated(message, loadSavedGame)
|
|||
{
|
||||
Engine.DisconnectNetworkGame();
|
||||
cancelSetup();
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
Engine.SwitchGuiPage("page_gamesetup.xml", {
|
||||
|
|
@ -336,7 +362,7 @@ async function handleAuthenticated(message, loadSavedGame)
|
|||
"serverName": g_ServerName,
|
||||
"hasPassword": g_ServerHasPassword
|
||||
});
|
||||
return; // don't process any more messages - leave them for the game GUI loop
|
||||
return false; // don't process any more messages - leave them for the game GUI loop
|
||||
}
|
||||
|
||||
function switchSetupPage(newPage)
|
||||
|
|
@ -385,7 +411,6 @@ function startHost(playername, servername, port, password, loadSavedGame)
|
|||
if (Engine.HasXmppClient() &&
|
||||
Engine.GetGameList().some(game => game.name == servername))
|
||||
{
|
||||
cancelSetup();
|
||||
hostFeedback.caption = translate("Game name already in use.");
|
||||
return false;
|
||||
}
|
||||
|
|
@ -397,7 +422,6 @@ function startHost(playername, servername, port, password, loadSavedGame)
|
|||
}
|
||||
catch (e)
|
||||
{
|
||||
cancelSetup();
|
||||
messageBox(
|
||||
400, 200,
|
||||
sprintf(translate("Cannot host game: %(message)s."), { "message": e.message }),
|
||||
|
|
@ -426,7 +450,6 @@ function startJoin(playername, ip, port)
|
|||
}
|
||||
catch (e)
|
||||
{
|
||||
cancelSetup();
|
||||
messageBox(
|
||||
400, 200,
|
||||
sprintf(translate("Cannot join game: %(message)s."), { "message": e.message }),
|
||||
|
|
@ -456,7 +479,6 @@ function startJoinFromLobby(playername, hostJID, password)
|
|||
{
|
||||
if (!Engine.HasXmppClient())
|
||||
{
|
||||
cancelSetup();
|
||||
messageBox(
|
||||
400, 200,
|
||||
sprintf("You cannot join a lobby game without logging in to the lobby."),
|
||||
|
|
@ -471,7 +493,6 @@ function startJoinFromLobby(playername, hostJID, password)
|
|||
}
|
||||
catch (e)
|
||||
{
|
||||
cancelSetup();
|
||||
messageBox(
|
||||
400, 200,
|
||||
sprintf(translate("Cannot join game: %(message)s."), { "message": e.message }),
|
||||
|
|
|
|||
|
|
@ -123,9 +123,8 @@
|
|||
<translatableAttribute id="caption">Continue</translatableAttribute>
|
||||
</object>
|
||||
|
||||
<object type="button" style="ModernButtonRed" size="18 100%-45 50%-5 100%-17" hotkey="cancel">
|
||||
<object name="cancelButton" type="button" style="ModernButtonRed" size="18 100%-45 50%-5 100%-17" hotkey="cancel">
|
||||
<translatableAttribute id="caption">Cancel</translatableAttribute>
|
||||
<action on="Press">cancelSetup();</action>
|
||||
</object>
|
||||
|
||||
<object name="pageConnecting" hidden="true">
|
||||
|
|
@ -146,7 +145,6 @@
|
|||
</object>
|
||||
<object name="confirmPasswordButton" hotkey="confirm" type="button" size="50%+5 100%-45 100%-18 100%-17" style="ModernButtonRed">
|
||||
<translatableAttribute id="caption">Confirm</translatableAttribute>
|
||||
<action on="Press">confirmPassword();</action>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
class HotkeysPage
|
||||
{
|
||||
constructor(metadata)
|
||||
constructor(metadata, closePageCallback)
|
||||
{
|
||||
this.metadata = metadata;
|
||||
|
||||
|
|
@ -23,7 +23,7 @@ class HotkeysPage
|
|||
this.saveButton = Engine.GetGUIObjectByName("hotkeySave");
|
||||
this.saveButton.enabled = false;
|
||||
|
||||
Engine.GetGUIObjectByName("hotkeyClose").onPress = () => Engine.PopGuiPage();
|
||||
Engine.GetGUIObjectByName("hotkeyClose").onPress = closePageCallback;
|
||||
Engine.GetGUIObjectByName("hotkeyReset").onPress = () => this.resetUserHotkeys();
|
||||
this.saveButton.onPress = () => {
|
||||
this.saveUserHotkeys();
|
||||
|
|
@ -181,7 +181,9 @@ class HotkeysPage
|
|||
|
||||
function init()
|
||||
{
|
||||
let hotkeyPage = new HotkeysPage(new HotkeyMetadata());
|
||||
return new Promise(closePageCallback => {
|
||||
new HotkeysPage(new HotkeyMetadata(), closePageCallback);
|
||||
});
|
||||
}
|
||||
|
||||
HotkeysPage.prototype.UnavailableTooltipString = markForTranslation("No tooltip available.");
|
||||
|
|
|
|||
|
|
@ -3,8 +3,9 @@
|
|||
*/
|
||||
class SavegameLoader
|
||||
{
|
||||
constructor()
|
||||
constructor(closePageCallback)
|
||||
{
|
||||
this.closePageCallback = closePageCallback;
|
||||
this.confirmButton = Engine.GetGUIObjectByName("confirmButton");
|
||||
this.confirmButton.caption = translate("Load");
|
||||
this.confirmButton.enabled = false;
|
||||
|
|
@ -27,7 +28,7 @@ class SavegameLoader
|
|||
|
||||
if (sameEngineVersion && sameMods)
|
||||
{
|
||||
Engine.PopGuiPage(gameId);
|
||||
this.closePageCallback(gameId);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -60,6 +61,6 @@ class SavegameLoader
|
|||
translate("Warning"),
|
||||
[translate("No"), translate("Yes")]);
|
||||
if (buttonIndex === 1)
|
||||
Engine.PopGuiPage(gameId);
|
||||
this.closePageCallback(gameId);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
*/
|
||||
class SavegamePage
|
||||
{
|
||||
constructor(data)
|
||||
constructor(data, closePageCallback)
|
||||
{
|
||||
this.savegameList = new SavegameList(data && data.campaignRun || null);
|
||||
|
||||
|
|
@ -18,7 +18,7 @@ class SavegamePage
|
|||
const savePage = !!data?.savedGameData;
|
||||
if (savePage)
|
||||
{
|
||||
this.savegameWriter = new SavegameWriter(data.savedGameData);
|
||||
this.savegameWriter = new SavegameWriter(closePageCallback, data.savedGameData);
|
||||
this.savegameList.registerSelectionChangeHandler(this.savegameWriter);
|
||||
let size = this.savegameList.gameSelection.size;
|
||||
size.bottom -= 24;
|
||||
|
|
@ -26,13 +26,13 @@ class SavegamePage
|
|||
}
|
||||
else
|
||||
{
|
||||
this.savegameLoader = new SavegameLoader();
|
||||
this.savegameLoader = new SavegameLoader(closePageCallback);
|
||||
this.savegameList.registerSelectionChangeHandler(this.savegameLoader);
|
||||
this.savegameList.selectFirst();
|
||||
}
|
||||
|
||||
Engine.GetGUIObjectByName("title").caption = savePage ? translate("Save Game") : translate("Load Game");
|
||||
Engine.GetGUIObjectByName("cancel").onPress = () => { Engine.PopGuiPage(); };
|
||||
Engine.GetGUIObjectByName("cancel").onPress = closePageCallback;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -40,5 +40,7 @@ var g_SavegamePage;
|
|||
|
||||
function init(data)
|
||||
{
|
||||
g_SavegamePage = new SavegamePage(data);
|
||||
return new Promise(closePageCallback => {
|
||||
g_SavegamePage = new SavegamePage(data, closePageCallback);
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,8 +4,9 @@
|
|||
*/
|
||||
class SavegameWriter
|
||||
{
|
||||
constructor(savedGameData)
|
||||
constructor(closePageCallback, savedGameData)
|
||||
{
|
||||
this.closePageCallback = closePageCallback;
|
||||
this.savedGameData = savedGameData;
|
||||
|
||||
let saveNew = () => {
|
||||
|
|
@ -58,6 +59,6 @@ class SavegameWriter
|
|||
|
||||
Engine[gameID ? "SaveGame" : "SaveGamePrefix"](name, desc, this.savedGameData);
|
||||
|
||||
Engine.PopGuiPage();
|
||||
this.closePageCallback();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,13 +3,13 @@
|
|||
*/
|
||||
class LobbyHandler
|
||||
{
|
||||
constructor(dialog)
|
||||
constructor(closePageCallback, dialog)
|
||||
{
|
||||
this.xmppMessages = new XmppMessages();
|
||||
|
||||
this.profilePage = new ProfilePage(this.xmppMessages);
|
||||
this.leaderboardPage = new LeaderboardPage(this.xmppMessages);
|
||||
this.lobbyPage = new LobbyPage(dialog, this.xmppMessages, this.leaderboardPage, this.profilePage);
|
||||
this.lobbyPage = new LobbyPage(closePageCallback, dialog, this.xmppMessages, this.leaderboardPage, this.profilePage);
|
||||
|
||||
this.xmppMessages.processHistoricMessages();
|
||||
|
||||
|
|
|
|||
|
|
@ -3,8 +3,9 @@
|
|||
*/
|
||||
class QuitButton
|
||||
{
|
||||
constructor(dialog, leaderboardPage, profilePage)
|
||||
constructor(closePageCallback, dialog, leaderboardPage, profilePage)
|
||||
{
|
||||
this.closePageCallback = closePageCallback;
|
||||
let closeDialog = this.closeDialog.bind(this);
|
||||
let returnToMainMenu = this.returnToMainMenu.bind(this);
|
||||
let onPress = dialog ? closeDialog : returnToMainMenu;
|
||||
|
|
@ -29,7 +30,7 @@ class QuitButton
|
|||
closeDialog()
|
||||
{
|
||||
Engine.LobbySetPlayerPresence("playing");
|
||||
Engine.PopGuiPage();
|
||||
this.closePageCallback();
|
||||
}
|
||||
|
||||
returnToMainMenu()
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
*/
|
||||
class LobbyPage
|
||||
{
|
||||
constructor(dialog, xmppMessages, leaderboardPage, profilePage)
|
||||
constructor(closePageCallback, dialog, xmppMessages, leaderboardPage, profilePage)
|
||||
{
|
||||
Engine.ProfileStart("Create LobbyPage");
|
||||
let mapCache = new MapCache();
|
||||
|
|
@ -25,7 +25,8 @@ class LobbyPage
|
|||
Engine.GetGUIObjectByName("hostSavedGameButton"), true),
|
||||
"leaderboardButton": new LeaderboardButton(xmppMessages, leaderboardPage),
|
||||
"profileButton": new ProfileButton(xmppMessages, profilePage),
|
||||
"quitButton": new QuitButton(dialog, leaderboardPage, profilePage)
|
||||
"quitButton": new QuitButton(closePageCallback, dialog, leaderboardPage,
|
||||
profilePage)
|
||||
},
|
||||
"panels": {
|
||||
"chatPanel": new ChatPanel(xmppMessages),
|
||||
|
|
|
|||
|
|
@ -31,10 +31,13 @@ var g_LobbyHandler;
|
|||
/**
|
||||
* Called after the XmppConnection succeeded and when returning from a game.
|
||||
*/
|
||||
function init(attribs)
|
||||
async function init(attribs)
|
||||
{
|
||||
if (g_Settings)
|
||||
g_LobbyHandler = new LobbyHandler(attribs && attribs.dialog);
|
||||
else
|
||||
error("Could not load settings");
|
||||
return new Promise(closePageCallback => {
|
||||
g_LobbyHandler = new LobbyHandler(closePageCallback, attribs && attribs.dialog);
|
||||
});
|
||||
|
||||
error("Could not load settings");
|
||||
return undefined;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,11 +13,10 @@ function init()
|
|||
|
||||
var localeText = Engine.GetGUIObjectByName("localeText");
|
||||
localeText.caption = currentLocale;
|
||||
}
|
||||
|
||||
function cancelSetup()
|
||||
{
|
||||
Engine.PopGuiPage();
|
||||
return new Promise(closePageCallback => {
|
||||
Engine.GetGUIObjectByName("cancelButton").onPress = closePageCallback;
|
||||
});
|
||||
}
|
||||
|
||||
function applySelectedLocale()
|
||||
|
|
|
|||
|
|
@ -32,9 +32,8 @@
|
|||
</object>
|
||||
<object name="localeText" type="text" size="40%+10 80 100% 105" textcolor="white" />
|
||||
|
||||
<object type="button" size="0 100%-60 33% 100%-32" style="ModernButtonRed" hotkey="cancel">
|
||||
<object name="cancelButton" type="button" size="0 100%-60 33% 100%-32" style="ModernButtonRed" hotkey="cancel">
|
||||
<translatableAttribute id="caption">Cancel</translatableAttribute>
|
||||
<action on="Press">cancelSetup();</action>
|
||||
</object>
|
||||
|
||||
<object type="button" size="33%+5 100%-60 66% 100%-32" style="ModernButtonRed">
|
||||
|
|
|
|||
|
|
@ -46,6 +46,13 @@ function init(initData)
|
|||
|
||||
// fill the script
|
||||
scriptInput.caption = Engine.GetLocaleScript(initData.locale);
|
||||
|
||||
return new Promise(closePageCallback => {
|
||||
Engine.GetGUIObjectByName("cancelButton").onPress = closePageCallback;
|
||||
Engine.GetGUIObjectByName("acceptButton").onPress = () => {
|
||||
closePageCallback(applySelectedLocale());
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
// TODO: an onChanged event for input boxes would be useful and would allow us to avoid a tick event here.
|
||||
|
|
@ -54,11 +61,6 @@ function onTick()
|
|||
updateResultingLocale();
|
||||
}
|
||||
|
||||
function cancelSetup()
|
||||
{
|
||||
Engine.PopGuiPage();
|
||||
}
|
||||
|
||||
function updateResultingLocale()
|
||||
{
|
||||
var languageList = Engine.GetGUIObjectByName("languageList");
|
||||
|
|
@ -113,6 +115,5 @@ function autoDetectLocale()
|
|||
|
||||
function applySelectedLocale()
|
||||
{
|
||||
var resultingLocaleText = Engine.GetGUIObjectByName("resultingLocale");
|
||||
Engine.PopGuiPage(resultingLocaleText.caption);
|
||||
return Engine.GetGUIObjectByName("resultingLocale").caption;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,9 +61,8 @@
|
|||
</object>
|
||||
<object name="dictionaryFile" type="text" size="50%+10 260 100% 345" style="ModernText" />
|
||||
|
||||
<object type="button" size="0 100%-60 33% 100%-25" style="ModernButtonRed" hotkey="cancel">
|
||||
<object name="cancelButton" type="button" size="0 100%-60 33% 100%-25" style="ModernButtonRed" hotkey="cancel">
|
||||
<translatableAttribute id="caption">Cancel</translatableAttribute>
|
||||
<action on="Press">cancelSetup();</action>
|
||||
</object>
|
||||
|
||||
<object type="button" size="33%+5 100%-60 66% 100%-25" style="ModernButtonRed">
|
||||
|
|
@ -73,7 +72,6 @@
|
|||
|
||||
<object name="acceptButton" type="button" style="ModernButtonRed" size="66%+5 100%-60 100% 100%-25">
|
||||
<translatableAttribute id="caption">Accept</translatableAttribute>
|
||||
<action on="Press">applySelectedLocale();</action>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
|
|
|
|||
|
|
@ -7,4 +7,8 @@ function init()
|
|||
|
||||
// Replace anything starting with 'hotkey.' with its hotkey.
|
||||
mainText.caption = text.replace(/hotkey\.([a-z0-9_\.]+)/g, (_, k) => formatHotkeyCombinations(hotkeys[k]));
|
||||
|
||||
return new Promise(closePageCallback => {
|
||||
Engine.GetGUIObjectByName("closeButton").onPress = closePageCallback;
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,9 +17,8 @@
|
|||
<object name="mainText" type="text" style="ModernTextPanel" />
|
||||
</object>
|
||||
|
||||
<object type="button" style="ModernButtonRed" tooltip_style="snToolTip" size="100%-408 100%-52 100%-218 100%-24" hotkey="cancel">
|
||||
<object name="closeButton" type="button" style="ModernButtonRed" tooltip_style="snToolTip" size="100%-408 100%-52 100%-218 100%-24" hotkey="cancel">
|
||||
<translatableAttribute id="caption">Close</translatableAttribute>
|
||||
<action on="Press">Engine.PopGuiPage();</action>
|
||||
</object>
|
||||
|
||||
<object name="url" type="button" style="ModernButtonRed" size="100%-214 100%-52 100%-24 100%-24">
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ function init()
|
|||
let cache = new MapCache();
|
||||
let filters = new MapFilters(cache);
|
||||
let browser = new MapBrowser(cache, filters);
|
||||
browser.registerClosePageHandler(() => Engine.PopGuiPage());
|
||||
browser.openPage(false);
|
||||
browser.controls.MapFiltering.select("default", "skirmish");
|
||||
return new Promise(closePageCallback => { browser.registerClosePageHandler(closePageCallback); });
|
||||
}
|
||||
|
|
|
|||
|
|
@ -209,7 +209,7 @@ var g_OptionType = {
|
|||
}
|
||||
};
|
||||
|
||||
function init(data, hotloadData)
|
||||
async function init(data, hotloadData)
|
||||
{
|
||||
g_ChangedKeys = hotloadData ? hotloadData.changedKeys : new Set();
|
||||
g_TabCategorySelected = hotloadData ? hotloadData.tabCategorySelected : 0;
|
||||
|
|
@ -225,6 +225,13 @@ function init(data, hotloadData)
|
|||
g_TabButtonDist,
|
||||
selectPanel,
|
||||
displayOptions);
|
||||
|
||||
while (true)
|
||||
{
|
||||
await new Promise(resolve => { Engine.GetGUIObjectByName("closeButton").onPress = resolve; });
|
||||
if (await shouldClosePage())
|
||||
return g_ChangedKeys;
|
||||
}
|
||||
}
|
||||
|
||||
function getHotloadData()
|
||||
|
|
@ -436,20 +443,18 @@ async function saveChanges()
|
|||
}
|
||||
|
||||
/**
|
||||
* Close GUI page and inform the parent GUI page which options changed.
|
||||
**/
|
||||
async function closePage()
|
||||
* Asks the user if this page really should be closed.
|
||||
*/
|
||||
async function shouldClosePage()
|
||||
{
|
||||
if (Engine.ConfigDB_HasChanges("user"))
|
||||
{
|
||||
const buttonIndex = await messageBox(
|
||||
500, 200,
|
||||
translate("You have unsaved changes, do you want to close this window?"),
|
||||
translate("Warning"),
|
||||
[translate("No"), translate("Yes")]);
|
||||
if (buttonIndex === 0)
|
||||
return;
|
||||
}
|
||||
if (!Engine.ConfigDB_HasChanges("user"))
|
||||
return true
|
||||
|
||||
Engine.PopGuiPage(g_ChangedKeys);
|
||||
const buttonIndex = await messageBox(
|
||||
500, 200,
|
||||
translate("You have unsaved changes, do you want to close this window?"),
|
||||
translate("Warning"),
|
||||
[translate("No"), translate("Yes")]);
|
||||
|
||||
return buttonIndex === 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,10 +58,9 @@
|
|||
<action on="Press">saveChanges();</action>
|
||||
</object>
|
||||
|
||||
<object type="button" style="ModernButtonRed" size="50%+177 100%-44 50%+339 100%-16" hotkey="cancel">
|
||||
<object name="closeButton" type="button" style="ModernButtonRed" size="50%+177 100%-44 50%+339 100%-16" hotkey="cancel">
|
||||
<translatableAttribute id="caption">Close</translatableAttribute>
|
||||
<translatableAttribute id="tooltip">Unsaved changes affect this session only</translatableAttribute>
|
||||
<action on="Press">closePage();</action>
|
||||
</object>
|
||||
|
||||
</object>
|
||||
|
|
|
|||
|
|
@ -37,9 +37,9 @@ function setFeedback(feedbackText)
|
|||
Engine.GetGUIObjectByName("continue").enabled = !feedbackText;
|
||||
}
|
||||
|
||||
function cancelButton()
|
||||
async function cancelButton()
|
||||
{
|
||||
await new Promise(resolve => { Engine.GetGUIObjectByName("cancel").onPress = resolve; });
|
||||
if (Engine.HasXmppClient())
|
||||
Engine.StopXmppClient();
|
||||
Engine.PopGuiPage();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
|
||||
<object name="cancel" type="button" size="0 0 50%-5 100%" style="ModernButtonRed" hotkey="cancel">
|
||||
<translatableAttribute id="caption">Cancel</translatableAttribute>
|
||||
<action on="Press">cancelButton();</action>
|
||||
</object>
|
||||
|
||||
<object name="continue" hotkey="confirm" type="button" size="50%+5 0 100% 100%" style="ModernButtonRed" enabled="false">
|
||||
|
|
|
|||
|
|
@ -2,6 +2,10 @@ function init()
|
|||
{
|
||||
if (Engine.ConfigDB_GetValue("user", "lobby.login"))
|
||||
loginButton();
|
||||
|
||||
return new Promise(closePageCallback => {
|
||||
Engine.GetGUIObjectByName("cancel").onPress = closePageCallback;
|
||||
});
|
||||
}
|
||||
|
||||
function loginButton()
|
||||
|
|
@ -13,8 +17,3 @@ function registerButton()
|
|||
{
|
||||
Engine.PushGuiPage("page_prelobby_register.xml");
|
||||
}
|
||||
|
||||
function cancelButton()
|
||||
{
|
||||
Engine.PopGuiPage();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@
|
|||
|
||||
<object name="cancel" type="button" size="18 100%-46 50%-5 100%-18" style="ModernButtonRed" hotkey="cancel">
|
||||
<translatableAttribute id="caption">Cancel</translatableAttribute>
|
||||
<action on="Press">cancelButton();</action>
|
||||
</object>
|
||||
|
||||
</object>
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ function init()
|
|||
initRememberPassword();
|
||||
|
||||
updateFeedback();
|
||||
|
||||
return cancelButton();
|
||||
}
|
||||
|
||||
function updateFeedback()
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
function init()
|
||||
{
|
||||
g_LobbyMessages.registered = onRegistered;
|
||||
|
||||
Engine.GetGUIObjectByName("continue").caption = translate("Register");
|
||||
|
||||
initLobbyTerms();
|
||||
|
|
@ -9,6 +7,8 @@ function init()
|
|||
initRememberPassword();
|
||||
|
||||
updateFeedback();
|
||||
|
||||
return Promise.race([ onRegistered(), cancelButton() ]);
|
||||
}
|
||||
|
||||
function updateFeedback()
|
||||
|
|
@ -32,14 +32,14 @@ function continueButton()
|
|||
Engine.ConnectXmppClient();
|
||||
}
|
||||
|
||||
function onRegistered()
|
||||
async function onRegistered()
|
||||
{
|
||||
await new Promise(resolve => { g_LobbyMessages.registered = resolve; });
|
||||
saveCredentials();
|
||||
|
||||
setFeedback(translate("Registered"));
|
||||
|
||||
Engine.StopXmppClient();
|
||||
|
||||
Engine.PopGuiPage();
|
||||
Engine.PushGuiPage("page_prelobby_login.xml");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
class CatafalquePage extends ReferencePage
|
||||
{
|
||||
constructor(data)
|
||||
constructor(closePageCallback)
|
||||
{
|
||||
super();
|
||||
super(closePageCallback);
|
||||
|
||||
this.Canvas = Engine.GetGUIObjectByName("canvas");
|
||||
this.Emblems = [];
|
||||
|
|
@ -31,7 +31,7 @@ class CatafalquePage extends ReferencePage
|
|||
|
||||
closePage()
|
||||
{
|
||||
Engine.PopGuiPage({ "page": "page_catafalque.xml" });
|
||||
this.closePageCallback({ "page": "page_catafalque.xml" });
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
function init(data = {})
|
||||
{
|
||||
g_Page = new CatafalquePage(data);
|
||||
return new Promise(closePageCallback => { g_Page = new CatafalquePage(closePageCallback); });
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
class CivInfoPage extends ReferencePage
|
||||
{
|
||||
constructor(data)
|
||||
constructor(closePageCallback)
|
||||
{
|
||||
super();
|
||||
super(closePageCallback);
|
||||
|
||||
this.civSelection = new CivSelectDropdown(this.civData);
|
||||
if (!this.civSelection.hasCivs())
|
||||
|
|
@ -25,7 +25,7 @@ class CivInfoPage extends ReferencePage
|
|||
|
||||
switchToStructreePage()
|
||||
{
|
||||
Engine.PopGuiPage({
|
||||
this.closePageCallback({
|
||||
"nextPage": "page_structree.xml",
|
||||
"args": {
|
||||
"civ": this.activeCiv
|
||||
|
|
@ -35,7 +35,7 @@ class CivInfoPage extends ReferencePage
|
|||
|
||||
closePage()
|
||||
{
|
||||
Engine.PopGuiPage({
|
||||
this.closePageCallback({
|
||||
"page": "page_civinfo.xml",
|
||||
"args": {
|
||||
"civ": this.activeCiv
|
||||
|
|
|
|||
|
|
@ -1,12 +1,14 @@
|
|||
/**
|
||||
* Initialize the dropdown containing all the available civs.
|
||||
*/
|
||||
function init(data = {})
|
||||
function init(data)
|
||||
{
|
||||
g_Page = new CivInfoPage(data);
|
||||
const promise = new Promise(closePageCallback => { g_Page = new CivInfoPage(closePageCallback); });
|
||||
|
||||
if (data.civ)
|
||||
if (data?.civ)
|
||||
g_Page.civSelection.selectCiv(data.civ);
|
||||
else
|
||||
g_Page.civSelection.selectFirstCiv();
|
||||
|
||||
return promise;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ class CivInfoButton
|
|||
|
||||
onPress()
|
||||
{
|
||||
Engine.PopGuiPage({
|
||||
this.parentPage.closePageCallback({
|
||||
"nextPage": "page_civinfo.xml",
|
||||
"args": {
|
||||
"civ": this.parentPage.activeCiv
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ class StructreeButton
|
|||
|
||||
onPress()
|
||||
{
|
||||
Engine.PopGuiPage({
|
||||
this.parentPage.closePageCallback({
|
||||
"nextPage": "page_structree.xml",
|
||||
"args": {
|
||||
"civ": this.parentPage.activeCiv
|
||||
|
|
|
|||
|
|
@ -3,8 +3,9 @@
|
|||
*/
|
||||
class ReferencePage
|
||||
{
|
||||
constructor()
|
||||
constructor(closePageCallback)
|
||||
{
|
||||
this.closePageCallback = closePageCallback;
|
||||
this.civData = loadCivData(true, false);
|
||||
|
||||
this.TemplateLoader = new TemplateLoader();
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@
|
|||
*/
|
||||
class StructreePage extends ReferencePage
|
||||
{
|
||||
constructor(data)
|
||||
constructor(closePageCallback)
|
||||
{
|
||||
super();
|
||||
super(closePageCallback);
|
||||
|
||||
this.structureBoxes = [];
|
||||
this.trainerBoxes = [];
|
||||
|
|
@ -36,7 +36,7 @@ class StructreePage extends ReferencePage
|
|||
|
||||
closePage()
|
||||
{
|
||||
Engine.PopGuiPage({
|
||||
this.closePageCallback({
|
||||
"page": "page_structree.xml",
|
||||
"args": {
|
||||
"civ": this.activeCiv
|
||||
|
|
|
|||
|
|
@ -3,12 +3,14 @@
|
|||
*
|
||||
* @param {Object} data - Parameters passed from the code that calls this page into existence.
|
||||
*/
|
||||
function init(data = {})
|
||||
function init(data)
|
||||
{
|
||||
g_Page = new StructreePage(data);
|
||||
const promise = new Promise(closePageCallback => { g_Page = new StructreePage(closePageCallback); });
|
||||
|
||||
if (data.civ)
|
||||
if (data?.civ)
|
||||
g_Page.civSelection.selectCiv(data.civ);
|
||||
else
|
||||
g_Page.civSelection.selectFirstCiv();
|
||||
|
||||
return promise;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,14 +1,15 @@
|
|||
class TipsPage
|
||||
{
|
||||
constructor(initData, hotloadData)
|
||||
constructor(initData, hotloadData, closePageCallback)
|
||||
{
|
||||
this.closePageCallback = closePageCallback;
|
||||
this.tipDisplay = new TipDisplay(initData, hotloadData);
|
||||
this.closeButton = new CloseButton(this);
|
||||
}
|
||||
|
||||
closePage()
|
||||
{
|
||||
Engine.PopGuiPage("page_tips.xml");
|
||||
this.closePageCallback("page_tips.xml");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,9 @@ var g_TipsPage;
|
|||
|
||||
function init(initData, hotloadData)
|
||||
{
|
||||
g_TipsPage = new TipsPage(initData, hotloadData);
|
||||
return new Promise(closePageCallback => {
|
||||
g_TipsPage = new TipsPage(initData, hotloadData, closePageCallback);
|
||||
});
|
||||
}
|
||||
|
||||
function getHotloadData()
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@
|
|||
*/
|
||||
class ViewerPage extends ReferencePage
|
||||
{
|
||||
constructor(data)
|
||||
constructor(closePageCallback)
|
||||
{
|
||||
super();
|
||||
super(closePageCallback);
|
||||
|
||||
this.currentTemplate = undefined;
|
||||
|
||||
|
|
@ -140,7 +140,7 @@ class ViewerPage extends ReferencePage
|
|||
|
||||
closePage()
|
||||
{
|
||||
Engine.PopGuiPage({ "civ": this.activeCiv, "page": "page_viewer.xml" });
|
||||
this.closePageCallback({ "civ": this.activeCiv, "page": "page_viewer.xml" });
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ g_TooltipTextFormats.nameSecondary.font = "sans-bold-16";
|
|||
*/
|
||||
function init(data)
|
||||
{
|
||||
g_Page = new ViewerPage();
|
||||
const promise = new Promise(closePageCallback => { g_Page = new ViewerPage(closePageCallback); });
|
||||
g_Page.selectTemplate(data);
|
||||
return promise;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
class CampaignSession
|
||||
{
|
||||
constructor(data)
|
||||
constructor(data, closePageCallback)
|
||||
{
|
||||
this.run = new CampaignRun(data.run).load();
|
||||
registerPlayersFinishedHandler(this.onFinish.bind(this));
|
||||
registerPlayersFinishedHandler(this.onFinish.bind(this, closePageCallback));
|
||||
this.endGameData = {
|
||||
"won": false,
|
||||
"initData": data,
|
||||
|
|
@ -11,7 +11,7 @@ class CampaignSession
|
|||
};
|
||||
}
|
||||
|
||||
onFinish(players, won)
|
||||
onFinish(closePageCallback, players, won)
|
||||
{
|
||||
let playerID = Engine.GetPlayerID();
|
||||
if (players.indexOf(playerID) === -1)
|
||||
|
|
@ -24,7 +24,7 @@ class CampaignSession
|
|||
|
||||
// Run the endgame script.
|
||||
Engine.PushGuiPage(this.getEndGame(), this.endGameData);
|
||||
Engine.PopGuiPage();
|
||||
closePageCallback();
|
||||
}
|
||||
|
||||
getMenu()
|
||||
|
|
|
|||
|
|
@ -250,7 +250,7 @@ function init(initData, hotloadData)
|
|||
{
|
||||
Engine.EndGame();
|
||||
Engine.SwitchGuiPage("page_pregame.xml");
|
||||
return;
|
||||
return undefined;
|
||||
}
|
||||
|
||||
// Fallback used by atlas
|
||||
|
|
@ -269,8 +269,10 @@ function init(initData, hotloadData)
|
|||
restoreSavedGameData(initData.savedGUIData);
|
||||
}
|
||||
|
||||
if (g_InitAttributes.campaignData)
|
||||
g_CampaignSession = new CampaignSession(g_InitAttributes.campaignData);
|
||||
const promise = new Promise(closePageCallback => {
|
||||
if (g_InitAttributes.campaignData)
|
||||
g_CampaignSession = new CampaignSession(g_InitAttributes.campaignData, closePageCallback);
|
||||
});
|
||||
|
||||
let mapCache = new MapCache();
|
||||
g_Cheats = new Cheats();
|
||||
|
|
@ -331,6 +333,8 @@ function init(initData, hotloadData)
|
|||
onSimulationUpdate();
|
||||
|
||||
setTimeout(displayGamestateNotifications, 1000);
|
||||
|
||||
return promise;
|
||||
}
|
||||
|
||||
function registerPlayersInitHandler(handler)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
function init(data)
|
||||
async function init(data)
|
||||
{
|
||||
const paragraphObjects = Engine.GetGUIObjectByName("paragraphs").children;
|
||||
|
||||
|
|
@ -25,12 +25,12 @@ function init(data)
|
|||
}
|
||||
|
||||
Engine.GetGUIObjectByName("displaySplashScreen").checked = Engine.ConfigDB_GetValue("user", "gui.splashscreen.enable") === "true";
|
||||
}
|
||||
|
||||
function closePage()
|
||||
{
|
||||
await new Promise(resolve => {
|
||||
Engine.GetGUIObjectByName("btnOK").onPress = resolve;
|
||||
});
|
||||
|
||||
Engine.ConfigDB_CreateValue("user", "gui.splashscreen.enable", String(Engine.GetGUIObjectByName("displaySplashScreen").checked));
|
||||
Engine.ConfigDB_CreateValue("user", "gui.splashscreen.version", Engine.CalculateMD5(Engine.ReadFile("gui/splashscreen/splashscreen.xml")));
|
||||
Engine.ConfigDB_SaveChanges("user");
|
||||
Engine.PopGuiPage();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,7 +54,6 @@
|
|||
|
||||
<object name="btnOK" type="button" style="ModernButtonRed" size="18 100%-45 50%-5 100%-17" hotkey="cancel">
|
||||
<translatableAttribute id="caption">OK</translatableAttribute>
|
||||
<action on="Press">closePage();</action>
|
||||
</object>
|
||||
|
||||
<object type="button" style="ModernButtonRed" size="50%+5 100%-45 100%-18 100%-17">
|
||||
|
|
|
|||
|
|
@ -135,10 +135,22 @@ var g_SelectedChart = {
|
|||
"type": [0, 0]
|
||||
};
|
||||
|
||||
function init(data)
|
||||
async function init(data)
|
||||
{
|
||||
initSummaryData(data);
|
||||
initGUISummary();
|
||||
|
||||
while (true)
|
||||
{
|
||||
const branchless = await new Promise(resolve => {
|
||||
Engine.GetGUIObjectByName("continueButton").onPress = resolve.bind(null, true);
|
||||
Engine.GetGUIObjectByName("summaryHotkey").onPress = resolve.bind(null, true);
|
||||
Engine.GetGUIObjectByName("cancelHotkey").onPress = resolve.bind(null, false);
|
||||
});
|
||||
|
||||
if (branchless || data.gui.isInGame)
|
||||
return continueButton(data);
|
||||
}
|
||||
}
|
||||
|
||||
function initSummaryData(data)
|
||||
|
|
@ -454,30 +466,32 @@ function updatePanelData(panelInfo)
|
|||
updateCountersTeam(teamCounterFn, panelInfo.counters, panelInfo.headings, index);
|
||||
}
|
||||
|
||||
function continueButton()
|
||||
function continueButton(gameData)
|
||||
{
|
||||
let summarySelection = {
|
||||
"panel": g_TabCategorySelected,
|
||||
"charts": g_SelectedChart,
|
||||
"teamCharts": Engine.GetGUIObjectByName("toggleTeamBox").checked
|
||||
};
|
||||
if (g_GameData.gui.isInGame)
|
||||
Engine.PopGuiPage({
|
||||
if (gameData.gui.isInGame)
|
||||
return {
|
||||
"summarySelection": summarySelection
|
||||
});
|
||||
else if (g_GameData.gui.dialog)
|
||||
Engine.PopGuiPage();
|
||||
};
|
||||
if (gameData.gui.dialog)
|
||||
return undefined;
|
||||
else if (Engine.HasXmppClient())
|
||||
Engine.SwitchGuiPage("page_lobby.xml", { "dialog": false });
|
||||
else if (g_GameData.gui.isReplay)
|
||||
else if (gameData.gui.isReplay)
|
||||
Engine.SwitchGuiPage("page_replaymenu.xml", {
|
||||
"replaySelectionData": g_GameData.gui.replaySelectionData,
|
||||
"replaySelectionData": gameData.gui.replaySelectionData,
|
||||
"summarySelection": summarySelection
|
||||
});
|
||||
else if (g_GameData.campaignData)
|
||||
Engine.SwitchGuiPage(g_GameData.nextPage, g_GameData.campaignData);
|
||||
else if (gameData.campaignData)
|
||||
Engine.SwitchGuiPage(gameData.nextPage, gameData.campaignData);
|
||||
else
|
||||
Engine.SwitchGuiPage("page_pregame.xml");
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function startReplay()
|
||||
|
|
|
|||
|
|
@ -5,16 +5,8 @@
|
|||
<script directory="gui/common/"/>
|
||||
<script directory="gui/summary/"/>
|
||||
|
||||
<object hotkey="summary">
|
||||
<action on="Press">continueButton();</action>
|
||||
</object>
|
||||
|
||||
<object hotkey="cancel">
|
||||
<action on="Press">
|
||||
if (g_GameData.gui.isInGame)
|
||||
continueButton();
|
||||
</action>
|
||||
</object>
|
||||
<object name="summaryHotkey" hotkey="summary"/>
|
||||
<object name="cancelHotkey" hotkey="cancel"/>
|
||||
|
||||
<object type="image" sprite="ModernFade" name="fadeImage"/>
|
||||
|
||||
|
|
@ -191,7 +183,6 @@
|
|||
|
||||
<object type="button" name="continueButton" style="ModernButtonRed" size="100%-200 100%-48 100%-20 100%-20" z="50">
|
||||
<translatableAttribute id="caption">Continue</translatableAttribute>
|
||||
<action on="Press">continueButton();</action>
|
||||
</object>
|
||||
</object>
|
||||
</objects>
|
||||
|
|
|
|||
Loading…
Reference in a new issue