class TextCell(Cell): def __init__(self, app, row, column): super(TextCell, self).__init__(app, row, column) textAlign = self.styleGet('textAlign') self.textElement = TextElement( self.app, '', self.styleGet('font'), Location(CellAttachedPoint((0, 0), self, textAlign), textAlign), colour=self.styleGet('foreColour')) self.elements = [self.textElement] self._oldText = '' def setText(self, text): if text != self._oldText: self.textElement.setText(text) self._styleChanged = True self._oldText = text def _update(self): self.textElement.setFont(self.styleGet('font')) self.textElement.setColour(self.styleGet('foreColour')) textAlign = self.styleGet('textAlign') self.textElement.pos.anchor = textAlign self.textElement.pos.point.attachedAt = textAlign self.textElement.setShadow(self.styleGet('hasShadow')) self.textElement.setShadowColour(self.styleGet('shadowColour'))
class KeymapTab(Tab): def __init__(self, app, onClose=None): super(KeymapTab, self).__init__(app, 'Controls') self.font = app.screenManager.fonts.bigMenuFont self.onClose = Event() if onClose is not None: self.onClose.addListener(onClose) # Break things up into categories movement = ['jump', 'down', 'left', 'right'] menus = ['menu', 'more actions'] actions = [ 'respawn', 'select upgrade', 'activate upgrade', 'change nickname', 'ready' ] misc = ['chat', 'follow'] upgrades = [ upgradeClass.action for upgradeClass in sorted( allUpgrades, key=lambda upgradeClass: upgradeClass.order) ] upgrades.append('no upgrade') display = ['leaderboard', 'toggle interface', 'toggle terminal'] actionNames = { 'select upgrade': 'Select upgrade', 'activate upgrade': 'Activate upgrade', 'change nickname': 'Change nickname', 'chat': 'Chat', 'down': 'Drop down', 'follow': 'Auto pan (replay)', 'jump': 'Jump', 'leaderboard': 'Show leaderboard', 'left': 'Move left', 'menu': 'Main menu', 'more actions': 'Advanced', 'no upgrade': 'Deselect upgrade', 'ready': 'Toggle ready', 'respawn': 'Respawn', 'right': 'Move right', 'status bar': 'Status bar', 'timer': 'Show timer', 'toggle interface': 'Toggle HUD', 'toggle terminal': 'Toggle terminal', 'zone progress': 'Show zone bar', } actionNames.update((upgradeClass.action, upgradeClass.name) for upgradeClass in allUpgrades) # Organise the categories by column self.layout = [ [movement, menus], [actions, display], [upgrades, misc], ] self.errorInfo = TextElement(self.app, '', self.font, ScaledLocation(512, 580, 'center')) self.text = [self.errorInfo] self.inputLookup = {} xPos = 190 # Lay everything out automatically. keymapFont = self.app.screenManager.fonts.keymapFont keymapInputFont = self.app.screenManager.fonts.keymapInputFont for column in self.layout: # Each column yPos = 200 for category in column: # Each category for action in category: # Each action # Draw action name (eg. Respawn) self.text.append( TextElement(self.app, actionNames[action], keymapFont, ScaledLocation(xPos, yPos + 6, 'topright'), self.app.theme.colours.headingColour)) # Create input box box = prompt.KeycodeBox(self.app, ScaledArea(xPos + 10, yPos, 100, 30), font=keymapInputFont) box.onClick.addListener(self.setFocus) box.onChange.addListener(self.inputChanged) box.__action = action self.inputLookup[action] = box yPos += 35 # Between items yPos += 35 # Between categories xPos += 320 # Between columns self.elements = self.text + self.inputLookup.values() + [ button(app, 'restore default controls', self.restoreDefaults, (0, -125), 'midbottom', secondColour=app.theme.colours.white), button(app, 'save', self.saveSettings, (-100, -75), 'midbottom', secondColour=app.theme.colours.white), button(app, 'cancel', self.cancel, (100, -75), 'midbottom', secondColour=app.theme.colours.white), ] self.populateInputs() def inputChanged(self, box): # Remove the old key. try: oldKey = self.keyMapping.getkey(box.__action) except KeyError: pass else: del self.keyMapping[oldKey] # Set the new key. self.keyMapping[box.value] = box.__action # Refresh the display. self.refreshInputs() def populateInputs(self): # Set up the keyboard mapping. self.keyMapping = keyboard.KeyboardMapping(keymap.default_game_keys) try: # Try to load keyboard mappings from the user's personal settings. config = open(getPath(user, 'keymap'), 'rU').read() self.keyMapping.load(config) except IOError: pass # Refresh the display. self.refreshInputs() def refreshInputs(self): for column in self.layout: for category in column: for action in category: # Get the current key and put it in the box. try: key = self.keyMapping.getkey(action) except KeyError: key = None self.inputLookup[action].value = key # Make the box white self.inputLookup[action].backColour = (255, 255, 255) def restoreDefaults(self): self.keyMapping = keyboard.KeyboardMapping(keymap.default_game_keys) self.refreshInputs() self.incorrectInput( "Default controls restored: press 'save' to " "confirm", (0, 128, 0)) def clearBackgrounds(self): for action in self.inputLookup: self.inputLookup[action].backColour = (255, 255, 255) self.setFocus(None) def saveSettings(self): # Perform the save. open(getPath(user, 'keymap'), 'w').write(self.keyMapping.save()) emptyBoxes = [] for box in self.inputLookup.itervalues(): if box.value is None: emptyBoxes.append(box) if len(emptyBoxes) > 0: self.populateInputs() for box in emptyBoxes: box.backColour = self.app.theme.colours.invalidDataColour self.incorrectInput('Warning: some actions have no key', (192, 0, 0)) else: self.mainMenu() def incorrectInput(self, string, colour): self.errorInfo.setColour(colour) self.errorInfo.setText(string) self.errorInfo.setFont(self.font) def cancel(self): self.populateInputs() self.mainMenu() def mainMenu(self): self.incorrectInput('', (0, 0, 0)) self.clearBackgrounds() self.onClose.execute()
class KeymapTab(Tab): def __init__(self, app, onClose=None): super(KeymapTab, self).__init__(app, 'Controls') self.font = app.screenManager.fonts.bigMenuFont self.onClose = Event() if onClose is not None: self.onClose.addListener(onClose) # Break things up into categories movement = [ ACTION_JUMP, ACTION_DOWN, ACTION_LEFT, ACTION_RIGHT, ACTION_HOOK ] menus = [ACTION_MAIN_MENU, ACTION_MORE_MENU] actions = [ ACTION_UPGRADE_MENU, ACTION_USE_UPGRADE, ACTION_EDIT_PLAYER_INFO, ACTION_READY, ACTION_SHOW_TRAJECTORY, ACTION_EMOTE ] misc = [ACTION_CHAT, ACTION_FOLLOW] upgrades = [ upgradeClass.action for upgradeClass in sorted( allUpgrades, key=lambda upgradeClass: upgradeClass.order) ] upgrades.append(ACTION_CLEAR_UPGRADE) display = [ ACTION_LEADERBOARD_TOGGLE, ACTION_HUD_TOGGLE, ACTION_TERMINAL_TOGGLE ] actionNames = { ACTION_EDIT_PLAYER_INFO: 'Change nick / hat', ACTION_CHAT: 'Chat', ACTION_CLEAR_UPGRADE: 'Deselect upgrade', ACTION_DOWN: 'Drop down', ACTION_FOLLOW: 'Auto pan (replay)', ACTION_HOOK: 'Grappling hook', ACTION_HUD_TOGGLE: 'Toggle HUD', ACTION_JUMP: 'Jump', ACTION_LEADERBOARD_TOGGLE: 'Show leaderboard', ACTION_LEFT: 'Move left', ACTION_MAIN_MENU: 'Main menu', ACTION_MORE_MENU: 'Advanced', ACTION_READY: 'Toggle ready', ACTION_RIGHT: 'Move right', ACTION_TERMINAL_TOGGLE: 'Toggle terminal', ACTION_UPGRADE_MENU: 'Select upgrade', ACTION_USE_UPGRADE: 'Activate upgrade', ACTION_SHOW_TRAJECTORY: 'Show trajectory', ACTION_EMOTE: 'Emote', } actionNames.update((upgradeClass.action, upgradeClass.name) for upgradeClass in allUpgrades) # Organise the categories by column self.layout = [ [movement, menus], [actions, display], [upgrades, misc], ] self.errorInfo = TextElement(self.app, '', self.font, ScaledLocation(512, 580, 'center')) self.text = [self.errorInfo] self.inputLookup = {} xPos = 210 # Lay everything out automatically. keymapFont = self.app.screenManager.fonts.keymapFont keymapInputFont = self.app.screenManager.fonts.keymapInputFont for column in self.layout: # Each column yPos = 200 for category in column: # Each category for action in category: # Each action # Draw action name (eg. Respawn) self.text.append( TextElement(self.app, actionNames[action], keymapFont, ScaledLocation(xPos, yPos + 6, 'topright'), self.app.theme.colours.headingColour)) # Create input box box = prompt.KeycodeBox(self.app, ScaledArea(xPos + 10, yPos, 100, 30), font=keymapInputFont, acceptMouse=True) box.onClick.addListener(self.setFocus) box.onChange.addListener(self.inputChanged) box.__action = action self.inputLookup[action] = box yPos += 35 # Between items yPos += 35 # Between categories xPos += 310 # Between columns self.elements = self.text + list(self.inputLookup.values()) + [ button(app, 'restore default controls', self.restoreDefaults, (0, -125), 'midbottom', secondColour=app.theme.colours.white), button(app, 'save', self.saveSettings, (-100, -75), 'midbottom', secondColour=app.theme.colours.white), button(app, 'cancel', self.cancel, (100, -75), 'midbottom', secondColour=app.theme.colours.white), ] self.populateInputs() def inputChanged(self, box): # Remove the old key. try: oldKey = self.keyMapping.getkey(box.__action) except KeyError: pass else: del self.keyMapping[oldKey] # Set the new key. self.keyMapping[box.value] = box.__action # Refresh the display. self.refreshInputs() def populateInputs(self): # Set up the keyboard mapping. self.keyMapping = keyboard.KeyboardMapping(keymap.default_game_keys) try: # Try to load keyboard mappings from the user's personal settings. with open(getPath(user, 'keymap'), 'r') as f: config = f.read() self.keyMapping.load(config) except IOError: pass # Refresh the display. self.refreshInputs() def refreshInputs(self): for column in self.layout: for category in column: for action in category: # Get the current key and put it in the box. try: key = self.keyMapping.getkey(action) except KeyError: key = None self.inputLookup[action].value = key # Make the box white self.inputLookup[action].backColour = (255, 255, 255) def restoreDefaults(self): self.keyMapping = keyboard.KeyboardMapping(keymap.default_game_keys) self.refreshInputs() self.showMessage( "Default controls restored: press 'save' to " "confirm", (0, 128, 0)) def clearBackgrounds(self): for action in self.inputLookup: self.inputLookup[action].backColour = (255, 255, 255) self.setFocus(None) def saveSettings(self): # Perform the save. open(getPath(user, 'keymap'), 'w').write(self.keyMapping.save()) self.mainMenu() def showMessage(self, string, colour): self.errorInfo.setColour(colour) self.errorInfo.setText(string) self.errorInfo.setFont(self.font) def cancel(self): self.populateInputs() self.mainMenu() def mainMenu(self): self.showMessage('', (0, 0, 0)) self.clearBackgrounds() self.onClose.execute()