def __init__(self, enableRedefineKeysMode=True):
     UIInterface.__init__(self)
     if not GUI_SETTINGS.minimapSize and self.KEYBOARD_MAPPING_BLOCKS.has_key(
             'minimap'):
         del self.KEYBOARD_MAPPING_BLOCKS['minimap']
     self.__enableRedefineKeysMode = enableRedefineKeysMode
     self.graphicsPresets = GraphicsPresets()
     self.resolutions = g_graficsResolutions
     self.__currentSettings = None
     self.__settingsUI = None
     self.__altVoiceSetting = g_settingsCore.options.getSetting(
         'alternativeVoices')
     self.graphicsChangeConfirmationRevert = None
     self.__dialogIsVisibility = False
     if not GUI_SETTINGS.voiceChat and self.KEYBOARD_MAPPING_COMMANDS.has_key(
             'voicechat'):
         if self.KEYBOARD_MAPPING_COMMANDS.has_key('voicechat'):
             del self.KEYBOARD_MAPPING_COMMANDS['voicechat']
         if self.KEYBOARD_MAPPING_BLOCKS.has_key('voicechat'):
             del self.KEYBOARD_MAPPING_BLOCKS['voicechat']
         self.KEYBOARD_MAPPING_BLOCKS_ORDER = list(
             self.KEYBOARD_MAPPING_BLOCKS_ORDER)
         del self.KEYBOARD_MAPPING_BLOCKS_ORDER[
             self.KEYBOARD_MAPPING_BLOCKS_ORDER.index('voicechat')]
         self.KEYBOARD_MAPPING_BLOCKS_ORDER = tuple(
             self.KEYBOARD_MAPPING_BLOCKS_ORDER)
     return
 def __init__(self, enableRedefineKeysMode = True):
     UIInterface.__init__(self)
     if not GUI_SETTINGS.minimapSize and self.KEYBOARD_MAPPING_BLOCKS.has_key('minimap'):
         del self.KEYBOARD_MAPPING_BLOCKS['minimap']
     self.__enableRedefineKeysMode = enableRedefineKeysMode
     self.graphicsPresets = GraphicsPresets()
     self.resolutions = g_graficsResolutions
     self.__currentSettings = None
     self.__settingsUI = None
     self.__altVoiceSetting = g_settingsCore.options.getSetting('alternativeVoices')
     if not GUI_SETTINGS.voiceChat and self.KEYBOARD_MAPPING_COMMANDS.has_key('voicechat'):
         if self.KEYBOARD_MAPPING_COMMANDS.has_key('voicechat'):
             del self.KEYBOARD_MAPPING_COMMANDS['voicechat']
         if self.KEYBOARD_MAPPING_BLOCKS.has_key('voicechat'):
             del self.KEYBOARD_MAPPING_BLOCKS['voicechat']
         self.KEYBOARD_MAPPING_BLOCKS_ORDER = list(self.KEYBOARD_MAPPING_BLOCKS_ORDER)
         del self.KEYBOARD_MAPPING_BLOCKS_ORDER[self.KEYBOARD_MAPPING_BLOCKS_ORDER.index('voicechat')]
         self.KEYBOARD_MAPPING_BLOCKS_ORDER = tuple(self.KEYBOARD_MAPPING_BLOCKS_ORDER)
     return
Esempio n. 3
0
 def __init__(self, enableRedefineKeysMode=True):
     UIInterface.__init__(self)
     if not GUI_SETTINGS.minimapSize and self.KEYBOARD_MAPPING_BLOCKS.has_key("minimap"):
         del self.KEYBOARD_MAPPING_BLOCKS["minimap"]
     self.__enableRedefineKeysMode = enableRedefineKeysMode
     self.graphicsPresets = GraphicsPresets()
     self.resolutions = g_graficsResolutions
     self.__currentSettings = None
     self.__settingsUI = None
     self.__altVoiceSetting = g_settingsCore.options.getSetting("alternativeVoices")
     self.graphicsChangeConfirmationRevert = None
     self.__dialogIsVisibility = False
     if not GUI_SETTINGS.voiceChat and self.KEYBOARD_MAPPING_COMMANDS.has_key("voicechat"):
         if self.KEYBOARD_MAPPING_COMMANDS.has_key("voicechat"):
             del self.KEYBOARD_MAPPING_COMMANDS["voicechat"]
         if self.KEYBOARD_MAPPING_BLOCKS.has_key("voicechat"):
             del self.KEYBOARD_MAPPING_BLOCKS["voicechat"]
         self.KEYBOARD_MAPPING_BLOCKS_ORDER = list(self.KEYBOARD_MAPPING_BLOCKS_ORDER)
         del self.KEYBOARD_MAPPING_BLOCKS_ORDER[self.KEYBOARD_MAPPING_BLOCKS_ORDER.index("voicechat")]
         self.KEYBOARD_MAPPING_BLOCKS_ORDER = tuple(self.KEYBOARD_MAPPING_BLOCKS_ORDER)
     return
