Index: binaries/data/mods/_test.gui/gui/event/event.js
===================================================================
--- binaries/data/mods/_test.gui/gui/event/event.js
+++ binaries/data/mods/_test.gui/gui/event/event.js
@@ -13,3 +13,8 @@
Engine.GetGUIObjectByName("obj4").onTick = () => { ++called4; };
};
obj3.onTick = () => { ++called3; };
+
+function init()
+{
+ return new Promise(() => {});
+}
Index: binaries/data/mods/_test.gui/gui/hotkey/hotkey.js
===================================================================
--- binaries/data/mods/_test.gui/gui/hotkey/hotkey.js
+++ binaries/data/mods/_test.gui/gui/hotkey/hotkey.js
@@ -12,3 +12,8 @@
state_after = Engine.HotkeyIsPressed("test");
return false;
}
+
+function init()
+{
+ return new Promise(() => {});
+}
Index: binaries/data/mods/_test.gui/gui/regainFocus/emptyPage.js
===================================================================
--- /dev/null
+++ binaries/data/mods/_test.gui/gui/regainFocus/emptyPage.js
@@ -0,0 +1,4 @@
+function init()
+{
+ return new Promise(resolve => global.closePage = resolve);
+}
Index: binaries/data/mods/_test.gui/gui/regainFocus/emptyPage.xml
===================================================================
--- /dev/null
+++ binaries/data/mods/_test.gui/gui/regainFocus/emptyPage.xml
@@ -0,0 +1,4 @@
+
+
+
+
Index: binaries/data/mods/_test.gui/gui/regainFocus/page_emptyPage.xml
===================================================================
--- binaries/data/mods/_test.gui/gui/regainFocus/page_emptyPage.xml
+++ binaries/data/mods/_test.gui/gui/regainFocus/page_emptyPage.xml
@@ -1,4 +1,5 @@
common/styles.xml
+ regainFocus/emptyPage.xml
Index: binaries/data/mods/_test.gui/gui/regainFocus/pushWithPopOnInit.js
===================================================================
--- binaries/data/mods/_test.gui/gui/regainFocus/pushWithPopOnInit.js
+++ binaries/data/mods/_test.gui/gui/regainFocus/pushWithPopOnInit.js
@@ -1 +1,4 @@
-Engine.PushGuiPage("regainFocus/page_emptyPage.xml").then(Engine.PopGuiPage);
+function init()
+{
+ return Engine.PushGuiPage("regainFocus/page_emptyPage.xml");
+}
Index: binaries/data/mods/_test.gui/gui/resolveReject/page_resolveReject.xml
===================================================================
--- /dev/null
+++ binaries/data/mods/_test.gui/gui/resolveReject/page_resolveReject.xml
@@ -0,0 +1,5 @@
+
+
+ common/styles.xml
+ resolveReject/resolveReject.xml
+
Index: binaries/data/mods/_test.gui/gui/resolveReject/resolveReject.js
===================================================================
--- /dev/null
+++ binaries/data/mods/_test.gui/gui/resolveReject/resolveReject.js
@@ -0,0 +1,5 @@
+async function init(reject)
+{
+ if (reject)
+ throw undefined;
+}
Index: binaries/data/mods/_test.gui/gui/resolveReject/resolveReject.xml
===================================================================
--- /dev/null
+++ binaries/data/mods/_test.gui/gui/resolveReject/resolveReject.xml
@@ -0,0 +1,4 @@
+
+
+
+
Index: binaries/data/mods/_test.gui/gui/sequential/page_sequential.xml
===================================================================
--- /dev/null
+++ binaries/data/mods/_test.gui/gui/sequential/page_sequential.xml
@@ -0,0 +1,5 @@
+
+
+ common/styles.xml
+ sequential/sequential.xml
+
Index: binaries/data/mods/_test.gui/gui/sequential/sequential.js
===================================================================
--- /dev/null
+++ binaries/data/mods/_test.gui/gui/sequential/sequential.js
@@ -0,0 +1,5 @@
+async function init()
+{
+ await Engine.PushGuiPage("regainFocus/page_emptyPage.xml");
+ await Engine.PushGuiPage("regainFocus/page_emptyPage.xml");
+}
Index: binaries/data/mods/_test.gui/gui/sequential/sequential.xml
===================================================================
--- /dev/null
+++ binaries/data/mods/_test.gui/gui/sequential/sequential.xml
@@ -0,0 +1,4 @@
+
+
+
+
Index: binaries/data/mods/mod/gui/colormixer/colormixer.js
===================================================================
--- binaries/data/mods/mod/gui/colormixer/colormixer.js
+++ binaries/data/mods/mod/gui/colormixer/colormixer.js
@@ -1,96 +1,79 @@
+const colorMixer = {};
+
+colorMixer.width = 500;
+colorMixer.height = 400;
+colorMixer.labels = [translate("Red"), translate("Green"), translate("Blue")];
+colorMixer.captions = [translate("Cancel"), translate("Save")];
+
/**
- * @class ColorMixer
+ * ColorMixer
* This class allows to mix color using sliders one for each of three channels in range of 0 to 255 with step of 1, returning sanitized color when closing
*/
-class ColorMixer
+function init(originalColor)
{
- /**
- * @param {String} color - initial color as RGB string e.g. 100 0 200
- */
- constructor(color)
- {
- this.panel = Engine.GetGUIObjectByName("main");
- this.colorDisplay = Engine.GetGUIObjectByName("colorDisplay");
+ const colorDisplay = Engine.GetGUIObjectByName("colorDisplay");
- this.color = [0, 0, 0];
- this.sliders = [];
- this.valuesText = [];
+ const color = [0, 0, 0];
+ const sliders = [];
+ const valuesText = [];
- this.setup(color);
- }
+ Engine.GetGUIObjectByName("titleBar").caption = translate("Color");
+ Engine.GetGUIObjectByName("infoLabel").caption = translate("Move the sliders to change the Red, Green and Blue components of the Color");
- setup(color)
- {
- Engine.GetGUIObjectByName("titleBar").caption = translate("Color");
- Engine.GetGUIObjectByName("infoLabel").caption = translate("Move the sliders to change the Red, Green and Blue components of the Color");
-
- const cancelHotkey = Engine.GetGUIObjectByName("cancelHotkey");
-
- const lRDiff = this.width / 2;
- const uDDiff = this.height / 2;
- this.panel.size = "50%-" + lRDiff + " 50%-" + uDDiff + " 50%+" + lRDiff + " 50%+" + uDDiff;
-
- const button = [];
- setButtonCaptionsAndVisibitily(button, this.captions, cancelHotkey, "cmButton");
- distributeButtonsHorizontally(button, this.captions);
-
- const c = color.split(" ");
-
- const object0 = Engine.GetGUIObjectByName("color[0]");
- const height0 = object0.size.bottom - object0.size.top;
- for (let i = 0; i < this.color.length; i++)
- {
- this.color[i] = Math.floor(+c[i] || 0);
- const object = Engine.GetGUIObjectByName("color[" + i + "]");
- if (!object)
- continue;
-
- const size = object.size;
- size.top = i * height0;
- size.bottom = size.top + height0;
- object.size = size;
-
- this.sliders[i] = Engine.GetGUIObjectByName("colorSlider[" + i + "]");
- const slider = this.sliders[i];
- slider.min_value = 0;
- slider.max_value = 255;
- slider.value = this.color[i];
- slider.onValueChange = () => {this.updateFromSlider(i);};
-
- this.valuesText[i] = Engine.GetGUIObjectByName("colorValue[" + i + "]");
- this.valuesText[i].caption = this.color[i];
-
- Engine.GetGUIObjectByName("colorLabel[" + i + "]").caption = this.labels[i];
- }
-
- this.updateColorPreview();
- // Update return color on cancel to prevent malformed values from initial input.
- color = this.color.join(" ");
-
- cancelHotkey.onPress = () => { Engine.PopGuiPage(color); };
- button[0].onPress = () => { Engine.PopGuiPage(color); };
- button[1].onPress = () => { Engine.PopGuiPage(this.color.join(" ")); };
- }
+ const cancelHotkey = Engine.GetGUIObjectByName("cancelHotkey");
- updateFromSlider(index)
- {
- this.color[index] = Math.floor(this.sliders[index].value);
- this.valuesText[index].caption = this.color[index];
- this.updateColorPreview();
- }
+ const lRDiff = colorMixer.width / 2;
+ const uDDiff = colorMixer.height / 2;
+ Engine.GetGUIObjectByName("main").size = "50%-" + lRDiff + " 50%-" + uDDiff + " 50%+" + lRDiff + " 50%+" + uDDiff;
+
+ const button = [];
+ setButtonCaptionsAndVisibitily(button, colorMixer.captions, cancelHotkey, "cmButton");
+ distributeButtonsHorizontally(button, colorMixer.captions);
+
+ const c = originalColor.split(" ");
- updateColorPreview()
+ const updateColorPreview = () => {
+ colorDisplay.sprite = "color:" + color.join(" ");
+ };
+
+ const object0 = Engine.GetGUIObjectByName("color[0]");
+ const height0 = object0.size.bottom - object0.size.top;
+ for (let i = 0; i < color.length; i++)
{
- this.colorDisplay.sprite = "color:" + this.color.join(" ");
+ color[i] = Math.floor(+c[i] || 0);
+ const object = Engine.GetGUIObjectByName("color[" + i + "]");
+ if (!object)
+ continue;
+
+ const size = object.size;
+ size.top = i * height0;
+ size.bottom = size.top + height0;
+ object.size = size;
+
+ sliders[i] = Engine.GetGUIObjectByName("colorSlider[" + i + "]");
+ const slider = sliders[i];
+ slider.min_value = 0;
+ slider.max_value = 255;
+ slider.value = color[i];
+ slider.onValueChange = () => {
+ color[i] = Math.floor(sliders[i].value);
+ valuesText[i].caption = color[i];
+ updateColorPreview();
+ };
+
+ valuesText[i] = Engine.GetGUIObjectByName("colorValue[" + i + "]");
+ valuesText[i].caption = color[i];
+
+ Engine.GetGUIObjectByName("colorLabel[" + i + "]").caption = colorMixer.labels[i];
}
-}
-ColorMixer.prototype.width = 500;
-ColorMixer.prototype.height = 400;
-ColorMixer.prototype.labels = [translate("Red"), translate("Green"), translate("Blue")];
-ColorMixer.prototype.captions = [translate("Cancel"), translate("Save")];
+ updateColorPreview();
+ // Update return color on cancel to prevent malformed values from initial input.
+ originalColor = color.join(" ");
-function init(color)
-{
- new ColorMixer(color);
+ return new Promise(resolve => {
+ cancelHotkey.onPress = resolve.bind(null, originalColor);
+ button[0].onPress = resolve.bind(null, originalColor);
+ button[1].onPress = () => { resolve(color.join(" ")); };
+ });
}
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,7 +1,6 @@
-async function messageBox(mbWidth, mbHeight, mbMessage, mbTitle, mbButtonCaptions, mbBtnCode,
- mbCallbackArgs)
+function messageBox(mbWidth, mbHeight, mbMessage, mbTitle, mbButtonCaptions)
{
- const btnCode = await Engine.PushGuiPage(
+ return Engine.PushGuiPage(
"page_msgbox.xml",
{
"width": mbWidth,
@@ -10,15 +9,11 @@
"title": mbTitle,
"buttonCaptions": mbButtonCaptions
});
-
- if (mbBtnCode !== undefined && mbBtnCode[btnCode])
- mbBtnCode[btnCode](mbCallbackArgs ? mbCallbackArgs[btnCode] : undefined);
}
-async function timedConfirmation(width, height, message, timeParameter, timeout, title, buttonCaptions,
- btnCode, callbackArgs)
+function timedConfirmation(width, height, message, timeParameter, timeout, title, buttonCaptions)
{
- const button = await Engine.PushGuiPage(
+ return Engine.PushGuiPage(
"page_timedconfirmation.xml",
{
"width": width,
@@ -29,9 +24,6 @@
"title": title,
"buttonCaptions": buttonCaptions
});
-
- if (btnCode !== undefined && btnCode[button])
- btnCode[button](callbackArgs ? callbackArgs[button] : undefined);
}
function openURL(url)
Index: binaries/data/mods/mod/gui/common/utilities.js
===================================================================
--- binaries/data/mods/mod/gui/common/utilities.js
+++ binaries/data/mods/mod/gui/common/utilities.js
@@ -21,15 +21,13 @@
function setButtonCaptionsAndVisibitily(button, captions, cancelHotkey, name)
{
- captions.forEach((caption, i) => {
- button[i] = Engine.GetGUIObjectByName(name + (i + 1));
- button[i].caption = caption;
- button[i].hidden = false;
- button[i].onPress = () => {
- Engine.PopGuiPage(i);
- };
-
- if (i == 0)
- cancelHotkey.onPress = button[i].onPress;
+ return new Promise(resolve => {
+ captions.forEach((caption, i) => {
+ button[i] = Engine.GetGUIObjectByName(name + (i + 1));
+ button[i].caption = caption;
+ button[i].hidden = false;
+ button[i].onPress = resolve.bind(null, i);
+ });
+ cancelHotkey.onPress = resolve.bind(null, 0);
});
}
Index: binaries/data/mods/mod/gui/incompatible_mods/incompatible_mods.js
===================================================================
--- binaries/data/mods/mod/gui/incompatible_mods/incompatible_mods.js
+++ binaries/data/mods/mod/gui/incompatible_mods/incompatible_mods.js
@@ -3,9 +3,5 @@
function init(data)
{
Engine.GetGUIObjectByName("mainText").caption = Engine.TranslateLines(Engine.ReadFile(g_IncompatibleModsFile));
-}
-
-function closePage()
-{
- Engine.PopGuiPage();
+ return new Promise(resolve => Engine.GetGUIObjectByName("btnClose").onPress = resolve);
}
Index: binaries/data/mods/mod/gui/incompatible_mods/incompatible_mods.xml
===================================================================
--- binaries/data/mods/mod/gui/incompatible_mods/incompatible_mods.xml
+++ binaries/data/mods/mod/gui/incompatible_mods/incompatible_mods.xml
@@ -17,7 +17,6 @@
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
@@ -23,128 +23,144 @@
var g_RequestStartTime;
-/**
- * Returns true if ModIoAdvanceRequest should be called.
- */
-var g_ModIOState = {
- /**
- * Finished status indicators
- */
- "ready": progressData => {
- // GameID acquired, ready to fetch mod list
- if (!g_RequestCancelled)
- updateModList();
- return true;
- },
- "listed": progressData => {
- // List of available mods acquired
-
- // Only run this once (for each update).
- if (Engine.GetGUIObjectByName("modsAvailableList").list.length)
- return true;
-
- hideDialog();
- Engine.GetGUIObjectByName("refreshButton").enabled = true;
- g_ModsAvailableOnline = Engine.ModIoGetMods();
- displayMods();
- return true;
- },
- "success": progressData => {
- // Successfully acquired a mod file
- hideDialog();
- Engine.GetGUIObjectByName("downloadButton").enabled = true;
- return true;
- },
- /**
- * In-progress status indicators.
- */
- "gameid": progressData => {
- // Acquiring GameID from mod.io
- return true;
- },
- "listing": progressData => {
- // Acquiring list of available mods from mod.io
- return true;
- },
- "downloading": progressData => {
- // Downloading a mod file
- updateProgressBar(progressData.progress, g_ModsAvailableOnline[selectedModIndex()].filesize);
- return true;
- },
- /**
- * Error/Failure status indicators.
- */
- "failed_gameid": progressData => {
- // Game ID couldn't be retrieved
- showErrorMessageBox(
- sprintf(translateWithContext("mod.io error message", "Game ID could not be retrieved.\n\n%(technicalDetails)s"), {
- "technicalDetails": progressData.error
- }),
- translateWithContext("mod.io error message", "Initialization Error"),
- [translate("Abort"), translate("Retry")],
- [closePage, init]);
- return false;
- },
- "failed_listing": progressData => {
- // Mod list couldn't be retrieved
- showErrorMessageBox(
- sprintf(translateWithContext("mod.io error message", "Mod List could not be retrieved.\n\n%(technicalDetails)s"), {
- "technicalDetails": progressData.error
- }),
- translateWithContext("mod.io error message", "Fetch Error"),
- [translate("Abort"), translate("Retry")],
- [cancelModListUpdate, updateModList]);
- return false;
- },
- "failed_downloading": progressData => {
- // File couldn't be retrieved
- showErrorMessageBox(
- sprintf(translateWithContext("mod.io error message", "File download failed.\n\n%(technicalDetails)s"), {
- "technicalDetails": progressData.error
- }),
- translateWithContext("mod.io error message", "Download Error"),
- [translate("Abort"), translate("Retry")],
- [cancelRequest, downloadMod]);
- return false;
- },
- "failed_filecheck": progressData => {
- // The file is corrupted
- showErrorMessageBox(
- sprintf(translateWithContext("mod.io error message", "File verification error.\n\n%(technicalDetails)s"), {
- "technicalDetails": progressData.error
- }),
- translateWithContext("mod.io error message", "Verification Error"),
- [translate("Abort")],
- [cancelRequest]);
- return false;
- },
- /**
- * Default
- */
- "none": progressData => {
- // Nothing has happened yet.
- return true;
- }
-};
-
function init(data)
{
- progressDialog(
- translate("Initializing mod.io interface."),
- translate("Initializing"),
- false,
- translate("Cancel"),
- closePage);
-
- g_Failure = false;
- Engine.ModIoStartGetGameId();
+ return new Promise(resolve => {
+ /**
+ * Returns true if ModIoAdvanceRequest should be called.
+ */
+ var modIOState = {
+ /**
+ * Finished status indicators
+ */
+ "ready": progressData => {
+ // GameID acquired, ready to fetch mod list
+ if (!g_RequestCancelled)
+ updateModList(resolve);
+ return true;
+ },
+ "listed": progressData => {
+ // List of available mods acquired
+
+ // Only run this once (for each update).
+ if (Engine.GetGUIObjectByName("modsAvailableList").list.length)
+ return true;
+
+ hideDialog();
+ Engine.GetGUIObjectByName("refreshButton").enabled = true;
+ g_ModsAvailableOnline = Engine.ModIoGetMods();
+ displayMods();
+ return true;
+ },
+ "success": progressData => {
+ // Successfully acquired a mod file
+ hideDialog();
+ Engine.GetGUIObjectByName("downloadButton").enabled = true;
+ return true;
+ },
+ /**
+ * In-progress status indicators.
+ */
+ "gameid": progressData => {
+ // Acquiring GameID from mod.io
+ return true;
+ },
+ "listing": progressData => {
+ // Acquiring list of available mods from mod.io
+ return true;
+ },
+ "downloading": progressData => {
+ // Downloading a mod file
+ updateProgressBar(
+ progressData.progress,
+ g_ModsAvailableOnline[selectedModIndex()].filesize);
+ return true;
+ },
+ /**
+ * Error/Failure status indicators.
+ */
+ "failed_gameid": progressData => {
+ // Game ID couldn't be retrieved
+ showErrorMessageBox(
+ sprintf(translateWithContext(
+ "mod.io error message",
+ "Game ID could not be retrieved.\n\n%(technicalDetails)s"), {
+ "technicalDetails": progressData.error
+ }),
+ translateWithContext("mod.io error message", "Initialization Error"),
+ [translate("Abort"), translate("Retry")]).then(button => {
+ [resolve, init][button]();
+ });
+ return false;
+ },
+ "failed_listing": progressData => {
+ // Mod list couldn't be retrieved
+ showErrorMessageBox(
+ sprintf(translateWithContext(
+ "mod.io error message",
+ "Mod List could not be retrieved.\n\n%(technicalDetails)s"), {
+ "technicalDetails": progressData.error
+ }),
+ translateWithContext("mod.io error message", "Fetch Error"),
+ [translate("Abort"), translate("Retry")].then(button => {
+ [cancelModListUpdate, updateModList][button](resolve)
+ });
+ return false;
+ },
+ "failed_downloading": progressData => {
+ // File couldn't be retrieved
+ showErrorMessageBox(
+ sprintf(translateWithContext(
+ "mod.io error message",
+ "File download failed.\n\n%(technicalDetails)s"), {
+ "technicalDetails": progressData.error
+ }),
+ translateWithContext("mod.io error message", "Download Error"),
+ [translate("Abort"), translate("Retry")]).then(button => {
+ [cancelRequest, downloadMod][button]()
+ });
+ return false;
+ },
+ "failed_filecheck": progressData => {
+ // The file is corrupted
+ showErrorMessageBox(
+ sprintf(translateWithContext(
+ "mod.io error message",
+ "File verification error.\n\n%(technicalDetails)s"), {
+ "technicalDetails": progressData.error
+ }),
+ translateWithContext("mod.io error message", "Verification Error"),
+ [translate("Abort")]).then(() => cancelRequest);
+ return false;
+ },
+ /**
+ * Default
+ */
+ "none": progressData => {
+ // Nothing has happened yet.
+ return true;
+ }
+ };
+ Engine.GetGUIObjectByName("modio").onTick = onTick.bind(null, modIOState);
+ Engine.GetGUIObjectByName("closePageBtn").onPress = resolve;
+
+ progressDialog(
+ translate("Initializing mod.io interface."),
+ translate("Initializing"),
+ false,
+ translate("Cancel"),
+ resolve);
+
+ g_Failure = false;
+ Engine.ModIoStartGetGameId();
+ });
}
-function onTick()
+function onTick(modIOState)
{
let progressData = Engine.ModIoGetDownloadProgress();
- let handler = g_ModIOState[progressData.status];
+ let handler = modIOState[progressData.status];
if (!handler)
{
warn("Unrecognized progress status: " + progressData.status);
@@ -223,13 +239,13 @@
Engine.GetGUIObjectByName("modError").caption = isSelected && isInvalid ? sprintf(translate("Invalid mod: %(error)s"), {"error": g_ModsAvailableOnline[selected].error }) : "";
}
-function cancelModListUpdate()
+function cancelModListUpdate(resolve)
{
cancelRequest();
if (!g_ModsAvailableOnline.length)
{
- closePage();
+ resolve();
return;
}
@@ -237,7 +253,7 @@
Engine.GetGUIObjectByName('refreshButton').enabled = true;
}
-function updateModList()
+function updateModList(resolve)
{
clearModList();
Engine.GetGUIObjectByName("refreshButton").enabled = false;
@@ -247,7 +263,7 @@
translate("Updating"),
false,
translate("Cancel Update"),
- cancelModListUpdate);
+ cancelModListUpdate.bind(null, resolve));
g_Failure = false;
g_RequestCancelled = false;
@@ -285,18 +301,13 @@
hideDialog();
}
-function closePage()
-{
- Engine.PopGuiPage();
-}
-
function showErrorMessageBox(caption, title, buttonCaptions, buttonActions)
{
if (g_Failure)
return;
- messageBox(500, 250, caption, title, buttonCaptions, buttonActions);
g_Failure = true;
+ return messageBox(500, 250, caption, title, buttonCaptions, buttonActions);
}
function progressDialog(dialogCaption, dialogTitle, showProgressBar, buttonCaption, buttonAction)
Index: binaries/data/mods/mod/gui/modio/modio.xml
===================================================================
--- binaries/data/mods/mod/gui/modio/modio.xml
+++ binaries/data/mods/mod/gui/modio/modio.xml
@@ -8,11 +8,6 @@