Ticket #3436: 3436_singMulti_filter_v6.patch
File 3436_singMulti_filter_v6.patch, 10.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 singleplayerFilter = Engine.GetGUIObjectByName("singleplayerFilter"); 15 let victoryConFilter = Engine.GetGUIObjectByName("victoryConditionFilter"); 16 let ratedGamesFilter = Engine.GetGUIObjectByName("ratedGamesFilter"); 14 17 15 18 return { 16 19 "directory": selectedDirectory, … … 23 26 "mapSize": mapSizeFilter.list_data[mapSizeFilter.selected], 24 27 "popCap": populationFilter.list_data[populationFilter.selected], 25 28 "duration": durationFilter.list_data[durationFilter.selected], 26 "compatibility": compatibilityFilter.checked 29 "compatibility": compatibilityFilter.checked, 30 "singleplayer": singleplayerFilter.list_data[singleplayerFilter.selected], 31 "victoryCondition": victoryConFilter.list_data[victoryConFilter.selected], 32 "ratedGames": ratedGamesFilter.selected 27 33 } 28 34 }; 29 35 } -
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 initSingleplayerFilter(filters && filters.singleplayer); 37 initVictoryConditionFilter(filters && filters.victoryCondition); 38 initRatedGamesFilter(filters && filters.ratedGames); 36 39 } 37 40 38 41 /** … … 133 136 durationFilter.selected = 0; 134 137 } 135 138 139 function initSingleplayerFilter(singleplayer) 140 { 141 let singleplayerFilter = Engine.GetGUIObjectByName("singleplayerFilter"); 142 singleplayerFilter.list = [translateWithContext("gamemode", "Any"), translate("Single Player"), translate("Multiplayer")]; 143 singleplayerFilter.list_data = ["", "Singleplayer", "Multiplayer"]; 144 145 if (singleplayer) 146 singleplayerFilter.selected = singleplayerFilter.list_data.indexOf(singleplayer); 147 148 if (singleplayerFilter.selected < 0 || singleplayerFilter.selected >= singleplayerFilter.list.length) 149 singleplayerFilter.selected = 0; 150 } 151 152 function initVictoryConditionFilter(victoryCondition) 153 { 154 let victoryConditionFilter = Engine.GetGUIObjectByName("victoryConditionFilter"); 155 victoryConditionFilter.list = [translateWithContext("victory condition", "Any")].concat(g_VictoryConditions.map(victoryCondition => translateVictoryCondition(victoryCondition))); 156 victoryConditionFilter.list_data = [""].concat(g_VictoryConditions); 157 158 if (victoryCondition) 159 victoryConditionFilter.selected = victoryConditionFilter.list_data.indexOf(victoryCondition); 160 161 if (victoryConditionFilter.selected < 0 || victoryConditionFilter.selected >= victoryConditionFilter.list.length) 162 victoryConditionFilter.selected = 0; 163 } 164 165 function initRatedGamesFilter(ratedGames) 166 { 167 let ratedGamesFilter = Engine.GetGUIObjectByName("ratedGamesFilter"); 168 ratedGamesFilter.list = [translateWithContext("rated game", "Any"), translate("Rated Games"), translate("No Rated Games")]; 169 ratedGamesFilter.list_data = ["", "rated", "not rated"]; 170 171 if (ratedGames) 172 ratedGamesFilter.selected = ratedGamesFilter.list_data.indexOf(ratedGames); 173 174 if (ratedGamesFilter.selected < 0 || ratedGamesFilter.selected >= ratedGamesFilter.list.length) 175 ratedGamesFilter.selected = 0; 176 } 177 136 178 /** 137 179 * Initializes g_ReplaysFiltered with replays that are not filtered out and sort it. 138 180 */ … … 193 235 if (compatibilityFilter.checked && !isReplayCompatible(replay)) 194 236 return false; 195 237 238 // Filter by multiplayer/singleplayer 239 let singleplayerFilter = Engine.GetGUIObjectByName("singleplayerFilter"); 240 if (singleplayerFilter.selected == 1 && replay.isMultiplayer || 241 singleplayerFilter.selected == 2 && !replay.isMultiplayer) 242 return false; 243 244 // Filter by victory condition 245 let victoryConditionFilter = Engine.GetGUIObjectByName("victoryConditionFilter"); 246 if (victoryConditionFilter.selected > 0 && replay.attribs.settings.GameType != victoryConditionFilter.list_data[victoryConditionFilter.selected]) 247 return false; 248 249 // Filter by rating 250 let ratedGamesFilter = Engine.GetGUIObjectByName("ratedGamesFilter"); 251 if (ratedGamesFilter.selected == 1 && !replay.attribs.settings.RatingEnabled || 252 ratedGamesFilter.selected == 2 && replay.attribs.settings.RatingEnabled) 253 return false 254 196 255 // Filter date/time (select a month) 197 vardateTimeFilter = Engine.GetGUIObjectByName("dateTimeFilter");256 let dateTimeFilter = Engine.GetGUIObjectByName("dateTimeFilter"); 198 257 if (dateTimeFilter.selected > 0 && getReplayMonth(replay) != dateTimeFilter.list_data[dateTimeFilter.selected]) 199 258 return false; 200 259 201 260 // Filter by playernames 202 varplayersFilter = Engine.GetGUIObjectByName("playersFilter");203 varkeywords = playersFilter.caption.toLowerCase().split(" ");261 let playersFilter = Engine.GetGUIObjectByName("playersFilter"); 262 let keywords = playersFilter.caption.toLowerCase().split(" "); 204 263 if (keywords.length) 205 264 { 206 265 // We just check if all typed words are somewhere in the playerlist of that replay … … 210 269 } 211 270 212 271 // Filter by map name 213 varmapNameFilter = Engine.GetGUIObjectByName("mapNameFilter");272 let mapNameFilter = Engine.GetGUIObjectByName("mapNameFilter"); 214 273 if (mapNameFilter.selected > 0 && getReplayMapName(replay) != mapNameFilter.list_data[mapNameFilter.selected]) 215 274 return false; 216 275 217 276 // Filter by map size 218 varmapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter");277 let mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter"); 219 278 if (mapSizeFilter.selected > 0 && replay.attribs.settings.Size != mapSizeFilter.list_data[mapSizeFilter.selected]) 220 279 return false; 221 280 222 281 // Filter by population capacity 223 varpopulationFilter = Engine.GetGUIObjectByName("populationFilter");282 let populationFilter = Engine.GetGUIObjectByName("populationFilter"); 224 283 if (populationFilter.selected > 0 && replay.attribs.settings.PopulationCap != populationFilter.list_data[populationFilter.selected]) 225 284 return false; 226 285 227 286 // Filter by game duration 228 vardurationFilter = Engine.GetGUIObjectByName("durationFilter");287 let durationFilter = Engine.GetGUIObjectByName("durationFilter"); 229 288 if (durationFilter.selected > 0) 230 289 { 231 290 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) 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="singleplayerFilter" type="dropdown" style="ModernDropDown" size="0 30 100% 55" font="sans-bold-13"> 115 <action on="SelectionChange">displayReplayList();</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();</action> 121 </object> 122 123 <!-- Rated Games Filter --> 124 <object name="ratedGamesFilter" type="dropdown" style="ModernDropDown" size="0 90 100% 115" font="sans-bold-13"> 125 <action on="SelectionChange">displayReplayList();</action> 126 </object> 127 113 128 <!-- Placeholder to show if no replay is selected --> 114 <object name="replayInfoEmpty" size="0 30 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="false">129 <object name="replayInfoEmpty" size="0 120 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="false"> 115 130 <object name="logo" size="50%-110 40 50%+110 140" type="image" sprite="logo"/> 116 131 <object name="subjectBox" type="image" sprite="ModernDarkBoxWhite" size="3% 180 97% 99%"> 117 132 <object name="subject" size="5 5 100%-5 100%-5" type="text" style="ModernText" text_align="center"/> … … 119 134 </object> 120 135 121 136 <!-- --> 122 <object name="replayInfo" size="0 30 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="true">137 <object name="replayInfo" size="0 120 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="true"> 123 138 124 139 <!-- Map Name Label --> 125 140 <object name="sgMapName" size="0 5 100% 20" type="text" style="ModernLabelText"/>