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')