From 76b6725272ad2993439b2a6c9981170f020533b1 Mon Sep 17 00:00:00 2001 From: phosit Date: Sat, 9 Aug 2025 14:52:08 +0200 Subject: [PATCH] Remove Engine.SwitchGuiPage from campaigns --- .../campaigns/default_menu/CampaignMenu.js | 88 +++++++++++-------- .../gui/campaigns/load_modal/LoadModal.js | 23 +++-- .../campaigns/new_modal/NewCampaignModal.js | 12 ++- .../gui/campaigns/setup/CampaignSetupPage.js | 17 +++- 4 files changed, 86 insertions(+), 54 deletions(-) diff --git a/binaries/data/mods/public/gui/campaigns/default_menu/CampaignMenu.js b/binaries/data/mods/public/gui/campaigns/default_menu/CampaignMenu.js index 170e404b16..7a2495dcc8 100644 --- a/binaries/data/mods/public/gui/campaigns/default_menu/CampaignMenu.js +++ b/binaries/data/mods/public/gui/campaigns/default_menu/CampaignMenu.js @@ -6,7 +6,7 @@ */ class CampaignMenu extends AutoWatcher { - constructor(campaignRun) + constructor(campaignRun, closePageCallback) { super("render"); @@ -16,17 +16,20 @@ class CampaignMenu extends AutoWatcher this.levelSelection = Engine.GetGUIObjectByName("levelSelection"); this.levelSelection.onSelectionChange = () => { this.selectedLevel = this.levelSelection.selected; }; - this.levelSelection.onMouseLeftDoubleClickItem = () => this.startScenario(); - Engine.GetGUIObjectByName('startButton').onPress = () => this.startScenario(); - Engine.GetGUIObjectByName('backToMain').onPress = () => this.goBackToMainMenu(); - Engine.GetGUIObjectByName('savedGamesButton').onPress = this.loadSavegame.bind(this); + const startScenarioCallback = this.startScenario.bind(this, closePageCallback); + this.levelSelection.onMouseLeftDoubleClickItem = startScenarioCallback; + Engine.GetGUIObjectByName('startButton').onPress = startScenarioCallback; + Engine.GetGUIObjectByName('backToMain').onPress = + this.goBackToMainMenu.bind(this, closePageCallback); + Engine.GetGUIObjectByName('savedGamesButton').onPress = + this.loadSavegame.bind(this, closePageCallback); this.mapCache = new MapCache(); this._ready = true; } - async loadSavegame() + async loadSavegame(closePageCallback) { const gameId = await Engine.OpenChildPage( 'page_loadgame.xml', @@ -44,27 +47,29 @@ class CampaignMenu extends AutoWatcher return; } - Engine.SwitchGuiPage("page_loading.xml", { - "attribs": metadata.initAttributes, - "playerAssignments": { - "local": { - "name": - metadata.initAttributes.settings.PlayerData[metadata.playerID]?.Name ?? - singleplayerName(), - "player": metadata.playerID - } - }, - "savedGUIData": metadata.gui - }); + closePageCallback({ [Engine.openRequest]: { + "page": "page_loading.xml", + "argument": { + "attribs": metadata.initAttributes, + "playerAssignments": { + "local": { + "name": metadata.initAttributes.settings.PlayerData[metadata.playerID] + ?.Name ?? singleplayerName(), + "player": metadata.playerID + } + }, + "savedGUIData": metadata.gui + } + } }); } - goBackToMainMenu() + goBackToMainMenu(closePageCallback) { this.run.save(); - Engine.SwitchGuiPage("page_pregame.xml", {}); + closePageCallback({ [Engine.openRequest]: { "page": "page_pregame.xml" } }); } - startScenario() + startScenario(closePageCallback) { const level = this.getSelectedLevelData(); if (!meetsRequirements(this.run, level)) @@ -113,23 +118,29 @@ class CampaignMenu extends AutoWatcher }, }; - Engine.SwitchGuiPage("page_gamesetup.xml", { - "backPage": { - "page": this.run.getMenuPath(), - "data": { - "filename": this.run.filename - } - }, - "gameSettings": attributes, - }); + closePageCallback({ [Engine.openRequest]: { + "page": "page_gamesetup.xml", + "argument": { + "backPage": { + "page": this.run.getMenuPath(), + "data": { + "filename": this.run.filename + } + }, + "gameSettings": attributes, + } + } }); return; } gameSettings.launchGame(assignments, true); - Engine.SwitchGuiPage("page_loading.xml", { - "attribs": gameSettings.finalizedAttributes, - "playerAssignments": assignments - }); + closePageCallback({ [Engine.openRequest]: { + "page": "page_loading.xml", + "argument": { + "attribs": gameSettings.finalizedAttributes, + "playerAssignments": assignments + } + } }); } getSelectedLevelData() @@ -234,7 +245,7 @@ class CampaignMenu extends AutoWatcher var g_CampaignMenu; -function init(initData) +async function init(initData) { let run = initData?.filename || CampaignRun.getCurrentRunFilename(); try @@ -242,11 +253,14 @@ function init(initData) run = new CampaignRun(run).load(); if (!run.isCurrent()) run.setCurrent(); - g_CampaignMenu = new CampaignMenu(run); + return new Promise(closePageCallback => + { + g_CampaignMenu = new CampaignMenu(run, closePageCallback); + }); } catch(err) { error(sprintf("Error loading campaign run %s: %s.", CampaignRun.getCurrentRunFilename(), err)); - Engine.SwitchGuiPage("page_pregame.xml", {}); + return { [Engine.openRequest]: { "page": "page_pregame.xml" } }; } } diff --git a/binaries/data/mods/public/gui/campaigns/load_modal/LoadModal.js b/binaries/data/mods/public/gui/campaigns/load_modal/LoadModal.js index e1d68c0ed9..c0bd9395a7 100644 --- a/binaries/data/mods/public/gui/campaigns/load_modal/LoadModal.js +++ b/binaries/data/mods/public/gui/campaigns/load_modal/LoadModal.js @@ -32,14 +32,16 @@ class BrokenRun */ class LoadModal extends AutoWatcher { - constructor(campaignTemplate) + constructor(closePageCallback) { super("render"); // _watch so render() is called anytime currentRuns are modified. this.currentRuns = _watch(this.getRuns(), () => this.render()); - Engine.GetGUIObjectByName('cancelButton').onPress = () => Engine.SwitchGuiPage("page_pregame.xml", {}); + Engine.GetGUIObjectByName('cancelButton').onPress = closePageCallback.bind(undefined, { + [Engine.openRequest]: { "page": "page_pregame.xml" } + }); Engine.GetGUIObjectByName('deleteGameButton').onPress = () => this.deleteSelectedRun(); Engine.GetGUIObjectByName('startButton').onPress = () => this.startSelectedRun(); @@ -81,16 +83,19 @@ class LoadModal extends AutoWatcher return out; } - loadCampaign() + loadCampaign(closePageCallback) { const filename = this.currentRuns[this.selectedRun].filename; const run = new CampaignRun(filename) .load() .setCurrent(); - Engine.SwitchGuiPage(run.getMenuPath(), { - "filename": run.filename - }); + closePageCallback({ [Engine.openRequest]: { + "page": run.getMenuPath(), + "argument": { + "filename": run.filename + } + } }); } async deleteSelectedRun() @@ -112,10 +117,10 @@ class LoadModal extends AutoWatcher this.selectedRun = -1; } - startSelectedRun() + startSelectedRun(closePageCallback) { if (this.currentRuns[this.selectedRun] instanceof CampaignRun) - this.loadCampaign(); + this.loadCampaign(closePageCallback); } displayCurrentRuns() @@ -138,5 +143,5 @@ var g_LoadModal; function init() { - g_LoadModal = new LoadModal(); + return new Promise(closePageCallback => { g_LoadModal = new LoadModal(closePageCallback); }); } diff --git a/binaries/data/mods/public/gui/campaigns/new_modal/NewCampaignModal.js b/binaries/data/mods/public/gui/campaigns/new_modal/NewCampaignModal.js index fe69d0017a..afe8f1d0f0 100644 --- a/binaries/data/mods/public/gui/campaigns/new_modal/NewCampaignModal.js +++ b/binaries/data/mods/public/gui/campaigns/new_modal/NewCampaignModal.js @@ -10,7 +10,8 @@ class NewCampaignModal this.template = campaignTemplate; Engine.GetGUIObjectByName('cancelButton').onPress = closePageCallback; - Engine.GetGUIObjectByName('startButton').onPress = () => this.createAndStartCampaign(); + Engine.GetGUIObjectByName('startButton').onPress = + this.createAndStartCampaign.bind(this, closePageCallback); Engine.GetGUIObjectByName('runDescription').caption = translateWithContext("Campaign Template", this.template.Name); Engine.GetGUIObjectByName('runDescription').onTextEdit = () => { @@ -19,7 +20,7 @@ class NewCampaignModal Engine.GetGUIObjectByName('runDescription').focus(); } - createAndStartCampaign() + createAndStartCampaign(closePageCallback) { const filename = this.template.identifier + "_" + Date.now() + "_" + Math.floor(Math.random()*100000); const run = new CampaignRun(filename) @@ -28,8 +29,11 @@ class NewCampaignModal .save() .setCurrent(); - Engine.SwitchGuiPage(run.getMenuPath(), { - "filename": run.filename + closePageCallback({ + "page": run.getMenuPath(), + "argument": { + "filename": run.filename + } }); } } diff --git a/binaries/data/mods/public/gui/campaigns/setup/CampaignSetupPage.js b/binaries/data/mods/public/gui/campaigns/setup/CampaignSetupPage.js index 8a8d8d0d8c..f23207038d 100644 --- a/binaries/data/mods/public/gui/campaigns/setup/CampaignSetupPage.js +++ b/binaries/data/mods/public/gui/campaigns/setup/CampaignSetupPage.js @@ -4,15 +4,21 @@ */ class CampaignSetupPage extends AutoWatcher { - constructor() + constructor(closePageCallback) { super("render"); this.selectedIndex = -1; this.templates = CampaignTemplate.getAvailableTemplates(); - Engine.GetGUIObjectByName("mainMenuButton").onPress = () => Engine.SwitchGuiPage("page_pregame.xml"); - Engine.GetGUIObjectByName("startCampButton").onPress = () => Engine.OpenChildPage("campaigns/new_modal/page.xml", this.selectedTemplate); + Engine.GetGUIObjectByName("mainMenuButton").onPress = closePageCallback.bind(undefined, + { [Engine.openRequest]: { "page": "page_pregame.xml" } }); + Engine.GetGUIObjectByName("startCampButton").onPress = async() => + { + const ret = await Engine.OpenChildPage("campaigns/new_modal/page.xml", this.selectedTemplate); + if (ret !== undefined) + closePageCallback({ [Engine.openRequest]: ret }); + }; this.campaignSelection = Engine.GetGUIObjectByName("campaignSelection"); this.campaignSelection.onMouseLeftDoubleClickItem = () => @@ -69,5 +75,8 @@ var g_CampaignSetupPage; function init() { - g_CampaignSetupPage = new CampaignSetupPage(); + return new Promise(closePageCallback => + { + g_CampaignSetupPage = new CampaignSetupPage(closePageCallback); + }); }