Ticket #4413: 4413_load.2.patch

File 4413_load.2.patch, 8.9 KB (added by Vladislav Belov, 7 years ago)

Adds olist, checkbox and removes paths

  • binaries/data/mods/public/gui/common/functions_utility_loadsave.js

     
    33    return b.metadata.time - a.metadata.time;
    44}
    55
    6 function generateLabel(metadata, engineInfo)
     6function isCompatibleSavegame(metadata, engineInfo)
    77{
     8    return engineInfo ?
     9            hasSameSavegameVersion(metadata, engineInfo) &&
     10            hasSameEngineVersion(metadata, engineInfo) &&
     11            hasSameMods(metadata, engineInfo)
     12            :
     13            false;
     14}
     15
     16function generateDateString(metadata, engineInfo)
     17{
    818    let dateTimeString = Engine.FormatMillisecondsIntoDateString(metadata.time*1000, translate("yyyy-MM-dd HH:mm:ss"));
    9     let dateString = sprintf(translate("\\[%(date)s]"), { "date": dateTimeString });
     19    let dateString = sprintf(translate("%(date)s"), { "date": dateTimeString });
    1020
    1121    if (engineInfo)
    1222    {
     
    1626            dateString = "[color=\"orange\"]" + dateString + "[/color]";
    1727    }
    1828
     29    return dateString;
     30}
     31
     32function generateLabel(metadata, engineInfo)
     33{
    1934    return sprintf(
    2035        metadata.description ?
    2136            translate("%(dateString)s %(map)s - %(description)s") :
    2237            translate("%(dateString)s %(map)s"),
    2338        {
    24             "dateString": dateString,
     39            "dateString": "\\[" + generateDateString(metadata, engineInfo) + "]",
    2540            "map": metadata.initAttributes.map,
    2641            "description": metadata.description || ""
    2742        }
  • binaries/data/mods/public/gui/savedgames/load.js

     
    77
    88function init()
    99{
     10    let savedGames = Engine.GetSavedGames();
     11
     12    // Get current game version and loaded mods
     13    let engineInfo = Engine.GetEngineInfo();
     14
     15    // Filter incompatible saved games
     16    if (Engine.GetGUIObjectByName("compatibilityFilter").checked)
     17        savedGames = savedGames.filter(game => isCompatibleSavegame(game.metadata, engineInfo));
     18
    1019    let gameSelection = Engine.GetGUIObjectByName("gameSelection");
    11     let savedGames = Engine.GetSavedGames().sort(sortDecreasingDate);
    1220    gameSelection.enabled = !!savedGames.length;
    13     if (!savedGames.length)
     21    Engine.GetGUIObjectByName("gameSelectionFeedback").hidden = !!savedGames.length;
     22
     23    let selectedGameId = gameSelection.list_data[gameSelection.selected];
     24
     25    // Save metadata for the detailed view
     26    g_SavedGamesMetadata = savedGames.map(game =>
    1427    {
    15         gameSelection.list = [translate("No saved games found")];
    16         gameSelection.selected = -1;
    17         return;
    18     }
     28        game.metadata["id"] = game.id;
     29        return game.metadata;
     30    });
    1931
    20     // Get current game version and loaded mods
    21     let engineInfo = Engine.GetEngineInfo();
     32    const sortKey = gameSelection.selected_column;
     33    const sortOrder = gameSelection.selected_column_order;
     34    g_SavedGamesMetadata = g_SavedGamesMetadata.sort((a, b) =>
     35    {
     36        let cmpA, cmpB;
     37        switch (sortKey)
     38        {
     39        case 'date':
     40            cmpA = +a.time;
     41            cmpB = +b.time;
     42            break;
     43        case 'mapName':
     44            cmpA = translate(a.initAttributes.settings.Name);
     45            cmpB = translate(b.initAttributes.settings.Name);
     46            break;
     47        case 'mapType':
     48            cmpA = translateMapType(a.initAttributes.mapType);
     49            cmpB = translateMapType(b.initAttributes.mapType);
     50            break;
     51        case 'description':
     52            cmpA = a.description;
     53            cmpB = b.description;
     54            break;
     55        }
     56       
     57        if (cmpA < cmpB)
     58            return -sortOrder;
     59        else if (cmpA > cmpB)
     60            return +sortOrder;
    2261
    23     g_SavedGamesMetadata = savedGames.map(game => game.metadata);
     62        return 0;
     63    });
     64   
     65    let list = g_SavedGamesMetadata.map(metadata => {
     66        return {
     67            "date": generateDateString(metadata, engineInfo),
     68            "mapName": translate(metadata.initAttributes.settings.Name),
     69            "mapType": translateMapType(metadata.initAttributes.mapType),
     70            "description": metadata.description
     71        };
     72    });
    2473
    25     gameSelection.list = savedGames.map(game => generateLabel(game.metadata, engineInfo));
    26     gameSelection.list_data = savedGames.map(game => game.id);
     74    if (list.length)
     75        list = prepareForDropdown(list);
    2776
    28     if (gameSelection.selected == -1)
     77    gameSelection.list_date = list.date || [];
     78    gameSelection.list_mapName = list.mapName || [];
     79    gameSelection.list_mapType = list.mapType || [];
     80    gameSelection.list_description = list.description || [];
     81
     82    // Change these last, otherwise crash
     83    gameSelection.list = g_SavedGamesMetadata.map(metadata => generateLabel(metadata, engineInfo));
     84    gameSelection.list_data = g_SavedGamesMetadata.map(metadata => metadata.id);
     85
     86    if (gameSelection.selected == -1 && !!savedGames.length)
    2987        gameSelection.selected = 0;
    30     else if (gameSelection.selected >= savedGames.length) // happens when deleting the last saved game
    31         gameSelection.selected = savedGames.length - 1;
     88    else if (gameSelection.selected >= g_SavedGamesMetadata.length) // happens when deleting the last saved game
     89        gameSelection.selected = g_SavedGamesMetadata.length - 1;
    3290    else
    33         selectionChanged();
     91        gameSelection.selected = g_SavedGamesMetadata.findIndex(metadata => metadata.id == selectedGameId);
    3492
    3593    Engine.GetGUIObjectByName("deleteGameButton").tooltip = deleteTooltip();
    3694}
  • binaries/data/mods/public/gui/savedgames/load.xml

     
    1414    <!-- Add a translucent black background to fade out the menu page -->
    1515    <object type="image" z="0" sprite="BackgroundTranslucent"/>
    1616
    17     <object type="image" style="ModernDialog" size="50%-420 50%-325 50%+420 50%+325">
     17    <object type="image" style="ModernDialog" size="50%-460 50%-325 50%+460 50%+325">
    1818
    1919        <object type="text" style="TitleText" size="50%-128 -18 50%+128 14">
    2020            <translatableAttribute id="caption">Load Game</translatableAttribute>
    2121        </object>
    2222
    23         <object type="image" size="0 20 550 100%">
    24             <object name="gameSelection" style="ModernList" type="list" size="24 12 100%-24 100%-90">
     23        <object type="image" size="0 20 630 100%">
     24            <object name="gameSelection"
     25                selected_column="date"
     26                selected_column_order="-1"
     27                sortable="true"
     28                size="24 4 100%-24 100%-70"
     29                sprite_asc="ModernArrowDown"
     30                sprite_desc="ModernArrowUp"
     31                sprite_not_sorted="ModernNotSorted"
     32                style="ModernList"
     33                type="olist"
     34            >
    2535                <action on="SelectionChange">selectionChanged();</action>
     36                <action on="SelectionColumnChange">init();</action>
     37                <action on="mouseleftdoubleclickitem">loadGame();</action>
     38
     39                <column id="date" color="255 255 255" width="25%">
     40                    <translatableAttribute id="heading" context="replay">Date / Time</translatableAttribute>
     41                </column>
     42
     43                <column id="mapType" color="255 255 255" width="15%">
     44                    <translatableAttribute id="heading" context="replay">Map Type</translatableAttribute>
     45                </column>
     46
     47                <column id="mapName" color="255 255 255" width="35%">
     48                    <translatableAttribute id="heading" context="replay">Map Name</translatableAttribute>
     49                </column>
     50
     51                <column id="description" color="255 255 255" width="25%">
     52                    <translatableAttribute id="heading" context="replay">Description</translatableAttribute>
     53                </column>
    2654            </object>
    2755
     56            <object name="gameSelectionFeedback" size="24 12 100%-24 100" type="text" style="ModernLabelText" hidden="true">
     57                <translatableAttribute id="caption">No saved games found.</translatableAttribute>
     58            </object>
     59
    2860            <object type="button" size="0%+25 100%-60 33%+10 100%-32" style="StoneButton" hotkey="cancel">
    2961                <translatableAttribute id="caption">Cancel</translatableAttribute>
    3062                <action on="Press">Engine.PopGuiPage();</action>
     
    4274
    4375        </object>
    4476
    45         <object name="validGame" type="image" size="550 20 100%-20 100%">
     77        <object name="filterPanel" size="630 25 100%-20 60">
     78            <object name="compatibilityFilter" type="checkbox" checked="false" style="ModernTickBox" size="0 0 20 20">
     79                <action on="Press">init();</action>
     80            </object>
     81
     82            <object type="text" size="25 0 100% 100%" text_align="left" textcolor="white">
     83                <translatableAttribute id="caption">Filter compatible saved games</translatableAttribute>
     84            </object>
     85        </object>
     86
     87        <object name="validGame" type="image" size="630 60 100%-20 100%">
     88            <object size="0 0 100%-15 1" type="image" sprite="ModernWhiteLine" z="25" />
    4689            <object name="savedMapName" size="0 0 100% 20" type="text" style="ModernLabelText" />
    4790            <object name="savedInfoPreview" size="20 20 240 240" type="image" sprite="" />
    4891
     
    76119            <object size="0 100%-32 100%-15 100%-31" type="image" sprite="ModernWhiteLine" z="25" />
    77120        </object>
    78121
    79         <object name="invalidGame" size="570 55 790 155" type="image" sprite="logo" />
     122        <object name="invalidGame" size="650 105 870 205" type="image" sprite="logo" />
    80123    </object>
    81124
    82125</objects>