Esempio n. 4
0
class SettingsInterface(UIInterface):
    KEYBOARD_MAPPING_COMMANDS = {'movement': {'forward': 'CMD_MOVE_FORWARD',
                  'backward': 'CMD_MOVE_BACKWARD',
                  'left': 'CMD_ROTATE_LEFT',
                  'right': 'CMD_ROTATE_RIGHT',
                  'auto_rotation': 'CMD_CM_VEHICLE_SWITCH_AUTOROTATION'},
     'cruis_control': {'forward': 'CMD_INCREMENT_CRUISE_MODE',
                       'backward': 'CMD_DECREMENT_CRUISE_MODE',
                       'stop_fire': 'CMD_STOP_UNTIL_FIRE'},
     'firing': {'fire': 'CMD_CM_SHOOT',
                'lock_target': 'CMD_CM_LOCK_TARGET',
                'lock_target_off': 'CMD_CM_LOCK_TARGET_OFF',
                'alternate_mode': 'CMD_CM_ALTERNATE_MODE',
                'reloadPartialClip': 'CMD_RELOAD_PARTIAL_CLIP'},
     'vehicle_other': {'showHUD': 'CMD_TOGGLE_GUI',
                       'showRadialMenu': 'CMD_RADIAL_MENU_SHOW'},
     'equipment': {'item01': 'CMD_AMMO_CHOICE_1',
                   'item02': 'CMD_AMMO_CHOICE_2',
                   'item03': 'CMD_AMMO_CHOICE_3',
                   'item04': 'CMD_AMMO_CHOICE_4',
                   'item05': 'CMD_AMMO_CHOICE_5',
                   'item06': 'CMD_AMMO_CHOICE_6',
                   'item07': 'CMD_AMMO_CHOICE_7',
                   'item08': 'CMD_AMMO_CHOICE_8'},
     'shortcuts': {'attack': 'CMD_CHAT_SHORTCUT_ATTACK',
                   'to_base': 'CMD_CHAT_SHORTCUT_BACKTOBASE',
                   'positive': 'CMD_CHAT_SHORTCUT_POSITIVE',
                   'negative': 'CMD_CHAT_SHORTCUT_NEGATIVE',
                   'help_me': 'CMD_CHAT_SHORTCUT_HELPME',
                   'reload': 'CMD_CHAT_SHORTCUT_RELOAD'},
     'camera': {'camera_up': 'CMD_CM_CAMERA_ROTATE_UP',
                'camera_down': 'CMD_CM_CAMERA_ROTATE_DOWN',
                'camera_left': 'CMD_CM_CAMERA_ROTATE_LEFT',
                'camera_right': 'CMD_CM_CAMERA_ROTATE_RIGHT'},
     'voicechat': {'pushToTalk': 'CMD_VOICECHAT_MUTE'},
     'logitech_keyboard': {'switch_view': 'CMD_LOGITECH_SWITCH_VIEW'},
     'minimap': {'sizeUp': 'CMD_MINIMAP_SIZE_UP',
                 'sizeDown': 'CMD_MINIMAP_SIZE_DOWN',
                 'visible': 'CMD_MINIMAP_VISIBLE'}}
    KEYBOARD_MAPPING_BLOCKS = {'movement': ('forward', 'backward', 'left', 'right', 'auto_rotation'),
     'cruis_control': ('forward', 'backward', 'stop_fire'),
     'firing': ('fire', 'lock_target', 'lock_target_off', 'alternate_mode', 'reloadPartialClip'),
     'vehicle_other': ('showHUD', 'showRadialMenu'),
     'equipment': ('item01', 'item02', 'item03', 'item04', 'item05', 'item06', 'item07', 'item08'),
     'shortcuts': ('attack', 'to_base', 'positive', 'negative', 'help_me', 'reload'),
     'camera': ('camera_up', 'camera_down', 'camera_left', 'camera_right'),
     'voicechat': ('pushToTalk',),
     'logitech_keyboard': ('switch_view',),
     'minimap': ('sizeUp', 'sizeDown', 'visible')}
    KEYBOARD_MAPPING_BLOCKS_ORDER = ('movement', 'cruis_control', 'firing', 'vehicle_other', 'equipment', 'shortcuts', 'camera', 'voicechat', 'minimap', 'logitech_keyboard')
    POPULATE_UI = 'SettingsDialog.PopulateUI'
    APPLY_SETTINGS = 'SettingsDialog.ApplySettings'
    COMMIT_SETTINGS = 'SettingsDialog.CommitSettings'
    SETTINGS_TAB_SELECTED = 'SettingsDialog.onTabSelected'
    DELAY_SETTINGS = 'SettingsDialog.DelaySettings'
    AUTODETECT_QUALITY = 'SettingsDialog.AutodetectQuality'
    SET_DIALOG_VISIBILITY = 'SettingsDialog.setVisibility'
    CURSOR_VALUES = {'mixing': 3,
     'gunTag': 15,
     'centralTag': 14,
     'net': 4,
     'reloader': 0,
     'condition': 0,
     'cassette': 0,
     'reloaderTimer': 0}
    SNIPER_VALUES = {'snpMixing': 3,
     'snpGunTag': 6,
     'snpCentralTag': 14,
     'snpNet': 4,
     'snpReloader': 0,
     'snpCondition': 0,
     'snpCassette': 0,
     'snpReloaderTimer': 0}
    MARKER_VALUES = {'Hp': 4,
     'Name': 3}
    MARKER_TYPES = ['Base', 'Alt']
    MOUSE_KEYS = {'ingame': {'arcadeSens': ('arcade', 'sensitivity'),
                'sniperSens': ('sniper', 'sensitivity'),
                'artSens': ('strategic', 'sensitivity'),
                'horInvert': ('arcade', 'horzInvert'),
                'vertInvert': ('arcade', 'vertInvert'),
                'backDraftInvert': ('arcade', 'backDraftInvert')},
     'lobby': {'arcadeSens': ('arcadeMode/camera', 'sensitivity', 'float'),
               'sniperSens': ('sniperMode/camera', 'sensitivity', 'float'),
               'artSens': ('strategicMode/camera', 'sensitivity', 'float'),
               'horInvert': ('arcadeMode/camera', 'horzInvert', 'bool'),
               'vertInvert': ('arcadeMode/camera', 'vertInvert', 'bool'),
               'backDraftInvert': ('arcadeMode/camera', 'backDraftInvert', 'bool')},
     'default': {'arcadeSens': 1,
                 'sniperSens': 1,
                 'artSens': 1,
                 'horInvert': False,
                 'vertInvert': False,
                 'backDraftInvert': False}}
    GAMEPLAY_KEY_FORMAT = 'gameplay_{0:>s}'
    GAMEPLAY_PREFIX = 'gameplay_'

    def __init__(self, enableRedefineKeysMode = True):
        UIInterface.__init__(self)
        if not GUI_SETTINGS.minimapSize and self.KEYBOARD_MAPPING_BLOCKS.has_key('minimap'):
            del self.KEYBOARD_MAPPING_BLOCKS['minimap']
        self.__enableRedefineKeysMode = enableRedefineKeysMode
        self.graphicsPresets = GraphicsPresets()
        self.resolutions = g_graficsResolutions
        self.__currentSettings = None
        self.__settingsUI = None
        self.__altVoiceSetting = g_settingsCore.options.getSetting('alternativeVoices')
        self.graphicsChangeConfirmationRevert = None
        self.__dialogIsVisibility = False
        if not GUI_SETTINGS.voiceChat and self.KEYBOARD_MAPPING_COMMANDS.has_key('voicechat'):
            if self.KEYBOARD_MAPPING_COMMANDS.has_key('voicechat'):
                del self.KEYBOARD_MAPPING_COMMANDS['voicechat']
            if self.KEYBOARD_MAPPING_BLOCKS.has_key('voicechat'):
                del self.KEYBOARD_MAPPING_BLOCKS['voicechat']
            self.KEYBOARD_MAPPING_BLOCKS_ORDER = list(self.KEYBOARD_MAPPING_BLOCKS_ORDER)
            del self.KEYBOARD_MAPPING_BLOCKS_ORDER[self.KEYBOARD_MAPPING_BLOCKS_ORDER.index('voicechat')]
            self.KEYBOARD_MAPPING_BLOCKS_ORDER = tuple(self.KEYBOARD_MAPPING_BLOCKS_ORDER)
        return

    def populateUI(self, proxy):
        UIInterface.populateUI(self, proxy)
        self.uiHolder.addExternalCallbacks({SettingsInterface.POPULATE_UI: self.onPopulateUI,
         SettingsInterface.APPLY_SETTINGS: self.onApplySettings,
         SettingsInterface.COMMIT_SETTINGS: self.onCommitSettings,
         SettingsInterface.SETTINGS_TAB_SELECTED: self.onTabSelected,
         SettingsInterface.DELAY_SETTINGS: self.onDelaySettings,
         SettingsInterface.AUTODETECT_QUALITY: self.onAutodetectSettings,
         SettingsInterface.SET_DIALOG_VISIBILITY: self.onSetVisibility,
         'SettingsDialog.useRedifineKeysMode': self.onUseRedifineKeyMode,
         'SettingsDialog.processVivoxTest': self.onProcessVivoxTest,
         'SettingsDialog.voiceChatEnable': self.onVoiceChatEnable,
         'SettingsDialog.updateCaptureDevices': self.onUpdateCaptureDevices,
         'SettingsDialog.setVivoxMicVolume': self.onSetVivoxMicVolume,
         'SettingsDialog.killDialog': self.onDialogClose,
         'SettingsDialog.graphicsChangeConfirmationStatus': self.graphicsChangeConfirmationStatus})
        VibroManager.g_instance.onConnect += self.__vm_onConnect
        VibroManager.g_instance.onDisconnect += self.__vm_onDisconnect
        g_guiResetters.add(self.onRecreateDevice)
        BigWorld.wg_setAdapterOrdinalNotifyCallback(self.onRecreateDevice)

    def dispossessUI(self):
        if self.__settingsUI:
            self.__settingsUI.script = None
            self.__settingsUI = None
        self.__altVoiceSetting = None
        self.uiHolder.removeExternalCallbacks(SettingsInterface.POPULATE_UI, SettingsInterface.APPLY_SETTINGS, SettingsInterface.COMMIT_SETTINGS, SettingsInterface.SETTINGS_TAB_SELECTED, SettingsInterface.DELAY_SETTINGS, SettingsInterface.AUTODETECT_QUALITY, SettingsInterface.SET_DIALOG_VISIBILITY, 'SettingsDialog.useRedifineKeysMode', 'SettingsDialog.processVivoxTest', 'SettingsDialog.voiceChatEnable', 'SettingsDialog.updateCaptureDevices', 'SettingsDialog.setVivoxMicVolume', 'SettingsDialog.killDialog')
        VibroManager.g_instance.onConnect -= self.__vm_onConnect
        VibroManager.g_instance.onDisconnect -= self.__vm_onDisconnect
        g_guiResetters.discard(self.onRecreateDevice)
        BigWorld.wg_setAdapterOrdinalNotifyCallback(None)
        UIInterface.dispossessUI(self)
        return

    def altVoicesPreview(self, soundMode):
        if not self.__altVoiceSetting.isOptionEnabled():
            return True
        if not g_sessionProvider.getCtx().isInBattle:
            SoundGroups.g_instance.enableVoiceSounds(True)
        self.__altVoiceSetting.preview(soundMode)
        return self.__altVoiceSetting.playPreviewSound(self.uiHolder.soundManager)

    def isSoundModeValid(self, soundMode):
        self.__altVoiceSetting.preview(soundMode)
        valid = self.__altVoiceSetting.isSoundModeValid()
        self.__altVoiceSetting.revert()
        return valid

    def onSetVivoxMicVolume(self, callbackId, value):
        import VOIP
        if round(SoundGroups.g_instance.getVolume('micVivox') * 100) != value:
            SoundGroups.g_instance.setVolume('micVivox', value / 100)
            VOIP.getVOIPManager().setMicrophoneVolume(int(value))

    def onVoiceChatEnable(self, callbackId, isEnable):
        self.__voiceChatEnable(isEnable)

    def __voiceChatEnable(self, isEnable):
        if BattleReplay.isPlaying():
            return
        elif isEnable is None:
            return
        else:
            preveVoIP = Settings.g_instance.userPrefs.readBool(Settings.KEY_ENABLE_VOIP)
            import VOIP
            if preveVoIP != isEnable:
                VOIP.getVOIPManager().enable(isEnable)
                Settings.g_instance.userPrefs.writeBool(Settings.KEY_ENABLE_VOIP, bool(isEnable))
                LOG_NOTE('Change state of voip: %s' % str(isEnable))
            return

    def onUseRedifineKeyMode(self, callbackId, isUse):
        if self.__enableRedefineKeysMode:
            BigWorld.wg_setRedefineKeysMode(isUse)

    def onProcessVivoxTest(self, callbackId, isStart):
        LOG_DEBUG('Vivox test: %s' % str(isStart))
        import VOIP
        rh = VOIP.getVOIPManager()
        rh.enterTestChannel() if isStart else rh.leaveTestChannel()
        self.respond([callbackId, False])

    def __vm_onConnect(self):
        self.call('SettingsDialog.VibroManager.Connect')

    def __vm_onDisconnect(self):
        self.call('SettingsDialog.VibroManager.Disconnect')

    def __getVideoSettings(self):
        settings = {}
        settings['monitor'] = {'current': self.resolutions.monitorIndex,
         'real': self.resolutions.realMonitorIndex,
         'options': self.resolutions.monitorsList}
        settings['fullScreen'] = g_settingsCore.getSetting('fullScreen')
        settings['windowSize'] = {'current': g_settingsCore.getSetting('windowSize'),
         'options': g_settingsCore.options.getSetting('windowSize').getOptions()}
        settings['resolution'] = {'current': g_settingsCore.getSetting('resolution'),
         'options': g_settingsCore.options.getSetting('resolution').getOptions()}
        settings['refreshRate'] = {'current': g_settingsCore.getSetting('refreshRate'),
         'options': g_settingsCore.options.getSetting('refreshRate').getOptions()}
        return settings

    def __getSettings(self):
        settings = [self.graphicsPresets.getGraphicsPresetsData()]
        import VOIP
        rh = VOIP.getVOIPManager()
        g_windowsStoredData.start()
        vManager = VibroManager.g_instance
        vEffGroups = vManager.getGroupsSettings()
        vEffDefGroup = VibroManager.VibroManager.GroupSettings()
        vEffDefGroup.enabled = False
        vEffDefGroup.gain = 0
        markers = {'enemy': g_settingsCore.getSetting('enemy'),
         'dead': g_settingsCore.getSetting('dead'),
         'ally': g_settingsCore.getSetting('ally')}
        datetimeIdx = g_settingsCore.getSetting('showDateMessage') << 0 | g_settingsCore.getSetting('showTimeMessage') << 1
        config = {'locale': getClientOverride(),
         'aspectRatio': {'current': self.resolutions.aspectRatioIndex,
                         'options': self.resolutions.aspectRatiosList},
         'vertSync': self.resolutions.isVideoVSync,
         'tripleBuffered': self.resolutions.isTripleBuffered,
         'multisampling': {'current': self.resolutions.multisamplingTypeIndex,
                           'options': self.resolutions.multisamplingTypesList},
         'customAA': {'current': self.resolutions.customAAModeIndex,
                      'options': self.resolutions.customAAModesList},
         'gamma': self.resolutions.gamma,
         'masterVolume': round(SoundGroups.g_instance.getMasterVolume() * 100),
         'musicVolume': round(SoundGroups.g_instance.getVolume('music') * 100),
         'voiceVolume': round(SoundGroups.g_instance.getVolume('voice') * 100),
         'vehiclesVolume': round(SoundGroups.g_instance.getVolume('vehicles') * 100),
         'effectsVolume': round(SoundGroups.g_instance.getVolume('effects') * 100),
         'guiVolume': round(SoundGroups.g_instance.getVolume('gui') * 100),
         'ambientVolume': round(SoundGroups.g_instance.getVolume('ambient') * 100),
         'masterVivoxVolume': round(SoundGroups.g_instance.getVolume('masterVivox') * 100),
         'micVivoxVolume': round(SoundGroups.g_instance.getVolume('micVivox') * 100),
         'masterFadeVivoxVolume': round(SoundGroups.g_instance.getVolume('masterFadeVivox') * 100),
         'captureDevice': g_settingsCore.options.getSetting(SOUND.CAPTURE_DEVICES).pack(),
         'voiceChatNotSupported': not g_settingsCore.getSetting(SOUND.VOIP_SUPPORTED),
         'datetimeIdx': datetimeIdx,
         'enableOlFilter': g_settingsCore.getSetting('enableOlFilter'),
         'enableSpamFilter': g_settingsCore.getSetting('enableSpamFilter'),
         'enableStoreChatMws': g_settingsCore.getSetting('enableStoreMws'),
         'enableStoreChatCws': g_settingsCore.getSetting('enableStoreCws'),
         'invitesFromFriendsOnly': g_settingsCore.getSetting('invitesFromFriendsOnly'),
         'storeReceiverInBattle': g_settingsCore.getSetting('storeReceiverInBattle'),
         'disableBattleChat': g_settingsCore.getSetting('disableBattleChat'),
         'dynamicCamera': g_settingsCore.getSetting('dynamicCamera'),
         'horStabilizationSnp': g_settingsCore.getSetting('horStabilizationSnp'),
         'enableVoIP': VOIP.getVOIPManager().isEnabled(),
         'enablePostMortemEffect': g_settingsCore.getSetting('enablePostMortemEffect'),
         'enablePostMortemDelay': g_settingsCore.getSetting('enablePostMortemDelay'),
         'nationalVoices': g_settingsCore.getSetting('nationalVoices'),
         'isColorBlind': g_settingsCore.getSetting('isColorBlind'),
         'useServerAim': g_settingsCore.getSetting('useServerAim'),
         'showVehiclesCounter': g_settingsCore.getSetting('showVehiclesCounter'),
         'showMarksOnGun': g_settingsCore.getSetting('showMarksOnGun'),
         'minimapAlpha': g_settingsCore.getSetting('minimapAlpha'),
         'showVectorOnMap': g_settingsCore.getSetting('showVectorOnMap'),
         'showSectorOnMap': g_settingsCore.getSetting('showSectorOnMap'),
         'showVehModelsOnMap': g_settingsCore.options.getSetting('showVehModelsOnMap').pack(),
         'vibroIsConnected': vManager.connect(),
         'vibroGain': vManager.getGain() * 100,
         'vibroEngine': vEffGroups.get('engine', vEffDefGroup).gain * 100,
         'vibroAcceleration': vEffGroups.get('acceleration', vEffDefGroup).gain * 100,
         'vibroShots': vEffGroups.get('shots', vEffDefGroup).gain * 100,
         'vibroHits': vEffGroups.get('hits', vEffDefGroup).gain * 100,
         'vibroCollisions': vEffGroups.get('collisions', vEffDefGroup).gain * 100,
         'vibroDamage': vEffGroups.get('damage', vEffDefGroup).gain * 100,
         'vibroGUI': vEffGroups.get('gui', vEffDefGroup).gain * 100,
         'ppShowLevels': g_settingsCore.getSetting('ppShowLevels'),
         'ppShowTypes': g_settingsCore.getSetting('ppShowTypes'),
         'replayEnabled': g_settingsCore.options.getSetting('replayEnabled').pack(),
         'fpsPerfomancer': g_settingsCore.getSetting('fpsPerfomancer'),
         'dynamicRenderer': g_settingsCore.getSetting('dynamicRenderer'),
         'colorFilterIntensity': g_settingsCore.getSetting('colorFilterIntensity'),
         'colorFilterImages': g_settingsCore.getSetting('colorFilterImages'),
         'fov': g_settingsCore.getSetting('fov'),
         'dynamicFov': g_settingsCore.getSetting('dynamicFov'),
         'enableOpticalSnpEffect': g_settingsCore.getSetting('enableOpticalSnpEffect'),
         'arcade': {'values': g_settingsCore.options.getSetting('arcade').toAccountSettings(),
                    'options': SettingsInterface.CURSOR_VALUES},
         'sniper': {'values': g_settingsCore.options.getSetting('sniper').toAccountSettings(),
                    'options': SettingsInterface.SNIPER_VALUES},
         'markers': {'values': markers,
                     'options': SettingsInterface.MARKER_VALUES,
                     'types': SettingsInterface.MARKER_TYPES}}
        if self.__altVoiceSetting.isOptionEnabled():
            altVoices = []
            for idx, desc in enumerate(self.__altVoiceSetting.getOptions()):
                altVoices.append({'data': idx,
                 'label': desc})

            config['alternativeVoices'] = {'current': self.__altVoiceSetting.get(),
             'options': altVoices}
        for name in ('ctf', 'domination', 'assault', 'nations'):
            key = self.GAMEPLAY_KEY_FORMAT.format(name)
            config[key] = g_settingsCore.getSetting(key)

        settings.append(config)
        if not LogitechMonitor.isPresentColor():
            if self.KEYBOARD_MAPPING_BLOCKS.has_key('logitech_keyboard'):
                del self.KEYBOARD_MAPPING_BLOCKS['logitech_keyboard']
        else:
            self.KEYBOARD_MAPPING_BLOCKS['logitech_keyboard'] = ('switch_view',)
        cmdMap = CommandMapping.g_instance
        defaults = cmdMap.getDefaults()
        keyboard = []
        for group_name in self.KEYBOARD_MAPPING_BLOCKS_ORDER:
            if group_name in self.KEYBOARD_MAPPING_BLOCKS.keys():
                group = {'id': group_name,
                 'commands': []}
                keyboard.append(group)
                for key_setting in self.KEYBOARD_MAPPING_BLOCKS[group_name]:
                    command = cmdMap.getCommand(self.KEYBOARD_MAPPING_COMMANDS[group_name][key_setting])
                    keyCode = cmdMap.get(self.KEYBOARD_MAPPING_COMMANDS[group_name][key_setting])
                    defaultCode = defaults[command] if defaults.has_key(command) else 0
                    key = {'id': key_setting,
                     'command': command,
                     'key': getScaleformKey(keyCode),
                     'keyDefault': getScaleformKey(defaultCode)}
                    group['commands'].append(key)

        settings.append(keyboard)
        mouse = {}
        player = BigWorld.player()
        if hasattr(player.inputHandler, 'ctrls'):
            for key, path in SettingsInterface.MOUSE_KEYS['ingame'].items():
                if key == 'horInvert':
                    value = g_settingsCore.getSetting('mouseHorzInvert')
                elif key == 'vertInvert':
                    value = g_settingsCore.getSetting('mouseVertInvert')
                elif key == 'backDraftInvert':
                    value = g_settingsCore.getSetting('backDraftInvert')
                else:
                    value = player.inputHandler.ctrls[path[0]].camera.getUserConfigValue(path[1])
                mouse[key] = {'defaultValue': SettingsInterface.MOUSE_KEYS['default'][key],
                 'value': value}

        else:
            ds = Settings.g_instance.userPrefs[Settings.KEY_CONTROL_MODE]
            for key, path in SettingsInterface.MOUSE_KEYS['lobby'].items():
                default = SettingsInterface.MOUSE_KEYS['default'][key]
                value = default
                if key == 'horInvert':
                    value = g_settingsCore.getSetting('mouseHorzInvert')
                elif key == 'vertInvert':
                    value = g_settingsCore.getSetting('mouseVertInvert')
                elif key == 'backDraftInvert':
                    value = g_settingsCore.getSetting('backDraftInvert')
                elif ds is not None:
                    if path[2] == 'float':
                        value = ds[path[0]].readFloat(path[1], default)
                    elif path[2] == 'bool':
                        value = ds[path[0]].readBool(path[1], default)
                    else:
                        LOG_DEBUG('Unknown mouse settings type %s %s' % (key, path))
                mouse[key] = {'defaultValue': default,
                 'value': value}

        settings.append(mouse)
        g_windowsStoredData.stop()
        return settings

    def onUpdateCaptureDevices(self, callbackId):
        self.__updateCaptureDevices()

    @process
    def __updateCaptureDevices(self):
        Waiting.show('__updateCaptureDevices')
        yield VoiceChatInterface.g_instance.requestCaptureDevices()
        opt = g_settingsCore.options.getSetting(SOUND.CAPTURE_DEVICES)
        Waiting.hide('__updateCaptureDevices')
        self.call('SettingsDialog.updateCaptureDevices', [opt.get()] + opt.getOptions())

    def onRecreateDevice(self):
        if self.__settingsUI and self.__dialogIsVisibility:
            if self.__currentSettings and self.__currentSettings != self.__getVideoSettings():
                self.__currentSettings = self.__getVideoSettings()
                self.__settingsUI.buildGraphicsData(self.__getVideoSettings())

    def onSetVisibility(self, callbackID, isVisibility):
        self.__dialogIsVisibility = isVisibility

    def onAutodetectSettings(self, callbackID):
        presetIndex = BigWorld.autoDetectGraphicsSettings()
        self.call('SettingsDialog.setPreset', [presetIndex])

    def onPopulateUI(self, *args):
        self.graphicsPresets.checkCurrentPreset(True)
        self.__currentSettings = self.__getVideoSettings()
        if self.__settingsUI:
            self.__settingsUI.script = None
            self.__settingsUI = None
        settingsDialogName = args[1]
        self.__settingsUI = self.uiHolder.getMember(settingsDialogName)
        if self.__settingsUI and self.__dialogIsVisibility:
            settings = self.__getSettings()
            self.__settingsUI.buildData(settings[0], settings[1], settings[2], settings[3])
            self.__settingsUI.buildGraphicsData(self.__getVideoSettings())
            self.__settingsUI.script = self
        else:
            LOG_ERROR('settingsDialog is not found in flash by name {0}'.format(settingsDialogName))
        return

    def onApplySettings(self, callbackId, settings):
        monitorIndex, presetIndex, settingsList, fullscreen = settings
        if (not self.resolutions.isVideoWindowed or fullscreen) and (monitorIndex != self.resolutions.realMonitorIndex or self.resolutions.monitorChanged):
            self.call('SettingsDialog.ApplySettings', ['restartNeeded'])
            return
        applyMethod = g_settingsCore.options.getApplyMethod(settingsList)
        method = 'apply'
        if applyMethod == APPLY_METHOD.RESTART:
            method = 'restartNeeded'
        elif applyMethod == APPLY_METHOD.DELAYED:
            method = 'hasPendingSettings'
        self.call('SettingsDialog.ApplySettings', [method])

    def onDelaySettings(self, *args):
        g_settingsCore.options.revert()

    def onCommitSettings(self, *args):
        self.apply(True, *args)

    def onTabSelected(self, cbID, tabId):
        if tabId == SETTINGS.SOUNDTITLE:
            VoiceChatInterface.g_instance.processFailedMessage()

    def apply(self, restartApproved, callbackId, settings):
        restartClient = False
        g_settingsCore.isDeviseRecreated = False
        import VOIP
        if (not self.resolutions.isVideoWindowed or settings['fullScreen']) and (settings['monitor'] != self.resolutions.realMonitorIndex or self.resolutions.monitorChanged):
            restartClient = True
        g_settingsCore.applySetting('ppShowTypes', settings['ppShowTypes'])
        g_settingsCore.applySetting('ppShowLevels', settings['ppShowLevels'])
        g_settingsCore.applySetting('replayEnabled', settings['replayEnabled'])
        g_settingsCore.applySetting('fpsPerfomancer', settings['fpsPerfomancer'])
        g_settingsCore.applySetting('dynamicRenderer', settings['dynamicRenderer'])
        g_settingsCore.applySetting('colorFilterIntensity', settings['colorFilterIntensity'])
        g_settingsCore.applySetting('fov', settings['fov'])
        g_settingsCore.applySetting('dynamicFov', settings['dynamicFov'])
        g_settingsCore.applySetting('enableOpticalSnpEffect', settings['enableOpticalSnpEffect'])
        g_settingsCore.applySetting('nationalVoices', settings['nationalVoices'])
        g_settingsCore.applySetting('isColorBlind', settings['isColorBlind'])
        g_settingsCore.applySetting('useServerAim', settings['useServerAim'])
        g_settingsCore.applySetting('showVehiclesCounter', settings['showVehiclesCounter'])
        g_settingsCore.applySetting('showMarksOnGun', settings['showMarksOnGun'])
        g_settingsCore.applySetting('minimapAlpha', settings['minimapAlpha'])
        g_settingsCore.applySetting('showVectorOnMap', settings['showVectorOnMap'])
        g_settingsCore.applySetting('showSectorOnMap', settings['showSectorOnMap'])
        g_settingsCore.applySetting('showVehModelsOnMap', settings['showVehModelsOnMap'])
        arcade = g_settingsCore.options.getSetting('arcade').fromAccountSettings(settings['arcade'])
        sniper = g_settingsCore.options.getSetting('sniper').fromAccountSettings(settings['sniper'])
        g_settingsCore.applySetting('arcade', arcade)
        g_settingsCore.applySetting('sniper', sniper)
        g_settingsCore.applySetting('enemy', settings['markers']['enemy'])
        g_settingsCore.applySetting('dead', settings['markers']['dead'])
        g_settingsCore.applySetting('ally', settings['markers']['ally'])
        g_settingsCore.applySetting('dynamicCamera', settings['dynamicCamera'])
        g_settingsCore.applySetting('horStabilizationSnp', settings['horStabilizationSnp'])
        if self.__altVoiceSetting.isOptionEnabled():
            altVoices = settings.get('alternativeVoices')
            if altVoices is not None:
                self.__altVoiceSetting.apply(altVoices)
        vManager = VibroManager.g_instance
        vManager.setGain(settings['vibroGain'] / 100.0)
        vEffGroups = vManager.getGroupsSettings()
        for groupName, newValue in [('engine', settings['vibroEngine']),
         ('acceleration', settings['vibroAcceleration']),
         ('shots', settings['vibroShots']),
         ('hits', settings['vibroHits']),
         ('collisions', settings['vibroCollisions']),
         ('damage', settings['vibroDamage']),
         ('gui', settings['vibroGUI'])]:
            if groupName in vEffGroups:
                vEffGroups[groupName].gain = newValue / 100.0
                vEffGroups[groupName].enabled = newValue > 0

        vManager.setGroupsSettings(vEffGroups)
        self.__voiceChatEnable(settings['enableVoIP'])
        g_settingsCore.applySetting(SOUND.CAPTURE_DEVICES, settings[Settings.KEY_VOIP_DEVICE])
        g_settingsCore.applySetting('enablePostMortemEffect', settings['enablePostMortemEffect'])
        g_settingsCore.applySetting('enablePostMortemDelay', settings['enablePostMortemDelay'])
        self.uiHolder.clearCommands()
        keyboard = settings['controls']['keyboard']
        keyboardMapping = {}
        keysLayout = dict(g_settingsCore.options.getSetting('keyboard').KEYS_LAYOUT)
        layout = list(itertools.chain(*keysLayout.values()))
        for i in xrange(len(self.KEYBOARD_MAPPING_BLOCKS)):
            group_name = keyboard[i]['id']
            for j in xrange(len(self.KEYBOARD_MAPPING_BLOCKS[group_name])):
                key_name = keyboard[i]['commands'][j]['id']
                value = keyboard[i]['commands'][j]['key']
                cmd = self.KEYBOARD_MAPPING_COMMANDS[group_name][key_name]
                for item in layout:
                    key, command = item[0], item[1]
                    if command == cmd:
                        keyboardMapping[key] = value
                        break

        g_settingsCore.applySetting('keyboard', keyboardMapping)
        self.uiHolder.bindCommands()
        player = BigWorld.player()
        mouse = settings['controls']['mouse']
        if hasattr(player.inputHandler, 'ctrls'):
            player.inputHandler.ctrls['arcade'].camera.setUserConfigValue('sensitivity', mouse['arcadeSens']['value'])
            player.inputHandler.ctrls['sniper'].camera.setUserConfigValue('sensitivity', mouse['sniperSens']['value'])
            player.inputHandler.ctrls['strategic'].camera.setUserConfigValue('sensitivity', mouse['artSens']['value'])
        else:
            ds = Settings.g_instance.userPrefs[Settings.KEY_CONTROL_MODE]
            if ds:
                ds['arcadeMode/camera'].writeFloat('sensitivity', mouse['arcadeSens']['value'])
                ds['sniperMode/camera'].writeFloat('sensitivity', mouse['sniperSens']['value'])
                ds['strategicMode/camera'].writeFloat('sensitivity', mouse['artSens']['value'])
        g_settingsCore.applySetting('mouseHorzInvert', bool(mouse['horInvert']['value']))
        g_settingsCore.applySetting('mouseVertInvert', bool(mouse['vertInvert']['value']))
        g_settingsCore.applySetting('backDraftInvert', bool(mouse['backDraftInvert']['value']))
        isFullScreen = bool(settings['fullScreen'])
        if isFullScreen:
            g_settingsCore.applySetting('refreshRate', settings['refreshRate'])
            g_settingsCore.applySetting('resolution', settings['resolution'])
            g_settingsCore.applySetting('aspectRatio', settings['aspectRatio'])
            g_settingsCore.applySetting('gamma', settings['gamma'])
        else:
            g_settingsCore.applySetting('windowSize', settings['windowSize'])
        g_settingsCore.applySetting('fullScreen', isFullScreen)
        g_settingsCore.applySetting('multisampling', settings['multisampling'])
        g_settingsCore.applySetting('customAA', settings['customAA'])
        g_settingsCore.applySetting('monitor', settings['monitor'])
        g_settingsCore.applySetting('vertSync', settings['vertSync'])
        g_settingsCore.applySetting('tripleBuffered', settings['tripleBuffered'])
        if round(SoundGroups.g_instance.getVolume('masterVivox') * 100) != settings['masterVivoxVolume']:
            VOIP.getVOIPManager().setMasterVolume(settings['masterVivoxVolume'])
        if round(SoundGroups.g_instance.getVolume('micVivox') * 100) != settings['micVivoxVolume']:
            VOIP.getVOIPManager().setMicrophoneVolume(settings['micVivoxVolume'])
        SoundGroups.g_instance.setMasterVolume(float(settings['masterVolume']) / 100)
        SoundGroups.g_instance.setVolume('music', float(settings['musicVolume']) / 100)
        SoundGroups.g_instance.setVolume('voice', float(settings['voiceVolume']) / 100)
        SoundGroups.g_instance.setVolume('vehicles', float(settings['vehiclesVolume']) / 100)
        SoundGroups.g_instance.setVolume('effects', float(settings['effectsVolume']) / 100)
        SoundGroups.g_instance.setVolume('gui', float(settings['guiVolume']) / 100)
        SoundGroups.g_instance.setVolume('ambient', float(settings['ambientVolume']) / 100)
        SoundGroups.g_instance.setVolume('masterVivox', float(settings['masterVivoxVolume']) / 100)
        SoundGroups.g_instance.setVolume('micVivox', float(settings['micVivoxVolume']) / 100)
        SoundGroups.g_instance.setVolume('masterFadeVivox', float(settings['masterFadeVivoxVolume']) / 100)
        from BattleReplay import g_replayCtrl
        if g_replayCtrl is not None and g_replayCtrl.isPlaying:
            if g_replayCtrl.playbackSpeed == 0 or g_replayCtrl.playbackSpeed > 4.0:
                SoundGroups.g_instance.enableReplaySounds(False)
        g_settingsCore.applySetting('showDateMessage', settings['datetimeIdx'] & 1)
        g_settingsCore.applySetting('showTimeMessage', settings['datetimeIdx'] & 2)
        g_settingsCore.applySetting('enableOlFilter', settings['enableOlFilter'])
        g_settingsCore.applySetting('enableSpamFilter', settings['enableSpamFilter'])
        g_windowsStoredData.start()
        g_settingsCore.applySetting('enableStoreMws', settings['enableStoreChatMws'])
        g_settingsCore.applySetting('enableStoreCws', settings['enableStoreChatCws'])
        g_windowsStoredData.stop()
        g_settingsCore.applySetting('invitesFromFriendsOnly', settings['invitesFromFriendsOnly'])
        g_settingsCore.applySetting('storeReceiverInBattle', settings['storeReceiverInBattle'])
        g_settingsCore.applySetting('disableBattleChat', settings['disableBattleChat'])
        gameplayKeys = filter(lambda item: item.startswith(self.GAMEPLAY_PREFIX), settings.keys())
        for key in gameplayKeys:
            g_settingsCore.applySetting(key, settings[key])

        qualitySettings = settings['quality']
        applyMethod = g_settingsCore.options.getApplyMethod(qualitySettings)
        for key in GraphicsPresets.GRAPHICS_QUALITY_SETTINGS:
            value = qualitySettings.get(key)
            if value is not None:
                g_settingsCore.applySetting(key, value)

        if applyMethod == APPLY_METHOD.RESTART:
            BigWorld.commitPendingGraphicsSettings()
            restartClient = True
        elif applyMethod == APPLY_METHOD.DELAYED:
            BigWorld.commitPendingGraphicsSettings()
        confirmators = g_settingsCore.applyStorages(restartClient)
        for confirmation, revert in confirmators:
            if confirmation is not None:
                if confirmation == 'graphicsChangeConfirmation':

                    def callback(isConfirmed):
                        if not isConfirmed:
                            g_settingsCore.isChangesConfirmed = False
                            revert()

                    self.graphicsChangeConfirmationRevert = revert
                    self.call('SettingsDialog.ApplySettings', [confirmation])

        g_postProcessing.refresh()
        if restartClient:
            BigWorld.savePreferences()
            if restartApproved:
                if g_replayCtrl.isPlaying and g_replayCtrl.playbackSpeed == 0:
                    g_replayCtrl.setPlaybackSpeedIdx(5)
                BigWorld.callback(0.3, self.__restartGame)
            elif g_settingsCore.isDeviseRecreated:
                g_settingsCore.isDeviseRecreated = False
            else:
                BigWorld.callback(0.0, partial(BigWorld.changeVideoMode, -1, BigWorld.isVideoWindowed()))
        return

    def __restartGame(self):
        BigWorld.savePreferences()
        BigWorld.restartGame()

    def onDialogClose(self, _):
        if self.__altVoiceSetting.isOptionEnabled():
            self.__altVoiceSetting.revert()
        if not g_sessionProvider.getCtx().isInBattle:
            SoundGroups.g_instance.enableVoiceSounds(False)
        elif hasattr(BigWorld.player(), 'vehicle') and BigWorld.player().vehicle:
            SoundGroups.g_instance.soundModes.setCurrentNation(nations.NAMES[BigWorld.player().vehicle.typeDescriptor.type.id[0]])
        g_settingsCore.clearStorages()
        self.__dialogIsVisibility = False
        if self.__settingsUI:
            self.__settingsUI.script = None
            self.__settingsUI = None
        return

    def graphicsChangeConfirmationStatus(self, callbackId, isConfirmed):
        if not isConfirmed and self.graphicsChangeConfirmationRevert is not None:
            self.graphicsChangeConfirmationRevert()
            self.graphicsChangeConfirmationRevert = None
        return
