summaryrefslogblamecommitdiff
path: root/curses/cui.py
blob: 540576546dc3bb9d504dad007520b1b97f771c18 (plain) (tree)













































































                                                                     
#-*- coding: utf-8 -*-
"""
Curses-based console user interface for TMW chat client.
"""

import curses
from curses.textpad import Textbox

stdscr = None
chatlog_win = None
input_win = None
players_win = None
input_textbox = None


def init():
    global stdscr, chatlog_win, input_win, players_win, input_textbox

    stdscr = curses.initscr()
    curses.cbreak()
    curses.noecho()
    stdscr.keypad(1)

    h, w = stdscr.getmaxyx()
    PNW = 20  # player name width
    INH = 4   # input window height

    stdscr.vline(0, w - PNW - 1, curses.ACS_VLINE, h)
    stdscr.hline(h - INH - 1, 0, curses.ACS_HLINE, w - PNW - 1)

    chatlog_win = curses.newwin(h - INH - 1, w - PNW - 1, 0, 0)
    input_win = curses.newwin(INH, w - PNW - 1, h - INH, 0)
    players_win = curses.newwin(h, PNW, 0, w - PNW)

    chatlog_win.idlok(1)
    chatlog_win.scrollok(1)

    players_win.idlok(1)
    players_win.scrollok(1)

    input_textbox = Textbox(input_win)
    input_textbox.stripspaces = True

    stdscr.noutrefresh()
    input_win.noutrefresh()
    players_win.noutrefresh()
    chatlog_win.noutrefresh()

    curses.doupdate()


def chatlog_append(line):
    if line[-1] != "\n":
        line = line + "\n"
    chatlog_win.addstr(line)
    chatlog_win.refresh()


def input_loop(callback):
    def v(ch):
        # chatlog_append(curses.keyname(ch))
        if ch in (curses.KEY_ENTER, curses.ascii.NL):
            return curses.ascii.BEL
        return ch

    cmd = ''
    while cmd not in ('/exit', '/quit'):
        cmd = input_textbox.edit(v).strip()
        callback(cmd)
        input_win.clear()
        input_win.move(0, 0)


def finalize():
    stdscr.keypad(0)
    curses.echo()
    curses.nocbreak()
    curses.endwin()