Ticket #3244: t3244_keep_player_and_gamelist_selection_v2_a18.patch

File t3244_keep_player_and_gamelist_selection_v2_a18.patch, 5.2 KB (added by elexis, 9 years ago)

Patch to test with a18 (a lobby with more than 0-1 games online).

  • binaries/data/mods/public/gui/lobby/lobby.js

     
    11var g_ChatMessages = [];
    22var g_Name = "unknown";
    33var g_GameList = {};
     4var g_filteredGameList = {};
     5var g_selectedGameIP = "";
     6var g_selectedNick = "";
    47var g_specialKey = Math.random();
    58// This object looks like {"name":[numMessagesSinceReset, lastReset, timeBlocked]} when in use.
    69var g_spamMonitor = {};
    710var g_timestamp = Engine.ConfigDB_GetValue("user", "lobby.chattimestamp") == "true";
    811var g_mapSizes = {};
     
    153156 * @return Array containing the player, presence, nickname, and rating listings.
    154157 */
    155158function updatePlayerList()
    156159{
    157160    var playersBox = Engine.GetGUIObjectByName("playersBox");
     161   
     162    // Save previously selected player
     163    if (playersBox.selected > -1)
     164        g_selectedNick = playersBox.list[playersBox.selected];
     165       
    158166    var playerList = [];
    159167    var presenceList = [];
    160168    var nickList = [];
    161169    var ratingList = [];
    162170    var cleanPlayerList = Engine.GetPlayerList();
     
    188196    }
    189197    playersBox.list_name = playerList;
    190198    playersBox.list_status = presenceList;
    191199    playersBox.list_rating = ratingList;
    192200    playersBox.list = nickList;
    193     if (playersBox.selected >= playersBox.list.length)
    194         playersBox.selected = -1;
     201   
     202    // Select the previously selected player
     203    playersBox.selected = playersBox.list.indexOf(g_selectedNick);
     204   
    195205    return [playerList, presenceList, nickList, ratingList];
    196206}
    197207
    198208/**
    199209 * Display the profile of the selected player.
     
    354364 * Update the game listing from data cached in C++.
    355365 */
    356366function updateGameList()
    357367{
    358368    var gamesBox = Engine.GetGUIObjectByName("gamesBox");
    359     var gameList = Engine.GetGameList();
     369   
     370    // Save previously selected game by ip
     371    if (gamesBox.selected > -1)
     372        g_selectedGameIP = g_filteredGameList[gamesBox.selected].ip;
     373   
    360374    // Store the game whole game list data so that we can access it later
    361375    // to update the game info panel.
    362     g_GameList = gameList;
     376    g_GameList = Engine.GetGameList();
    363377
    364378    // Sort the list of games to that games 'waiting' are displayed at the top, followed by 'init', followed by 'running'.
    365379    var gameStatuses = ['waiting', 'init', 'running'];
    366380    g_GameList.sort(function (a,b) {
    367381        if (gameStatuses.indexOf(a.state) < gameStatuses.indexOf(b.state))
     
    385399    var list_nPlayers = [];
    386400    var list = [];
    387401    var list_data = [];
    388402
    389403    var c = 0;
    390     for each (var g in gameList)
     404    var selectedIndex = -1;
     405    for each (var g in g_GameList)
    391406    {
    392407        if(!filterGame(g))
    393408        {
    394409            // 'waiting' games are highlighted in orange, 'running' in red, and 'init' in green.
    395410            let name;
     
    399414                name = '[color="255 127 0"]' + g.name + '[/color]';
    400415            else
    401416                name = '[color="255 0 0"]' + g.name + '[/color]';
    402417            list_name.push(name);
    403418            list_ip.push(g.ip);
     419            if (g.ip == g_selectedGameIP)
     420                selectedIndex = list_ip.length - 1;
    404421            list_mapName.push(translate(g.niceMapName));
    405422            list_mapSize.push(translatedMapSize(g.mapSize));
    406423            let idx = g_mapTypes.indexOf(g.mapType);
    407424            list_mapType.push(idx != -1 ? g_mapTypesText[idx] : "");
    408425            list_nPlayers.push(g.nbp + "/" +g.tnbp);
    409426            list.push(g.name);
    410427            list_data.push(c);
    411428        }
    412429        c++;
    413430    }
     431    g_filteredGameList = g_GameList.filter(g => !filterGame(g));
    414432
    415433    gamesBox.list_name = list_name;
    416434    gamesBox.list_mapName = list_mapName;
    417435    gamesBox.list_mapSize = list_mapSize;
    418436    gamesBox.list_mapType = list_mapType;
    419437    gamesBox.list_nPlayers = list_nPlayers;
    420438    gamesBox.list = list;
    421439    gamesBox.list_data = list_data;
    422440
    423     if (gamesBox.selected >= gamesBox.list_name.length)
    424         gamesBox.selected = -1;
     441    // Select previously selected game
     442    gamesBox.selected = selectedIndex;
    425443
    426444    // Update info box about the game currently selected
    427445    updateGameSelection();
    428446}
    429447
     
    626644            var playerList = playersBox.list_name;
    627645            var presenceList = playersBox.list_status;
    628646            var nickList = playersBox.list;
    629647            var ratingList = playersBox.list_rating;
    630648            var nickIndex = nickList.indexOf(nick);
     649
     650            // Save the previously selected nickname
     651            if (playersBox.selected > -1)
     652                g_selectedNick = playersBox.list[playersBox.selected];
     653
    631654            switch(message.level)
    632655            {
    633656            case "join":
    634657                if (nick == g_Name)
    635658                {
     
    655678                addChatMessage({ "text": "/special " + sprintf(translate("%(nick)s has left."), { nick: nick }), "key": g_specialKey });
    656679                break;
    657680            case "nick":
    658681                if (nickIndex == -1) // This shouldn't ever happen
    659682                    break;
     683               
    660684                if (!isValidNick(message.data))
    661685                {
    662686                    addChatMessage({ "from": "system", "text": sprintf(translate("Invalid nickname: %(nick)s"), { nick: message.data })});
    663687                    break;
    664688                }
     
    686710            }
    687711            // Push new data to GUI
    688712            playersBox.list_name = playerList;
    689713            playersBox.list_status = presenceList;
    690714            playersBox.list_rating = ratingList;
    691             playersBox.list = nickList;     
    692             if (playersBox.selected >= playersBox.list.length)
    693                 playersBox.selected = -1;
     715            playersBox.list = nickList;
     716            // Select the previously selected player
     717            playersBox.selected = nickList.indexOf(g_selectedNick);
    694718            break;
    695719        case "system":
    696720            switch (message.level)
    697721            {
    698722            case "standard":