Esempio n. 5
0
class SettingsInterface(UIInterface):
    KEYBOARD_MAPPING_COMMANDS = {
        "movement": {
            "forward": "CMD_MOVE_FORWARD",
            "backward": "CMD_MOVE_BACKWARD",
            "left": "CMD_ROTATE_LEFT",
            "right": "CMD_ROTATE_RIGHT",
            "auto_rotation": "CMD_CM_VEHICLE_SWITCH_AUTOROTATION",
        },
        "cruis_control": {
            "forward": "CMD_INCREMENT_CRUISE_MODE",
            "backward": "CMD_DECREMENT_CRUISE_MODE",
            "stop_fire": "CMD_STOP_UNTIL_FIRE",
        },
        "firing": {
            "fire": "CMD_CM_SHOOT",
            "lock_target": "CMD_CM_LOCK_TARGET",
            "lock_target_off": "CMD_CM_LOCK_TARGET_OFF",
            "alternate_mode": "CMD_CM_ALTERNATE_MODE",
            "reloadPartialClip": "CMD_RELOAD_PARTIAL_CLIP",
        },
        "vehicle_other": {"showHUD": "CMD_TOGGLE_GUI", "showRadialMenu": "CMD_RADIAL_MENU_SHOW"},
        "equipment": {
            "item01": "CMD_AMMO_CHOICE_1",
            "item02": "CMD_AMMO_CHOICE_2",
            "item03": "CMD_AMMO_CHOICE_3",
            "item04": "CMD_AMMO_CHOICE_4",
            "item05": "CMD_AMMO_CHOICE_5",
            "item06": "CMD_AMMO_CHOICE_6",
            "item07": "CMD_AMMO_CHOICE_7",
            "item08": "CMD_AMMO_CHOICE_8",
        },
        "shortcuts": {
            "attack": "CMD_CHAT_SHORTCUT_ATTACK",
            "to_base": "CMD_CHAT_SHORTCUT_BACKTOBASE",
            "positive": "CMD_CHAT_SHORTCUT_POSITIVE",
            "negative": "CMD_CHAT_SHORTCUT_NEGATIVE",
            "help_me": "CMD_CHAT_SHORTCUT_HELPME",
            "reload": "CMD_CHAT_SHORTCUT_RELOAD",
        },
        "camera": {
            "camera_up": "CMD_CM_CAMERA_ROTATE_UP",
            "camera_down": "CMD_CM_CAMERA_ROTATE_DOWN",
            "camera_left": "CMD_CM_CAMERA_ROTATE_LEFT",
            "camera_right": "CMD_CM_CAMERA_ROTATE_RIGHT",
        },
        "voicechat": {"pushToTalk": "CMD_VOICECHAT_MUTE"},
        "logitech_keyboard": {"switch_view": "CMD_LOGITECH_SWITCH_VIEW"},
        "minimap": {
            "sizeUp": "CMD_MINIMAP_SIZE_UP",
            "sizeDown": "CMD_MINIMAP_SIZE_DOWN",
            "visible": "CMD_MINIMAP_VISIBLE",
        },
    }
    KEYBOARD_MAPPING_BLOCKS = {
        "movement": ("forward", "backward", "left", "right", "auto_rotation"),
        "cruis_control": ("forward", "backward", "stop_fire"),
        "firing": ("fire", "lock_target", "lock_target_off", "alternate_mode", "reloadPartialClip"),
        "vehicle_other": ("showHUD", "showRadialMenu"),
        "equipment": ("item01", "item02", "item03", "item04", "item05", "item06", "item07", "item08"),
        "shortcuts": ("attack", "to_base", "positive", "negative", "help_me", "reload"),
        "camera": ("camera_up", "camera_down", "camera_left", "camera_right"),
        "voicechat": ("pushToTalk",),
        "logitech_keyboard": ("switch_view",),
        "minimap": ("sizeUp", "sizeDown", "visible"),
    }
    KEYBOARD_MAPPING_BLOCKS_ORDER = (
        "movement",
        "cruis_control",
        "firing",
        "vehicle_other",
        "equipment",
        "shortcuts",
        "camera",
        "voicechat",
        "minimap",
        "logitech_keyboard",
    )
    POPULATE_UI = "SettingsDialog.PopulateUI"
    APPLY_SETTINGS = "SettingsDialog.ApplySettings"
    COMMIT_SETTINGS = "SettingsDialog.CommitSettings"
    SETTINGS_TAB_SELECTED = "SettingsDialog.onTabSelected"
    DELAY_SETTINGS = "SettingsDialog.DelaySettings"
    AUTODETECT_QUALITY = "SettingsDialog.AutodetectQuality"
    SET_DIALOG_VISIBILITY = "SettingsDialog.setVisibility"
    CURSOR_VALUES = {
        "mixing": 3,
        "gunTag": 15,
        "centralTag": 14,
        "net": 4,
        "reloader": 0,
        "condition": 0,
        "cassette": 0,
        "reloaderTimer": 0,
    }
    SNIPER_VALUES = {
        "snpMixing": 3,
        "snpGunTag": 6,
        "snpCentralTag": 14,
        "snpNet": 4,
        "snpReloader": 0,
        "snpCondition": 0,
        "snpCassette": 0,
        "snpReloaderTimer": 0,
    }
    MARKER_VALUES = {"Hp": 4, "Name": 3}
    MARKER_TYPES = ["Base", "Alt"]
    MOUSE_KEYS = {
        "ingame": {
            "arcadeSens": ("arcade", "sensitivity"),
            "sniperSens": ("sniper", "sensitivity"),
            "artSens": ("strategic", "sensitivity"),
            "horInvert": ("arcade", "horzInvert"),
            "vertInvert": ("arcade", "vertInvert"),
            "backDraftInvert": ("arcade", "backDraftInvert"),
        },
        "lobby": {
            "arcadeSens": ("arcadeMode/camera", "sensitivity", "float"),
            "sniperSens": ("sniperMode/camera", "sensitivity", "float"),
            "artSens": ("strategicMode/camera", "sensitivity", "float"),
            "horInvert": ("arcadeMode/camera", "horzInvert", "bool"),
            "vertInvert": ("arcadeMode/camera", "vertInvert", "bool"),
            "backDraftInvert": ("arcadeMode/camera", "backDraftInvert", "bool"),
        },
        "default": {
            "arcadeSens": 1,
            "sniperSens": 1,
            "artSens": 1,
            "horInvert": False,
            "vertInvert": False,
            "backDraftInvert": False,
        },
    }
    GAMEPLAY_KEY_FORMAT = "gameplay_{0:>s}"
    GAMEPLAY_PREFIX = "gameplay_"

    def __init__(self, enableRedefineKeysMode=True):
        UIInterface.__init__(self)
        if not GUI_SETTINGS.minimapSize and self.KEYBOARD_MAPPING_BLOCKS.has_key("minimap"):
            del self.KEYBOARD_MAPPING_BLOCKS["minimap"]
        self.__enableRedefineKeysMode = enableRedefineKeysMode
        self.graphicsPresets = GraphicsPresets()
        self.resolutions = g_graficsResolutions
        self.__currentSettings = None
        self.__settingsUI = None
        self.__altVoiceSetting = g_settingsCore.options.getSetting("alternativeVoices")
        self.graphicsChangeConfirmationRevert = None
        self.__dialogIsVisibility = False
        if not GUI_SETTINGS.voiceChat and self.KEYBOARD_MAPPING_COMMANDS.has_key("voicechat"):
            if self.KEYBOARD_MAPPING_COMMANDS.has_key("voicechat"):
                del self.KEYBOARD_MAPPING_COMMANDS["voicechat"]
            if self.KEYBOARD_MAPPING_BLOCKS.has_key("voicechat"):
                del self.KEYBOARD_MAPPING_BLOCKS["voicechat"]
            self.KEYBOARD_MAPPING_BLOCKS_ORDER = list(self.KEYBOARD_MAPPING_BLOCKS_ORDER)
            del self.KEYBOARD_MAPPING_BLOCKS_ORDER[self.KEYBOARD_MAPPING_BLOCKS_ORDER.index("voicechat")]
            self.KEYBOARD_MAPPING_BLOCKS_ORDER = tuple(self.KEYBOARD_MAPPING_BLOCKS_ORDER)
        return

    def populateUI(self, proxy):
        UIInterface.populateUI(self, proxy)
        self.uiHolder.addExternalCallbacks(
            {
                SettingsInterface.POPULATE_UI: self.onPopulateUI,
                SettingsInterface.APPLY_SETTINGS: self.onApplySettings,
                SettingsInterface.COMMIT_SETTINGS: self.onCommitSettings,
                SettingsInterface.SETTINGS_TAB_SELECTED: self.onTabSelected,
                SettingsInterface.DELAY_SETTINGS: self.onDelaySettings,
                SettingsInterface.AUTODETECT_QUALITY: self.onAutodetectSettings,
                SettingsInterface.SET_DIALOG_VISIBILITY: self.onSetVisibility,
                "SettingsDialog.useRedifineKeysMode": self.onUseRedifineKeyMode,
                "SettingsDialog.processVivoxTest": self.onProcessVivoxTest,
                "SettingsDialog.voiceChatEnable": self.onVoiceChatEnable,
                "SettingsDialog.updateCaptureDevices": self.onUpdateCaptureDevices,
                "SettingsDialog.setVivoxMicVolume": self.onSetVivoxMicVolume,
                "SettingsDialog.killDialog": self.onDialogClose,
                "SettingsDialog.graphicsChangeConfirmationStatus": self.graphicsChangeConfirmationStatus,
            }
        )
        VibroManager.g_instance.onConnect += self.__vm_onConnect
        VibroManager.g_instance.onDisconnect += self.__vm_onDisconnect
        g_guiResetters.add(self.onRecreateDevice)
        BigWorld.wg_setAdapterOrdinalNotifyCallback(self.onRecreateDevice)

    def dispossessUI(self):
        if self.__settingsUI:
            self.__settingsUI.script = None
            self.__settingsUI = None
        self.__altVoiceSetting = None
        self.uiHolder.removeExternalCallbacks(
            SettingsInterface.POPULATE_UI,
            SettingsInterface.APPLY_SETTINGS,
            SettingsInterface.COMMIT_SETTINGS,
            SettingsInterface.SETTINGS_TAB_SELECTED,
            SettingsInterface.DELAY_SETTINGS,
            SettingsInterface.AUTODETECT_QUALITY,
            SettingsInterface.SET_DIALOG_VISIBILITY,
            "SettingsDialog.useRedifineKeysMode",
            "SettingsDialog.processVivoxTest",
            "SettingsDialog.voiceChatEnable",
            "SettingsDialog.updateCaptureDevices",
            "SettingsDialog.setVivoxMicVolume",
            "SettingsDialog.killDialog",
        )
        VibroManager.g_instance.onConnect -= self.__vm_onConnect
        VibroManager.g_instance.onDisconnect -= self.__vm_onDisconnect
        g_guiResetters.discard(self.onRecreateDevice)
        BigWorld.wg_setAdapterOrdinalNotifyCallback(None)
        UIInterface.dispossessUI(self)
        return

    def altVoicesPreview(self, soundMode):
        if not self.__altVoiceSetting.isOptionEnabled():
            return True
        if not g_sessionProvider.getCtx().isInBattle:
            SoundGroups.g_instance.enableVoiceSounds(True)
        self.__altVoiceSetting.preview(soundMode)
        return self.__altVoiceSetting.playPreviewSound(self.uiHolder.soundManager)

    def isSoundModeValid(self, soundMode):
        self.__altVoiceSetting.preview(soundMode)
        valid = self.__altVoiceSetting.isSoundModeValid()
        self.__altVoiceSetting.revert()
        return valid

    def onSetVivoxMicVolume(self, callbackId, value):
        import VOIP

        if round(SoundGroups.g_instance.getVolume("micVivox") * 100) != value:
            SoundGroups.g_instance.setVolume("micVivox", value / 100)
            VOIP.getVOIPManager().setMicrophoneVolume(int(value))

    def onVoiceChatEnable(self, callbackId, isEnable):
        self.__voiceChatEnable(isEnable)

    def __voiceChatEnable(self, isEnable):
        if BattleReplay.isPlaying():
            return
        elif isEnable is None:
            return
        else:
            g_settingsCore.applySetting("enableVoIP", isEnable)
            return

    def onUseRedifineKeyMode(self, callbackId, isUse):
        if self.__enableRedefineKeysMode:
            BigWorld.wg_setRedefineKeysMode(isUse)

    def onProcessVivoxTest(self, callbackId, isStart):
        LOG_DEBUG("Vivox test: %s" % str(isStart))
        import VOIP

        rh = VOIP.getVOIPManager()
        rh.enterTestChannel() if isStart else rh.leaveTestChannel()
        self.respond([callbackId, False])

    def __vm_onConnect(self):
        self.call("SettingsDialog.VibroManager.Connect")

    def __vm_onDisconnect(self):
        self.call("SettingsDialog.VibroManager.Disconnect")

    def __getVideoSettings(self):
        settings = {}
        settings["monitor"] = {
            "current": self.resolutions.monitorIndex,
            "real": self.resolutions.realMonitorIndex,
            "options": self.resolutions.monitorsList,
        }
        settings["fullScreen"] = g_settingsCore.getSetting("fullScreen")
        settings["windowSize"] = {
            "current": g_settingsCore.getSetting("windowSize"),
            "options": g_settingsCore.options.getSetting("windowSize").getOptions(),
        }
        settings["resolution"] = {
            "current": g_settingsCore.getSetting("resolution"),
            "options": g_settingsCore.options.getSetting("resolution").getOptions(),
        }
        settings["refreshRate"] = {
            "current": g_settingsCore.getSetting("refreshRate"),
            "options": g_settingsCore.options.getSetting("refreshRate").getOptions(),
        }
        settings["interfaceScale"] = {
            "current": g_settingsCore.getSetting("interfaceScale"),
            "options": g_settingsCore.options.getSetting("interfaceScale").getOptions(),
        }
        return settings

    def __getSettings(self):
        settings = [self.graphicsPresets.getGraphicsPresetsData()]
        import VOIP

        rh = VOIP.getVOIPManager()
        g_windowsStoredData.start()
        vManager = VibroManager.g_instance
        vEffGroups = vManager.getGroupsSettings()
        vEffDefGroup = VibroManager.VibroManager.GroupSettings()
        vEffDefGroup.enabled = False
        vEffDefGroup.gain = 0
        markers = {
            "enemy": g_settingsCore.getSetting("enemy"),
            "dead": g_settingsCore.getSetting("dead"),
            "ally": g_settingsCore.getSetting("ally"),
        }
        datetimeIdx = (
            g_settingsCore.getSetting("showDateMessage") << 0 | g_settingsCore.getSetting("showTimeMessage") << 1
        )
        config = {
            "locale": getClientOverride(),
            "aspectRatio": {"current": self.resolutions.aspectRatioIndex, "options": self.resolutions.aspectRatiosList},
            "vertSync": self.resolutions.isVideoVSync,
            "tripleBuffered": self.resolutions.isTripleBuffered,
            "multisampling": {
                "current": self.resolutions.multisamplingTypeIndex,
                "options": self.resolutions.multisamplingTypesList,
            },
            "customAA": {"current": self.resolutions.customAAModeIndex, "options": self.resolutions.customAAModesList},
            "gamma": self.resolutions.gamma,
            "masterVolume": round(SoundGroups.g_instance.getMasterVolume() * 100),
            "musicVolume": round(SoundGroups.g_instance.getVolume("music") * 100),
            "voiceVolume": round(SoundGroups.g_instance.getVolume("voice") * 100),
            "vehiclesVolume": round(SoundGroups.g_instance.getVolume("vehicles") * 100),
            "effectsVolume": round(SoundGroups.g_instance.getVolume("effects") * 100),
            "guiVolume": round(SoundGroups.g_instance.getVolume("gui") * 100),
            "ambientVolume": round(SoundGroups.g_instance.getVolume("ambient") * 100),
            "masterVivoxVolume": round(SoundGroups.g_instance.getVolume("masterVivox") * 100),
            "micVivoxVolume": round(SoundGroups.g_instance.getVolume("micVivox") * 100),
            "masterFadeVivoxVolume": round(SoundGroups.g_instance.getVolume("masterFadeVivox") * 100),
            "captureDevice": g_settingsCore.options.getSetting(SOUND.CAPTURE_DEVICES).pack(),
            "voiceChatNotSupported": not g_settingsCore.getSetting(SOUND.VOIP_SUPPORTED),
            "datetimeIdx": datetimeIdx,
            "enableOlFilter": g_settingsCore.getSetting("enableOlFilter"),
            "enableSpamFilter": g_settingsCore.getSetting("enableSpamFilter"),
            "receiveFriendshipRequest": g_settingsCore.getSetting("receiveFriendshipRequest"),
            "receiveInvitesInBattle": g_settingsCore.getSetting("receiveInvitesInBattle"),
            "invitesFromFriendsOnly": g_settingsCore.getSetting("invitesFromFriendsOnly"),
            "storeReceiverInBattle": g_settingsCore.getSetting("storeReceiverInBattle"),
            "disableBattleChat": g_settingsCore.getSetting("disableBattleChat"),
            "chatContactsListOnly": g_settingsCore.getSetting("chatContactsListOnly"),
            "receiveClanInvitesNotifications": g_settingsCore.getSetting("receiveClanInvitesNotifications"),
            "dynamicCamera": g_settingsCore.getSetting("dynamicCamera"),
            "horStabilizationSnp": g_settingsCore.getSetting("horStabilizationSnp"),
            "enableVoIP": g_settingsCore.getSetting("enableVoIP"),
            "enablePostMortemEffect": g_settingsCore.getSetting("enablePostMortemEffect"),
            "enablePostMortemDelay": g_settingsCore.getSetting("enablePostMortemDelay"),
            "nationalVoices": g_settingsCore.getSetting("nationalVoices"),
            "isColorBlind": g_settingsCore.getSetting("isColorBlind"),
            "graphicsQualityHDSD": g_settingsCore.getSetting("graphicsQualityHDSD"),
            "useServerAim": g_settingsCore.getSetting("useServerAim"),
            "showVehiclesCounter": g_settingsCore.getSetting("showVehiclesCounter"),
            "showMarksOnGun": g_settingsCore.getSetting("showMarksOnGun"),
            "showBattleEfficiencyRibbons": g_settingsCore.getSetting("showBattleEfficiencyRibbons"),
            "minimapAlpha": g_settingsCore.getSetting("minimapAlpha"),
            "showVectorOnMap": g_settingsCore.getSetting("showVectorOnMap"),
            "showSectorOnMap": g_settingsCore.getSetting("showSectorOnMap"),
            "showVehModelsOnMap": g_settingsCore.options.getSetting("showVehModelsOnMap").pack(),
            "vibroIsConnected": vManager.connect(),
            "vibroGain": vManager.getGain() * 100,
            "vibroEngine": vEffGroups.get("engine", vEffDefGroup).gain * 100,
            "vibroAcceleration": vEffGroups.get("acceleration", vEffDefGroup).gain * 100,
            "vibroShots": vEffGroups.get("shots", vEffDefGroup).gain * 100,
            "vibroHits": vEffGroups.get("hits", vEffDefGroup).gain * 100,
            "vibroCollisions": vEffGroups.get("collisions", vEffDefGroup).gain * 100,
            "vibroDamage": vEffGroups.get("damage", vEffDefGroup).gain * 100,
            "vibroGUI": vEffGroups.get("gui", vEffDefGroup).gain * 100,
            "ppShowLevels": g_settingsCore.getSetting("ppShowLevels"),
            "ppShowTypes": g_settingsCore.getSetting("ppShowTypes"),
            "replayEnabled": g_settingsCore.options.getSetting("replayEnabled").pack(),
            "fpsPerfomancer": g_settingsCore.getSetting("fpsPerfomancer"),
            "dynamicRenderer": g_settingsCore.getSetting("dynamicRenderer"),
            "colorFilterIntensity": g_settingsCore.getSetting("colorFilterIntensity"),
            "colorFilterImages": g_settingsCore.getSetting("colorFilterImages"),
            "fov": g_settingsCore.getSetting("fov"),
            "dynamicFov": g_settingsCore.getSetting("dynamicFov"),
            "enableOpticalSnpEffect": g_settingsCore.getSetting("enableOpticalSnpEffect"),
            "arcade": {
                "values": g_settingsCore.options.getSetting("arcade").toAccountSettings(),
                "options": SettingsInterface.CURSOR_VALUES,
            },
            "sniper": {
                "values": g_settingsCore.options.getSetting("sniper").toAccountSettings(),
                "options": SettingsInterface.SNIPER_VALUES,
            },
            "markers": {
                "values": markers,
                "options": SettingsInterface.MARKER_VALUES,
                "types": SettingsInterface.MARKER_TYPES,
            },
        }
        if self.__altVoiceSetting.isOptionEnabled():
            altVoices = []
            for idx, desc in enumerate(self.__altVoiceSetting.getOptions()):
                altVoices.append({"data": idx, "label": desc})

            config["alternativeVoices"] = {"current": self.__altVoiceSetting.get(), "options": altVoices}
        for name in ("ctf", "domination", "assault", "nations"):
            key = self.GAMEPLAY_KEY_FORMAT.format(name)
            config[key] = g_settingsCore.getSetting(key)

        settings.append(config)
        if not LogitechMonitor.isPresentColor():
            if self.KEYBOARD_MAPPING_BLOCKS.has_key("logitech_keyboard"):
                del self.KEYBOARD_MAPPING_BLOCKS["logitech_keyboard"]
        else:
            self.KEYBOARD_MAPPING_BLOCKS["logitech_keyboard"] = ("switch_view",)
        cmdMap = CommandMapping.g_instance
        defaults = cmdMap.getDefaults()
        keyboard = []
        for group_name in self.KEYBOARD_MAPPING_BLOCKS_ORDER:
            if group_name in self.KEYBOARD_MAPPING_BLOCKS.keys():
                group = {"id": group_name, "commands": []}
                keyboard.append(group)
                for key_setting in self.KEYBOARD_MAPPING_BLOCKS[group_name]:
                    command = cmdMap.getCommand(self.KEYBOARD_MAPPING_COMMANDS[group_name][key_setting])
                    keyCode = cmdMap.get(self.KEYBOARD_MAPPING_COMMANDS[group_name][key_setting])
                    defaultCode = defaults[command] if defaults.has_key(command) else 0
                    key = {
                        "id": key_setting,
                        "command": command,
                        "key": getScaleformKey(keyCode),
                        "keyDefault": getScaleformKey(defaultCode),
                    }
                    group["commands"].append(key)

        settings.append(keyboard)
        mouse = {}
        player = BigWorld.player()
        if hasattr(player.inputHandler, "ctrls"):
            for key, path in SettingsInterface.MOUSE_KEYS["ingame"].items():
                if key == "horInvert":
                    value = g_settingsCore.getSetting("mouseHorzInvert")
                elif key == "vertInvert":
                    value = g_settingsCore.getSetting("mouseVertInvert")
                elif key == "backDraftInvert":
                    value = g_settingsCore.getSetting("backDraftInvert")
                else:
                    value = player.inputHandler.ctrls[path[0]].camera.getUserConfigValue(path[1])
                mouse[key] = {"defaultValue": SettingsInterface.MOUSE_KEYS["default"][key], "value": value}

        else:
            ds = Settings.g_instance.userPrefs[Settings.KEY_CONTROL_MODE]
            for key, path in SettingsInterface.MOUSE_KEYS["lobby"].items():
                default = SettingsInterface.MOUSE_KEYS["default"][key]
                value = default
                if key == "horInvert":
                    value = g_settingsCore.getSetting("mouseHorzInvert")
                elif key == "vertInvert":
                    value = g_settingsCore.getSetting("mouseVertInvert")
                elif key == "backDraftInvert":
                    value = g_settingsCore.getSetting("backDraftInvert")
                elif ds is not None:
                    if path[2] == "float":
                        value = ds[path[0]].readFloat(path[1], default)
                    elif path[2] == "bool":
                        value = ds[path[0]].readBool(path[1], default)
                    else:
                        LOG_DEBUG("Unknown mouse settings type %s %s" % (key, path))
                mouse[key] = {"defaultValue": default, "value": value}

        settings.append(mouse)
        g_windowsStoredData.stop()
        return settings

    def onUpdateCaptureDevices(self, callbackId):
        self.__updateCaptureDevices()

    @process
    def __updateCaptureDevices(self):
        Waiting.show("__updateCaptureDevices")
        yield VoiceChatInterface.g_instance.requestCaptureDevices()
        opt = g_settingsCore.options.getSetting(SOUND.CAPTURE_DEVICES)
        Waiting.hide("__updateCaptureDevices")
        self.call("SettingsDialog.updateCaptureDevices", [opt.get()] + opt.getOptions())

    def onRecreateDevice(self):
        if self.__settingsUI and self.__dialogIsVisibility:
            if self.__currentSettings and self.__currentSettings != self.__getVideoSettings():
                self.__currentSettings = self.__getVideoSettings()
                self.__settingsUI.buildGraphicsData(self.__getVideoSettings())

    def onSetVisibility(self, callbackID, isVisibility):
        self.__dialogIsVisibility = isVisibility

    def onAutodetectSettings(self, callbackID):
        presetIndex = BigWorld.autoDetectGraphicsSettings()
        self.call("SettingsDialog.setPreset", [presetIndex])

    def onPopulateUI(self, *args):
        self.graphicsPresets.checkCurrentPreset(True)
        self.__currentSettings = self.__getVideoSettings()
        if self.__settingsUI:
            self.__settingsUI.script = None
            self.__settingsUI = None
        settingsDialogName = args[1]
        self.__settingsUI = self.uiHolder.getMember(settingsDialogName)
        if self.__settingsUI and self.__dialogIsVisibility:
            settings = self.__getSettings()
            self.__settingsUI.buildData(settings[0], settings[1], settings[2], settings[3])
            self.__settingsUI.buildGraphicsData(self.__getVideoSettings())
            self.__settingsUI.script = self
        else:
            LOG_ERROR("settingsDialog is not found in flash by name {0}".format(settingsDialogName))
        return

    def onApplySettings(self, callbackId, settings):
        monitorIndex, presetIndex, settingsList, fullscreen = settings
        if (not self.resolutions.isVideoWindowed or fullscreen) and (
            monitorIndex != self.resolutions.realMonitorIndex or self.resolutions.monitorChanged
        ):
            self.call("SettingsDialog.ApplySettings", ["restartNeeded"])
            return
        applyMethod = g_settingsCore.options.getApplyMethod(settingsList)
        method = "apply"
        if applyMethod == APPLY_METHOD.RESTART:
            method = "restartNeeded"
        elif applyMethod == APPLY_METHOD.DELAYED:
            method = "hasPendingSettings"
        self.call("SettingsDialog.ApplySettings", [method])

    def onDelaySettings(self, *args):
        g_settingsCore.options.revert()

    def onCommitSettings(self, *args):
        self.apply(True, *args)

    def onTabSelected(self, cbID, tabId):
        if tabId == SETTINGS.SOUNDTITLE:
            VoiceChatInterface.g_instance.processFailedMessage()

    def apply(self, restartApproved, callbackId, settings):
        restartClient = False
        interfaceScaled = False
        g_settingsCore.isDeviseRecreated = False
        import VOIP

        if (not self.resolutions.isVideoWindowed or settings["fullScreen"]) and (
            settings["monitor"] != self.resolutions.realMonitorIndex or self.resolutions.monitorChanged
        ):
            restartClient = True
        if g_settingsCore.getSetting("interfaceScale") != settings["interfaceScale"]:
            interfaceScaled = True
        g_settingsCore.applySetting("ppShowTypes", settings["ppShowTypes"])
        g_settingsCore.applySetting("ppShowLevels", settings["ppShowLevels"])
        g_settingsCore.applySetting("replayEnabled", settings["replayEnabled"])
        g_settingsCore.applySetting("fpsPerfomancer", settings["fpsPerfomancer"])
        g_settingsCore.applySetting("colorFilterIntensity", settings["colorFilterIntensity"])
        g_settingsCore.applySetting("fov", settings["fov"])
        g_settingsCore.applySetting("dynamicFov", settings["dynamicFov"])
        g_settingsCore.applySetting("enableOpticalSnpEffect", settings["enableOpticalSnpEffect"])
        g_settingsCore.applySetting("nationalVoices", settings["nationalVoices"])
        g_settingsCore.applySetting("isColorBlind", settings["isColorBlind"])
        g_settingsCore.applySetting("useServerAim", settings["useServerAim"])
        g_settingsCore.applySetting("showVehiclesCounter", settings["showVehiclesCounter"])
        g_settingsCore.applySetting("showMarksOnGun", settings["showMarksOnGun"])
        g_settingsCore.applySetting("minimapAlpha", settings["minimapAlpha"])
        g_settingsCore.applySetting("showVectorOnMap", settings["showVectorOnMap"])
        g_settingsCore.applySetting("showSectorOnMap", settings["showSectorOnMap"])
        g_settingsCore.applySetting("showVehModelsOnMap", settings["showVehModelsOnMap"])
        arcade = g_settingsCore.options.getSetting("arcade").fromAccountSettings(settings["arcade"])
        sniper = g_settingsCore.options.getSetting("sniper").fromAccountSettings(settings["sniper"])
        g_settingsCore.applySetting("arcade", arcade)
        g_settingsCore.applySetting("sniper", sniper)
        g_settingsCore.applySetting("enemy", settings["markers"]["enemy"])
        g_settingsCore.applySetting("dead", settings["markers"]["dead"])
        g_settingsCore.applySetting("ally", settings["markers"]["ally"])
        g_settingsCore.applySetting("interfaceScale", settings["interfaceScale"])
        if "showBattleEfficiencyRibbons" in settings:
            g_settingsCore.applySetting("showBattleEfficiencyRibbons", settings["showBattleEfficiencyRibbons"])
        g_settingsCore.applySetting("dynamicCamera", settings["dynamicCamera"])
        g_settingsCore.applySetting("horStabilizationSnp", settings["horStabilizationSnp"])
        if self.__altVoiceSetting.isOptionEnabled():
            altVoices = settings.get("alternativeVoices")
            if altVoices is not None:
                self.__altVoiceSetting.apply(altVoices)
        vManager = VibroManager.g_instance
        vManager.setGain(settings["vibroGain"] / 100.0)
        vEffGroups = vManager.getGroupsSettings()
        for groupName, newValue in [
            ("engine", settings["vibroEngine"]),
            ("acceleration", settings["vibroAcceleration"]),
            ("shots", settings["vibroShots"]),
            ("hits", settings["vibroHits"]),
            ("collisions", settings["vibroCollisions"]),
            ("damage", settings["vibroDamage"]),
            ("gui", settings["vibroGUI"]),
        ]:
            if groupName in vEffGroups:
                vEffGroups[groupName].gain = newValue / 100.0
                vEffGroups[groupName].enabled = newValue > 0

        vManager.setGroupsSettings(vEffGroups)
        self.__voiceChatEnable(settings["enableVoIP"])
        g_settingsCore.applySetting(SOUND.CAPTURE_DEVICES, settings[Settings.KEY_VOIP_DEVICE])
        g_settingsCore.applySetting("enablePostMortemEffect", settings["enablePostMortemEffect"])
        g_settingsCore.applySetting("enablePostMortemDelay", settings["enablePostMortemDelay"])
        self.uiHolder.clearCommands()
        keyboard = settings["controls"]["keyboard"]
        keyboardMapping = {}
        keysLayout = dict(g_settingsCore.options.getSetting("keyboard").KEYS_LAYOUT)
        layout = list(itertools.chain(*keysLayout.values()))
        for i in xrange(len(self.KEYBOARD_MAPPING_BLOCKS)):
            group_name = keyboard[i]["id"]
            for j in xrange(len(self.KEYBOARD_MAPPING_BLOCKS[group_name])):
                key_name = keyboard[i]["commands"][j]["id"]
                value = keyboard[i]["commands"][j]["key"]
                cmd = self.KEYBOARD_MAPPING_COMMANDS[group_name][key_name]
                for item in layout:
                    key, command = item[0], item[1]
                    if command == cmd:
                        keyboardMapping[key] = value
                        break

        g_settingsCore.applySetting("keyboard", keyboardMapping)
        self.uiHolder.bindCommands()
        player = BigWorld.player()
        mouse = settings["controls"]["mouse"]
        if hasattr(player.inputHandler, "ctrls"):
            player.inputHandler.ctrls["arcade"].camera.setUserConfigValue("sensitivity", mouse["arcadeSens"]["value"])
            player.inputHandler.ctrls["sniper"].camera.setUserConfigValue("sensitivity", mouse["sniperSens"]["value"])
            player.inputHandler.ctrls["strategic"].camera.setUserConfigValue("sensitivity", mouse["artSens"]["value"])
        else:
            ds = Settings.g_instance.userPrefs[Settings.KEY_CONTROL_MODE]
            if ds:
                ds["arcadeMode/camera"].writeFloat("sensitivity", mouse["arcadeSens"]["value"])
                ds["sniperMode/camera"].writeFloat("sensitivity", mouse["sniperSens"]["value"])
                ds["strategicMode/camera"].writeFloat("sensitivity", mouse["artSens"]["value"])
        g_settingsCore.applySetting("mouseHorzInvert", bool(mouse["horInvert"]["value"]))
        g_settingsCore.applySetting("mouseVertInvert", bool(mouse["vertInvert"]["value"]))
        g_settingsCore.applySetting("backDraftInvert", bool(mouse["backDraftInvert"]["value"]))
        g_settingsCore.applySetting("monitor", settings["monitor"])
        isFullScreen = bool(settings["fullScreen"])
        if isFullScreen:
            g_settingsCore.applySetting("refreshRate", settings["refreshRate"])
            g_settingsCore.applySetting("resolution", settings["resolution"])
            g_settingsCore.applySetting("aspectRatio", settings["aspectRatio"])
            g_settingsCore.applySetting("gamma", settings["gamma"])
        else:
            g_settingsCore.applySetting("windowSize", settings["windowSize"])
        g_settingsCore.applySetting("fullScreen", isFullScreen)
        g_settingsCore.applySetting("multisampling", settings["multisampling"])
        g_settingsCore.applySetting("customAA", settings["customAA"])
        g_settingsCore.applySetting("vertSync", settings["vertSync"])
        g_settingsCore.applySetting("tripleBuffered", settings["tripleBuffered"])
        if round(SoundGroups.g_instance.getVolume("masterVivox") * 100) != settings["masterVivoxVolume"]:
            VOIP.getVOIPManager().setMasterVolume(settings["masterVivoxVolume"])
        if round(SoundGroups.g_instance.getVolume("micVivox") * 100) != settings["micVivoxVolume"]:
            VOIP.getVOIPManager().setMicrophoneVolume(settings["micVivoxVolume"])
        SoundGroups.g_instance.setMasterVolume(float(settings["masterVolume"]) / 100)
        SoundGroups.g_instance.setVolume("music", float(settings["musicVolume"]) / 100)
        SoundGroups.g_instance.setVolume("voice", float(settings["voiceVolume"]) / 100)
        SoundGroups.g_instance.setVolume("vehicles", float(settings["vehiclesVolume"]) / 100)
        SoundGroups.g_instance.setVolume("effects", float(settings["effectsVolume"]) / 100)
        SoundGroups.g_instance.setVolume("gui", float(settings["guiVolume"]) / 100)
        SoundGroups.g_instance.setVolume("ambient", float(settings["ambientVolume"]) / 100)
        SoundGroups.g_instance.setVolume("masterVivox", float(settings["masterVivoxVolume"]) / 100)
        SoundGroups.g_instance.setVolume("micVivox", float(settings["micVivoxVolume"]) / 100)
        SoundGroups.g_instance.setVolume("masterFadeVivox", float(settings["masterFadeVivoxVolume"]) / 100)
        g_settingsCore.applySetting("showDateMessage", settings["datetimeIdx"] & 1)
        g_settingsCore.applySetting("showTimeMessage", settings["datetimeIdx"] & 2)
        g_settingsCore.applySetting("enableOlFilter", settings["enableOlFilter"])
        g_settingsCore.applySetting("enableSpamFilter", settings["enableSpamFilter"])
        g_windowsStoredData.start()
        g_settingsCore.applySetting("receiveFriendshipRequest", settings["receiveFriendshipRequest"])
        g_settingsCore.applySetting("receiveInvitesInBattle", settings.get("receiveInvitesInBattle"))
        g_windowsStoredData.stop()
        g_settingsCore.applySetting("invitesFromFriendsOnly", settings["invitesFromFriendsOnly"])
        g_settingsCore.applySetting("storeReceiverInBattle", settings["storeReceiverInBattle"])
        g_settingsCore.applySetting("disableBattleChat", settings["disableBattleChat"])
        g_settingsCore.applySetting("chatContactsListOnly", settings["chatContactsListOnly"])
        gameplayKeys = filter(lambda item: item.startswith(self.GAMEPLAY_PREFIX), settings.keys())
        for key in gameplayKeys:
            g_settingsCore.applySetting(key, settings[key])

        qualitySettings = settings["quality"]
        applyMethod = g_settingsCore.options.getApplyMethod(qualitySettings)
        for key in GraphicsPresets.GRAPHICS_QUALITY_SETTINGS:
            value = qualitySettings.get(key)
            if value is not None:
                g_settingsCore.applySetting(key, value)

        g_settingsCore.applySetting("dynamicRenderer", settings["dynamicRenderer"])
        if applyMethod == APPLY_METHOD.RESTART:
            BigWorld.commitPendingGraphicsSettings()
            restartClient = True
        elif applyMethod == APPLY_METHOD.DELAYED:
            BigWorld.commitPendingGraphicsSettings()
        confirmators = g_settingsCore.applyStorages(restartClient)
        for confirmation, revert in confirmators:
            if confirmation is not None:
                if confirmation == "graphicsChangeConfirmation":

                    def callback(isConfirmed):
                        if not isConfirmed:
                            g_settingsCore.isChangesConfirmed = False
                            revert()

                    self.graphicsChangeConfirmationRevert = revert
                    self.call("SettingsDialog.ApplySettings", [confirmation])

        g_postProcessing.refresh()
        if restartClient:
            BigWorld.savePreferences()
            if restartApproved:
                from BattleReplay import g_replayCtrl

                if g_replayCtrl.isPlaying and g_replayCtrl.playbackSpeed == 0:
                    g_replayCtrl.setPlaybackSpeedIdx(5)
                BigWorld.callback(0.3, self.__restartGame)
            elif g_settingsCore.isDeviseRecreated:
                g_settingsCore.isDeviseRecreated = False
            else:
                BigWorld.callback(0.0, partial(BigWorld.changeVideoMode, -1, BigWorld.isVideoWindowed()))
        if interfaceScaled:
            self.__settingsUI.buildGraphicsData(self.__getVideoSettings())
        return

    def __restartGame(self):
        BigWorld.savePreferences()
        BigWorld.restartGame()

    def onDialogClose(self, _):
        if self.__altVoiceSetting.isOptionEnabled():
            self.__altVoiceSetting.revert()
        if not g_sessionProvider.getCtx().isInBattle:
            SoundGroups.g_instance.enableVoiceSounds(False)
        elif hasattr(BigWorld.player(), "vehicle") and BigWorld.player().vehicle:
            SoundGroups.g_instance.soundModes.setCurrentNation(
                nations.NAMES[BigWorld.player().vehicle.typeDescriptor.type.id[0]]
            )
        g_settingsCore.clearStorages()
        self.__dialogIsVisibility = False
        if self.__settingsUI:
            self.__settingsUI.script = None
            self.__settingsUI = None
        return

    def graphicsChangeConfirmationStatus(self, callbackId, isConfirmed):
        if not isConfirmed and self.graphicsChangeConfirmationRevert is not None:
            self.graphicsChangeConfirmationRevert()
            self.graphicsChangeConfirmationRevert = None
        return
