Ticket #3742: restore_selection_v2.patch

File restore_selection_v2.patch, 12.3 KB (added by Imarok, 8 years ago)

Now stores unique identifiers instead of selection indices. Also some whitespace and typo correction

  • binaries/data/mods/public/gui/replaymenu/replay_actions.js

     
    11/**
     2 * Creates the data for restoring selection, order and filters when returning to the replay menu
     3 */
     4function createReplayMenuData(selectedDirectory)
     5{
     6    return {
     7        "selectedDirectory": selectedDirectory,
     8        "selectedColumn": Engine.GetGUIObjectByName("replaySelection").selected_column,
     9        "selectedColumnOrder": Engine.GetGUIObjectByName("replaySelection").selected_column_order,
     10        "selectedFilters": {
     11            "date": Engine.GetGUIObjectByName("dateTimeFilter").list_data[Engine.GetGUIObjectByName("dateTimeFilter").selected],
     12            "playernames": Engine.GetGUIObjectByName("playersFilter").caption,
     13            "mapName": Engine.GetGUIObjectByName("mapNameFilter").list_data[Engine.GetGUIObjectByName("mapNameFilter").selected],
     14            "mapSize": Engine.GetGUIObjectByName("mapSizeFilter").list_data[Engine.GetGUIObjectByName("mapSizeFilter").selected],
     15            "popCap": Engine.GetGUIObjectByName("populationFilter").list_data[Engine.GetGUIObjectByName("populationFilter").selected],
     16            "duration": Engine.GetGUIObjectByName("durationFilter").list_data[Engine.GetGUIObjectByName("durationFilter").selected]
     17        }
     18    }
     19}
     20/**
    221 * Starts the selected visual replay, or shows an error message in case of incompatibility.
    322 */
    423function startReplay()
     
    2544    Engine.StartVisualReplay(replayDirectory);
    2645    Engine.SwitchGuiPage("page_loading.xml", {
    2746        "attribs": Engine.GetReplayAttributes(replayDirectory),
    28         "isNetworked" : false,
     47        "isNetworked": false,
    2948        "playerAssignments": {
    3049            "local":{
    3150                "name": translate("You"),
     
    3352            }
    3453        },
    3554        "savedGUIData": "",
    36         "isReplay" : true
     55        "isReplay": true,
     56        "replayMenuData": createReplayMenuData(replayDirectory)
    3757    });
    3858}
    3959
     
    7999    // Open summary screen
    80100    summary.isReplay = true;
    81101    summary.gameResult = translate("Scores at the end of the game.");
    82     summary.replayDirectory = g_ReplaysFiltered[selected].directory;
     102    summary.replayMenuData = createReplayMenuData(g_ReplaysFiltered[selected].directory);
    83103    Engine.SwitchGuiPage("page_summary.xml", summary);
    84104}
    85105
  • binaries/data/mods/public/gui/replaymenu/replay_filters.js

     
    2121 * Reloads the selectable values in the filters. The filters depend on g_Settings and g_Replays
    2222 * (including its derivatives g_MapSizes, g_MapNames).
    2323 */
    24 function initFilters()
     24function initFilters(data)
    2525{
    26     initDateFilter();
    27     initMapNameFilter();
    28     initMapSizeFilter();
    29     initPopCapFilter();
    30     initDurationFilter();
     26    initDateFilter(data);
     27    initMapNameFilter(data);
     28    initMapSizeFilter(data);
     29    initPopCapFilter(data);
     30    initDurationFilter(data);
    3131}
    3232
    3333/**
    3434 * Allow to filter by month. Uses g_Replays.
    3535 */
    36 function initDateFilter()
     36function initDateFilter(data)
    3737{
    3838    var months = g_Replays.map(replay => getReplayMonth(replay));
    3939    months = months.filter((month, index) => months.indexOf(month) == index).sort();
    40     months.unshift(translateWithContext("datetime", "Any"));
    4140
    4241    var dateTimeFilter = Engine.GetGUIObjectByName("dateTimeFilter");
    43     dateTimeFilter.list = months;
    44     dateTimeFilter.list_data = months;
     42    dateTimeFilter.list = [translateWithContext("datetime", "Any")].concat(months);
     43    dateTimeFilter.list_data = [""].concat(months);
    4544
     45    if(data && data.replayMenuData)
     46        dateTimeFilter.selected = dateTimeFilter.list_data.indexOf(data.replayMenuData.selectedFilters.date);
     47
    4648    if (dateTimeFilter.selected == -1 || dateTimeFilter.selected >= dateTimeFilter.list.length)
    4749        dateTimeFilter.selected = 0;
    4850}
     
    5052/**
    5153 * Allow to filter by mapsize. Uses g_MapSizes.
    5254 */
    53 function initMapSizeFilter()
     55function initMapSizeFilter(data)
    5456{
    5557    var mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter");
    5658    mapSizeFilter.list = [translateWithContext("map size", "Any")].concat(g_MapSizes.Name);
    5759    mapSizeFilter.list_data = [-1].concat(g_MapSizes.Tiles);
    5860
     61    if(data && data.replayMenuData)
     62        mapSizeFilter.selected = mapSizeFilter.list_data.indexOf(data.replayMenuData.selectedFilters.mapSize);
     63
    5964    if (mapSizeFilter.selected == -1 || mapSizeFilter.selected >= mapSizeFilter.list.length)
    6065        mapSizeFilter.selected = 0;
    6166}
     
    6368/**
    6469 * Allow to filter by mapname. Uses g_MapNames.
    6570 */
    66 function initMapNameFilter()
     71function initMapNameFilter(data)
    6772{
    6873    var mapNameFilter = Engine.GetGUIObjectByName("mapNameFilter");
    69     mapNameFilter.list = [translateWithContext("map name", "Any")].concat(g_MapNames);
    70     mapNameFilter.list_data = [""].concat(g_MapNames.map(mapName => translate(mapName)));
     74    mapNameFilter.list = [translateWithContext("map name", "Any")].concat(g_MapNames.map(mapName => translate(mapName)));
     75    mapNameFilter.list_data = [""].concat(g_MapNames);
    7176
     77    if(data && data.replayMenuData)
     78        mapNameFilter.selected = mapNameFilter.list_data.indexOf(data.replayMenuData.selectedFilters.mapName);
     79
    7280    if (mapNameFilter.selected == -1 || mapNameFilter.selected >= mapNameFilter.list.length)
    7381        mapNameFilter.selected = 0;
    7482}
     
    7684/**
    7785 * Allow to filter by population capacity.
    7886 */
    79 function initPopCapFilter()
     87function initPopCapFilter(data)
    8088{
    8189    var populationFilter = Engine.GetGUIObjectByName("populationFilter");
    8290    populationFilter.list = [translateWithContext("population capacity", "Any")].concat(g_PopulationCapacities.Title);
    8391    populationFilter.list_data = [""].concat(g_PopulationCapacities.Population);
    8492
     93    if(data && data.replayMenuData)
     94        populationFilter.selected = populationFilter.list_data.indexOf(data.replayMenuData.selectedFilters.popCap);
     95
    8596    if (populationFilter.selected == -1 || populationFilter.selected >= populationFilter.list.length)
    8697        populationFilter.selected = 0;
    8798}
     
    89100/**
    90101 * Allow to filter by game duration. Uses g_DurationFilterIntervals.
    91102 */
    92 function initDurationFilter()
     103function initDurationFilter(data)
    93104{
    94105    var durationFilter = Engine.GetGUIObjectByName("durationFilter");
    95106    durationFilter.list = g_DurationFilterIntervals.map((interval, index) => {
     
    110121    });
    111122    durationFilter.list_data = g_DurationFilterIntervals.map((interval, index) => index);
    112123
     124    if(data && data.replayMenuData)
     125        durationFilter.selected = durationFilter.list_data.indexOf(data.replayMenuData.selectedFilters.duration);
     126
    113127    if (durationFilter.selected == -1 || durationFilter.selected >= g_DurationFilterIntervals.length)
    114128        durationFilter.selected = 0;
    115129}
  • binaries/data/mods/public/gui/replaymenu/replay_menu.js

     
    3636/**
    3737 * Directory name of the currently selected replay. Used to restore the selection after changing filters.
    3838 */
    39 var g_selectedReplayDirectory = "";
     39var g_SelectedReplayDirectory = "";
    4040
    4141/**
    4242 * Initializes globals, loads replays and displays the list.
    4343 */
    44 function init()
     44function init(data)
    4545{
     46    if (data && data.replayMenuData)
     47    {
     48        g_SelectedReplayDirectory = data.replayMenuData.selectedDirectory;
     49        Engine.GetGUIObjectByName("playersFilter").caption = data.replayMenuData.selectedFilters.playernames;
     50        Engine.GetGUIObjectByName("replaySelection").selected_column = data.replayMenuData.selectedColumn;
     51        Engine.GetGUIObjectByName("replaySelection").selected_column_order = data.replayMenuData.selectedColumnOrder;
     52    }
     53
    4654    if (!g_Settings)
    4755    {
    4856        Engine.SwitchGuiPage("page_pregame.xml");
     
    4957        return;
    5058    }
    5159
    52     loadReplays();
     60    loadReplays(data);
    5361
    5462    if (!g_Replays)
    5563    {
     
    6472 * Store the list of replays loaded in C++ in g_Replays.
    6573 * Check timestamp and compatibility and extract g_Playernames, g_MapNames
    6674 */
    67 function loadReplays()
     75function loadReplays(data)
    6876{
    6977    g_Replays = Engine.GetReplays();
    7078
     
    105113    g_MapNames.sort();
    106114
    107115    // Reload filters (since they depend on g_Replays and its derivatives)
    108     initFilters();
     116    initFilters(data);
    109117}
    110118
    111119/**
     
    152160    // Remember previously selected replay
    153161    var replaySelection = Engine.GetGUIObjectByName("replaySelection");
    154162    if (replaySelection.selected != -1)
    155         g_selectedReplayDirectory = g_ReplaysFiltered[replaySelection.selected].directory;
     163        g_SelectedReplayDirectory = g_ReplaysFiltered[replaySelection.selected].directory;
    156164
    157165    filterReplays();
    158166
     
    188196    replaySelection.list_data = list.directories || [];
    189197
    190198    // Restore selection
    191     replaySelection.selected = replaySelection.list.findIndex(directory => directory == g_selectedReplayDirectory);
     199    replaySelection.selected = replaySelection.list.findIndex(directory => directory == g_SelectedReplayDirectory);
    192200
    193201    displayReplayDetails();
    194202}
  • binaries/data/mods/public/gui/session/session.js

     
    6161
    6262/**
    6363 * Not constant as we add "gaia".
    64  **/
     64 */
    6565var g_CivData = {};
    6666
     67/**
     68 * For restoring selection, order and filters when returning to the replay menu
     69 */
     70var g_ReplayMenuData;
     71
    6772var g_PlayerAssignments = { "local": { "name": translate("You"), "player": 1 } };
    6873
    6974/**
     
    213218        g_PlayerAssignments = initData.playerAssignments;
    214219        g_MatchID = initData.attribs.matchID;
    215220
     221        g_ReplayMenuData = initData.replayMenuData;
     222
    216223        // Cache the player data
    217224        // (This may be updated at runtime by handleNetMessage)
    218225        g_Players = getPlayerData(g_PlayerAssignments);
     
    473480        Engine.SaveReplayMetadata(JSON.stringify(summary));
    474481
    475482    summary.replayDirectory = Engine.GetCurrentReplayDirectory();
     483    summary.replayMenuData = g_ReplayMenuData;
    476484
    477485    Engine.EndGame();
    478486
  • binaries/data/mods/public/gui/summary/summary.js

     
    134134    if (Engine.HasXmppClient())
    135135        Engine.StopXmppClient();
    136136
    137     Engine.StartVisualReplay(g_GameData.replayDirectory);
     137    Engine.StartVisualReplay(g_GameData.replayMenuData.selectedDirectory);
    138138    Engine.SwitchGuiPage("page_loading.xml", {
    139         "attribs": Engine.GetReplayAttributes(g_GameData.replayDirectory),
    140         "isNetworked" : false,
     139        "attribs": Engine.GetReplayAttributes(g_GameData.replayMenuData.selectedDirectory),
     140        "isNetworked": false,
    141141        "playerAssignments": {
    142             "local" : {
     142            "local": {
    143143                "name": translate("You"),
    144144                "player": -1
    145145            }
    146146        },
    147147        "savedGUIData": "",
    148         "isReplay" : true
     148        "isReplay": true,
     149        "replayMenuData": g_GameData.replayMenuData
    149150    });
    150151}
    151152
     
    159160    Engine.GetGUIObjectByName("timeElapsed").caption = sprintf(translate("Game time elapsed: %(time)s"), { "time": timeToString(data.timeElapsed) });
    160161    Engine.GetGUIObjectByName("summaryText").caption = data.gameResult;
    161162    Engine.GetGUIObjectByName("mapName").caption = sprintf(translate("%(mapName)s - %(mapType)s"), { "mapName": translate(data.mapSettings.Name), "mapType": mapSize ? mapSize.LongName : (mapType ? mapType.Title : "") });
    162     Engine.GetGUIObjectByName("replayButton").hidden = g_GameData.isInGame || !g_GameData.replayDirectory;
     163    Engine.GetGUIObjectByName("replayButton").hidden = g_GameData.isInGame || !g_GameData.replayMenuData.selectedDirectory;
    163164
    164165    // Panels
    165166    g_PlayerCount = data.playerStates.length - 1;
  • binaries/data/mods/public/gui/summary/summary.xml

     
    187187                }
    188188                else if (g_GameData.isReplay)
    189189                {
    190                     Engine.SwitchGuiPage("page_replaymenu.xml");
     190                    Engine.SwitchGuiPage("page_replaymenu.xml", { "replayMenuData": g_GameData.replayMenuData });
    191191                }
    192192                else if (!Engine.HasXmppClient())
    193193                {