diff --git a/binaries/data/mods/public/gui/replaymenu/replay_actions.js b/binaries/data/mods/public/gui/replaymenu/replay_actions.js index 26f5d9c276..126f30e039 100644 --- a/binaries/data/mods/public/gui/replaymenu/replay_actions.js +++ b/binaries/data/mods/public/gui/replaymenu/replay_actions.js @@ -1,3 +1,33 @@ +/** + * Creates the data for restoring selection, order and filters when returning to the replay menu. + */ +function createReplaySelectionData(selectedDirectory) +{ + let replaySelection = Engine.GetGUIObjectByName("replaySelection"); + let dateTimeFilter = Engine.GetGUIObjectByName("dateTimeFilter"); + let playersFilter = Engine.GetGUIObjectByName("playersFilter"); + let mapNameFilter = Engine.GetGUIObjectByName("mapNameFilter"); + let mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter"); + let populationFilter = Engine.GetGUIObjectByName("populationFilter"); + let durationFilter = Engine.GetGUIObjectByName("durationFilter"); + let compatibilityFilter = Engine.GetGUIObjectByName("compabilityFilter"); + + return { + "directory": selectedDirectory, + "column": replaySelection.selected_column, + "columnOrder": replaySelection.selected_column_order, + "filters": { + "date": dateTimeFilter.list_data[dateTimeFilter.selected], + "playernames": playersFilter.caption, + "mapName": mapNameFilter.list_data[mapNameFilter.selected], + "mapSize": mapSizeFilter.list_data[mapSizeFilter.selected], + "popCap": populationFilter.list_data[populationFilter.selected], + "duration": durationFilter.list_data[durationFilter.selected], + "compatibility": compatibilityFilter.checked + } + }; +} + /** * Starts the selected visual replay, or shows an error message in case of incompatibility. */ @@ -25,7 +55,7 @@ function reallyStartVisualReplay(replayDirectory) Engine.StartVisualReplay(replayDirectory); Engine.SwitchGuiPage("page_loading.xml", { "attribs": Engine.GetReplayAttributes(replayDirectory), - "isNetworked" : false, + "isNetworked": false, "playerAssignments": { "local":{ "name": translate("You"), @@ -33,7 +63,8 @@ function reallyStartVisualReplay(replayDirectory) } }, "savedGUIData": "", - "isReplay" : true + "isReplay": true, + "replaySelectionData": createReplaySelectionData(replayDirectory) }); } @@ -80,6 +111,7 @@ function showReplaySummary() summary.isReplay = true; summary.gameResult = translate("Scores at the end of the game."); summary.replayDirectory = g_ReplaysFiltered[selected].directory; + summary.replaySelectionData = createReplaySelectionData(g_ReplaysFiltered[selected].directory); Engine.SwitchGuiPage("page_summary.xml", summary); } diff --git a/binaries/data/mods/public/gui/replaymenu/replay_filters.js b/binaries/data/mods/public/gui/replaymenu/replay_filters.js index a8dae801cb..bbbe1acb00 100644 --- a/binaries/data/mods/public/gui/replaymenu/replay_filters.js +++ b/binaries/data/mods/public/gui/replaymenu/replay_filters.js @@ -21,27 +21,34 @@ const g_PopulationCapacities = prepareForDropdown(g_Settings && g_Settings.Popul * Reloads the selectable values in the filters. The filters depend on g_Settings and g_Replays * (including its derivatives g_MapSizes, g_MapNames). */ -function initFilters() +function initFilters(filters) { - initDateFilter(); - initMapNameFilter(); - initMapSizeFilter(); - initPopCapFilter(); - initDurationFilter(); + Engine.GetGUIObjectByName("compabilityFilter").checked = !filters || filters.compatibility; + + if (filters && filters.playernames) + Engine.GetGUIObjectByName("playersFilter").caption = filters.playernames; + + initDateFilter(filters && filters.date); + initMapSizeFilter(filters && filters.mapSize); + initMapNameFilter(filters && filters.mapName); + initPopCapFilter(filters && filters.popCap); + initDurationFilter(filters && filters.duration); } /** * Allow to filter by month. Uses g_Replays. */ -function initDateFilter() +function initDateFilter(date) { var months = g_Replays.map(replay => getReplayMonth(replay)); months = months.filter((month, index) => months.indexOf(month) == index).sort(); - months.unshift(translateWithContext("datetime", "Any")); var dateTimeFilter = Engine.GetGUIObjectByName("dateTimeFilter"); - dateTimeFilter.list = months; - dateTimeFilter.list_data = months; + dateTimeFilter.list = [translateWithContext("datetime", "Any")].concat(months); + dateTimeFilter.list_data = [""].concat(months); + + if (date) + dateTimeFilter.selected = dateTimeFilter.list_data.indexOf(date); if (dateTimeFilter.selected == -1 || dateTimeFilter.selected >= dateTimeFilter.list.length) dateTimeFilter.selected = 0; @@ -50,12 +57,15 @@ function initDateFilter() /** * Allow to filter by mapsize. Uses g_MapSizes. */ -function initMapSizeFilter() +function initMapSizeFilter(mapSize) { var mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter"); mapSizeFilter.list = [translateWithContext("map size", "Any")].concat(g_MapSizes.Name); mapSizeFilter.list_data = [-1].concat(g_MapSizes.Tiles); + if (mapSize) + mapSizeFilter.selected = mapSizeFilter.list_data.indexOf(mapSize); + if (mapSizeFilter.selected == -1 || mapSizeFilter.selected >= mapSizeFilter.list.length) mapSizeFilter.selected = 0; } @@ -63,11 +73,14 @@ function initMapSizeFilter() /** * Allow to filter by mapname. Uses g_MapNames. */ -function initMapNameFilter() +function initMapNameFilter(mapName) { var mapNameFilter = Engine.GetGUIObjectByName("mapNameFilter"); - mapNameFilter.list = [translateWithContext("map name", "Any")].concat(g_MapNames); - mapNameFilter.list_data = [""].concat(g_MapNames.map(mapName => translate(mapName))); + mapNameFilter.list = [translateWithContext("map name", "Any")].concat(g_MapNames.map(mapName => translate(mapName))); + mapNameFilter.list_data = [""].concat(g_MapNames); + + if (mapName) + mapNameFilter.selected = mapNameFilter.list_data.indexOf(mapName); if (mapNameFilter.selected == -1 || mapNameFilter.selected >= mapNameFilter.list.length) mapNameFilter.selected = 0; @@ -76,12 +89,15 @@ function initMapNameFilter() /** * Allow to filter by population capacity. */ -function initPopCapFilter() +function initPopCapFilter(popCap) { var populationFilter = Engine.GetGUIObjectByName("populationFilter"); populationFilter.list = [translateWithContext("population capacity", "Any")].concat(g_PopulationCapacities.Title); populationFilter.list_data = [""].concat(g_PopulationCapacities.Population); + if (popCap) + populationFilter.selected = populationFilter.list_data.indexOf(popCap); + if (populationFilter.selected == -1 || populationFilter.selected >= populationFilter.list.length) populationFilter.selected = 0; } @@ -89,7 +105,7 @@ function initPopCapFilter() /** * Allow to filter by game duration. Uses g_DurationFilterIntervals. */ -function initDurationFilter() +function initDurationFilter(duration) { var durationFilter = Engine.GetGUIObjectByName("durationFilter"); durationFilter.list = g_DurationFilterIntervals.map((interval, index) => { @@ -110,6 +126,9 @@ function initDurationFilter() }); durationFilter.list_data = g_DurationFilterIntervals.map((interval, index) => index); + if (duration) + durationFilter.selected = durationFilter.list_data.indexOf(duration); + if (durationFilter.selected == -1 || durationFilter.selected >= g_DurationFilterIntervals.length) durationFilter.selected = 0; } diff --git a/binaries/data/mods/public/gui/replaymenu/replay_menu.js b/binaries/data/mods/public/gui/replaymenu/replay_menu.js index 89947beecf..cacc150039 100644 --- a/binaries/data/mods/public/gui/replaymenu/replay_menu.js +++ b/binaries/data/mods/public/gui/replaymenu/replay_menu.js @@ -36,12 +36,12 @@ var g_MapNames = []; /** * Directory name of the currently selected replay. Used to restore the selection after changing filters. */ -var g_selectedReplayDirectory = ""; +var g_SelectedReplayDirectory = ""; /** * Initializes globals, loads replays and displays the list. */ -function init() +function init(data) { if (!g_Settings) { @@ -49,7 +49,7 @@ function init() return; } - loadReplays(); + loadReplays(data && data.replaySelectionData); if (!g_Replays) { @@ -62,9 +62,10 @@ function init() /** * Store the list of replays loaded in C++ in g_Replays. - * Check timestamp and compatibility and extract g_Playernames, g_MapNames + * Check timestamp and compatibility and extract g_Playernames, g_MapNames. + * Restore selected filters and item. */ -function loadReplays() +function loadReplays(replaySelectionData) { g_Replays = Engine.GetReplays(); @@ -105,7 +106,20 @@ function loadReplays() g_MapNames.sort(); // Reload filters (since they depend on g_Replays and its derivatives) - initFilters(); + initFilters(replaySelectionData && replaySelectionData.filters); + + // Restore user selection + if (replaySelectionData) + { + if (replaySelectionData.directory) + g_SelectedReplayDirectory = replaySelectionData.directory; + + let replaySelection = Engine.GetGUIObjectByName("replaySelection"); + if (replaySelectionData.column) + replaySelection.selected_column = replaySelectionData.column; + if (replaySelectionData.columnOrder) + replaySelection.selected_column_order = replaySelectionData.columnOrder; + } } /** @@ -152,7 +166,7 @@ function displayReplayList() // Remember previously selected replay var replaySelection = Engine.GetGUIObjectByName("replaySelection"); if (replaySelection.selected != -1) - g_selectedReplayDirectory = g_ReplaysFiltered[replaySelection.selected].directory; + g_SelectedReplayDirectory = g_ReplaysFiltered[replaySelection.selected].directory; filterReplays(); @@ -188,7 +202,7 @@ function displayReplayList() replaySelection.list_data = list.directories || []; // Restore selection - replaySelection.selected = replaySelection.list.findIndex(directory => directory == g_selectedReplayDirectory); + replaySelection.selected = replaySelection.list.findIndex(directory => directory == g_SelectedReplayDirectory); displayReplayDetails(); } diff --git a/binaries/data/mods/public/gui/session/session.js b/binaries/data/mods/public/gui/session/session.js index eb93e05ee4..cf22d04e96 100644 --- a/binaries/data/mods/public/gui/session/session.js +++ b/binaries/data/mods/public/gui/session/session.js @@ -61,9 +61,14 @@ var lastTickTime = new Date(); /** * Not constant as we add "gaia". - **/ + */ var g_CivData = {}; +/** + * For restoring selection, order and filters when returning to the replay menu + */ +var g_ReplaySelectionData; + var g_PlayerAssignments = { "local": { "name": translate("You"), "player": 1 } }; /** @@ -212,6 +217,7 @@ function init(initData, hotloadData) g_IsController = initData.isController; g_PlayerAssignments = initData.playerAssignments; g_MatchID = initData.attribs.matchID; + g_ReplaySelectionData = initData.replaySelectionData; // Cache the player data // (This may be updated at runtime by handleNetMessage) @@ -473,6 +479,7 @@ function leaveGame(willRejoin) Engine.SaveReplayMetadata(JSON.stringify(summary)); summary.replayDirectory = Engine.GetCurrentReplayDirectory(); + summary.replaySelectionData = g_ReplaySelectionData; Engine.EndGame(); diff --git a/binaries/data/mods/public/gui/summary/summary.js b/binaries/data/mods/public/gui/summary/summary.js index bc01cdeac6..d1bf6486de 100644 --- a/binaries/data/mods/public/gui/summary/summary.js +++ b/binaries/data/mods/public/gui/summary/summary.js @@ -137,15 +137,16 @@ function startReplay() Engine.StartVisualReplay(g_GameData.replayDirectory); Engine.SwitchGuiPage("page_loading.xml", { "attribs": Engine.GetReplayAttributes(g_GameData.replayDirectory), - "isNetworked" : false, + "isNetworked": false, "playerAssignments": { - "local" : { + "local": { "name": translate("You"), "player": -1 } }, "savedGUIData": "", - "isReplay" : true + "isReplay": true, + "replaySelectionData": g_GameData.replaySelectionData }); } diff --git a/binaries/data/mods/public/gui/summary/summary.xml b/binaries/data/mods/public/gui/summary/summary.xml index 577a138f78..8178571ee9 100644 --- a/binaries/data/mods/public/gui/summary/summary.xml +++ b/binaries/data/mods/public/gui/summary/summary.xml @@ -187,7 +187,7 @@ } else if (g_GameData.isReplay) { - Engine.SwitchGuiPage("page_replaymenu.xml"); + Engine.SwitchGuiPage("page_replaymenu.xml", { "replaySelectionData": g_GameData.replaySelectionData }); } else if (!Engine.HasXmppClient()) {