class SettingsInterface(UIInterface):
    KEYBOARD_MAPPING_COMMANDS = {
        'movement': {
            'forward': 'CMD_MOVE_FORWARD',
            'backward': 'CMD_MOVE_BACKWARD',
            'left': 'CMD_ROTATE_LEFT',
            'right': 'CMD_ROTATE_RIGHT',
            'auto_rotation': 'CMD_CM_VEHICLE_SWITCH_AUTOROTATION',
            'block_tracks': 'CMD_BLOCK_TRACKS'
        },
        'cruis_control': {
            'forward': 'CMD_INCREMENT_CRUISE_MODE',
            'backward': 'CMD_DECREMENT_CRUISE_MODE',
            'stop_fire': 'CMD_STOP_UNTIL_FIRE'
        },
        'firing': {
            'fire': 'CMD_CM_SHOOT',
            'lock_target': 'CMD_CM_LOCK_TARGET',
            'lock_target_off': 'CMD_CM_LOCK_TARGET_OFF',
            'alternate_mode': 'CMD_CM_ALTERNATE_MODE',
            'reloadPartialClip': 'CMD_RELOAD_PARTIAL_CLIP'
        },
        'vehicle_other': {
            'showHUD': 'CMD_TOGGLE_GUI',
            'showRadialMenu': 'CMD_RADIAL_MENU_SHOW'
        },
        'equipment': {
            'item01': 'CMD_AMMO_CHOICE_1',
            'item02': 'CMD_AMMO_CHOICE_2',
            'item03': 'CMD_AMMO_CHOICE_3',
            'item04': 'CMD_AMMO_CHOICE_4',
            'item05': 'CMD_AMMO_CHOICE_5',
            'item06': 'CMD_AMMO_CHOICE_6',
            'item07': 'CMD_AMMO_CHOICE_7',
            'item08': 'CMD_AMMO_CHOICE_8'
        },
        'shortcuts': {
            'attack': 'CMD_CHAT_SHORTCUT_ATTACK',
            'to_base': 'CMD_CHAT_SHORTCUT_BACKTOBASE',
            'positive': 'CMD_CHAT_SHORTCUT_POSITIVE',
            'negative': 'CMD_CHAT_SHORTCUT_NEGATIVE',
            'help_me': 'CMD_CHAT_SHORTCUT_HELPME',
            'reload': 'CMD_CHAT_SHORTCUT_RELOAD'
        },
        'camera': {
            'camera_up': 'CMD_CM_CAMERA_ROTATE_UP',
            'camera_down': 'CMD_CM_CAMERA_ROTATE_DOWN',
            'camera_left': 'CMD_CM_CAMERA_ROTATE_LEFT',
            'camera_right': 'CMD_CM_CAMERA_ROTATE_RIGHT'
        },
        'voicechat': {
            'pushToTalk': 'CMD_VOICECHAT_MUTE',
            'voicechat_enable': 'CMD_VOICECHAT_ENABLE'
        },
        'logitech_keyboard': {
            'switch_view': 'CMD_LOGITECH_SWITCH_VIEW'
        },
        'minimap': {
            'sizeUp': 'CMD_MINIMAP_SIZE_UP',
            'sizeDown': 'CMD_MINIMAP_SIZE_DOWN',
            'visible': 'CMD_MINIMAP_VISIBLE'
        }
    }
    KEYBOARD_MAPPING_BLOCKS = {
        'movement': ('forward', 'backward', 'left', 'right', 'auto_rotation',
                     'block_tracks'),
        'cruis_control': ('forward', 'backward', 'stop_fire'),
        'firing': ('fire', 'lock_target', 'lock_target_off', 'alternate_mode',
                   'reloadPartialClip'),
        'vehicle_other': ('showHUD', 'showRadialMenu'),
        'equipment': ('item01', 'item02', 'item03', 'item04', 'item05',
                      'item06', 'item07', 'item08'),
        'shortcuts':
        ('attack', 'to_base', 'positive', 'negative', 'help_me', 'reload'),
        'camera': ('camera_up', 'camera_down', 'camera_left', 'camera_right'),
        'voicechat': ('pushToTalk', 'voicechat_enable'),
        'logitech_keyboard': ('switch_view', ),
        'minimap': ('sizeUp', 'sizeDown', 'visible')
    }
    KEYBOARD_MAPPING_BLOCKS_ORDER = ('movement', 'cruis_control', 'firing',
                                     'vehicle_other', 'equipment', 'shortcuts',
                                     'camera', 'voicechat',
                                     'logitech_keyboard', 'minimap')
    POPULATE_UI = 'SettingsDialog.PopulateUI'
    APPLY_SETTINGS = 'SettingsDialog.ApplySettings'
    COMMIT_SETTINGS = 'SettingsDialog.CommitSettings'
    SETTINGS_TAB_SELECTED = 'SettingsDialog.onTabSelected'
    DELAY_SETTINGS = 'SettingsDialog.DelaySettings'
    AUTODETECT_QUALITY = 'SettingsDialog.AutodetectQuality'
    SET_DIALOG_VISIBILITY = 'SettingsDialog.setVisibility'
    CURSOR_VALUES = {
        'mixing': 4,
        'gunTag': 15,
        'centralTag': 14,
        'net': 4,
        'reloader': 0,
        'condition': 0,
        'cassette': 0,
        'reloaderTimer': 0
    }
    SNIPER_VALUES = {
        'snpMixing': 4,
        'snpGunTag': 6,
        'snpCentralTag': 14,
        'snpNet': 4,
        'snpReloader': 0,
        'snpCondition': 0,
        'snpCassette': 0,
        'snpReloaderTimer': 0,
        'snpZoomIndicator': 0
    }
    MARKER_VALUES = {'Hp': 4, 'Name': 3}
    MARKER_TYPES = ['Base', 'Alt']
    MOUSE_KEYS = {
        'ingame': {
            'arcadeSens': ('arcade', 'sensitivity'),
            'sniperSens': ('sniper', 'sensitivity'),
            'artSens': ('strategic', 'sensitivity'),
            'horInvert': ('arcade', 'horzInvert'),
            'vertInvert': ('arcade', 'vertInvert'),
            'backDraftInvert': ('arcade', 'backDraftInvert')
        },
        'lobby': {
            'arcadeSens': ('arcadeMode/camera', 'sensitivity', 'float'),
            'sniperSens': ('sniperMode/camera', 'sensitivity', 'float'),
            'artSens': ('strategicMode/camera', 'sensitivity', 'float'),
            'horInvert': ('arcadeMode/camera', 'horzInvert', 'bool'),
            'vertInvert': ('arcadeMode/camera', 'vertInvert', 'bool'),
            'backDraftInvert': ('arcadeMode/camera', 'backDraftInvert', 'bool')
        },
        'default': {
            'arcadeSens': 1,
            'sniperSens': 1,
            'artSens': 1,
            'horInvert': False,
            'vertInvert': False,
            'backDraftInvert': False
        }
    }
    GAMEPLAY_KEY_FORMAT = 'gameplay_{0:>s}'
    GAMEPLAY_PREFIX = 'gameplay_'

    def __init__(self, enableRedefineKeysMode=True):
        UIInterface.__init__(self)
        if not GUI_SETTINGS.minimapSize and self.KEYBOARD_MAPPING_BLOCKS.has_key(
                'minimap'):
            del self.KEYBOARD_MAPPING_BLOCKS['minimap']
        self.__enableRedefineKeysMode = enableRedefineKeysMode
        self.graphicsPresets = GraphicsPresets()
        self.resolutions = g_graficsResolutions
        self.__currentSettings = None
        self.__settingsUI = None
        self.__altVoiceSetting = g_settingsCore.options.getSetting(
            'alternativeVoices')
        self.graphicsChangeConfirmationRevert = None
        self.__dialogIsVisibility = False
        if not GUI_SETTINGS.voiceChat and self.KEYBOARD_MAPPING_COMMANDS.has_key(
                'voicechat'):
            if self.KEYBOARD_MAPPING_COMMANDS.has_key('voicechat'):
                del self.KEYBOARD_MAPPING_COMMANDS['voicechat']
            if self.KEYBOARD_MAPPING_BLOCKS.has_key('voicechat'):
                del self.KEYBOARD_MAPPING_BLOCKS['voicechat']
            self.KEYBOARD_MAPPING_BLOCKS_ORDER = list(
                self.KEYBOARD_MAPPING_BLOCKS_ORDER)
            del self.KEYBOARD_MAPPING_BLOCKS_ORDER[
                self.KEYBOARD_MAPPING_BLOCKS_ORDER.index('voicechat')]
            self.KEYBOARD_MAPPING_BLOCKS_ORDER = tuple(
                self.KEYBOARD_MAPPING_BLOCKS_ORDER)
        return

    @proto_getter(PROTO_TYPE.BW_CHAT2)
    def bwProto(self):
        return None

    def populateUI(self, proxy):
        UIInterface.populateUI(self, proxy)
        self.uiHolder.addExternalCallbacks({
            SettingsInterface.POPULATE_UI:
            self.onPopulateUI,
            SettingsInterface.APPLY_SETTINGS:
            self.onApplySettings,
            SettingsInterface.COMMIT_SETTINGS:
            self.onCommitSettings,
            SettingsInterface.SETTINGS_TAB_SELECTED:
            self.onTabSelected,
            SettingsInterface.DELAY_SETTINGS:
            self.onDelaySettings,
            SettingsInterface.AUTODETECT_QUALITY:
            self.onAutodetectSettings,
            SettingsInterface.SET_DIALOG_VISIBILITY:
            self.onSetVisibility,
            'SettingsDialog.useRedifineKeysMode':
            self.onUseRedifineKeyMode,
            'SettingsDialog.processVivoxTest':
            self.onProcessVivoxTest,
            'SettingsDialog.voiceChatEnable':
            self.onVoiceChatEnable,
            'SettingsDialog.updateCaptureDevices':
            self.onUpdateCaptureDevices,
            'SettingsDialog.setVivoxMicVolume':
            self.onSetVivoxMicVolume,
            'SettingsDialog.killDialog':
            self.onDialogClose,
            'SettingsDialog.graphicsChangeConfirmationStatus':
            self.graphicsChangeConfirmationStatus
        })
        VibroManager.g_instance.onConnect += self.__vm_onConnect
        VibroManager.g_instance.onDisconnect += self.__vm_onDisconnect
        g_guiResetters.add(self.onRecreateDevice)
        BigWorld.wg_setAdapterOrdinalNotifyCallback(self.onRecreateDevice)

    def dispossessUI(self):
        if self.__settingsUI:
            self.__settingsUI.script = None
            self.__settingsUI = None
        self.__altVoiceSetting = None
        self.uiHolder.removeExternalCallbacks(
            SettingsInterface.POPULATE_UI, SettingsInterface.APPLY_SETTINGS,
            SettingsInterface.COMMIT_SETTINGS,
            SettingsInterface.SETTINGS_TAB_SELECTED,
            SettingsInterface.DELAY_SETTINGS,
            SettingsInterface.AUTODETECT_QUALITY,
            SettingsInterface.SET_DIALOG_VISIBILITY,
            'SettingsDialog.useRedifineKeysMode',
            'SettingsDialog.processVivoxTest',
            'SettingsDialog.voiceChatEnable',
            'SettingsDialog.updateCaptureDevices',
            'SettingsDialog.setVivoxMicVolume', 'SettingsDialog.killDialog')
        VibroManager.g_instance.onConnect -= self.__vm_onConnect
        VibroManager.g_instance.onDisconnect -= self.__vm_onDisconnect
        g_guiResetters.discard(self.onRecreateDevice)
        BigWorld.wg_setAdapterOrdinalNotifyCallback(None)
        UIInterface.dispossessUI(self)
        return

    def altVoicesPreview(self, soundMode):
        if not self.__altVoiceSetting.isOptionEnabled():
            return True
        if not g_sessionProvider.getCtx().isInBattle:
            SoundGroups.g_instance.enableVoiceSounds(True)
        self.__altVoiceSetting.preview(soundMode)
        return self.__altVoiceSetting.playPreviewSound(
            self.uiHolder.soundManager)

    def isSoundModeValid(self, soundMode):
        self.__altVoiceSetting.preview(soundMode)
        valid = self.__altVoiceSetting.isSoundModeValid()
        self.__altVoiceSetting.revert()
        return valid

    def onSetVivoxMicVolume(self, callbackId, value):
        import VOIP
        if round(SoundGroups.g_instance.getVolume('micVivox') * 100) != value:
            SoundGroups.g_instance.setVolume('micVivox', value / 100)
            VOIP.getVOIPManager().setMicrophoneVolume(int(value))

    def onVoiceChatEnable(self, callbackId, isEnable):
        self.__voiceChatEnable(isEnable)

    def __voiceChatEnable(self, isEnable):
        if BattleReplay.isPlaying():
            return
        elif isEnable is None:
            return
        else:
            g_settingsCore.applySetting('enableVoIP', isEnable)
            return

    def onUseRedifineKeyMode(self, callbackId, isUse):
        if self.__enableRedefineKeysMode:
            BigWorld.wg_setRedefineKeysMode(isUse)

    def onProcessVivoxTest(self, callbackId, isStart):
        LOG_DEBUG('Vivox test: %s' % str(isStart))
        import VOIP
        rh = VOIP.getVOIPManager()
        rh.enterTestChannel() if isStart else rh.leaveTestChannel()
        self.respond([callbackId, False])

    def __vm_onConnect(self):
        self.call('SettingsDialog.VibroManager.Connect')

    def __vm_onDisconnect(self):
        self.call('SettingsDialog.VibroManager.Disconnect')

    def __getVideoSettings(self):
        settings = {}
        settings['monitor'] = {
            'current': self.resolutions.monitorIndex,
            'real': self.resolutions.realMonitorIndex,
            'options': self.resolutions.monitorsList
        }
        settings['fullScreen'] = g_settingsCore.getSetting('fullScreen')
        settings['windowSize'] = {
            'current': g_settingsCore.getSetting('windowSize'),
            'options':
            g_settingsCore.options.getSetting('windowSize').getOptions()
        }
        settings['resolution'] = {
            'current': g_settingsCore.getSetting('resolution'),
            'options':
            g_settingsCore.options.getSetting('resolution').getOptions()
        }
        settings['refreshRate'] = {
            'current':
            g_settingsCore.getSetting('refreshRate'),
            'options':
            g_settingsCore.options.getSetting('refreshRate').getOptions()
        }
        settings['interfaceScale'] = {
            'current':
            g_settingsCore.getSetting('interfaceScale'),
            'options':
            g_settingsCore.options.getSetting('interfaceScale').getOptions()
        }
        return settings

    def __getSettings(self):
        settings = [self.graphicsPresets.getGraphicsPresetsData()]
        import VOIP
        rh = VOIP.getVOIPManager()
        g_windowsStoredData.start()
        vManager = VibroManager.g_instance
        vEffGroups = vManager.getGroupsSettings()
        vEffDefGroup = VibroManager.VibroManager.GroupSettings()
        vEffDefGroup.enabled = False
        vEffDefGroup.gain = 0
        markers = {
            'enemy': g_settingsCore.getSetting('enemy'),
            'dead': g_settingsCore.getSetting('dead'),
            'ally': g_settingsCore.getSetting('ally')
        }
        datetimeIdx = g_settingsCore.getSetting(
            'showDateMessage') << 0 | g_settingsCore.getSetting(
                'showTimeMessage') << 1
        zoomOption = g_settingsCore.options.getSetting('increasedZoom')
        config = {
            'locale':
            getClientOverride(),
            'aspectRatio': {
                'current': self.resolutions.aspectRatioIndex,
                'options': self.resolutions.aspectRatiosList
            },
            'vertSync':
            self.resolutions.isVideoVSync,
            'tripleBuffered':
            self.resolutions.isTripleBuffered,
            'multisampling': {
                'current': self.resolutions.multisamplingTypeIndex,
                'options': self.resolutions.multisamplingTypesList
            },
            'customAA': {
                'current': self.resolutions.customAAModeIndex,
                'options': self.resolutions.customAAModesList
            },
            'gamma':
            self.resolutions.gamma,
            'masterVolumeToggle':
            g_settingsCore.getSetting(SOUND.MASTER_TOGGLE),
            'soundQuality':
            g_settingsCore.getSetting(SOUND.SOUND_QUALITY),
            'soundQualityVisible':
            g_settingsCore.getSetting(SOUND.SOUND_QUALITY_VISIBLE),
            'masterVolume':
            round(SoundGroups.g_instance.getMasterVolume() * 100),
            'musicVolume':
            round(SoundGroups.g_instance.getVolume('music') * 100),
            'vehiclesVolume':
            round(SoundGroups.g_instance.getVolume('vehicles') * 100),
            'effectsVolume':
            round(SoundGroups.g_instance.getVolume('effects') * 100),
            'guiVolume':
            round(SoundGroups.g_instance.getVolume('gui') * 100),
            'ambientVolume':
            round(SoundGroups.g_instance.getVolume('ambient') * 100),
            'masterVivoxVolume':
            round(SoundGroups.g_instance.getVolume('masterVivox') * 100),
            'micVivoxVolume':
            round(SoundGroups.g_instance.getVolume('micVivox') * 100),
            'masterFadeVivoxVolume':
            round(SoundGroups.g_instance.getVolume('masterFadeVivox') * 100),
            'dynamicRange':
            g_settingsCore.options.getSetting('dynamicRange').pack(),
            'soundDevice':
            g_settingsCore.options.getSetting('soundDevice').pack(),
            'captureDevice':
            g_settingsCore.options.getSetting(SOUND.CAPTURE_DEVICES).pack(),
            'voiceChatNotSupported':
            not g_settingsCore.getSetting(SOUND.VOIP_SUPPORTED),
            'datetimeIdx':
            datetimeIdx,
            'enableOlFilter':
            g_settingsCore.getSetting('enableOlFilter'),
            'enableSpamFilter':
            g_settingsCore.getSetting('enableSpamFilter'),
            'receiveFriendshipRequest':
            g_settingsCore.getSetting('receiveFriendshipRequest'),
            'receiveInvitesInBattle':
            g_settingsCore.getSetting('receiveInvitesInBattle'),
            'invitesFromFriendsOnly':
            g_settingsCore.getSetting('invitesFromFriendsOnly'),
            'disableBattleChat':
            g_settingsCore.getSetting('disableBattleChat'),
            'chatContactsListOnly':
            g_settingsCore.getSetting('chatContactsListOnly'),
            'receiveClanInvitesNotifications':
            g_settingsCore.getSetting('receiveClanInvitesNotifications'),
            'dynamicCamera':
            g_settingsCore.getSetting('dynamicCamera'),
            'horStabilizationSnp':
            g_settingsCore.getSetting('horStabilizationSnp'),
            'increasedZoom':
            zoomOption.get(),
            'sniperModeByShift':
            g_settingsCore.getSetting('sniperModeByShift'),
            'enableVoIP':
            g_settingsCore.getSetting('enableVoIP'),
            'enablePostMortemEffect':
            g_settingsCore.getSetting('enablePostMortemEffect'),
            'enablePostMortemDelay':
            g_settingsCore.getSetting('enablePostMortemDelay'),
            'isColorBlind':
            g_settingsCore.getSetting('isColorBlind'),
            'graphicsQualityHDSD':
            g_settingsCore.getSetting('graphicsQualityHDSD'),
            'useServerAim':
            g_settingsCore.getSetting('useServerAim'),
            'showVehiclesCounter':
            g_settingsCore.getSetting('showVehiclesCounter'),
            'showMarksOnGun':
            g_settingsCore.getSetting('showMarksOnGun'),
            'simplifiedTTC':
            g_settingsCore.getSetting('simplifiedTTC'),
            'showBattleEfficiencyRibbons':
            g_settingsCore.getSetting('showBattleEfficiencyRibbons'),
            'minimapAlpha':
            g_settingsCore.getSetting('minimapAlpha'),
            'showVectorOnMap':
            g_settingsCore.getSetting('showVectorOnMap'),
            'showSectorOnMap':
            g_settingsCore.getSetting('showSectorOnMap'),
            'showVehModelsOnMap':
            g_settingsCore.options.getSetting('showVehModelsOnMap').pack(),
            'minimapViewRange':
            g_settingsCore.getSetting('minimapViewRange'),
            'minimapMaxViewRange':
            g_settingsCore.getSetting('minimapMaxViewRange'),
            'minimapDrawRange':
            g_settingsCore.getSetting('minimapDrawRange'),
            'battleLoadingInfo':
            g_settingsCore.options.getSetting('battleLoadingInfo').pack(),
            'vibroIsConnected':
            vManager.connect(),
            'vibroGain':
            vManager.getGain() * 100,
            'vibroEngine':
            vEffGroups.get('engine', vEffDefGroup).gain * 100,
            'vibroAcceleration':
            vEffGroups.get('acceleration', vEffDefGroup).gain * 100,
            'vibroShots':
            vEffGroups.get('shots', vEffDefGroup).gain * 100,
            'vibroHits':
            vEffGroups.get('hits', vEffDefGroup).gain * 100,
            'vibroCollisions':
            vEffGroups.get('collisions', vEffDefGroup).gain * 100,
            'vibroDamage':
            vEffGroups.get('damage', vEffDefGroup).gain * 100,
            'vibroGUI':
            vEffGroups.get('gui', vEffDefGroup).gain * 100,
            'ppShowLevels':
            g_settingsCore.getSetting('ppShowLevels'),
            'ppShowTypes':
            g_settingsCore.getSetting('ppShowTypes'),
            'replayEnabled':
            g_settingsCore.options.getSetting('replayEnabled').pack(),
            'fpsPerfomancer':
            g_settingsCore.getSetting('fpsPerfomancer'),
            'dynamicRenderer':
            g_settingsCore.getSetting('dynamicRenderer'),
            'colorFilterIntensity':
            g_settingsCore.getSetting('colorFilterIntensity'),
            'colorFilterImages':
            g_settingsCore.getSetting('colorFilterImages'),
            'fov':
            g_settingsCore.getSetting('fov'),
            'dynamicFov':
            g_settingsCore.getSetting('dynamicFov'),
            'enableOpticalSnpEffect':
            g_settingsCore.getSetting('enableOpticalSnpEffect'),
            'arcade': {
                'values':
                g_settingsCore.options.getSetting(
                    'arcade').toAccountSettings(),
                'options':
                SettingsInterface.CURSOR_VALUES
            },
            'sniper': {
                'values':
                g_settingsCore.options.getSetting(
                    'sniper').toAccountSettings(),
                'options':
                SettingsInterface.SNIPER_VALUES
            },
            'markers': {
                'values': markers,
                'options': SettingsInterface.MARKER_VALUES,
                'types': SettingsInterface.MARKER_TYPES
            }
        }
        if self.__altVoiceSetting.isOptionEnabled():
            altVoices = []
            for idx, desc in enumerate(self.__altVoiceSetting.getOptions()):
                altVoices.append({'data': idx, 'label': desc})

            config['alternativeVoices'] = {
                'current': self.__altVoiceSetting.get(),
                'options': altVoices
            }
        for name in ('ctf', 'domination', 'assault', 'nations'):
            key = self.GAMEPLAY_KEY_FORMAT.format(name)
            config[key] = g_settingsCore.getSetting(key)

        settings.append(config)
        if KeyboardSettings.isGroupHidden('logitech_keyboard'):
            if self.KEYBOARD_MAPPING_BLOCKS.has_key('logitech_keyboard'):
                del self.KEYBOARD_MAPPING_BLOCKS['logitech_keyboard']
        else:
            self.KEYBOARD_MAPPING_BLOCKS['logitech_keyboard'] = (
                'switch_view', )
        cmdMap = CommandMapping.g_instance
        defaults = cmdMap.getDefaults()
        keyboard = []
        for group_name in self.KEYBOARD_MAPPING_BLOCKS_ORDER:
            if group_name in self.KEYBOARD_MAPPING_BLOCKS.keys():
                group = {'id': group_name, 'commands': []}
                keyboard.append(group)
                for key_setting in self.KEYBOARD_MAPPING_BLOCKS[group_name]:
                    command = cmdMap.getCommand(
                        self.KEYBOARD_MAPPING_COMMANDS[group_name]
                        [key_setting])
                    keyCode = cmdMap.get(
                        self.KEYBOARD_MAPPING_COMMANDS[group_name]
                        [key_setting])
                    defaultCode = defaults[command] if defaults.has_key(
                        command) else 0
                    key = {
                        'id': key_setting,
                        'command': command,
                        'key': getScaleformKey(keyCode),
                        'keyDefault': getScaleformKey(defaultCode)
                    }
                    group['commands'].append(key)

        settings.append(keyboard)
        mouse = {}
        player = BigWorld.player()
        if hasattr(player.inputHandler, 'ctrls'):
            for key, path in SettingsInterface.MOUSE_KEYS['ingame'].items():
                if key == 'horInvert':
                    value = g_settingsCore.getSetting('mouseHorzInvert')
                elif key == 'vertInvert':
                    value = g_settingsCore.getSetting('mouseVertInvert')
                elif key == 'backDraftInvert':
                    value = g_settingsCore.getSetting('backDraftInvert')
                else:
                    value = player.inputHandler.ctrls[
                        path[0]].camera.getUserConfigValue(path[1])
                mouse[key] = {
                    'defaultValue':
                    SettingsInterface.MOUSE_KEYS['default'][key],
                    'value': value
                }

        else:
            ds = Settings.g_instance.userPrefs[Settings.KEY_CONTROL_MODE]
            for key, path in SettingsInterface.MOUSE_KEYS['lobby'].items():
                default = SettingsInterface.MOUSE_KEYS['default'][key]
                value = default
                if key == 'horInvert':
                    value = g_settingsCore.getSetting('mouseHorzInvert')
                elif key == 'vertInvert':
                    value = g_settingsCore.getSetting('mouseVertInvert')
                elif key == 'backDraftInvert':
                    value = g_settingsCore.getSetting('backDraftInvert')
                elif ds is not None:
                    if path[2] == 'float':
                        value = ds[path[0]].readFloat(path[1], default)
                    elif path[2] == 'bool':
                        value = ds[path[0]].readBool(path[1], default)
                    else:
                        LOG_DEBUG('Unknown mouse settings type %s %s' %
                                  (key, path))
                mouse[key] = {'defaultValue': default, 'value': value}

        settings.append(mouse)
        extraData = {
            'increasedZoom':
            zoomOption.getExtraData(),
            'keyboardImportantBinds':
            g_settingsCore.getSetting('keyboardImportantBinds')
        }
        settings.append(extraData)
        g_windowsStoredData.stop()
        return settings

    def onUpdateCaptureDevices(self, callbshowVectorOnMapackId):
        self.__updateCaptureDevices()

    @process
    def __updateCaptureDevices(self):
        Waiting.show('__updateCaptureDevices')
        yield self.bwProto.voipController.requestCaptureDevices()
        opt = g_settingsCore.options.getSetting(SOUND.CAPTURE_DEVICES)
        Waiting.hide('__updateCaptureDevices')
        self.call('SettingsDialog.updateCaptureDevices',
                  [opt.get()] + opt.getOptions())

    def onRecreateDevice(self):
        if self.__settingsUI and self.__dialogIsVisibility:
            if self.__currentSettings and self.__currentSettings != self.__getVideoSettings(
            ):
                self.__currentSettings = self.__getVideoSettings()
                self.__settingsUI.buildGraphicsData(self.__getVideoSettings())

    def onSetVisibility(self, callbackID, isVisibility):
        self.__dialogIsVisibility = isVisibility

    def onAutodetectSettings(self, callbackID):
        presetIndex = BigWorld.autoDetectGraphicsSettings()
        self.call('SettingsDialog.setPreset', [presetIndex])

    def onPopulateUI(self, *args):
        self.graphicsPresets.checkCurrentPreset(True)
        self.__currentSettings = self.__getVideoSettings()
        if self.__settingsUI:
            self.__settingsUI.script = None
            self.__settingsUI = None
        settingsDialogName = args[1]
        self.__settingsUI = self.uiHolder.getMember(settingsDialogName)
        if self.__settingsUI and self.__dialogIsVisibility:
            settings = self.__getSettings()
            self.__settingsUI.buildData(settings[0], settings[1], settings[2],
                                        settings[3], settings[4])
            self.__settingsUI.buildGraphicsData(self.__getVideoSettings())
            self.__settingsUI.script = self
        else:
            LOG_ERROR(
                'settingsDialog is not found in flash by name {0}'.format(
                    settingsDialogName))
        return

    def onApplySettings(self, callbackId, settings):
        monitorIndex, presetIndex, settingsList, fullscreen, masterVolumeToggle, soundQuality = settings
        if (not self.resolutions.isVideoWindowed or fullscreen) and (
                monitorIndex != self.resolutions.realMonitorIndex
                or self.resolutions.monitorChanged):
            self.call('SettingsDialog.ApplySettings', ['restartNeeded'])
            return
        isSoundChanged = masterVolumeToggle is not g_settingsCore.getSetting(
            SOUND.MASTER_TOGGLE
        ) or soundQuality is not g_settingsCore.getSetting(SOUND.SOUND_QUALITY)
        applyMethod = g_settingsCore.options.getApplyMethod(settingsList)
        method = 'apply'
        if applyMethod == APPLY_METHOD.RESTART or isSoundChanged:
            method = 'restartNeeded'
        elif applyMethod == APPLY_METHOD.DELAYED:
            method = 'hasPendingSettings'
        self.call('SettingsDialog.ApplySettings', [method])

    def onDelaySettings(self, *args):
        g_settingsCore.options.revert()

    def onCommitSettings(self, *args):
        self.apply(True, *args)

    def onTabSelected(self, cbID, tabId):
        if tabId == SETTINGS.SOUNDTITLE:
            self.bwProto.voipController.invalidateInitialization()

    def apply(self, restartApproved, callbackId, settings):
        restartClient = False
        interfaceScaled = False
        g_settingsCore.isDeviseRecreated = False
        isSoundChanged = settings[
            SOUND.MASTER_TOGGLE] is not g_settingsCore.getSetting(
                SOUND.MASTER_TOGGLE) or settings[
                    SOUND.SOUND_QUALITY] is not g_settingsCore.getSetting(
                        SOUND.SOUND_QUALITY)
        import VOIP
        if (not self.resolutions.isVideoWindowed or settings['fullScreen']
            ) and (settings['monitor'] != self.resolutions.realMonitorIndex
                   or self.resolutions.monitorChanged):
            restartClient = True
        if g_settingsCore.getSetting(
                'interfaceScale') != settings['interfaceScale']:
            interfaceScaled = True
        g_settingsCore.applySetting('ppShowTypes', settings['ppShowTypes'])
        g_settingsCore.applySetting('ppShowLevels', settings['ppShowLevels'])
        g_settingsCore.applySetting('replayEnabled', settings['replayEnabled'])
        g_settingsCore.applySetting('fpsPerfomancer',
                                    settings['fpsPerfomancer'])
        g_settingsCore.applySetting('colorFilterIntensity',
                                    settings['colorFilterIntensity'])
        g_settingsCore.applySetting('fov', settings['fov'])
        g_settingsCore.applySetting('dynamicFov', settings['dynamicFov'])
        g_settingsCore.applySetting('enableOpticalSnpEffect',
                                    settings['enableOpticalSnpEffect'])
        g_settingsCore.applySetting('isColorBlind', settings['isColorBlind'])
        g_settingsCore.applySetting('useServerAim', settings['useServerAim'])
        g_settingsCore.applySetting('showVehiclesCounter',
                                    settings['showVehiclesCounter'])
        g_settingsCore.applySetting('showMarksOnGun',
                                    settings['showMarksOnGun'])
        g_settingsCore.applySetting('simplifiedTTC', settings['simplifiedTTC'])
        g_settingsCore.applySetting('minimapAlpha', settings['minimapAlpha'])
        g_settingsCore.applySetting('showVectorOnMap',
                                    settings['showVectorOnMap'])
        g_settingsCore.applySetting('showSectorOnMap',
                                    settings['showSectorOnMap'])
        g_settingsCore.applySetting('showVehModelsOnMap',
                                    settings['showVehModelsOnMap'])
        g_settingsCore.applySetting('minimapViewRange',
                                    settings['minimapViewRange'])
        g_settingsCore.applySetting('minimapMaxViewRange',
                                    settings['minimapMaxViewRange'])
        g_settingsCore.applySetting('minimapDrawRange',
                                    settings['minimapDrawRange'])
        g_settingsCore.applySetting('battleLoadingInfo',
                                    settings['battleLoadingInfo'])
        arcade = g_settingsCore.options.getSetting(
            'arcade').fromAccountSettings(settings['arcade'])
        sniper = g_settingsCore.options.getSetting(
            'sniper').fromAccountSettings(settings['sniper'])
        g_settingsCore.applySetting('arcade', arcade)
        g_settingsCore.applySetting('sniper', sniper)
        g_settingsCore.applySetting('enemy', settings['markers']['enemy'])
        g_settingsCore.applySetting('dead', settings['markers']['dead'])
        g_settingsCore.applySetting('ally', settings['markers']['ally'])
        g_settingsCore.applySetting('interfaceScale',
                                    settings['interfaceScale'])
        if 'showBattleEfficiencyRibbons' in settings:
            g_settingsCore.applySetting(
                'showBattleEfficiencyRibbons',
                settings['showBattleEfficiencyRibbons'])
        g_settingsCore.applySetting('dynamicCamera', settings['dynamicCamera'])
        g_settingsCore.applySetting('horStabilizationSnp',
                                    settings['horStabilizationSnp'])
        g_settingsCore.applySetting('increasedZoom', settings['increasedZoom'])
        g_settingsCore.applySetting('sniperModeByShift',
                                    settings['sniperModeByShift'])
        if self.__altVoiceSetting.isOptionEnabled():
            altVoices = settings.get('alternativeVoices')
            if altVoices is not None:
                self.__altVoiceSetting.apply(altVoices)
        vManager = VibroManager.g_instance
        vManager.setGain(settings['vibroGain'] / 100.0)
        vEffGroups = vManager.getGroupsSettings()
        for groupName, newValue in [
            ('engine', settings['vibroEngine']),
            ('acceleration', settings['vibroAcceleration']),
            ('shots', settings['vibroShots']), ('hits', settings['vibroHits']),
            ('collisions', settings['vibroCollisions']),
            ('damage', settings['vibroDamage']), ('gui', settings['vibroGUI'])
        ]:
            if groupName in vEffGroups:
                vEffGroups[groupName].gain = newValue / 100.0
                vEffGroups[groupName].enabled = newValue > 0

        vManager.setGroupsSettings(vEffGroups)
        self.__voiceChatEnable(settings['enableVoIP'])
        g_settingsCore.applySetting(SOUND.CAPTURE_DEVICES,
                                    settings[Settings.KEY_VOIP_DEVICE])
        g_settingsCore.applySetting('enablePostMortemEffect',
                                    settings['enablePostMortemEffect'])
        g_settingsCore.applySetting('enablePostMortemDelay',
                                    settings['enablePostMortemDelay'])
        self.uiHolder.clearCommands()
        keyboard = settings['controls']['keyboard']
        keyboardMapping = {}
        keysLayout = dict(
            g_settingsCore.options.getSetting('keyboard').KEYS_LAYOUT)
        layout = list(itertools.chain(*keysLayout.values()))
        for i in xrange(len(self.KEYBOARD_MAPPING_BLOCKS)):
            group_name = keyboard[i]['id']
            for j in xrange(len(self.KEYBOARD_MAPPING_BLOCKS[group_name])):
                key_name = keyboard[i]['commands'][j]['id']
                value = keyboard[i]['commands'][j]['key']
                cmd = self.KEYBOARD_MAPPING_COMMANDS[group_name][key_name]
                for item in layout:
                    key, command = item[0], item[1]
                    if command == cmd:
                        keyboardMapping[key] = value
                        break

        g_settingsCore.applySetting('keyboard', keyboardMapping)
        self.uiHolder.bindCommands()
        player = BigWorld.player()
        mouse = settings['controls']['mouse']
        if hasattr(player.inputHandler, 'ctrls'):
            player.inputHandler.ctrls['arcade'].camera.setUserConfigValue(
                'sensitivity', mouse['arcadeSens']['value'])
            player.inputHandler.ctrls['sniper'].camera.setUserConfigValue(
                'sensitivity', mouse['sniperSens']['value'])
            player.inputHandler.ctrls['strategic'].camera.setUserConfigValue(
                'sensitivity', mouse['artSens']['value'])
        else:
            ds = Settings.g_instance.userPrefs[Settings.KEY_CONTROL_MODE]
            if ds:
                ds['arcadeMode/camera'].writeFloat(
                    'sensitivity', mouse['arcadeSens']['value'])
                ds['sniperMode/camera'].writeFloat(
                    'sensitivity', mouse['sniperSens']['value'])
                ds['strategicMode/camera'].writeFloat(
                    'sensitivity', mouse['artSens']['value'])
        g_settingsCore.applySetting('mouseHorzInvert',
                                    bool(mouse['horInvert']['value']))
        g_settingsCore.applySetting('mouseVertInvert',
                                    bool(mouse['vertInvert']['value']))
        g_settingsCore.applySetting('backDraftInvert',
                                    bool(mouse['backDraftInvert']['value']))
        g_settingsCore.applySetting('monitor', settings['monitor'])
        isFullScreen = bool(settings['fullScreen'])
        if isFullScreen:
            g_settingsCore.applySetting('refreshRate', settings['refreshRate'])
            g_settingsCore.applySetting('resolution', settings['resolution'])
            g_settingsCore.applySetting('aspectRatio', settings['aspectRatio'])
            g_settingsCore.applySetting('gamma', settings['gamma'])
        else:
            g_settingsCore.applySetting('windowSize', settings['windowSize'])
        g_settingsCore.applySetting('fullScreen', isFullScreen)
        g_settingsCore.applySetting('multisampling', settings['multisampling'])
        g_settingsCore.applySetting('customAA', settings['customAA'])
        g_settingsCore.applySetting('vertSync', settings['vertSync'])
        g_settingsCore.applySetting('tripleBuffered',
                                    settings['tripleBuffered'])
        if round(SoundGroups.g_instance.getVolume('masterVivox') *
                 100) != settings['masterVivoxVolume']:
            VOIP.getVOIPManager().setMasterVolume(
                settings['masterVivoxVolume'])
        if round(SoundGroups.g_instance.getVolume('micVivox') *
                 100) != settings['micVivoxVolume']:
            VOIP.getVOIPManager().setMicrophoneVolume(
                settings['micVivoxVolume'])
        for s in (SOUND.MASTER_TOGGLE, SOUND.SOUND_QUALITY):
            g_settingsCore.applySetting(s, settings[s])

        SoundGroups.g_instance.setMasterVolume(
            float(settings['masterVolume']) / 100)
        SoundGroups.g_instance.setVolume('music',
                                         float(settings['musicVolume']) / 100)
        SoundGroups.g_instance.setVolume(
            'vehicles',
            float(settings['vehiclesVolume']) / 100)
        SoundGroups.g_instance.setVolume(
            'effects',
            float(settings['effectsVolume']) / 100)
        SoundGroups.g_instance.setVolume('gui',
                                         float(settings['guiVolume']) / 100)
        SoundGroups.g_instance.setVolume(
            'ambient',
            float(settings['ambientVolume']) / 100)
        SoundGroups.g_instance.setVolume(
            'masterVivox',
            float(settings['masterVivoxVolume']) / 100)
        SoundGroups.g_instance.setVolume(
            'micVivox',
            float(settings['micVivoxVolume']) / 100)
        SoundGroups.g_instance.setVolume(
            'masterFadeVivox',
            float(settings['masterFadeVivoxVolume']) / 100)
        g_settingsCore.applySetting('dynamicRange', settings['dynamicRange'])
        g_settingsCore.applySetting('soundDevice', settings['soundDevice'])
        g_settingsCore.applySetting('showDateMessage',
                                    settings['datetimeIdx'] & 1)
        g_settingsCore.applySetting('showTimeMessage',
                                    settings['datetimeIdx'] & 2)
        g_settingsCore.applySetting('enableOlFilter',
                                    settings['enableOlFilter'])
        g_settingsCore.applySetting('enableSpamFilter',
                                    settings['enableSpamFilter'])
        g_windowsStoredData.start()
        g_settingsCore.applySetting('receiveFriendshipRequest',
                                    settings['receiveFriendshipRequest'])
        g_settingsCore.applySetting('receiveInvitesInBattle',
                                    settings.get('receiveInvitesInBattle'))
        g_settingsCore.applySetting(
            'receiveClanInvitesNotifications',
            settings.get('receiveClanInvitesNotifications'))
        g_windowsStoredData.stop()
        g_settingsCore.applySetting('invitesFromFriendsOnly',
                                    settings['invitesFromFriendsOnly'])
        g_settingsCore.applySetting('disableBattleChat',
                                    settings['disableBattleChat'])
        g_settingsCore.applySetting('chatContactsListOnly',
                                    settings['chatContactsListOnly'])
        gameplayKeys = filter(
            lambda item: item.startswith(self.GAMEPLAY_PREFIX),
            settings.keys())
        for key in gameplayKeys:
            g_settingsCore.applySetting(key, settings[key])

        qualitySettings = settings['quality']
        applyMethod = g_settingsCore.options.getApplyMethod(qualitySettings)
        for key in GraphicsPresets.GRAPHICS_QUALITY_SETTINGS:
            value = qualitySettings.get(key)
            if value is not None:
                g_settingsCore.applySetting(key, value)

        g_settingsCore.applySetting('dynamicRenderer',
                                    settings['dynamicRenderer'])
        if applyMethod == APPLY_METHOD.RESTART or isSoundChanged:
            BigWorld.commitPendingGraphicsSettings()
            restartClient = True
        elif applyMethod == APPLY_METHOD.DELAYED:
            BigWorld.commitPendingGraphicsSettings()
        confirmators = g_settingsCore.applyStorages(restartClient)
        for confirmation, revert in confirmators:
            if confirmation is not None:
                if confirmation == 'graphicsChangeConfirmation':

                    def callback(isConfirmed):
                        if not isConfirmed:
                            g_settingsCore.isChangesConfirmed = False
                            revert()

                    self.graphicsChangeConfirmationRevert = revert
                    self.call('SettingsDialog.ApplySettings', [confirmation])

        g_postProcessing.refresh()
        if restartClient:
            BigWorld.savePreferences()
            if restartApproved:
                from BattleReplay import g_replayCtrl
                if g_replayCtrl.isPlaying and g_replayCtrl.playbackSpeed == 0:
                    g_replayCtrl.setPlaybackSpeedIdx(5)
                BigWorld.callback(0.3, self.__restartGame)
            elif g_settingsCore.isDeviseRecreated:
                g_settingsCore.isDeviseRecreated = False
            else:
                BigWorld.callback(
                    0.0,
                    partial(BigWorld.changeVideoMode, -1,
                            BigWorld.isVideoWindowed()))
        if interfaceScaled:
            self.__settingsUI.buildGraphicsData(self.__getVideoSettings())
        return

    def __restartGame(self):
        BigWorld.savePreferences()
        BigWorld.restartGame()

    def onDialogClose(self, _):
        if self.__altVoiceSetting.isOptionEnabled():
            self.__altVoiceSetting.revert()
        if not g_sessionProvider.getCtx().isInBattle:
            SoundGroups.g_instance.enableVoiceSounds(False)
        elif hasattr(BigWorld.player(),
                     'vehicle') and BigWorld.player().vehicle:
            SoundGroups.g_instance.soundModes.setCurrentNation(nations.NAMES[
                BigWorld.player().vehicle.typeDescriptor.type.id[0]])
        g_settingsCore.clearStorages()
        self.__dialogIsVisibility = False
        if self.__settingsUI:
            self.__settingsUI.script = None
            self.__settingsUI = None
        return

    def graphicsChangeConfirmationStatus(self, callbackId, isConfirmed):
        if not isConfirmed and self.graphicsChangeConfirmationRevert is not None:
            self.graphicsChangeConfirmationRevert()
            self.graphicsChangeConfirmationRevert = None
        return
