New UI for gamesetup settings

Nuke the more options window
Create 3 tabs containing all options from more options and map options,
giving more space for new options
Rename options => settings in gamesetup

Reviewed By: elexis
Comments By: ffffffff and gentz
Differential Revision: https://code.wildfiregames.com/D1027
This was SVN commit r20945.
This commit is contained in:
bb 2018-01-21 12:35:47 +00:00
parent 7c338b5755
commit ac7b5ce861
6 changed files with 350 additions and 223 deletions

View File

@ -354,6 +354,7 @@ enabletips = true ; Enable/Disable tips during gamesetup (for ne
assignplayers = everyone ; Whether to assign joining clients to free playerslots. Possible values: everyone, buddies, disabled.
aidifficulty = 3 ; Difficulty level, from 0 (easiest) to 5 (hardest)
aibehavior = "random" ; Default behavior of the AI (random, balanced, aggressive or defensive)
settingsslide = true ; Enable/Disable settings panel slide
[gui.session]
camerajump.threshold = 40 ; How close do we have to be to the actual location in order to jump back to the previous one?

View File

@ -483,6 +483,26 @@
- Misc. -
==========================================
-->
<sprite name = "ModernWindowCornerBottomRight">
<!-- background -->
<image backcolor = "12 12 12"/>
<image texture = "global/modern/background.png"
texture_size = "0 0 1024 1024"
size = "0 0 100%-12 100%-12"
/>
<!-- shading -->
<image texture = "global/modern/shadow-high.png"
texture_size = "0 0 1024 256"
size = "0 100%-268 100%-12 100%-12"
/>
<!-- bottom edge -->
<image texture = "global/modern/border.png"
real_texture_placement = "0 0 2048 8"
size = "0 100%-16 100%-10 100%-8"
/>
</sprite>
<sprite name = "ModernDropDownArrow">
<image texture = "global/modern/dropdown-arrow.png"
real_texture_placement = "0 0 16 16"

View File

@ -57,7 +57,11 @@ function placeTabButtons(categoriesData, buttonHeight, spacing, onPress, onSelec
*/
function selectNextTab(direction)
{
selectPanel((g_TabCategorySelected + direction + g_TabCategoryCount) % g_TabCategoryCount);
selectPanel(g_TabCategorySelected === undefined ?
direction > 0 ?
0 :
g_TabCategoryCount - 1 :
(g_TabCategorySelected + direction + g_TabCategoryCount) % g_TabCategoryCount);
}
function selectPanel(category)

View File

@ -299,6 +299,11 @@ var g_Autocomplete = [];
*/
var g_ChatMessages = [];
/**
* Minimum amount of pixels required for the chat panel to be visible.
*/
var g_MinChatWidth = 74;
/**
* Filename and translated title of all maps, given the currently selected
* maptype and filter. Sorted by title, shown in the dropdown.
@ -343,42 +348,91 @@ var g_LastViewedAIPlayer = -1;
var g_PopulationCapacityRecommendation = 1200;
/**
* Order in which the GUI elements will be shown.
* All valid options are required to appear here.
* The ones under "map" are shown in the map selection panel,
* the others in the "more options" dialog.
* Horizontal space between tab buttons and lobby button.
*/
var g_OptionOrderGUI = {
"map": [
var g_LobbyButtonSpacing = 8;
/**
* Vertical size of a tab button.
*/
var g_TabButtonHeight = 30;
/**
* Vertical space between two tab buttons.
*/
var g_TabButtonDist = 4;
/**
* Vertical size of a setting object.
*/
var g_SettingHeight = 32;
/**
* Vertical space between two setting objects.
*/
var g_SettingDist = 2;
/**
* Width of a column in the settings panel.
*/
var g_ColumnWidth = 320;
/**
* Pixels per millisecond the settings panel slides when opening/closing.
*/
var g_SlideSpeed = 1.2;
/**
* Store last tick time.
*/
var g_LastTickTime = Date.now();
/**
* Order in which the GUI elements will be shown.
* All valid settings are required to appear here.
*/
var g_SettingsTabsGUI = [
{
"label": translateWithContext("Match settings tab name", "Map"),
"settings": [
"mapType",
"mapFilter",
"mapSelection",
"numPlayers",
"mapSize"
],
"more": [
"triggerDifficulty",
"mapSize",
"biome",
"gameSpeed",
"nomad",
"triggerDifficulty",
"disableTreasures",
"exploreMap",
"revealMap"
]
},
{
"label": translateWithContext("Match settings tab name", "Player"),
"settings": [
"numPlayers",
"populationCap",
"startingResources",
"disableSpies",
"enableCheats"
]
},
{
"label": translateWithContext("Match settings tab name", "Game Type"),
"settings": [
"victoryCondition",
"relicCount",
"relicDuration",
"wonderDuration",
"populationCap",
"startingResources",
"ceasefire",
"nomad",
"regicideGarrison",
"exploreMap",
"revealMap",
"disableTreasures",
"disableSpies",
"gameSpeed",
"ceasefire",
"lockTeams",
"lastManStanding",
"enableCheats",
"enableRating"
]
};
}
];
/**
* Contains the logic of all multiple-choice gamesettings.
@ -400,7 +454,7 @@ var g_OptionOrderGUI = {
* autocomplete - Marks whether to autocomplete translated values of the string. (default: undefined)
* If not undefined, must be a number that denotes the priority (higher numbers come first).
* If undefined, still autocompletes the translated title of the setting.
* initOrder - Options with lower values will be initialized first.
* initOrder - Settings with lower values will be initialized first.
*/
var g_Dropdowns = {
"mapType": {
@ -783,10 +837,10 @@ var g_Checkboxes = {
},
"revealMap": {
"title": () =>
// Translation: Make sure to differentiate between the revealed map and explored map options!
// Translation: Make sure to differentiate between the revealed map and explored map settings!
translate("Revealed Map"),
"tooltip":
// Translation: Make sure to differentiate between the revealed map and explored map options!
// Translation: Make sure to differentiate between the revealed map and explored map settings!
() => translate("Toggle revealed map (see everything)."),
"default": () => false,
"defined": () => g_GameAttributes.settings.RevealMap !== undefined,
@ -802,10 +856,10 @@ var g_Checkboxes = {
},
"exploreMap": {
"title":
// Translation: Make sure to differentiate between the revealed map and explored map options!
// Translation: Make sure to differentiate between the revealed map and explored map settings!
() => translate("Explored Map"),
"tooltip":
// Translation: Make sure to differentiate between the revealed map and explored map options!
// Translation: Make sure to differentiate between the revealed map and explored map settings!
() => translate("Toggle explored map (see initial map)."),
"default": () => false,
"defined": () => g_GameAttributes.settings.ExploreMap !== undefined,
@ -908,7 +962,13 @@ var g_Checkboxes = {
*/
var g_MiscControls = {
"chatPanel": {
"hidden": () => !g_IsNetworked,
"hidden": () => {
if (!g_IsNetworked)
return true;
let size = Engine.GetGUIObjectByName("chatPanel").getComputedSize();
return size.right - size.left < g_MinChatWidth;
},
},
"chatInput": {
"tooltip": () => colorizeAutocompleteHotkey(translate("Press %(hotkey)s to autocomplete playernames or settings.")),
@ -953,13 +1013,15 @@ var g_MiscControls = {
},
"hidden": () => !Engine.HasXmppClient()
},
// Display these after having hidden every GUI object in the "More Options" dialog
"moreOptionsLabel": {
"hidden": () => false,
},
"hideMoreOptions": {
"hidden": () => false,
},
"spTips": {
"hidden": () => {
let settingsPanel = Engine.GetGUIObjectByName("settingsPanel");
let spTips = Engine.GetGUIObjectByName("spTips");
return g_IsNetworked ||
Engine.ConfigDB_GetValue("user", "gui.gamesetup.enabletips") !== "true" ||
spTips.size.right > settingsPanel.getComputedSize().left
}
}
};
/**
@ -1090,6 +1152,12 @@ function supplementDefaults()
*/
function initGUIObjects()
{
for (let tab in g_SettingsTabsGUI)
g_SettingsTabsGUI[tab].tooltip =
sprintf(translate("Toggle the %(name)s settings tab."), { "name": g_SettingsTabsGUI[tab].label }) +
colorizeHotkey("\n" + translate("Use %(hotkey)s to move a settings tab down."), "tab.next") +
colorizeHotkey("\n" + translate("Use %(hotkey)s to move a settings tab up."), "tab.prev");
// Copy all initOrder values into one object
let initOrder = {};
for (let dropdown in g_Dropdowns)
@ -1097,19 +1165,45 @@ function initGUIObjects()
for (let checkbox in g_Checkboxes)
initOrder[checkbox] = g_Checkboxes[checkbox].initOrder;
// Sort the object on initOrder so we can init the options in an arbitrary order
for (let option of Object.keys(initOrder).sort((a, b) => initOrder[a] - initOrder[b]))
if (g_Dropdowns[option])
initDropdown(option);
else if (g_Checkboxes[option])
initCheckbox(option);
// Sort the object on initOrder so we can init the settings in an arbitrary order
for (let setting of Object.keys(initOrder).sort((a, b) => initOrder[a] - initOrder[b]))
if (g_Dropdowns[setting])
initDropdown(setting);
else if (g_Checkboxes[setting])
initCheckbox(setting);
else
warn('The option "' + option + '" is not defined.');
warn('The setting "' + setting + '" is not defined.');
for (let dropdown in g_PlayerDropdowns)
initPlayerDropdowns(dropdown);
resizeMoreOptionsWindow();
let settingTabButtons = Engine.GetGUIObjectByName("settingTabButtons");
let settingTabButtonsSize = settingTabButtons.size;
settingTabButtonsSize.bottom = settingTabButtonsSize.top + g_SettingsTabsGUI.length * (g_TabButtonHeight + g_TabButtonDist);
settingTabButtonsSize.right = g_MiscControls.lobbyButton.hidden() ?
settingTabButtonsSize.right :
Engine.GetGUIObjectByName("lobbyButton").size.left - g_LobbyButtonSpacing;
settingTabButtons.size = settingTabButtonsSize;
let settingTabButtonsBackground = Engine.GetGUIObjectByName("settingTabButtonsBackground");
settingTabButtonsBackground.size = settingTabButtonsSize;
let gameDescription = Engine.GetGUIObjectByName("mapInfoDescriptionFrame");
let gameDescriptionSize = gameDescription.size;
gameDescriptionSize.top = settingTabButtonsSize.bottom + 3;
gameDescription.size = gameDescriptionSize;
placeTabButtons(
g_SettingsTabsGUI,
g_TabButtonHeight,
g_TabButtonDist,
category => {
selectPanel(category == g_TabCategorySelected ? undefined : category);
},
() => {
updateGUIObjects();
Engine.GetGUIObjectByName("settingsPanel").hidden = false;
});
initSPTips();
@ -1128,6 +1222,53 @@ function initGUIObjects()
hideLoadingWindow();
}
/**
* Slide settings panel.
* @param {number} dt - Time in milliseconds since last call.
*/
function updateSettingsPanelPosition(dt)
{
let slideSpeed = Engine.ConfigDB_GetValue("user", "gui.gamesetup.settingsslide") == "true" ? g_SlideSpeed : Infinity;
let settingsPanel = Engine.GetGUIObjectByName("settingsPanel");
let rightBorder = Engine.GetGUIObjectByName("settingTabButtons").size.left;
let offset = 0;
if (g_TabCategorySelected === undefined)
{
let maxOffset = rightBorder - settingsPanel.size.left;
if (maxOffset > 0)
offset = Math.min(slideSpeed * dt, maxOffset);
}
else if (rightBorder > settingsPanel.size.right)
offset = Math.min(slideSpeed * dt, rightBorder - settingsPanel.size.right);
else
{
let maxOffset = settingsPanel.size.right - rightBorder;
if (maxOffset > 0)
offset = -Math.min(slideSpeed * dt, maxOffset);
}
let size = settingsPanel.size;
size.left += offset;
size.right += offset;
settingsPanel.size = size;
let settingsBackground = Engine.GetGUIObjectByName("settingsBackground");
let backgroundSize = settingsBackground.size;
backgroundSize.left = size.left;
settingsBackground.size = backgroundSize;
let chatPanel = Engine.GetGUIObjectByName("chatPanel");
let chatSize = chatPanel.size;
chatSize.right += offset;
chatPanel.size = chatSize;
chatPanel.hidden = g_MiscControls.chatPanel.hidden();
let spTips = Engine.GetGUIObjectByName("spTips");
spTips.hidden = g_MiscControls.spTips.hidden();
}
function hideLoadingWindow()
{
let loadingWindow = Engine.GetGUIObjectByName("loadingWindow");
@ -1140,24 +1281,26 @@ function hideLoadingWindow()
}
/**
* Options in the "More Options" or "Map" panel use a generic name.
* Settings under the settings tabs use a generic name.
* Player settings use custom names.
*/
function getGUIObjectNameFromSetting(name)
function getGUIObjectNameFromSetting(setting)
{
for (let panel in g_OptionOrderGUI)
let idxOffset = 0;
for (let category of g_SettingsTabsGUI)
{
let idx = g_OptionOrderGUI[panel].indexOf(name);
let idx = category.settings.indexOf(setting);
if (idx != -1)
return [
panel + "Option",
g_Dropdowns[name] ? "Dropdown" : "Checkbox",
"[" + idx + "]"
"setting",
g_Dropdowns[setting] ? "Dropdown" : "Checkbox",
"[" + (idx + idxOffset) + "]"
];
idxOffset += category.settings.length;
}
// Assume there is a GUI object with exactly that setting name
return [name, "", ""];
return [setting, "", ""];
}
function initDropdown(name, playerIdx)
@ -1239,45 +1382,48 @@ function saveSPTipsSetting()
Engine.ConfigDB_WriteValueToFile("user", "gui.gamesetup.enabletips", enabled, "config/user.cfg");
}
function verticallyDistributeGUIObjects(parent, objectHeight, ignore)
/**
* Distribute the currently visible settings over the settings panel.
* First calculate the number of columns required, then place the objects.
*/
function distributeSettings()
{
let yPos;
let settingsPanel = Engine.GetGUIObjectByName("settingsPanel");
let actualSettingsPanelSize = settingsPanel.getComputedSize();
let parentObject = Engine.GetGUIObjectByName(parent);
for (let child of parentObject.children)
let maxPerColumn = Math.floor((actualSettingsPanelSize.bottom - actualSettingsPanelSize.top) / g_SettingHeight);
let childCount = settingsPanel.children.filter(child => !child.hidden).length;
let perColumn = childCount / Math.ceil(childCount / maxPerColumn);
let yPos = g_SettingDist;
let column = 0;
let thisColumn = 0;
let settingsPanelSize = settingsPanel.size;
for (let child of settingsPanel.children)
{
if (ignore.indexOf(child.name) != -1)
continue;
let childSize = child.size;
yPos = yPos || childSize.top;
if (child.hidden)
continue;
childSize.top = yPos;
childSize.bottom = yPos + objectHeight - 2;
child.size = childSize;
yPos += objectHeight;
if (thisColumn >= perColumn)
{
yPos = g_SettingDist;
++column;
thisColumn = 0;
}
return yPos;
}
/**
* Remove empty space in case of hidden options (like cheats, rating or victory duration)
*/
function resizeMoreOptionsWindow()
{
verticallyDistributeGUIObjects("mapOptions", 32, []);
let childSize = child.size;
child.size = new GUISize(
column * g_ColumnWidth,
yPos,
column * g_ColumnWidth + g_ColumnWidth - 10,
yPos + g_SettingHeight - g_SettingDist);
let yPos = verticallyDistributeGUIObjects("moreOptions", 32, ["moreOptionsLabel"]);
yPos += g_SettingHeight;
++thisColumn;
}
// Resize the vertically centered window containing the options
let moreOptions = Engine.GetGUIObjectByName("moreOptions");
let mSize = moreOptions.size;
mSize.bottom = mSize.top + yPos + 20;
moreOptions.size = mSize;
settingsPanelSize.right = settingsPanelSize.left + (column + 1) * g_ColumnWidth;
settingsPanel.size = settingsPanelSize;
}
/**
@ -1572,6 +1718,7 @@ function reloadBiomeList()
}))));
initDropdown("biome");
updateGUIDropdown("biome");
}
function reloadTriggerDifficulties()
@ -1601,6 +1748,7 @@ function reloadTriggerDifficulties()
})));
initDropdown("triggerDifficulty");
updateGUIDropdown("triggerDifficulty");
}
function reloadGameSpeedChoices()
@ -1763,6 +1911,12 @@ function onTick()
handleNetMessages();
updateTimers();
let now = Date.now();
let tickLength = now - g_LastTickTime;
g_LastTickTime = now;
updateSettingsPanelPosition(tickLength);
}
/**
@ -1872,10 +2026,11 @@ function updateGUIDropdown(name, playerIdx = undefined)
let indexHidden = isControlArrayElementHidden(playerIdx);
let obj = (playerIdx === undefined ? g_Dropdowns : g_PlayerDropdowns)[name];
let selected = indexHidden ? -1 : dropdown.list_data.indexOf(String(obj.get(playerIdx)));
let enabled = !indexHidden && (!obj.enabled || obj.enabled(playerIdx));
let hidden = indexHidden || obj.hidden && obj.hidden(playerIdx);
let selected = hidden ? -1 : dropdown.list_data.indexOf(String(obj.get(playerIdx)));
let enabled = !indexHidden && (!obj.enabled || obj.enabled(playerIdx));
dropdown.enabled = g_IsController && enabled;
dropdown.hidden = !g_IsController || !enabled || hidden;
dropdown.selected = selected;
dropdown.tooltip = !indexHidden && obj.tooltip ? obj.tooltip(-1, playerIdx) : "";
@ -1884,12 +2039,12 @@ function updateGUIDropdown(name, playerIdx = undefined)
frame.hidden = hidden;
if (title && obj.title && !indexHidden)
title.caption = sprintf(translate("%(option)s:"), { "option": obj.title(playerIdx) });
title.caption = sprintf(translateWithContext("Title for specific setting", "%(setting)s:"), { "setting": obj.title(playerIdx) });
if (label && !indexHidden)
{
label.hidden = g_IsController && enabled || hidden;
label.caption = selected == -1 ? translateWithContext("option value", "Unknown") : dropdown.list[selected];
label.caption = selected == -1 ? translateWithContext("settings value", "Unknown") : dropdown.list[selected];
}
}
@ -1915,7 +2070,7 @@ function updateGUICheckbox(name)
Engine.GetGUIObjectByName(guiName + "Dropdown" + guiIdx).hidden = true;
checkbox.checked = checked;
checkbox.enabled = enabled;
checkbox.enabled = g_IsController && enabled;
checkbox.hidden = hidden || !g_IsController;
checkbox.tooltip = obj.tooltip ? obj.tooltip() : "";
@ -1926,7 +2081,7 @@ function updateGUICheckbox(name)
frame.hidden = hidden;
if (title && obj.title)
title.caption = sprintf(translate("%(option)s:"), { "option": obj.title() });
title.caption = sprintf(translate("%(setting)s:"), { "setting": obj.title() });
}
function updateGUIMiscControl(name, playerIdx)
@ -2081,16 +2236,20 @@ function updateGUIObjects()
reloadPlayerAssignmentChoices();
// Hide exceeding dropdowns and checkboxes
for (let panel in g_OptionOrderGUI)
for (let child of Engine.GetGUIObjectByName(panel + "Options").children)
child.hidden = true;
for (let setting of Engine.GetGUIObjectByName("settingsPanel").children)
setting.hidden = true;
// Show the relevant ones
if (g_TabCategorySelected !== undefined)
{
for (let name in g_Dropdowns)
if (g_SettingsTabsGUI[g_TabCategorySelected].settings.indexOf(name) != -1)
updateGUIDropdown(name);
for (let name in g_Checkboxes)
if (g_SettingsTabsGUI[g_TabCategorySelected].settings.indexOf(name) != -1)
updateGUICheckbox(name);
}
for (let i = 0; i < g_MaxPlayers; ++i)
{
@ -2105,7 +2264,7 @@ function updateGUIObjects()
updateGUIMiscControl(name);
updateGameDescription();
resizeMoreOptionsWindow();
distributeSettings();
rightAlignCancelButton();
updateAutocompleteEntries();
@ -2358,12 +2517,6 @@ function addChatMessage(msg)
Engine.GetGUIObjectByName("chatText").caption = g_ChatMessages.join("\n");
}
function showMoreOptions(show)
{
Engine.GetGUIObjectByName("moreOptionsFade").hidden = !show;
Engine.GetGUIObjectByName("moreOptions").hidden = !show;
}
function resetCivilizations()
{
for (let i in g_GameAttributes.settings.PlayerData)

View File

@ -29,6 +29,10 @@
<action on="Tick">
onTick();
</action>
<!-- Keep the settings panel size fitting to the settings when resizing -->
<action on="WindowResized">
distributeSettings();
</action>
<!-- Player assignments -->
<object size="24 49 100%-440 345" type="image" sprite="ModernDarkBoxGold" name="playerAssignmentsPanel">
@ -125,7 +129,7 @@
</object>
<!-- Singleplayer / AI tips -->
<object name="spTips" size="24 370 560 520" type="image" hidden="true">
<object name="spTips" size="24 370 360 570" type="image" hidden="true">
<object size="4 10 28 34" type="image" sprite="ModernGear"/>
<object name="aiTips" size="32 0 100%-20 100%-32" type="text" style="ModernLeftLabelText"/>
<object size="30 100%-30 100% 100%-8" type="text" style="ModernLeftLabelText">
@ -136,58 +140,80 @@
</object>
</object>
<!-- Map Options -->
<object name="mapOptions" size="100%-425 355 100%-25 470">
<!-- Map Preview -->
<object type="image" sprite="ModernDarkBoxGold" name="gamePreviewBox" size="100%-426 49 100%-24 345">
<object type="image" sprite="snMapPreview" size="1 1 401 294" name="mapPreview"/>
<object name="mapInfoName" type="text" style="ModernLeftLabelText" size="5 100%-20 100% 100%-1"/>
</object>
<repeat count="30" var="n">
<object name="mapOptionFrame[n]" size="0 0 100% 30">
<!-- Settings -->
<object name="settingsBackground" type="image" sprite="ModernDarkBoxGold" size="100%-635 355 100%-315 100%-60"/>
<object name="settingsPanel" type="image" sprite="ModernDarkBoxGold" size="100%-635 360 100%-315 100%-65" hidden="true" z="1">
<repeat count="60" var="n">
<object name="settingFrame[n]" size="0 2 320 60">
<object
name="mapOptionTitle[n]"
name="settingTitle[n]"
type="text"
size="0 0 140 28"
size="0 0 50%-27 28"
style="ModernRightLabelText"
z="1"
/>
<object
name="mapOptionText[n]"
name="settingText[n]"
type="text"
size="150 0 100% 28"
size="50%-27 0 100% 28"
style="ModernLeftLabelText"
z="1"
/>
<object
name="mapOptionDropdown[n]"
name="settingDropdown[n]"
type="dropdown"
size="150 0 100% 28"
size="50%-22 0 100% 28"
style="ModernDropDown"
tooltip_style="onscreenToolTip"
z="1"
/>
<object
name="mapOptionCheckbox[n]"
name="settingCheckbox[n]"
type="checkbox"
size="150 0 180 28"
size="50%-22 5 50% 28"
style="ModernTickBox"
tooltip_style="onscreenToolTip"
z="1"
/>
</object>
</repeat>
</object>
<!-- End Map Options -->
<!-- Re-add background to hide settings panel -->
<object type="image" sprite="ModernWindowCornerBottomRight" size="100%-315 355 100% 100%" z="20"/>
<!-- Map Preview -->
<object type="image" sprite="ModernDarkBoxGold" name="gamePreviewBox" size="100%-426 49 100%-24 345">
<object type="image" size="1 1 401 294" name="mapPreview"/>
<!-- Category Tabs -->
<object name="settingTabButtonsBackground" type="image" sprite="ModernDarkBoxGold" size="100%-315 355 100%-25 556" z="21"/>
<object name="settingTabButtons" size="100%-315 355 100%-25 556" z="21">
<include file="gui/common/tab_buttons.xml"/>
</object>
<!-- View Lobby Button -->
<object name="lobbyButton"
type="button"
style="IconButton"
sprite="iconBubbleGold"
sprite_over="iconBubbleWhite"
size="100%-41 355 100%-25 371"
hotkey="lobby"
z="100"
>
<translatableAttribute id="tooltip">Show the multiplayer lobby in a dialog window.</translatableAttribute>
</object>
<!-- Map Description -->
<object size="100%-425 529 100%-25 100%-60">
<object name="mapInfoName" type="text" style="ModernLeftLabelText" size="0 0 100%-120 30"/>
<object type="image" sprite="ModernDarkBoxGold" size="0 30 100% 100%">
<object name="mapInfoDescriptionFrame" type="image" sprite="ModernDarkBoxGold" size="100%-315 559 100%-25 100%-60" z="21">
<object name="mapInfoDescription" type="text" style="ModernText" size="0 0 100% 100%"/>
</object>
</object>
<!-- Chat window -->
<object name="chatPanel" size="24 355 100%-440 100%-58" type="image" sprite="ModernDarkBoxGold">
<object name="chatPanel" size="24 355 100%-640 100%-58" type="image" sprite="ModernDarkBoxGold">
<object name="chatText" size="2 2 100%-2 100%-26" type="text" style="ChatPanel"/>
<object name="chatInput" size="4 100%-24 100%-76 100%-4" type="input" style="ModernInput">
@ -224,6 +250,7 @@
style="StoneButton"
size="100%-164 100%-52 100%-24 100%-24"
tooltip_style="onscreenToolTip"
z="21"
>
<action on="Press">
if (g_IsController)
@ -240,95 +267,11 @@
style="StoneButton"
size="100%-308 100%-52 100%-168 100%-24"
tooltip_style="onscreenToolTip"
z="21"
>
<translatableAttribute id="caption">Back</translatableAttribute>
<action on="Press">cancelSetup();</action>
</object>
<!-- Options -->
<object name="gameOptionsBox" size="100%-425 529 100%-25 525">
<!-- View Lobby Button -->
<object name="lobbyButton"
type="button"
style="IconButton"
sprite="iconBubbleGold"
sprite_over="iconBubbleWhite"
size="100%-143 0 100%-127 16"
hotkey="lobby"
>
<translatableAttribute id="tooltip">Show the multiplayer lobby in a dialog window.</translatableAttribute>
</object>
<!-- More Options Button -->
<object
name="showMoreOptions"
type="button"
style="StoneButton"
size="100%-120 0 100% 28"
tooltip_style="onscreenToolTip"
>
<translatableAttribute id="caption">More Options</translatableAttribute>
<translatableAttribute id="tooltip">See more game options</translatableAttribute>
<action on="Press">showMoreOptions(true);</action>
</object>
</object>
<!-- End Options -->
<!-- More Options -->
<object hidden="true" name="moreOptionsFade" type="image" z="60" sprite="ModernFade"/>
<object name="moreOptions" type="image" sprite="ModernDialog" size="50%-200 50%-195 50%+200 50%+220" z="70" hidden="true">
<object name="moreOptionsLabel" style="ModernLabelText" type="text" size="50%-128 -18 50%+128 14">
<translatableAttribute id="caption">More Options</translatableAttribute>
</object>
<repeat count="30" var="n">
<object name="moreOptionFrame[n]" size="14 30 94% 60">
<object
name="moreOptionTitle[n]"
type="text"
size="0 0 40% 28"
style="ModernRightLabelText"
/>
<object
name="moreOptionText[n]"
type="text"
size="40% 0 100% 28"
style="ModernLeftLabelText"
/>
<object
name="moreOptionDropdown[n]"
type="dropdown"
size="40%+10 0 100% 28"
style="ModernDropDown"
tooltip_style="onscreenToolTip"
dropdown_size="350"
/>
<object
name="moreOptionCheckbox[n]"
type="checkbox"
size="40%+10 5 40%+28 28"
style="ModernTickBox"
tooltip_style="onscreenToolTip"
/>
</object>
</repeat>
<!-- Hide More Options Button -->
<object
name="hideMoreOptions"
type="button"
style="StoneButton"
size="50%-70 428 50%+70 456"
tooltip_style="onscreenToolTip"
hotkey="cancel"
>
<translatableAttribute id="caption">OK</translatableAttribute>
<translatableAttribute id="tooltip">Close more game options window</translatableAttribute>
<action on="Press">showMoreOptions(false);</action>
</object>
</object>
<!-- End More Options -->
</object>
</object>
</objects>

View File

@ -361,6 +361,12 @@
"tooltip": "Show tips when setting up a game.",
"config": "gui.gamesetup.enabletips"
},
{
"type": "boolean",
"label": "Enable Settings Panel Slide",
"tooltip": "Slide the settings panel when opening, closing or resizing",
"config": "gui.gamesetup.settingsslide"
},
{
"type": "boolean",
"label": "Persist Match Settings",