1
0
forked from 0ad/0ad

Restore the previously selected item and filters when returning to the replay menu. Patch by Imarok, fixes #3742.

Also few cleanups and translate the mapnames in the correct place.

This was SVN commit r18085.
This commit is contained in:
elexis 2016-04-22 22:25:50 +00:00
parent f0263086c4
commit fca844eef6
6 changed files with 104 additions and 31 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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();

View File

@ -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
});
}

View File

@ -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())
{