def select_joy(player, button): # Show key alert g.screen.blit(i['joy_alert'], [12, 73]) # Show title with button name f = font.render("Set " + button + " button", [255, 255, 255], [0, 0, 0]) f_size = f.get_size() g.screen.blit(f, [g.screen_size[0] / 2 - f_size[0] / 2, 80]) # Update screen g.flip() # Some vars for timer start_time = time.time() total = 5 diff = 0 # Wait 5 secs, while listenning to events while diff <= total: # Show timer f = font.render( str(total - int(diff)) + " seconds left", [255, 255, 255], [0, 0, 0]) f_size = f.get_size() g.screen.blit(f, [g.screen_size[0] / 2 - f_size[0] / 2, 124]) # Update screen g.flip() # Calculate timer difference diff = (time.time() - start_time) # Get all events e.update() for event in e.retrieve_events(): # A key was pressed, save it ! if event.type == e.X360_CNTRL_DOWN and event.joy == e.CONFIG[ 'p' + player]['controller']: print(event.joy, e.CONFIG['p' + player]['controller']) # Stop loop diff = total + 1 # Save key number in data data.d['config']['controls'][ 'p' + player]['joystick'][button] = event.button print("CONFIG: New " + button + " joy for p" + player + ": " + event.button) # Apply config in event module e.apply_config(data.d['config']['controls'])
def loop(onclose): global CURRENT, options, keynames, arrow_pos # Useful vars current_part = options[CURRENT['part']] current_item = current_part['items'][CURRENT['item']] # Encountered keys for matching duplicates encountered_keys = [] # skip item if item is separator or text (useful for default selected seps) while current_item['type'] == "separator" or current_item['type'] == "text": CURRENT['item'] += 1 if CURRENT['item'] >= len(current_part['items']): CURRENT['item'] = 0 current_item = current_part['items'][CURRENT['item']] # Event for event in e.retrieve_events(): # Controller button if event.type == e.CNTLR_KEYDOWN: # B goes back if event.btn_global == e.BTN_B: if current_part['back'] != False: CURRENT['part'] = current_part['back'] # Do part init if needed if 'on_open' in options[CURRENT['part']]: options[CURRENT['part']]['on_open']() # Get part (updated by init) current_part = options[CURRENT['part']] else: CURRENT['part'] = "MAIN" onclose() CURRENT['item'] = 0 s['back'].play() # Select next option elif event.btn_global == e.BTN_DOWN: # Start scroll + avoid separators done_1_time = False while current_item['type'] == "separator" or current_item[ 'type'] == "text" or not done_1_time: # Set we done scroll 1 time done_1_time = True # Update current selected item CURRENT['item'] += 1 if CURRENT['item'] >= len(current_part['items']): CURRENT['item'] = 0 current_item = current_part['items'][CURRENT['item']] # Reset arrow animation :D arrow_pos = 0 s['move'].play() # Select prev option elif event.btn_global == e.BTN_UP: # Start scroll + avoid separators done_1_time = False while current_item['type'] == "separator" or current_item[ 'type'] == "text" or not done_1_time: # Set we done scroll 1 time done_1_time = True # Update current selected item CURRENT['item'] -= 1 if CURRENT['item'] < 0: CURRENT['item'] = len(current_part['items']) - 1 current_item = current_part['items'][CURRENT['item']] # Reset arrow animation :D arrow_pos = 0 s['move'].play() # Current option selected elif event.btn_global == e.BTN_A: if current_item['type'] == "link": old_back = current_part['back'] if current_item['goto'] == "#CLOSE#": CURRENT['part'] = "MAIN" onclose() else: CURRENT['part'] = current_item['goto'] # Do part init if needed if 'on_open' in options[CURRENT['part']]: options[CURRENT['part']]['on_open']() # Get part (updated by init) current_part = options[CURRENT['part']] CURRENT['item'] = 0 if old_back == CURRENT['part']: s['back'].play() else: s['select'].play() elif current_item['type'] == "button": current_item['function']() s['select'].play() elif current_item['type'] == "keyselector": s['select'].play() select_key(current_item['player'], current_item['button']) s['select'].play() elif current_item['type'] == "joyselector": s['select'].play() select_joy(current_item['player'], current_item['button']) s['select'].play() # Left value on selectors elif event.btn_global == e.BTN_LEFT: if current_item['type'] == "selector": # Update current selected item current_item['selected'] -= 1 if current_item['selected'] < 0: current_item['selected'] = len( current_item['values']) - 1 # Do on_change event if needed if 'on_change' in current_item: current_item['on_change'](current_item['values'][ current_item['selected']]['value']) s['move'].play() # Right value on selectors elif event.btn_global == e.BTN_RIGHT: if current_item['type'] == "selector": # Update current selected item current_item['selected'] += 1 if current_item['selected'] >= len(current_item['values']): current_item['selected'] = 0 # Do on_change event if needed if 'on_change' in current_item: current_item['on_change'](current_item['values'][ current_item['selected']]['value']) s['move'].play() # Show current page title centered title = font.render(current_part['title'], [255, 255, 255], [0, 0, 0]) g.screen.blit(title, [g.screen_size[0] / 2 - title.get_size()[0] / 2, 8]) # Offsets offset = 39 margin = 9 # Iterating through all items for index, item in enumerate(current_part['items']): # Link = goes to a new page if item['type'] == "link" or item['type'] == "button" or item[ 'type'] == "text": # Link name f = font.render(item['name'], [255, 255, 255], [0, 0, 0]) f_size = f.get_size() g.screen.blit(f, [236 - f_size[0], offset]) # Arrow if CURRENT['item'] == index: g.screen.blit(i['right'], [int(241 + 5 * arrow_pos), offset + 3]) # Set next item position offset += f_size[1] + margin # A blank separator elif item['type'] == "separator": # Draw a little line f = font.render("-", [255, 255, 255], [0, 0, 0]) f_size = f.get_size() g.screen.blit(f, [236 - f_size[0], offset]) # Set next item position offset += f_size[1] + margin # Used to selct a key # This item is on the left with a label elif item['type'] == "keyselector": # BTN NAME f = font.render(item['button'], [255, 255, 255], [0, 0, 0]) f_size = f.get_size() g.screen.blit(f, [16, offset]) # KEY NAME key = e.CONFIG['p' + item['player']]['keyboard'][item['button']] if key in keynames: name = keynames[key] else: name = "[?]" # Set background background = [0, 0, 0] if key in encountered_keys: background = [255, 0, 0] else: encountered_keys.append(key) f = font.render(name, [255, 255, 255], background) f_size = f.get_size() g.screen.blit(f, [236 - f_size[0], offset]) # Cursor if CURRENT['item'] == index: g.screen.blit(i['right'], [int(241 + 5 * arrow_pos), offset + 3]) offset += f_size[1] + margin # Joystick key selector # On the right, next to keyselector items elif item['type'] == "joyselector": # BTN NAME f = font.render(item['button'], [255, 255, 255], [0, 0, 0]) f_size = f.get_size() g.screen.blit(f, [16, offset]) # KEY NAME name = e.CONFIG['p' + item['player']]['joystick'][item['button']] if name in x360_cntrl_buttons: sprite = octopg.util.crop_surf(i['x360_cntrl_buttons'], x360_cntrl_buttons[name]) pos = [236 - x360_cntrl_buttons[name][2], offset] else: sprite = font.render("[?]", [255, 255, 255], [0, 0, 0]) f_size = sprite.get_size() pos = [236 - f_size[0], offset] g.screen.blit(sprite, pos) # Cursor if CURRENT['item'] == index: g.screen.blit(i['right'], [int(241 + 5 * arrow_pos), offset + 3]) offset += f_size[1] + margin # A selector = choose in a set of values elif item['type'] == "selector": f = font.render(item['name'], [255, 255, 255], [0, 0, 0]) f_size = f.get_size() g.screen.blit(f, [16, offset]) f = font.render(item['values'][item['selected']]['name'], [255, 255, 255], [0, 0, 0]) f_size = f.get_size() g.screen.blit(f, [236 - f_size[0], offset]) if CURRENT['item'] == index: g.screen.blit(i['right'], [int(241 + 5 * arrow_pos), offset + 3]) g.screen.blit( i['left'], [int(226 - f_size[0] - 5 * arrow_pos), offset + 3]) offset += f_size[1] + margin # Arrow animationl if CURRENT['item'] == index: arrow_pos += 0.02 if arrow_pos >= 1: arrow_pos = 0 # TODO: # commenting # cleaning up code # mark duplicates in keyboard/controller configuration # a better ui? # customizable? # disallow controller configuration when no controller selected