예제 #1
0
def load_md_buttons(page: Optional[int] = None) -> None:
    """
    Reads the buttons configured for use with MaterialDeck and sends willAppear events.
    """
    if _deck_id not in deck_api.state:
        return

    if page is None:
        page = deck_api.get_page(_deck_id)

    button_states = deck_api.state[_deck_id]['buttons']
    for button_index, button_info in button_states.get(page, {}).items():
        if 'material_deck' in button_info:
            deck_info = button_info['material_deck']
            if 'init_data' in deck_info:
                init_data = _create_will_display_payload(
                    deck_info, button_index, page)
                command = _create_command_payload(init_data['action'],
                                                  'keyDown', button_index,
                                                  page)
                deck_api.set_button_command(
                    _deck_id, page, button_index,
                    f"{CONFIG_PATH}/pipe_writer.sh '{_bridge_file}' '{json.dumps(command)}'"
                )
                _write_message(json.dumps(init_data))
예제 #2
0
def md_action_changed(button_index: int, action: str) -> None:
    """
    Handles changing the type of action Material Deck listens for.
    """
    global _ui  # pylint: disable=global-statement,invalid-name
    button_state = deck_api._button_state(  # pylint: disable=protected-access
        _deck_id, deck_api.get_page(_deck_id), button_index)
    page = deck_api.get_page(_deck_id)
    if action:
        deck_info: dict = button_state.setdefault('material_deck', {})
        init_data = deck_info.setdefault(
            'init_data', {
                'event': 'willAppear',
                'payload': {
                    'settings': {
                        'displayName': True,
                        'displayIcon': True,
                        'displaySceneIcon': True,
                        'displaySceneName': True,
                    },
                },
            })
        init_data['action'] = action
        command = _create_command_payload(action, 'keyDown', button_index,
                                          page)
        deck_api.set_button_command(
            _deck_id, page, button_index,
            f"{CONFIG_PATH}/pipe_writer.sh '{_bridge_file}' '{json.dumps(command)}'"
        )

        _write_message(
            json.dumps(
                _create_will_display_payload(deck_info, button_index, page)))
    elif 'material_deck' in button_state:
        previous_action = button_state['material_deck'].get('init_data',
                                                            {}).get(
                                                                'action', '')
        del button_state['material_deck']
        _reset_button(button_index, '', page)
        _write_message(
            json.dumps({
                'event': 'willDisappear',
                'action': previous_action,
                'payload': {
                    'coordinates': {
                        'column': button_index % DECK_COLUMNS,
                        'row': math.floor(button_index / DECK_COLUMNS),
                    },
                },
                'context': _to_context(button_index, page),
                'device': _deck_id,
            }))
    deck_api.export_config(DECK_CONFIG_FILE)
    deck_gui.redraw_buttons(_ui)
예제 #3
0
def update_button_command(ui, command: str) -> None:
    deck_id = _deck_id(ui)
    api.set_button_command(deck_id, _page(ui), selected_button.index, command)
예제 #4
0
def _reset_button(button_index: int, image_path: str, page: int) -> None:
    deck_api.set_button_text(_deck_id, page, button_index, '')
    deck_api.set_button_command(_deck_id, page, button_index, '')
    deck_api.set_button_icon(_deck_id, page, button_index, image_path)