Exemplo n.º 1
0
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'])
Exemplo n.º 2
0
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