Example #1
0
async def render(stdscr: 'curses._CursesWindow', slos: shelve.Shelf) -> None:
    q: 'asyncio.Queue[str]' = asyncio.Queue(maxsize=1)
    asyncio.create_task(tick(q))
    asyncio.create_task(readio(stdscr, q))

    state = State()
    while True:
        k = await q.get()
        if k == 'q':
            return

        state.handle(k)
        items = sorted(slos.values(), key=state.key, reverse=state.reverse)

        height, width = stdscr.getmaxyx()

        i = 0
        stdscr.clear()
        for payload in items:
            if i >= height - 1 - len(payload.results):
                # TODO: pagination
                break

            stdscr.addstr(i, 0, payload.name)
            for result in payload.results:
                stdscr.addstr(i, width // 2, result.name)
                value = f'{result.value:.2f}'
                style = (1 if result.value >= 99.99
                         else 2 if result.value >= 99.9 else 3)
                stdscr.addstr(i, width - len(value) - 1,
                              value, curses.color_pair(style))
                i += 1
            stdscr.addstr(i, 0, '')

        state.render_bar(stdscr, height - 1)
        stdscr.refresh()