tuikit/application.py
author Radek Brich <radek.brich@devl.cz>
Wed, 13 Apr 2011 01:33:27 +0200
changeset 7 d4a291b31cbb
parent 1 69318aba22bf
child 9 7175ed629a76
permissions -rw-r--r--
New color management - named colors.

# -*- coding: utf-8 -*-

import curses
import curses.wrapper
import logging
import time
import math

from .container import Container
from .backend_curses import BackendCurses


class TopWindow(Container):
    def __init__(self):
        Container.__init__(self)

        self.focuswidget = None

        self.top = self

        self.timeout = []
        self.timelast = None

        self.connect('draw', self.on_draw)

    def keypress(self, keyname, char):
        if self.focuswidget and self.focuswidget != self:
            self.focuswidget.emit('keypress', keyname, char)
        self.handle('keypress', keyname, char)


    def on_draw(self, screen, x, y):
        screen.erase()


    def add_timeout(self, s, func):
        if not len(self.timeout):
            self.timelast = time.time()
        self.timeout += [[s, func]]


    def remove_timeout(self, func):
        for to in self.timeout[:]:
            if to[1] == func:
                self.timeout.remove(to)


    def has_timeout(self):
        return len(self.timeout) and True or False


    def nearest_timeout(self):
        return min(self.timeout)[0]


    def process_timeout(self):
        now = time.time()
        lasted = now - self.timelast
        self.timelast = now

        for to in self.timeout[:]:
            newt = to[0] - lasted
            if newt <= 0.0:
                to[1]()
                self.timeout.remove(to)
            else:
                to[0] = newt


class Application:
    def __init__(self):
        self.top = TopWindow()
        self.quit = False
        self.screen = None

        self.log = logging.getLogger('tuikit')
        self.log.setLevel(logging.DEBUG)
        handler = logging.FileHandler('./tuikit.log')
        format = logging.Formatter('%(asctime)s %(levelname)-5s %(message)s', '%y-%m-%d %H:%M:%S')
        handler.setFormatter(format)
        self.log.addHandler(handler)
        self.log.info('start')


    def start(self):
        curses.wrapper(self.mainloop)


    def terminate(self):
        self.quit = True


    def mainloop(self, screen):
        self.screen = BackendCurses(screen)
        self.applytheme()
        self.top.width, self.top.height = self.screen.width, self.screen.height
        self.top.emit('resize')

        while True:
            self.top.draw(self.screen)
            self.screen.commit()

            timeout = None
            if self.top.has_timeout():
                timeout = int(math.ceil(self.top.nearest_timeout() * 10))

            events = self.screen.process_input(timeout)

            if self.top.has_timeout():
                self.top.process_timeout()

            for event in events:
                self.top.emit(event[0], *event[1:])

            if self.quit:
                break


    def applytheme(self):
        screen = self.screen
        screen.setcolor('normal',                  'white on blue')
        screen.setcolor('window',                  'white on blue')
        screen.setcolor('window-controls',         'white on blue, bold')
        screen.setcolor('window-controls-active',  'cyan on blue, bold')
        screen.setcolor('button',                  'black on white')
        screen.setcolor('button-active',           'black on cyan')
        screen.setcolor('menu',                    'black on cyan')
        screen.setcolor('menu-active',             'white on cyan, bold')