ENGINES: Add a keymaps tab in the in-game options dialog

This commit is contained in:
Bastien Bouclet 2020-02-19 20:07:12 +01:00 committed by Filippos Karapetis
parent 94344ccf8e
commit 9475192e81
17 changed files with 259 additions and 145 deletions

View File

@ -100,6 +100,7 @@ void RemapWidget::reflowActionWidgets() {
int keyButtonWidth = g_gui.xmlEval()->getVar("Globals.KeyMapper.ButtonWidth");
int resetButtonWidth = g_gui.xmlEval()->getVar("Globals.KeyMapper.ResetWidth");
int labelWidth = getWidth() - (spacing + keyButtonWidth + spacing);
labelWidth = MAX(0, labelWidth);
uint textYOff = (buttonHeight - kLineHeight) / 2;
@ -120,7 +121,8 @@ void RemapWidget::reflowActionWidgets() {
KeymapTitleRow keymapTitle = _keymapSeparators[row.keymap];
if (keymapTitle.descriptionText) {
uint descriptionWidth = getWidth() - x - spacing - resetButtonWidth - spacing;
int descriptionWidth = getWidth() - x - spacing - resetButtonWidth - spacing;
descriptionWidth = MAX(0, descriptionWidth);
keymapTitle.descriptionText->resize(x, y + textYOff, descriptionWidth, kLineHeight);
keymapTitle.resetButton->resize(x + descriptionWidth, y, resetButtonWidth, buttonHeight);

View File

@ -36,6 +36,7 @@
#include "gui/ThemeEngine.h"
#include "gui/ThemeEval.h"
#include "gui/widget.h"
#include "gui/widgets/tab.h"
#include "graphics/font.h"
@ -55,9 +56,9 @@ protected:
public:
ConfigDialog(bool subtitleControls);
~ConfigDialog();
~ConfigDialog() override;
virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data);
void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) override;
};
MainMenuDialog::MainMenuDialog(Engine *engine)
@ -111,14 +112,12 @@ MainMenuDialog::MainMenuDialog(Engine *engine)
new GUI::ButtonWidget(this, "GlobalMenu.Quit", _("~Q~uit"), 0, kQuitCmd);
_aboutDialog = new GUI::AboutDialog();
_optionsDialog = new ConfigDialog(_engine->hasFeature(Engine::kSupportsSubtitleOptions));
_loadDialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load"), false);
_saveDialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"), true);
}
MainMenuDialog::~MainMenuDialog() {
delete _aboutDialog;
delete _optionsDialog;
delete _loadDialog;
delete _saveDialog;
}
@ -134,9 +133,11 @@ void MainMenuDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint3
case kSaveCmd:
save();
break;
case kOptionsCmd:
_optionsDialog->runModal();
case kOptionsCmd: {
ConfigDialog configDialog(_engine->hasFeature(Engine::kSupportsSubtitleOptions));
configDialog.runModal();
break;
}
case kAboutCmd:
_aboutDialog->runModal();
break;
@ -283,11 +284,16 @@ enum {
ConfigDialog::ConfigDialog(bool subtitleControls)
: GUI::OptionsDialog("", "GlobalConfig") {
// GUI: Add tab widget
GUI::TabWidget *tab = new GUI::TabWidget(this, "GlobalConfig.TabWidget");
tab->addTab(_("Audio"), "GlobalConfig_Audio");
//
// Sound controllers
//
addVolumeControls(this, "GlobalConfig.");
addVolumeControls(tab, "GlobalConfig_Audio.");
setVolumeSettingsState(true); // could disable controls by GUI options
//
@ -296,10 +302,29 @@ ConfigDialog::ConfigDialog(bool subtitleControls)
if (subtitleControls) {
// Global talkspeed range of 0-255
addSubtitleControls(this, "GlobalConfig.", 255);
addSubtitleControls(tab, "GlobalConfig_Audio.", 255);
setSubtitleSettingsState(true); // could disable controls by GUI options
}
//
// The Keymap tab
//
const Common::String &gameDomain = ConfMan.getActiveDomainName();
const Plugin *plugin = EngineMan.findPlugin(ConfMan.get("engineid"));
Common::KeymapArray keymaps;
if (plugin) {
keymaps = plugin->get<MetaEngine>().initKeymaps(gameDomain.c_str());
}
if (!keymaps.empty()) {
tab->addTab(_("Keymaps"), "GlobalConfig_KeyMapper");
addKeyMapperControls(tab, "GlobalConfig_KeyMapper.", keymaps, gameDomain);
}
// Activate the first tab
tab->setActiveTab(0);
//
// Add the buttons
//

View File

@ -71,7 +71,6 @@ protected:
GUI::ButtonWidget *_helpButton;
GUI::Dialog *_aboutDialog;
GUI::Dialog *_optionsDialog;
GUI::SaveLoadChooser *_loadDialog;
GUI::SaveLoadChooser *_saveDialog;

View File

@ -37,7 +37,7 @@
#include "graphics/pixelformat.h"
#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.33"
#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.34"
class OSystem;

View File

@ -2033,8 +2033,27 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
"/>"
"</layout>"
"</dialog>"
"<dialog name='GlobalConfig' overlays='screen_center'>"
"<layout type='vertical' padding='8,8,8,8'>"
"<dialog name='GlobalConfig' overlays='screen_center' size='500,350' inset='8'>"
"<layout type='vertical' padding='0,0,0,0'>"
"<widget name='TabWidget' type='TabWidget' "
"/>"
"<layout type='horizontal' padding='16,16,16,16'>"
"<space />"
"<widget name='Keys' "
"type='Button' "
"/>"
"<space />"
"<widget name='Cancel' "
"type='Button' "
"/>"
"<widget name='Ok' "
"type='Button' "
"/>"
"</layout>"
"</layout>"
"</dialog>"
"<dialog name='GlobalConfig_Audio' overlays='Dialog.GlobalConfig.TabWidget'>"
"<layout type='vertical' padding='8,8,8,8' spacing='8'>"
"<layout type='horizontal' padding='0,0,0,0'>"
"<layout type='vertical' padding='0,0,0,0' align='center'>"
"<layout type='horizontal' padding='0,0,0,0' spacing='8'>"
@ -2074,7 +2093,6 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
"<layout type='vertical' padding='24,24,24,24' align='center'>"
"<widget name='vcMuteCheckbox' "
"type='Checkbox' "
"width='80' "
"/>"
"</layout>"
"</layout>"
@ -2107,19 +2125,11 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
"type='SmallLabel' "
"/>"
"</layout>"
"<space size='60'/>"
"<layout type='horizontal' padding='0,0,0,0' spacing='10'>"
"<widget name='Keys' "
"type='Button' "
"/>"
"<space size='Globals.Button.Width' />"
"<widget name='Cancel' "
"type='Button' "
"/>"
"<widget name='Ok' "
"type='Button' "
"/>"
"</layout>"
"</dialog>"
"<dialog name='GlobalConfig_KeyMapper' overlays='Dialog.GlobalConfig.TabWidget'>"
"<layout type='vertical' padding='0,0,0,0'>"
"<widget name='Container'/>"
"</layout>"
"</dialog>"
"<dialog name='FluidSynthSettings' overlays='GlobalOptions' shading='dim'>"
@ -3819,7 +3829,26 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
"</layout>"
"</layout>"
"</dialog>"
"<dialog name='GlobalConfig' overlays='screen_center'>"
"<dialog name='GlobalConfig' overlays='screen_center' size='300,220' inset='5' >"
"<layout type='vertical' padding='0,0,0,0'>"
"<widget name='TabWidget' type='TabWidget' "
"/>"
"<layout type='horizontal' padding='8,8,0,8'>"
"<space />"
"<widget name='Keys' "
"type='Button' "
"/>"
"<space />"
"<widget name='Cancel' "
"type='Button' "
"/>"
"<widget name='Ok' "
"type='Button' "
"/>"
"</layout>"
"</layout>"
"</dialog>"
"<dialog name='GlobalConfig_Audio' overlays='Dialog.GlobalConfig.TabWidget'>"
"<layout type='vertical' padding='8,8,8,8'>"
"<layout type='horizontal' padding='0,0,0,0' spacing='6' align='center'>"
"<widget name='vcMusicText' "
@ -3880,7 +3909,6 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
"/>"
"</layout>"
"</layout>"
"<space size='2' />"
"<layout type='horizontal' padding='0,0,0,0' spacing='6' align='center'>"
"<widget name='subSubtitleSpeedDesc' "
"type='OptionsLabel' "
@ -3892,19 +3920,11 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
"type='SmallLabel' "
"/>"
"</layout>"
"<space size='16'/>"
"<layout type='horizontal' padding='0,0,0,0' spacing='4'>"
"<widget name='Keys' "
"type='Button' "
"/>"
"<space size='Globals.Button.Width' />"
"<widget name='Cancel' "
"type='Button' "
"/>"
"<widget name='Ok' "
"type='Button' "
"/>"
"</layout>"
"</dialog>"
"<dialog name='GlobalConfig_KeyMapper' overlays='Dialog.GlobalConfig.TabWidget'>"
"<layout type='vertical' padding='0,0,0,0'>"
"<widget name='Container'/>"
"</layout>"
"</dialog>"
"<dialog name='FluidSynthSettings' overlays='GlobalOptions' shading='dim'>"

Binary file not shown.

View File

@ -1 +1 @@
[SCUMMVM_STX0.8.33:ScummVM Classic Theme:No Author]
[SCUMMVM_STX0.8.34:ScummVM Classic Theme:No Author]

View File

@ -1189,8 +1189,28 @@
</layout>
</dialog>
<dialog name = 'GlobalConfig' overlays = 'screen_center'>
<layout type = 'vertical' padding = '8, 8, 8, 8'>
<dialog name = 'GlobalConfig' overlays = 'screen_center' size = '500, 350' inset = '8'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
<widget name = 'TabWidget' type = 'TabWidget'
/>
<layout type = 'horizontal' padding = '16, 16, 16, 16'>
<space />
<widget name='Keys'
type='Button'
/>
<space />
<widget name = 'Cancel'
type = 'Button'
/>
<widget name = 'Ok'
type = 'Button'
/>
</layout>
</layout>
</dialog>
<dialog name = 'GlobalConfig_Audio' overlays = 'Dialog.GlobalConfig.TabWidget'>
<layout type = 'vertical' padding = '8, 8, 8, 8' spacing = '8'>
<layout type = 'horizontal' padding = '0, 0, 0, 0'>
<layout type = 'vertical' padding = '0, 0, 0, 0' align = 'center'>
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '8'>
@ -1231,7 +1251,6 @@
<layout type = 'vertical' padding = '24, 24, 24, 24' align = 'center'>
<widget name = 'vcMuteCheckbox'
type = 'Checkbox'
width = '80' <!-- FIXME: Why this is needed? -->
/>
</layout>
</layout>
@ -1264,19 +1283,12 @@
type = 'SmallLabel'
/>
</layout>
<space size = '60'/>
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10'>
<widget name = 'Keys'
type = 'Button'
/>
<space size = 'Globals.Button.Width' />
<widget name = 'Cancel'
type = 'Button'
/>
<widget name = 'Ok'
type = 'Button'
/>
</layout>
</layout>
</dialog>
<dialog name = 'GlobalConfig_KeyMapper' overlays = 'Dialog.GlobalConfig.TabWidget'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
<widget name = 'Container'/>
</layout>
</dialog>
@ -1834,17 +1846,15 @@
</layout>
</dialog>
<dialog name = 'TestbedOptions' overlays = 'screen_center'>
<dialog name = 'TestbedOptions' overlays = 'screen_center' size = '400, 300'>
<layout type = 'vertical' padding = '8, 8, 8, 8'>
<widget name = 'Headline'
height = 'Globals.Line.Height'
width = '400'
/>
<widget name = 'Info'
height = 'Globals.Line.Height'
/>
<widget name = 'List'
height = '200'
/>
<layout type = 'vertical' padding = '0, 0, 16, 0'>
<layout type = 'horizontal' padding = '0, 0, 0, 0'>

View File

@ -1200,7 +1200,27 @@
</layout>
</dialog>
<dialog name = 'GlobalConfig' overlays = 'screen_center'>
<dialog name = 'GlobalConfig' overlays = 'screen_center' size = '300, 220' inset = '5' >
<layout type = 'vertical' padding = '0, 0, 0, 0'>
<widget name = 'TabWidget' type = 'TabWidget'
/>
<layout type = 'horizontal' padding = '8, 8, 0, 8'>
<space />
<widget name='Keys'
type='Button'
/>
<space />
<widget name = 'Cancel'
type = 'Button'
/>
<widget name = 'Ok'
type = 'Button'
/>
</layout>
</layout>
</dialog>
<dialog name = 'GlobalConfig_Audio' overlays = 'Dialog.GlobalConfig.TabWidget'>
<layout type = 'vertical' padding = '8, 8, 8, 8'>
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' align = 'center'>
<widget name = 'vcMusicText'
@ -1261,7 +1281,6 @@
/>
</layout>
</layout>
<space size = '2' />
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' align = 'center'>
<widget name = 'subSubtitleSpeedDesc'
type = 'OptionsLabel'
@ -1273,19 +1292,12 @@
type = 'SmallLabel'
/>
</layout>
<space size = '16'/>
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '4'>
<widget name = 'Keys'
type = 'Button'
/>
<space size = 'Globals.Button.Width' />
<widget name = 'Cancel'
type = 'Button'
/>
<widget name = 'Ok'
type = 'Button'
/>
</layout>
</layout>
</dialog>
<dialog name = 'GlobalConfig_KeyMapper' overlays = 'Dialog.GlobalConfig.TabWidget'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
<widget name = 'Container'/>
</layout>
</dialog>

Binary file not shown.

View File

@ -1 +1 @@
[SCUMMVM_STX0.8.33:ScummVM Modern Theme:No Author]
[SCUMMVM_STX0.8.34:ScummVM Modern Theme:No Author]

View File

@ -1202,7 +1202,27 @@
</layout>
</dialog>
<dialog name = 'GlobalConfig' overlays = 'screen_center'>
<dialog name = 'GlobalConfig' overlays = 'screen_center' size = '500, 350' inset = '8'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
<widget name = 'TabWidget' type = 'TabWidget'
/>
<layout type = 'horizontal' padding = '16, 16, 16, 16'>
<space />
<widget name='Keys'
type='Button'
/>
<space />
<widget name = 'Cancel'
type = 'Button'
/>
<widget name = 'Ok'
type = 'Button'
/>
</layout>
</layout>
</dialog>
<dialog name = 'GlobalConfig_Audio' overlays = 'Dialog.GlobalConfig.TabWidget'>
<layout type = 'vertical' padding = '8, 8, 8, 8' spacing = '8'>
<layout type = 'horizontal' padding = '0, 0, 0, 0'>
<layout type = 'vertical' padding = '0, 0, 0, 0' spacing = '8' align = 'center'>
@ -1244,7 +1264,6 @@
<layout type = 'vertical' padding = '24, 24, 24, 24' align = 'center'>
<widget name = 'vcMuteCheckbox'
type = 'Checkbox'
width = '120' <!-- FIXME: Why this is needed? -->
/>
</layout>
</layout>
@ -1277,19 +1296,12 @@
type = 'SmallLabel'
/>
</layout>
<space size = '60'/>
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10'>
<widget name='Keys'
type='Button'
/>
<space size = 'Globals.Button.Width' />
<widget name = 'Cancel'
type = 'Button'
/>
<widget name = 'Ok'
type = 'Button'
/>
</layout>
</layout>
</dialog>
<dialog name = 'GlobalConfig_KeyMapper' overlays = 'Dialog.GlobalConfig.TabWidget'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
<widget name = 'Container'/>
</layout>
</dialog>
@ -1849,17 +1861,15 @@
</layout>
</dialog>
<dialog name = 'TestbedOptions' overlays = 'screen_center'>
<dialog name = 'TestbedOptions' overlays = 'screen_center' size = '400, 300'>
<layout type = 'vertical' padding = '8, 8, 8, 8'>
<widget name = 'Headline'
height = 'Globals.Line.Height'
width = '400'
/>
<widget name = 'Info'
height = 'Globals.Line.Height'
/>
<widget name = 'List'
height = '200'
/>
<layout type = 'vertical' padding = '0, 0, 16, 0'>
<layout type = 'horizontal' padding = '0, 0, 0, 0'>

View File

@ -1198,7 +1198,27 @@
</layout>
</dialog>
<dialog name = 'GlobalConfig' overlays = 'screen_center'>
<dialog name = 'GlobalConfig' overlays = 'screen_center' size = '300, 220' inset = '5' >
<layout type = 'vertical' padding = '0, 0, 0, 0'>
<widget name = 'TabWidget' type = 'TabWidget'
/>
<layout type = 'horizontal' padding = '8, 8, 8, 8'>
<space />
<widget name='Keys'
type='Button'
/>
<space />
<widget name = 'Cancel'
type = 'Button'
/>
<widget name = 'Ok'
type = 'Button'
/>
</layout>
</layout>
</dialog>
<dialog name = 'GlobalConfig_Audio' overlays = 'Dialog.GlobalConfig.TabWidget'>
<layout type = 'vertical' padding = '8, 8, 8, 8'>
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' align = 'center'>
<widget name = 'vcMusicText'
@ -1240,7 +1260,7 @@
width = '80'
/>
</layout>
<space size = '4' />
<space size = '2' />
<layout type = 'vertical' padding = '0, 0, 0, 0' spacing = '6' align = 'center'>
<widget name = 'subToggleDesc'
type = 'OptionsLabel'
@ -1260,7 +1280,7 @@
/>
</layout>
</layout>
<space size = '4' />
<space size = '2' />
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' align = 'center'>
<widget name = 'subSubtitleSpeedDesc'
type = 'OptionsLabel'
@ -1272,19 +1292,12 @@
type = 'SmallLabel'
/>
</layout>
<space size = '20'/>
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '4'>
<widget name = 'Keys'
type = 'Button'
/>
<space size = 'Globals.Button.Width' />
<widget name = 'Cancel'
type = 'Button'
/>
<widget name = 'Ok'
type = 'Button'
/>
</layout>
</layout>
</dialog>
<dialog name = 'GlobalConfig_KeyMapper' overlays = 'Dialog.GlobalConfig.TabWidget'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
<widget name = 'Container'/>
</layout>
</dialog>

Binary file not shown.

View File

@ -1 +1 @@
[SCUMMVM_STX0.8.33:ScummVM Modern Theme Remastered:No Author]
[SCUMMVM_STX0.8.34:ScummVM Modern Theme Remastered:No Author]

View File

@ -1202,7 +1202,27 @@
</layout>
</dialog>
<dialog name = 'GlobalConfig' overlays = 'screen_center'>
<dialog name = 'GlobalConfig' overlays = 'screen_center' size = '500, 350' inset = '8'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
<widget name = 'TabWidget' type = 'TabWidget'
/>
<layout type = 'horizontal' padding = '16, 16, 16, 16'>
<space />
<widget name='Keys'
type='Button'
/>
<space />
<widget name = 'Cancel'
type = 'Button'
/>
<widget name = 'Ok'
type = 'Button'
/>
</layout>
</layout>
</dialog>
<dialog name = 'GlobalConfig_Audio' overlays = 'Dialog.GlobalConfig.TabWidget'>
<layout type = 'vertical' padding = '8, 8, 8, 8' spacing = '8'>
<layout type = 'horizontal' padding = '0, 0, 0, 0'>
<layout type = 'vertical' padding = '0, 0, 0, 0' spacing = '8' align = 'center'>
@ -1244,7 +1264,6 @@
<layout type = 'vertical' padding = '24, 24, 24, 24' align = 'center'>
<widget name = 'vcMuteCheckbox'
type = 'Checkbox'
width = '120' <!-- FIXME: Why this is needed? -->
/>
</layout>
</layout>
@ -1277,19 +1296,12 @@
type = 'SmallLabel'
/>
</layout>
<space size = '60'/>
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10'>
<widget name='Keys'
type='Button'
/>
<space size = 'Globals.Button.Width' />
<widget name = 'Cancel'
type = 'Button'
/>
<widget name = 'Ok'
type = 'Button'
/>
</layout>
</layout>
</dialog>
<dialog name = 'GlobalConfig_KeyMapper' overlays = 'Dialog.GlobalConfig.TabWidget'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
<widget name = 'Container'/>
</layout>
</dialog>
@ -1849,17 +1861,15 @@
</layout>
</dialog>
<dialog name = 'TestbedOptions' overlays = 'screen_center'>
<dialog name = 'TestbedOptions' overlays = 'screen_center' size = '400, 300'>
<layout type = 'vertical' padding = '8, 8, 8, 8'>
<widget name = 'Headline'
height = 'Globals.Line.Height'
width = '400'
/>
<widget name = 'Info'
height = 'Globals.Line.Height'
/>
<widget name = 'List'
height = '200'
/>
<layout type = 'vertical' padding = '0, 0, 16, 0'>
<layout type = 'horizontal' padding = '0, 0, 0, 0'>

View File

@ -1198,7 +1198,27 @@
</layout>
</dialog>
<dialog name = 'GlobalConfig' overlays = 'screen_center'>
<dialog name = 'GlobalConfig' overlays = 'screen_center' size = '300, 220' inset = '5' >
<layout type = 'vertical' padding = '0, 0, 0, 0'>
<widget name = 'TabWidget' type = 'TabWidget'
/>
<layout type = 'horizontal' padding = '8, 8, 8, 8'>
<space />
<widget name='Keys'
type='Button'
/>
<space />
<widget name = 'Cancel'
type = 'Button'
/>
<widget name = 'Ok'
type = 'Button'
/>
</layout>
</layout>
</dialog>
<dialog name = 'GlobalConfig_Audio' overlays = 'Dialog.GlobalConfig.TabWidget'>
<layout type = 'vertical' padding = '8, 8, 8, 8'>
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' align = 'center'>
<widget name = 'vcMusicText'
@ -1240,7 +1260,7 @@
width = '80'
/>
</layout>
<space size = '4' />
<space size = '2' />
<layout type = 'vertical' padding = '0, 0, 0, 0' spacing = '6' align = 'center'>
<widget name = 'subToggleDesc'
type = 'OptionsLabel'
@ -1260,7 +1280,7 @@
/>
</layout>
</layout>
<space size = '4' />
<space size = '2' />
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' align = 'center'>
<widget name = 'subSubtitleSpeedDesc'
type = 'OptionsLabel'
@ -1272,19 +1292,12 @@
type = 'SmallLabel'
/>
</layout>
<space size = '20'/>
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '4'>
<widget name = 'Keys'
type = 'Button'
/>
<space size = 'Globals.Button.Width' />
<widget name = 'Cancel'
type = 'Button'
/>
<widget name = 'Ok'
type = 'Button'
/>
</layout>
</layout>
</dialog>
<dialog name = 'GlobalConfig_KeyMapper' overlays = 'Dialog.GlobalConfig.TabWidget'>
<layout type = 'vertical' padding = '0, 0, 0, 0'>
<widget name = 'Container'/>
</layout>
</dialog>