Ticket #4413: 4413_load.2.patch
File 4413_load.2.patch, 8.9 KB (added by , 7 years ago) |
---|
-
binaries/data/mods/public/gui/common/functions_utility_loadsave.js
3 3 return b.metadata.time - a.metadata.time; 4 4 } 5 5 6 function generateLabel(metadata, engineInfo)6 function isCompatibleSavegame(metadata, engineInfo) 7 7 { 8 return engineInfo ? 9 hasSameSavegameVersion(metadata, engineInfo) && 10 hasSameEngineVersion(metadata, engineInfo) && 11 hasSameMods(metadata, engineInfo) 12 : 13 false; 14 } 15 16 function generateDateString(metadata, engineInfo) 17 { 8 18 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 }); 10 20 11 21 if (engineInfo) 12 22 { … … 16 26 dateString = "[color=\"orange\"]" + dateString + "[/color]"; 17 27 } 18 28 29 return dateString; 30 } 31 32 function generateLabel(metadata, engineInfo) 33 { 19 34 return sprintf( 20 35 metadata.description ? 21 36 translate("%(dateString)s %(map)s - %(description)s") : 22 37 translate("%(dateString)s %(map)s"), 23 38 { 24 "dateString": dateString,39 "dateString": "\\[" + generateDateString(metadata, engineInfo) + "]", 25 40 "map": metadata.initAttributes.map, 26 41 "description": metadata.description || "" 27 42 } -
binaries/data/mods/public/gui/savedgames/load.js
7 7 8 8 function init() 9 9 { 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 10 19 let gameSelection = Engine.GetGUIObjectByName("gameSelection"); 11 let savedGames = Engine.GetSavedGames().sort(sortDecreasingDate);12 20 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 => 14 27 { 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 }); 19 31 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; 22 61 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 }); 24 73 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); 27 76 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) 29 87 gameSelection.selected = 0; 30 else if (gameSelection.selected >= savedGames.length) // happens when deleting the last saved game31 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; 32 90 else 33 selectionChanged();91 gameSelection.selected = g_SavedGamesMetadata.findIndex(metadata => metadata.id == selectedGameId); 34 92 35 93 Engine.GetGUIObjectByName("deleteGameButton").tooltip = deleteTooltip(); 36 94 } -
binaries/data/mods/public/gui/savedgames/load.xml
14 14 <!-- Add a translucent black background to fade out the menu page --> 15 15 <object type="image" z="0" sprite="BackgroundTranslucent"/> 16 16 17 <object type="image" style="ModernDialog" size="50%-4 20 50%-325 50%+420 50%+325">17 <object type="image" style="ModernDialog" size="50%-460 50%-325 50%+460 50%+325"> 18 18 19 19 <object type="text" style="TitleText" size="50%-128 -18 50%+128 14"> 20 20 <translatableAttribute id="caption">Load Game</translatableAttribute> 21 21 </object> 22 22 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 > 25 35 <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> 26 54 </object> 27 55 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 28 60 <object type="button" size="0%+25 100%-60 33%+10 100%-32" style="StoneButton" hotkey="cancel"> 29 61 <translatableAttribute id="caption">Cancel</translatableAttribute> 30 62 <action on="Press">Engine.PopGuiPage();</action> … … 42 74 43 75 </object> 44 76 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" /> 46 89 <object name="savedMapName" size="0 0 100% 20" type="text" style="ModernLabelText" /> 47 90 <object name="savedInfoPreview" size="20 20 240 240" type="image" sprite="" /> 48 91 … … 76 119 <object size="0 100%-32 100%-15 100%-31" type="image" sprite="ModernWhiteLine" z="25" /> 77 120 </object> 78 121 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" /> 80 123 </object> 81 124 82 125 </objects>