Esempio n. 7
0
class SettingsInterface(UIInterface):
    KEYBOARD_MAPPING_COMMANDS = {
        'movement': {
            'forward': 'CMD_MOVE_FORWARD',
            'backward': 'CMD_MOVE_BACKWARD',
            'left': 'CMD_ROTATE_LEFT',
            'right': 'CMD_ROTATE_RIGHT',
            'auto_rotation': 'CMD_CM_VEHICLE_SWITCH_AUTOROTATION'
        },
        'cruis_control': {
            'forward': 'CMD_INCREMENT_CRUISE_MODE',
            'backward': 'CMD_DECREMENT_CRUISE_MODE',
            'stop_fire': 'CMD_STOP_UNTIL_FIRE'
        },
        'firing': {
            'fire': 'CMD_CM_SHOOT',
            'lock_target': 'CMD_CM_LOCK_TARGET',
            'lock_target_off': 'CMD_CM_LOCK_TARGET_OFF',
            'alternate_mode': 'CMD_CM_ALTERNATE_MODE',
            'reloadPartialClip': 'CMD_RELOAD_PARTIAL_CLIP'
        },
        'vehicle_other': {
            'showHUD': 'CMD_TOGGLE_GUI',
            'showRadialMenu': 'CMD_RADIAL_MENU_SHOW'
        },
        'equipment': {
            'item01': 'CMD_AMMO_CHOICE_1',
            'item02': 'CMD_AMMO_CHOICE_2',
            'item03': 'CMD_AMMO_CHOICE_3',
            'item04': 'CMD_AMMO_CHOICE_4',
            'item05': 'CMD_AMMO_CHOICE_5',
            'item06': 'CMD_AMMO_CHOICE_6',
            'item07': 'CMD_AMMO_CHOICE_7',
            'item08': 'CMD_AMMO_CHOICE_8'
        },
        'shortcuts': {
            'attack': 'CMD_CHAT_SHORTCUT_ATTACK',
            'to_base': 'CMD_CHAT_SHORTCUT_BACKTOBASE',
            'positive': 'CMD_CHAT_SHORTCUT_POSITIVE',
            'negative': 'CMD_CHAT_SHORTCUT_NEGATIVE',
            'help_me': 'CMD_CHAT_SHORTCUT_HELPME',
            'reload': 'CMD_CHAT_SHORTCUT_RELOAD'
        },
        'camera': {
            'camera_up': 'CMD_CM_CAMERA_ROTATE_UP',
            'camera_down': 'CMD_CM_CAMERA_ROTATE_DOWN',
            'camera_left': 'CMD_CM_CAMERA_ROTATE_LEFT',
            'camera_right': 'CMD_CM_CAMERA_ROTATE_RIGHT'
        },
        'voicechat': {
            'pushToTalk': 'CMD_VOICECHAT_MUTE'
        },
        'logitech_keyboard': {
            'switch_view': 'CMD_LOGITECH_SWITCH_VIEW'
        },
        'minimap': {
            'sizeUp': 'CMD_MINIMAP_SIZE_UP',
            'sizeDown': 'CMD_MINIMAP_SIZE_DOWN',
            'visible': 'CMD_MINIMAP_VISIBLE'
        }
    }
    KEYBOARD_MAPPING_BLOCKS = {
        'movement': ('forward', 'backward', 'left', 'right', 'auto_rotation'),
        'cruis_control': ('forward', 'backward', 'stop_fire'),
        'firing': ('fire', 'lock_target', 'lock_target_off', 'alternate_mode',
                   'reloadPartialClip'),
        'vehicle_other': ('showHUD', 'showRadialMenu'),
        'equipment': ('item01', 'item02', 'item03', 'item04', 'item05',
                      'item06', 'item07', 'item08'),
        'shortcuts':
        ('attack', 'to_base', 'positive', 'negative', 'help_me', 'reload'),
        'camera': ('camera_up', 'camera_down', 'camera_left', 'camera_right'),
        'voicechat': ('pushToTalk', ),
        'logitech_keyboard': ('switch_view', ),
        'minimap': ('sizeUp', 'sizeDown', 'visible')
    }
    KEYBOARD_MAPPING_BLOCKS_ORDER = ('movement', 'cruis_control', 'firing',
                                     'vehicle_other', 'equipment', 'shortcuts',
                                     'camera', 'voicechat', 'minimap',
                                     'logitech_keyboard')
    POPULATE_UI = 'SettingsDialog.PopulateUI'
    APPLY_SETTINGS = 'SettingsDialog.ApplySettings'
    COMMIT_SETTINGS = 'SettingsDialog.CommitSettings'
    DELAY_SETTINGS = 'SettingsDialog.DelaySettings'
    AUTODETECT_QUALITY = 'SettingsDialog.AutodetectQuality'
    CURSOR_VALUES = {
        'mixing': 3,
        'gunTag': 6,
        'centralTag': 8,
        'net': 3,
        'reloader': 0,
        'condition': 0,
        'cassette': 0,
        'reloaderTimer': 0
    }
    SNIPER_VALUES = {
        'snpMixing': 3,
        'snpGunTag': 6,
        'snpCentralTag': 8,
        'snpNet': 3,
        'snpReloader': 0,
        'snpCondition': 0,
        'snpCassette': 0,
        'snpReloaderTimer': 0
    }
    MARKER_VALUES = {'Hp': 4, 'Name': 3}
    MARKER_TYPES = ['Base', 'Alt']
    MOUSE_KEYS = {
        'ingame': {
            'arcadeSens': ('arcade', 'sensitivity'),
            'sniperSens': ('sniper', 'sensitivity'),
            'artSens': ('strategic', 'sensitivity'),
            'horInvert': ('arcade', 'horzInvert'),
            'vertInvert': ('arcade', 'vertInvert'),
            'backDraftInvert': ('arcade', 'backDraftInvert')
        },
        'lobby': {
            'arcadeSens': ('arcadeMode/camera', 'sensitivity', 'float'),
            'sniperSens': ('sniperMode/camera', 'sensitivity', 'float'),
            'artSens': ('strategicMode/camera', 'sensitivity', 'float'),
            'horInvert': ('arcadeMode/camera', 'horzInvert', 'bool'),
            'vertInvert': ('arcadeMode/camera', 'vertInvert', 'bool'),
            'backDraftInvert': ('arcadeMode/camera', 'backDraftInvert', 'bool')
        },
        'default': {
            'arcadeSens': 1,
            'sniperSens': 1,
            'artSens': 1,
            'horInvert': False,
            'vertInvert': False,
            'backDraftInvert': False
        }
    }
    GAMEPLAY_KEY_FORMAT = 'gameplay_{0:>s}'
    GAMEPLAY_PREFIX = 'gameplay_'

    def __init__(self, enableRedefineKeysMode=True):
        UIInterface.__init__(self)
        if not GUI_SETTINGS.minimapSize and self.KEYBOARD_MAPPING_BLOCKS.has_key(
                'minimap'):
            del self.KEYBOARD_MAPPING_BLOCKS['minimap']
        self.__enableRedefineKeysMode = enableRedefineKeysMode
        self.graphicsPresets = GraphicsPresets()
        self.resolutions = g_graficsResolutions
        self.__currentSettings = None
        self.__settingsUI = None
        self.__altVoiceSetting = g_settingsCore.options.getSetting(
            'alternativeVoices')
        if not GUI_SETTINGS.voiceChat and self.KEYBOARD_MAPPING_COMMANDS.has_key(
                'voicechat'):
            if self.KEYBOARD_MAPPING_COMMANDS.has_key('voicechat'):
                del self.KEYBOARD_MAPPING_COMMANDS['voicechat']
            if self.KEYBOARD_MAPPING_BLOCKS.has_key('voicechat'):
                del self.KEYBOARD_MAPPING_BLOCKS['voicechat']
            self.KEYBOARD_MAPPING_BLOCKS_ORDER = list(
                self.KEYBOARD_MAPPING_BLOCKS_ORDER)
            del self.KEYBOARD_MAPPING_BLOCKS_ORDER[
                self.KEYBOARD_MAPPING_BLOCKS_ORDER.index('voicechat')]
            self.KEYBOARD_MAPPING_BLOCKS_ORDER = tuple(
                self.KEYBOARD_MAPPING_BLOCKS_ORDER)
        return

    def populateUI(self, proxy):
        UIInterface.populateUI(self, proxy)
        self.uiHolder.addExternalCallbacks({
            SettingsInterface.POPULATE_UI:
            self.onPopulateUI,
            SettingsInterface.APPLY_SETTINGS:
            self.onApplySettings,
            SettingsInterface.COMMIT_SETTINGS:
            self.onCommitSettings,
            SettingsInterface.DELAY_SETTINGS:
            self.onDelaySettings,
            SettingsInterface.AUTODETECT_QUALITY:
            self.onAutodetectSettings,
            'SettingsDialog.useRedifineKeysMode':
            self.onUseRedifineKeyMode,
            'SettingsDialog.processVivoxTest':
            self.onProcessVivoxTest,
            'SettingsDialog.voiceChatEnable':
            self.onVoiceChatEnable,
            'SettingsDialog.updateCaptureDevices':
            self.onUpdateCaptureDevices,
            'SettingsDialog.setVivoxMicVolume':
            self.onSetVivoxMicVolume,
            'SettingsDialog.killDialog':
            self.onDialogClose
        })
        VibroManager.g_instance.onConnect += self.__vm_onConnect
        VibroManager.g_instance.onDisconnect += self.__vm_onDisconnect
        g_guiResetters.add(self.onRecreateDevice)
        BigWorld.wg_setAdapterOrdinalNotifyCallback(self.onRecreateDevice)

    def dispossessUI(self):
        if self.__settingsUI:
            self.__settingsUI.script = None
            self.__settingsUI = None
        self.__altVoiceSetting = None
        self.uiHolder.removeExternalCallbacks(
            SettingsInterface.POPULATE_UI, SettingsInterface.APPLY_SETTINGS,
            SettingsInterface.COMMIT_SETTINGS,
            SettingsInterface.DELAY_SETTINGS,
            SettingsInterface.AUTODETECT_QUALITY,
            'SettingsDialog.useRedifineKeysMode',
            'SettingsDialog.processVivoxTest',
            'SettingsDialog.voiceChatEnable',
            'SettingsDialog.updateCaptureDevices',
            'SettingsDialog.setVivoxMicVolume', 'SettingsDialog.killDialog')
        VibroManager.g_instance.onConnect -= self.__vm_onConnect
        VibroManager.g_instance.onDisconnect -= self.__vm_onDisconnect
        g_guiResetters.discard(self.onRecreateDevice)
        BigWorld.wg_setAdapterOrdinalNotifyCallback(None)
        UIInterface.dispossessUI(self)
        return

    def altVoicesPreview(self, soundMode):
        if not self.__altVoiceSetting.isOptionEnabled():
            return True
        if not g_battleContext.isInBattle:
            SoundGroups.g_instance.enableVoiceSounds(True)
        self.__altVoiceSetting.preview(soundMode)
        return self.__altVoiceSetting.playPreviewSound(
            self.uiHolder.soundManager)

    def isSoundModeValid(self, soundMode):
        self.__altVoiceSetting.preview(soundMode)
        valid = self.__altVoiceSetting.isSoundModeValid()
        self.__altVoiceSetting.revert()
        return valid

    def onSetVivoxMicVolume(self, callbackId, value):
        import VOIP
        if round(SoundGroups.g_instance.getVolume('micVivox') * 100) != value:
            SoundGroups.g_instance.setVolume('micVivox', value / 100)
            VOIP.getVOIPManager().setMicrophoneVolume(int(value))

    def onVoiceChatEnable(self, callbackId, isEnable):
        self.__voiceChatEnable(isEnable)

    def __voiceChatEnable(self, isEnable):
        if isEnable is None:
            return
        else:
            preveVoIP = Settings.g_instance.userPrefs.readBool(
                Settings.KEY_ENABLE_VOIP)
            import VOIP
            if preveVoIP != isEnable:
                VOIP.getVOIPManager().enable(isEnable)
                Settings.g_instance.userPrefs.writeBool(
                    Settings.KEY_ENABLE_VOIP, bool(isEnable))
                from gui.WindowsManager import g_windowsManager
                if g_windowsManager.battleWindow is not None and not isEnable:
                    g_windowsManager.battleWindow.speakingPlayersReset()
                LOG_NOTE('Change state of voip: %s' % str(isEnable))
            return

    def __changeCaptureDevice(self, captureDeviceIdx):
        if captureDeviceIdx is None or captureDeviceIdx == -1:
            return
        else:
            import VOIP
            rh = VOIP.getVOIPManager()
            devices = [
                device.decode(sys.getfilesystemencoding()).encode('utf-8')
                for device in rh.captureDevices
            ]
            if captureDeviceIdx < len(devices):
                newCaptureDevice = devices[captureDeviceIdx]
                previousDevice = Settings.g_instance.userPrefs.readString(
                    Settings.KEY_VOIP_DEVICE)
                if previousDevice != newCaptureDevice:
                    Settings.g_instance.userPrefs.writeString(
                        Settings.KEY_VOIP_DEVICE, newCaptureDevice)
                    LOG_NOTE('Change device of voip: %s' %
                             str(newCaptureDevice))
            return

    def onUseRedifineKeyMode(self, callbackId, isUse):
        if self.__enableRedefineKeysMode:
            BigWorld.wg_setRedefineKeysMode(isUse)

    def onProcessVivoxTest(self, callbackId, isStart):
        LOG_DEBUG('Vivox test: %s' % str(isStart))
        import VOIP
        rh = VOIP.getVOIPManager()
        rh.enterTestChannel() if isStart else rh.leaveTestChannel()
        self.respond([callbackId, False])

    def __vm_onConnect(self):
        self.call('SettingsDialog.VibroManager.Connect')

    def __vm_onDisconnect(self):
        self.call('SettingsDialog.VibroManager.Disconnect')

    def __getVideoSettings(self):
        settings = {}
        settings['monitor'] = {
            'current': self.resolutions.monitorIndex,
            'real': self.resolutions.realMonitorIndex,
            'options': self.resolutions.monitorsList
        }
        settings['fullScreen'] = not self.resolutions.isVideoWindowed
        settings['windowSize'] = {
            'current': self.resolutions.windowSizeIndex,
            'options': self.resolutions.windowSizesList
        }
        settings['resolution'] = {
            'current': self.resolutions.videoModeIndex,
            'options': self.resolutions.videoModesList
        }
        return settings

    def __getSettings(self):
        settings = [self.graphicsPresets.getGraphicsPresetsData()]
        import VOIP
        rh = VOIP.getVOIPManager()
        g_windowsStoredData.start()
        vManager = VibroManager.g_instance
        vEffGroups = vManager.getGroupsSettings()
        vEffDefGroup = VibroManager.VibroManager.GroupSettings()
        vEffDefGroup.enabled = False
        vEffDefGroup.gain = 0
        markers = {
            'enemy': g_settingsCore.getSetting('enemy'),
            'dead': g_settingsCore.getSetting('dead'),
            'ally': g_settingsCore.getSetting('ally')
        }
        config = {
            'locale':
            getClientOverride(),
            'aspectRatio': {
                'current': self.resolutions.aspectRatioIndex,
                'options': self.resolutions.aspectRatiosList
            },
            'vertSync':
            self.resolutions.isVideoVSync,
            'tripleBuffered':
            self.resolutions.isTripleBuffered,
            'multisampling': {
                'current': self.resolutions.multisamplingTypeIndex,
                'options': self.resolutions.multisamplingTypesList
            },
            'customAA': {
                'current': self.resolutions.customAAModeIndex,
                'options': self.resolutions.customAAModesList
            },
            'gamma':
            self.resolutions.gamma,
            'masterVolume':
            round(SoundGroups.g_instance.getMasterVolume() * 100),
            'musicVolume':
            round(SoundGroups.g_instance.getVolume('music') * 100),
            'voiceVolume':
            round(SoundGroups.g_instance.getVolume('voice') * 100),
            'vehiclesVolume':
            round(SoundGroups.g_instance.getVolume('vehicles') * 100),
            'effectsVolume':
            round(SoundGroups.g_instance.getVolume('effects') * 100),
            'guiVolume':
            round(SoundGroups.g_instance.getVolume('gui') * 100),
            'ambientVolume':
            round(SoundGroups.g_instance.getVolume('ambient') * 100),
            'masterVivoxVolume':
            round(SoundGroups.g_instance.getVolume('masterVivox') * 100),
            'micVivoxVolume':
            round(SoundGroups.g_instance.getVolume('micVivox') * 100),
            'masterFadeVivoxVolume':
            round(SoundGroups.g_instance.getVolume('masterFadeVivox') * 100),
            'captureDevice':
            self.__getCaptureDeviceSettings(),
            'voiceChatNotSupported':
            rh.vivoxDomain == '' or not VoiceChatInterface.g_instance.ready,
            'datetimeIdx':
            g_settingsCore.serverSettings.getGameSetting('datetimeIdx', 2),
            'enableOlFilter':
            g_settingsCore.getSetting('enableOlFilter'),
            'enableSpamFilter':
            g_settingsCore.getSetting('enableSpamFilter'),
            'enableStoreChatMws':
            g_settingsCore.getSetting('enableStoreMws'),
            'enableStoreChatCws':
            g_settingsCore.getSetting('enableStoreCws'),
            'invitesFromFriendsOnly':
            g_settingsCore.getSetting('invitesFromFriendsOnly'),
            'storeReceiverInBattle':
            g_settingsCore.getSetting('storeReceiverInBattle'),
            'dynamicCamera':
            g_settingsCore.getSetting('dynamicCamera'),
            'horStabilizationSnp':
            g_settingsCore.getSetting('horStabilizationSnp'),
            'enableVoIP':
            VOIP.getVOIPManager().channelsMgr.enabled,
            'enablePostMortemEffect':
            g_settingsCore.getSetting('enablePostMortemEffect'),
            'nationalVoices':
            AccountSettings.getSettings('nationalVoices'),
            'isColorBlind':
            AccountSettings.getSettings('isColorBlind'),
            'useServerAim':
            g_settingsCore.getSetting('useServerAim'),
            'showVehiclesCounter':
            g_settingsCore.getSetting('showVehiclesCounter'),
            'minimapAlpha':
            g_settingsCore.getSetting('minimapAlpha'),
            'vibroIsConnected':
            vManager.connect(),
            'vibroGain':
            vManager.getGain() * 100,
            'vibroEngine':
            vEffGroups.get('engine', vEffDefGroup).gain * 100,
            'vibroAcceleration':
            vEffGroups.get('acceleration', vEffDefGroup).gain * 100,
            'vibroShots':
            vEffGroups.get('shots', vEffDefGroup).gain * 100,
            'vibroHits':
            vEffGroups.get('hits', vEffDefGroup).gain * 100,
            'vibroCollisions':
            vEffGroups.get('collisions', vEffDefGroup).gain * 100,
            'vibroDamage':
            vEffGroups.get('damage', vEffDefGroup).gain * 100,
            'vibroGUI':
            vEffGroups.get('gui', vEffDefGroup).gain * 100,
            'ppShowLevels':
            g_settingsCore.getSetting('ppShowLevels'),
            'ppShowTypes':
            AccountSettings.getSettings('players_panel')['showTypes'],
            'replayEnabled':
            g_settingsCore.getSetting('replayEnabled'),
            'fpsPerfomancer':
            g_settingsCore.getSetting('fpsPerfomancer'),
            'arcade': {
                'values':
                g_settingsCore.options.getSetting(
                    'arcade').toAccountSettings(),
                'options':
                SettingsInterface.CURSOR_VALUES
            },
            'sniper': {
                'values':
                g_settingsCore.options.getSetting(
                    'sniper').toAccountSettings(),
                'options':
                SettingsInterface.SNIPER_VALUES
            },
            'markers': {
                'values': markers,
                'options': SettingsInterface.MARKER_VALUES,
                'types': SettingsInterface.MARKER_TYPES
            }
        }
        if self.__altVoiceSetting.isOptionEnabled():
            altVoices = []
            for idx, desc in enumerate(self.__altVoiceSetting.getOptions()):
                altVoices.append({'data': idx, 'label': desc})

            config['alternativeVoices'] = {
                'current': self.__altVoiceSetting.get(),
                'options': altVoices
            }
        gameplayMask = gameplay_ctx.getMask()
        for name in ArenaType.g_gameplayNames:
            key = self.GAMEPLAY_KEY_FORMAT.format(name)
            bit = ArenaType.getVisibilityMask(
                ArenaType.getGameplayIDForName(name))
            config[key] = gameplayMask & bit > 0

        settings.append(config)
        if not LogitechMonitor.isPresentColor():
            if self.KEYBOARD_MAPPING_BLOCKS.has_key('logitech_keyboard'):
                del self.KEYBOARD_MAPPING_BLOCKS['logitech_keyboard']
        else:
            self.KEYBOARD_MAPPING_BLOCKS['logitech_keyboard'] = (
                'switch_view', )
        cmdMap = CommandMapping.g_instance
        defaults = cmdMap.getDefaults()
        keyboard = []
        for group_name in self.KEYBOARD_MAPPING_BLOCKS_ORDER:
            if group_name in self.KEYBOARD_MAPPING_BLOCKS.keys():
                group = {'id': group_name, 'commands': []}
                keyboard.append(group)
                for key_setting in self.KEYBOARD_MAPPING_BLOCKS[group_name]:
                    command = cmdMap.getCommand(
                        self.KEYBOARD_MAPPING_COMMANDS[group_name]
                        [key_setting])
                    keyCode = cmdMap.get(
                        self.KEYBOARD_MAPPING_COMMANDS[group_name]
                        [key_setting])
                    defaultCode = defaults[command] if defaults.has_key(
                        command) else 0
                    key = {
                        'id': key_setting,
                        'command': command,
                        'key': getScaleformKey(keyCode),
                        'keyDefault': getScaleformKey(defaultCode)
                    }
                    group['commands'].append(key)

        settings.append(keyboard)
        mouse = {}
        player = BigWorld.player()
        if hasattr(player.inputHandler, 'ctrls'):
            for key, path in SettingsInterface.MOUSE_KEYS['ingame'].items():
                if key == 'horInvert':
                    value = g_settingsCore.getSetting('mouseHorzInvert')
                elif key == 'vertInvert':
                    value = g_settingsCore.getSetting('mouseVertInvert')
                elif key == 'backDraftInvert':
                    value = g_settingsCore.getSetting('backDraftInvert')
                else:
                    value = player.inputHandler.ctrls[
                        path[0]].camera.getUserConfigValue(path[1])
                mouse[key] = {
                    'defaultValue':
                    SettingsInterface.MOUSE_KEYS['default'][key],
                    'value': value
                }

        else:
            ds = Settings.g_instance.userPrefs[Settings.KEY_CONTROL_MODE]
            for key, path in SettingsInterface.MOUSE_KEYS['lobby'].items():
                default = SettingsInterface.MOUSE_KEYS['default'][key]
                value = default
                if key == 'horInvert':
                    value = g_settingsCore.getSetting('mouseHorzInvert')
                elif key == 'vertInvert':
                    value = g_settingsCore.getSetting('mouseVertInvert')
                elif key == 'backDraftInvert':
                    value = g_settingsCore.getSetting('backDraftInvert')
                elif ds is not None:
                    if path[2] == 'float':
                        value = ds[path[0]].readFloat(path[1], default)
                    elif path[2] == 'bool':
                        value = ds[path[0]].readBool(path[1], default)
                    else:
                        LOG_DEBUG('Unknown mouse settings type %s %s' %
                                  (key, path))
                mouse[key] = {'defaultValue': default, 'value': value}

        settings.append(mouse)
        g_windowsStoredData.stop()
        return settings

    def __getCaptureDeviceSettings(self):
        import VOIP
        rh = VOIP.getVOIPManager()
        devices = [
            device.decode(sys.getfilesystemencoding()).encode('utf-8')
            for device in rh.captureDevices
        ]
        currentDeviceName = Settings.g_instance.userPrefs.readString(
            Settings.KEY_VOIP_DEVICE)
        currentCaptureDeviceIdx = -1
        try:
            currentCaptureDeviceIdx = devices.index(currentDeviceName)
        except:
            try:
                currentCaptureDeviceIdx = rh.captureDevices.index(
                    rh.currentCaptureDevice)
            except:
                pass

        settings = {'current': currentCaptureDeviceIdx, 'options': devices}
        return settings

    def onUpdateCaptureDevices(self, callbackId):
        self.__updateCaptureDevices()

    @process
    def __updateCaptureDevices(self):
        Waiting.show('__updateCaptureDevices')
        devices = yield VoiceChatInterface.g_instance.requestCaptureDevices()
        currentDeviceName = Settings.g_instance.userPrefs.readString(
            Settings.KEY_VOIP_DEVICE)
        currentCaptureDeviceIdx = -1
        try:
            currentCaptureDeviceIdx = devices.index(currentDeviceName)
        except Exception:
            try:
                import VOIP
                currentCaptureDeviceIdx = devices.index(
                    VOIP.getVOIPManager().currentCaptureDevice)
            except Exception:
                pass

        value = [currentCaptureDeviceIdx]
        value.extend([
            d.decode(sys.getfilesystemencoding()).encode('utf-8')
            for d in devices
        ])
        Waiting.hide('__updateCaptureDevices')
        self.call('SettingsDialog.updateCaptureDevices', value)

    def onRecreateDevice(self):
        if self.__settingsUI:
            if self.__currentSettings and self.__currentSettings != self.__getVideoSettings(
            ):
                self.__currentSettings = self.__getVideoSettings()
                self.__settingsUI.buildGraphicsData(self.__getVideoSettings())

    def onAutodetectSettings(self, callbackID):
        presetIndex = BigWorld.autoDetectGraphicsSettings()
        self.call('SettingsDialog.setPreset', [presetIndex])

    def onPopulateUI(self, *args):
        self.graphicsPresets.checkCurrentPreset(True)
        self.__currentSettings = self.__getVideoSettings()
        VoiceChatInterface.g_instance.processFailedMessage()
        if self.__settingsUI:
            self.__settingsUI.script = None
            self.__settingsUI = None
        settingsDialogName = args[1]
        self.__settingsUI = self.uiHolder.getMember(settingsDialogName)
        if self.__settingsUI:
            settings = self.__getSettings()
            self.__settingsUI.buildData(settings[0], settings[1], settings[2],
                                        settings[3])
            self.__settingsUI.buildGraphicsData(self.__getVideoSettings())
            self.__settingsUI.script = self
        else:
            LOG_ERROR(
                'settingsDialog is not found in flash by name {0}'.format(
                    settingsDialogName))
        return

    def onApplySettings(self, callbackId, settings):
        monitorIndex, presetIndex, settingsList, fullscreen = settings
        if (not self.resolutions.isVideoWindowed or fullscreen) and (
                monitorIndex != self.resolutions.realMonitorIndex
                or self.resolutions.monitorChanged):
            self.call('SettingsDialog.ApplySettings', ['restartNeeded'])
            return
        applyPresets = self.graphicsPresets.checkApplyGraphicsPreset(
            int(presetIndex), settingsList)
        self.call('SettingsDialog.ApplySettings', [applyPresets])

    def onDelaySettings(self, *args):
        self.apply(False, *args)

    def onCommitSettings(self, *args):
        self.apply(True, *args)

    def apply(self, restartApproved, callbackId, settings):
        restartClient = False
        import VOIP
        ppSettings = dict(AccountSettings.getSettings('players_panel'))
        ppSettings['showTypes'] = settings['ppShowTypes']
        if (not self.resolutions.isVideoWindowed or settings['fullScreen']
            ) and (settings['monitor'] != self.resolutions.realMonitorIndex
                   or self.resolutions.monitorChanged):
            restartClient = True
        AccountSettings.setSettings('players_panel', ppSettings)
        g_settingsCore.applySetting('ppShowLevels', settings['ppShowLevels'])
        g_settingsCore.applySetting('replayEnabled', settings['replayEnabled'])
        g_settingsCore.applySetting('fpsPerfomancer',
                                    settings['fpsPerfomancer'])
        AccountSettings.setSettings('nationalVoices',
                                    settings['nationalVoices'])
        AccountSettings.setSettings('isColorBlind', settings['isColorBlind'])
        g_settingsCore.applySetting('useServerAim', settings['useServerAim'])
        g_settingsCore.applySetting('showVehiclesCounter',
                                    settings['showVehiclesCounter'])
        g_settingsCore.applySetting('minimapAlpha', settings['minimapAlpha'])
        arcade = g_settingsCore.options.getSetting(
            'arcade').fromAccountSettings(settings['arcade'])
        sniper = g_settingsCore.options.getSetting(
            'sniper').fromAccountSettings(settings['sniper'])
        g_settingsCore.applySetting('arcade', arcade)
        g_settingsCore.applySetting('sniper', sniper)
        g_settingsCore.applySetting('enemy', settings['markers']['enemy'])
        g_settingsCore.applySetting('dead', settings['markers']['dead'])
        g_settingsCore.applySetting('ally', settings['markers']['ally'])
        g_settingsCore.applySetting('dynamicCamera', settings['dynamicCamera'])
        g_settingsCore.applySetting('horStabilizationSnp',
                                    settings['horStabilizationSnp'])
        if self.__altVoiceSetting.isOptionEnabled():
            altVoices = settings.get('alternativeVoices')
            if altVoices is not None:
                self.__altVoiceSetting.apply(altVoices)
        vManager = VibroManager.g_instance
        vManager.setGain(settings['vibroGain'] / 100.0)
        vEffGroups = vManager.getGroupsSettings()
        for groupName, newValue in [
            ('engine', settings['vibroEngine']),
            ('acceleration', settings['vibroAcceleration']),
            ('shots', settings['vibroShots']), ('hits', settings['vibroHits']),
            ('collisions', settings['vibroCollisions']),
            ('damage', settings['vibroDamage']), ('gui', settings['vibroGUI'])
        ]:
            if groupName in vEffGroups:
                vEffGroups[groupName].gain = newValue / 100.0
                vEffGroups[groupName].enabled = newValue > 0

        vManager.setGroupsSettings(vEffGroups)
        self.__voiceChatEnable(settings['enableVoIP'])
        self.__changeCaptureDevice(settings[Settings.KEY_VOIP_DEVICE])
        g_settingsCore.applySetting('enablePostMortemEffect',
                                    settings['enablePostMortemEffect'])
        self.uiHolder.clearCommands()
        keyboard = settings['controls']['keyboard']
        keyboardMapping = {}
        keysLayout = dict(
            g_settingsCore.options.getSetting('keyboard').KEYS_LAYOUT)
        layout = list(itertools.chain(*keysLayout.values()))
        for i in xrange(len(self.KEYBOARD_MAPPING_BLOCKS)):
            group_name = keyboard[i]['id']
            for j in xrange(len(self.KEYBOARD_MAPPING_BLOCKS[group_name])):
                key_name = keyboard[i]['commands'][j]['id']
                value = keyboard[i]['commands'][j]['key']
                cmd = self.KEYBOARD_MAPPING_COMMANDS[group_name][key_name]
                for item in layout:
                    key, command = item[0], item[1]
                    if command == cmd:
                        keyboardMapping[key] = value
                        break

        g_settingsCore.applySetting('keyboard', keyboardMapping)
        self.uiHolder.bindCommands()
        player = BigWorld.player()
        mouse = settings['controls']['mouse']
        if hasattr(player.inputHandler, 'ctrls'):
            player.inputHandler.ctrls['arcade'].camera.setUserConfigValue(
                'sensitivity', mouse['arcadeSens']['value'])
            player.inputHandler.ctrls['sniper'].camera.setUserConfigValue(
                'sensitivity', mouse['sniperSens']['value'])
            player.inputHandler.ctrls['strategic'].camera.setUserConfigValue(
                'sensitivity', mouse['artSens']['value'])
        else:
            ds = Settings.g_instance.userPrefs[Settings.KEY_CONTROL_MODE]
            if ds:
                ds['arcadeMode/camera'].writeFloat(
                    'sensitivity', mouse['arcadeSens']['value'])
                ds['sniperMode/camera'].writeFloat(
                    'sensitivity', mouse['sniperSens']['value'])
                ds['strategicMode/camera'].writeFloat(
                    'sensitivity', mouse['artSens']['value'])
        g_settingsCore.applySetting('mouseHorzInvert',
                                    bool(mouse['horInvert']['value']))
        g_settingsCore.applySetting('mouseVertInvert',
                                    bool(mouse['vertInvert']['value']))
        g_settingsCore.applySetting('backDraftInvert',
                                    bool(mouse['backDraftInvert']['value']))
        self.resolutions.applyChanges(
            settings['fullScreen'], settings['vertSync'],
            settings['tripleBuffered'], settings['windowSize']
            if not settings['fullScreen'] else settings['resolution'],
            settings['aspectRatio'], settings['multisampling'],
            settings['customAA'], settings['gamma'], settings['monitor'])
        if round(SoundGroups.g_instance.getVolume('masterVivox') *
                 100) != settings['masterVivoxVolume']:
            VOIP.getVOIPManager().setMasterVolume(
                settings['masterVivoxVolume'])
        if round(SoundGroups.g_instance.getVolume('micVivox') *
                 100) != settings['micVivoxVolume']:
            VOIP.getVOIPManager().setMicrophoneVolume(
                settings['micVivoxVolume'])
        SoundGroups.g_instance.setMasterVolume(
            float(settings['masterVolume']) / 100)
        SoundGroups.g_instance.setVolume('music',
                                         float(settings['musicVolume']) / 100)
        SoundGroups.g_instance.setVolume('voice',
                                         float(settings['voiceVolume']) / 100)
        SoundGroups.g_instance.setVolume(
            'vehicles',
            float(settings['vehiclesVolume']) / 100)
        SoundGroups.g_instance.setVolume(
            'effects',
            float(settings['effectsVolume']) / 100)
        SoundGroups.g_instance.setVolume('gui',
                                         float(settings['guiVolume']) / 100)
        SoundGroups.g_instance.setVolume(
            'ambient',
            float(settings['ambientVolume']) / 100)
        SoundGroups.g_instance.setVolume(
            'masterVivox',
            float(settings['masterVivoxVolume']) / 100)
        SoundGroups.g_instance.setVolume(
            'micVivox',
            float(settings['micVivoxVolume']) / 100)
        SoundGroups.g_instance.setVolume(
            'masterFadeVivox',
            float(settings['masterFadeVivoxVolume']) / 100)
        if len(VOIP.getVOIPManager().captureDevices):
            device = VOIP.getVOIPManager().captureDevices[0]
            if len(VOIP.getVOIPManager().captureDevices
                   ) > settings['captureDevice']:
                device = VOIP.getVOIPManager().captureDevices[
                    settings['captureDevice']]
            VOIP.getVOIPManager().setCaptureDevice(device)
        g_settingsCore.applySetting('showDateMessage',
                                    settings['datetimeIdx'] & 1)
        g_settingsCore.applySetting('showTimeMessage',
                                    settings['datetimeIdx'] & 2)
        g_settingsCore.applySetting('enableOlFilter',
                                    settings['enableOlFilter'])
        g_settingsCore.applySetting('enableSpamFilter',
                                    settings['enableSpamFilter'])
        g_windowsStoredData.start()
        g_settingsCore.applySetting('enableStoreMws',
                                    settings['enableStoreChatMws'])
        g_settingsCore.applySetting('enableStoreCws',
                                    settings['enableStoreChatCws'])
        g_windowsStoredData.stop()
        g_settingsCore.applySetting('invitesFromFriendsOnly',
                                    settings['invitesFromFriendsOnly'])
        g_settingsCore.applySetting('storeReceiverInBattle',
                                    settings['storeReceiverInBattle'])
        gameplayKeys = filter(
            lambda item: item.startswith(self.GAMEPLAY_PREFIX) and bool(
                settings[item]), settings.keys())
        prefixLen = len(self.GAMEPLAY_PREFIX)
        gameplay_ctx.setMaskByNames(
            map(lambda key: str(key[prefixLen:]), gameplayKeys))
        qualitySettings = settings['quality']
        applyPresets = self.graphicsPresets.checkApplyGraphicsPreset(
            int(settings['graphicsQuality']), qualitySettings)
        if applyPresets:
            self.graphicsPresets.applyGraphicsPresets(
                int(settings['graphicsQuality']), qualitySettings)
            if applyPresets == 'restartNeeded':
                BigWorld.commitPendingGraphicsSettings()
                restartClient = True
            elif applyPresets == 'hasPendingSettings':
                BigWorld.commitPendingGraphicsSettings()
        g_settingsCore.applyStorages()
        g_postProcessing.refresh()
        if restartClient:
            BigWorld.savePreferences()
            if restartApproved:
                from BattleReplay import g_replayCtrl
                if g_replayCtrl.isPlaying and g_replayCtrl.playbackSpeed == 0:
                    g_replayCtrl.setPlaybackSpeedIdx(5)
                BigWorld.callback(0.3, BigWorld.restartGame)
            else:
                BigWorld.callback(
                    0.0,
                    partial(BigWorld.changeVideoMode, -1,
                            BigWorld.isVideoWindowed()))
        return

    def onDialogClose(self, _):
        if self.__altVoiceSetting.isOptionEnabled():
            self.__altVoiceSetting.revert()
        if not g_battleContext.isInBattle:
            SoundGroups.g_instance.enableVoiceSounds(False)
        elif hasattr(BigWorld.player(), 'vehicle'):
            SoundGroups.g_instance.soundModes.setCurrentNation(nations.NAMES[
                BigWorld.player().vehicle.typeDescriptor.type.id[0]])
        g_settingsCore.clearStorages()
        if self.__settingsUI:
            self.__settingsUI.script = None
            self.__settingsUI = None
        return