Ticket #3436: 3436_singMulti_filter_v2.patch
File 3436_singMulti_filter_v2.patch, 9.7 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/gui/replaymenu/replay_actions.js
11 11 let populationFilter = Engine.GetGUIObjectByName("populationFilter"); 12 12 let durationFilter = Engine.GetGUIObjectByName("durationFilter"); 13 13 let compatibilityFilter = Engine.GetGUIObjectByName("compatibilityFilter"); 14 let singMulFilter = Engine.GetGUIObjectByName("singleMultiPlayerFilter"); 15 let victoryConFilter = Engine.GetGUIObjectByName("victoryConditionFilter"); 14 16 15 17 return { 16 18 "directory": selectedDirectory, … … 23 25 "mapSize": mapSizeFilter.list_data[mapSizeFilter.selected], 24 26 "popCap": populationFilter.list_data[populationFilter.selected], 25 27 "duration": durationFilter.list_data[durationFilter.selected], 26 "compatibility": compatibilityFilter.checked 28 "compatibility": compatibilityFilter.checked, 29 "singleMultiPlayer": singMulFilter.list_data[singMulFilter.selected], 30 "victoryCondition": victoryConFilter.list_data[victoryConFilter.selected] 27 31 } 28 32 }; 29 33 } -
binaries/data/mods/public/gui/replaymenu/replay_filters.js
33 33 initMapNameFilter(filters && filters.mapName); 34 34 initPopCapFilter(filters && filters.popCap); 35 35 initDurationFilter(filters && filters.duration); 36 initSingleMultiPlayerFilter(filters && filters.singleMultiPlayer); 37 initVictoryConditionFilter(filters && filters.victoryCondition); 36 38 } 37 39 38 40 /** … … 133 135 durationFilter.selected = 0; 134 136 } 135 137 138 function initSingleMultiPlayerFilter(singleMultiPlayer) 139 { 140 let singleMultiPlayerFilter = Engine.GetGUIObjectByName("singleMultiPlayerFilter"); 141 singleMultiPlayerFilter.list = [translateWithContext("gamemode", "Any"), translate("Single Player"), translate("Multiplayer")]; 142 singleMultiPlayerFilter.list_data = ["", "Singleplayer", "Multiplayer"]; 143 144 if (singleMultiPlayer) 145 singleMultiPlayerFilter.selected = singleMultiPlayerFilter.list_data.indexOf(singleMultiPlayer); 146 147 if (singleMultiPlayerFilter.selected < 0 || singleMultiPlayerFilter.selected >= singleMultiPlayerFilter.list.length) 148 singleMultiPlayerFilter.selected = 0; 149 } 150 151 function initVictoryConditionFilter(victoryCondition) 152 { 153 let victoryConditionFilter = Engine.GetGUIObjectByName("victoryConditionFilter"); 154 victoryConditionFilter.list = [translateWithContext("victory condition", "Any")].concat(g_VictoryConditions.map(victoryCondition => translateVictoryCondition(victoryCondition))); 155 victoryConditionFilter.list_data = [""].concat(g_VictoryConditions); 156 157 if (victoryCondition) 158 victoryConditionFilter.selected = victoryConditionFilter.list_data.indexOf(victoryCondition); 159 160 if (victoryConditionFilter.selected < 0 || victoryConditionFilter.selected >= victoryConditionFilter.list.length) 161 victoryConditionFilter.selected = 0; 162 } 163 136 164 /** 137 165 * Initializes g_ReplaysFiltered with replays that are not filtered out and sort it. 138 166 */ … … 193 221 if (compatibilityFilter.checked && !isReplayCompatible(replay)) 194 222 return false; 195 223 224 // Filter by multiplayer/singleplayer 225 let singleMultiPlayerFilter = Engine.GetGUIObjectByName("singleMultiPlayerFilter"); 226 if (singleMultiPlayerFilter.selected > 0 && 227 ((singleMultiPlayerFilter.selected == 1 && replay.isMultiplayer) || 228 (singleMultiPlayerFilter.selected == 2 && !replay.isMultiplayer))) 229 return false; 230 231 // Filter by victory condition 232 let victoryConditionFilter = Engine.GetGUIObjectByName("victoryConditionFilter"); 233 if (victoryConditionFilter.selected > 0 && replay.attribs.settings.GameType != victoryConditionFilter.list_data[victoryConditionFilter.selected]) 234 return false; 235 196 236 // Filter date/time (select a month) 197 vardateTimeFilter = Engine.GetGUIObjectByName("dateTimeFilter");237 let dateTimeFilter = Engine.GetGUIObjectByName("dateTimeFilter"); 198 238 if (dateTimeFilter.selected > 0 && getReplayMonth(replay) != dateTimeFilter.list_data[dateTimeFilter.selected]) 199 239 return false; 200 240 201 241 // Filter by playernames 202 varplayersFilter = Engine.GetGUIObjectByName("playersFilter");203 varkeywords = playersFilter.caption.toLowerCase().split(" ");242 let playersFilter = Engine.GetGUIObjectByName("playersFilter"); 243 let keywords = playersFilter.caption.toLowerCase().split(" "); 204 244 if (keywords.length) 205 245 { 206 246 // We just check if all typed words are somewhere in the playerlist of that replay … … 210 250 } 211 251 212 252 // Filter by map name 213 varmapNameFilter = Engine.GetGUIObjectByName("mapNameFilter");253 let mapNameFilter = Engine.GetGUIObjectByName("mapNameFilter"); 214 254 if (mapNameFilter.selected > 0 && getReplayMapName(replay) != mapNameFilter.list_data[mapNameFilter.selected]) 215 255 return false; 216 256 217 257 // Filter by map size 218 varmapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter");258 let mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter"); 219 259 if (mapSizeFilter.selected > 0 && replay.attribs.settings.Size != mapSizeFilter.list_data[mapSizeFilter.selected]) 220 260 return false; 221 261 222 262 // Filter by population capacity 223 varpopulationFilter = Engine.GetGUIObjectByName("populationFilter");263 let populationFilter = Engine.GetGUIObjectByName("populationFilter"); 224 264 if (populationFilter.selected > 0 && replay.attribs.settings.PopulationCap != populationFilter.list_data[populationFilter.selected]) 225 265 return false; 226 266 227 267 // Filter by game duration 228 vardurationFilter = Engine.GetGUIObjectByName("durationFilter");268 let durationFilter = Engine.GetGUIObjectByName("durationFilter"); 229 269 if (durationFilter.selected > 0) 230 270 { 231 271 let interval = g_DurationFilterIntervals[durationFilter.selected]; -
binaries/data/mods/public/gui/replaymenu/replay_menu.js
34 34 var g_MapNames = []; 35 35 36 36 /** 37 * Sorted list of the victory conditions occuring in the replays 38 */ 39 var g_VictoryConditions = []; 40 41 /** 37 42 * Directory name of the currently selected replay. Used to restore the selection after changing filters. 38 43 */ 39 44 var g_SelectedReplayDirectory = ""; … … 62 67 63 68 /** 64 69 * Store the list of replays loaded in C++ in g_Replays. 65 * Check timestamp and compatibility and extract g_Playernames, g_MapNames .70 * Check timestamp and compatibility and extract g_Playernames, g_MapNames, g_VictoryConditions. 66 71 * Restore selected filters and item. 67 72 */ 68 73 function loadReplays(replaySelectionData) … … 75 80 g_Playernames = []; 76 81 for (let replay of g_Replays) 77 82 { 83 let nonAIPlayers = 0; 78 84 // Use time saved in file, otherwise file mod date 79 85 replay.timestamp = replay.attribs.timestamp ? +replay.attribs.timestamp : +replay.filemod_timestamp-replay.duration; 80 86 … … 87 93 if (g_MapNames.indexOf(replay.attribs.settings.Name) == -1 && replay.attribs.settings.Name != "") 88 94 g_MapNames.push(replay.attribs.settings.Name); 89 95 96 // Extract victory conditions 97 if (g_VictoryConditions.indexOf(replay.attribs.settings.GameType) == -1 && replay.attribs.settings.GameType != "") 98 g_VictoryConditions.push(replay.attribs.settings.GameType); 99 90 100 // Extract playernames 91 101 for (let playerData of replay.attribs.settings.PlayerData) 92 102 { … … 101 111 102 112 if (g_Playernames.indexOf(playername) == -1) 103 113 g_Playernames.push(playername); 114 nonAIPlayers++; 104 115 } 116 replay.isMultiplayer = nonAIPlayers > 1; 105 117 } 106 118 g_MapNames.sort(); 119 g_VictoryConditions.sort(); 107 120 108 121 // Reload filters (since they depend on g_Replays and its derivatives) 109 122 initFilters(replaySelectionData && replaySelectionData.filters); -
binaries/data/mods/public/gui/replaymenu/replay_menu.xml
110 110 <translatableAttribute id="caption">Filter compatible replays</translatableAttribute> 111 111 </object> 112 112 113 <!-- Singleplayer Multiplayer Filter --> 114 <object name="singleMultiPlayerFilter" type="dropdown" style="ModernDropDown" size="0 30 100% 55" font="sans-bold-13"> 115 <action on="SelectionChange">displayReplayList(); warn("change");</action> 116 </object> 117 118 <!-- Victory Condition Filter --> 119 <object name="victoryConditionFilter" type="dropdown" style="ModernDropDown" size="0 60 100% 85" font="sans-bold-13"> 120 <action on="SelectionChange">displayReplayList(); warn("change");</action> 121 </object> 122 113 123 <!-- Placeholder to show if no replay is selected --> 114 <object name="replayInfoEmpty" size="0 30100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="false">124 <object name="replayInfoEmpty" size="0 95 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="false"> 115 125 <object name="logo" size="50%-110 40 50%+110 140" type="image" sprite="logo"/> 116 126 <object name="subjectBox" type="image" sprite="ModernDarkBoxWhite" size="3% 180 97% 99%"> 117 127 <object name="subject" size="5 5 100%-5 100%-5" type="text" style="ModernText" text_align="center"/> … … 119 129 </object> 120 130 121 131 <!-- --> 122 <object name="replayInfo" size="0 30100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="true">132 <object name="replayInfo" size="0 95 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="true"> 123 133 124 134 <!-- Map Name Label --> 125 135 <object name="sgMapName" size="0 5 100% 20" type="text" style="ModernLabelText"/>