Ticket #3436: 3436_singMulti_filter_v4.patch

File 3436_singMulti_filter_v4.patch, 9.6 KB (added by Imarok, 8 years ago)

Renamed singleMultiPlayer to singleplayer

  • binaries/data/mods/public/gui/replaymenu/replay_actions.js

     
    1111    let populationFilter = Engine.GetGUIObjectByName("populationFilter");
    1212    let durationFilter = Engine.GetGUIObjectByName("durationFilter");
    1313    let compatibilityFilter = Engine.GetGUIObjectByName("compatibilityFilter");
     14    let singleplayerFilter = Engine.GetGUIObjectByName("singleplayerFilter");
     15    let victoryConFilter = Engine.GetGUIObjectByName("victoryConditionFilter");
    1416
    1517    return {
    1618        "directory": selectedDirectory,
     
    2325            "mapSize": mapSizeFilter.list_data[mapSizeFilter.selected],
    2426            "popCap": populationFilter.list_data[populationFilter.selected],
    2527            "duration": durationFilter.list_data[durationFilter.selected],
    26             "compatibility": compatibilityFilter.checked
     28            "compatibility": compatibilityFilter.checked,
     29            "singleplayer": singleplayerFilter.list_data[singleplayerFilter.selected],
     30            "victoryCondition": victoryConFilter.list_data[victoryConFilter.selected]
    2731        }
    2832    };
    2933}
  • binaries/data/mods/public/gui/replaymenu/replay_filters.js

     
    3333    initMapNameFilter(filters && filters.mapName);
    3434    initPopCapFilter(filters && filters.popCap);
    3535    initDurationFilter(filters && filters.duration);
     36    initSingleplayerFilter(filters && filters.singleplayer);
     37    initVictoryConditionFilter(filters && filters.victoryCondition);
    3638}
    3739
    3840/**
     
    133135        durationFilter.selected = 0;
    134136}
    135137
     138function initSingleplayerFilter(singleplayer)
     139{
     140    let singleplayerFilter = Engine.GetGUIObjectByName("singleplayerFilter");
     141    singleplayerFilter.list = [translateWithContext("gamemode", "Any"), translate("Single Player"), translate("Multiplayer")];
     142    singleplayerFilter.list_data = ["", "Singleplayer", "Multiplayer"];
     143
     144    if (singleplayer)
     145        singleplayerFilter.selected = singleplayerFilter.list_data.indexOf(singleplayer);
     146
     147    if (singleplayerFilter.selected < 0 || singleplayerFilter.selected >= singleplayerFilter.list.length)
     148        singleplayerFilter.selected = 0;
     149}
     150
     151function 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
    136164/**
    137165 * Initializes g_ReplaysFiltered with replays that are not filtered out and sort it.
    138166 */
     
    193221    if (compatibilityFilter.checked && !isReplayCompatible(replay))
    194222        return false;
    195223
     224    // Filter by multiplayer/singleplayer
     225    let singleplayerFilter = Engine.GetGUIObjectByName("singleplayerFilter");
     226    if (singleplayerFilter.selected > 0 &&
     227        ((singleplayerFilter.selected == 1 && replay.isMultiplayer) ||
     228         (singleplayerFilter.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
    196236    // Filter date/time (select a month)
    197     var dateTimeFilter = Engine.GetGUIObjectByName("dateTimeFilter");
     237    let dateTimeFilter = Engine.GetGUIObjectByName("dateTimeFilter");
    198238    if (dateTimeFilter.selected > 0 && getReplayMonth(replay) != dateTimeFilter.list_data[dateTimeFilter.selected])
    199239        return false;
    200240
    201241    // Filter by playernames
    202     var playersFilter = Engine.GetGUIObjectByName("playersFilter");
    203     var keywords = playersFilter.caption.toLowerCase().split(" ");
     242    let playersFilter = Engine.GetGUIObjectByName("playersFilter");
     243    let keywords = playersFilter.caption.toLowerCase().split(" ");
    204244    if (keywords.length)
    205245    {
    206246        // We just check if all typed words are somewhere in the playerlist of that replay
     
    210250    }
    211251
    212252    // Filter by map name
    213     var mapNameFilter = Engine.GetGUIObjectByName("mapNameFilter");
     253    let mapNameFilter = Engine.GetGUIObjectByName("mapNameFilter");
    214254    if (mapNameFilter.selected > 0 && getReplayMapName(replay) != mapNameFilter.list_data[mapNameFilter.selected])
    215255        return false;
    216256
    217257    // Filter by map size
    218     var mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter");
     258    let mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter");
    219259    if (mapSizeFilter.selected > 0 && replay.attribs.settings.Size != mapSizeFilter.list_data[mapSizeFilter.selected])
    220260        return false;
    221261
    222262    // Filter by population capacity
    223     var populationFilter = Engine.GetGUIObjectByName("populationFilter");
     263    let populationFilter = Engine.GetGUIObjectByName("populationFilter");
    224264    if (populationFilter.selected > 0 && replay.attribs.settings.PopulationCap != populationFilter.list_data[populationFilter.selected])
    225265        return false;
    226266
    227267    // Filter by game duration
    228     var durationFilter = Engine.GetGUIObjectByName("durationFilter");
     268    let durationFilter = Engine.GetGUIObjectByName("durationFilter");
    229269    if (durationFilter.selected > 0)
    230270    {
    231271        let interval = g_DurationFilterIntervals[durationFilter.selected];
  • binaries/data/mods/public/gui/replaymenu/replay_menu.js

     
    3434var g_MapNames = [];
    3535
    3636/**
     37 * Sorted list of the victory conditions occuring in the replays
     38 */
     39var g_VictoryConditions = [];
     40
     41/**
    3742 * Directory name of the currently selected replay. Used to restore the selection after changing filters.
    3843 */
    3944var g_SelectedReplayDirectory = "";
     
    6267
    6368/**
    6469 * 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.
    6671 * Restore selected filters and item.
    6772 */
    6873function loadReplays(replaySelectionData)
     
    7580    g_Playernames = [];
    7681    for (let replay of g_Replays)
    7782    {
     83        let nonAIPlayers = 0;
    7884        // Use time saved in file, otherwise file mod date
    7985        replay.timestamp = replay.attribs.timestamp ? +replay.attribs.timestamp : +replay.filemod_timestamp-replay.duration;
    8086
     
    8793        if (g_MapNames.indexOf(replay.attribs.settings.Name) == -1 && replay.attribs.settings.Name != "")
    8894            g_MapNames.push(replay.attribs.settings.Name);
    8995
     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
    90100        // Extract playernames
    91101        for (let playerData of replay.attribs.settings.PlayerData)
    92102        {
     
    101111
    102112            if (g_Playernames.indexOf(playername) == -1)
    103113                g_Playernames.push(playername);
     114            nonAIPlayers++;
    104115        }
     116        replay.isMultiplayer = nonAIPlayers > 1;
    105117    }
    106118    g_MapNames.sort();
     119    g_VictoryConditions.sort();
    107120
    108121    // Reload filters (since they depend on g_Replays and its derivatives)
    109122    initFilters(replaySelectionData && replaySelectionData.filters);
  • binaries/data/mods/public/gui/replaymenu/replay_menu.xml

     
    110110                <translatableAttribute id="caption">Filter compatible replays</translatableAttribute>
    111111            </object>
    112112
     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
    113123            <!-- Placeholder to show if no replay is selected -->
    114             <object name="replayInfoEmpty" size="0 30 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="false">
     124            <object name="replayInfoEmpty" size="0 95 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="false">
    115125                <object name="logo" size="50%-110 40 50%+110 140" type="image" sprite="logo"/>
    116126                <object name="subjectBox" type="image" sprite="ModernDarkBoxWhite" size="3% 180 97% 99%">
    117127                    <object name="subject" size="5 5 100%-5 100%-5" type="text" style="ModernText" text_align="center"/>
     
    119129            </object>
    120130
    121131            <!--  -->
    122             <object name="replayInfo" size="0 30 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="true">
     132            <object name="replayInfo" size="0 95 100% 100%-60" type="image" sprite="ModernDarkBoxGold" hidden="true">
    123133
    124134                <!-- Map Name Label -->
    125135                <object name="sgMapName" size="0 5 100% 20" type="text" style="ModernLabelText"/>