author | Radek Brich <radek.brich@devl.cz> |
Wed, 19 Mar 2014 00:32:38 +0100 | |
changeset 89 | 94f5baef19ac |
parent 88 | 90d00354dc70 |
child 90 | 781774a8d568 |
permissions | -rw-r--r-- |
86
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
1 |
from tuikit.core.buffer import Buffer |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
2 |
from tuikit.core.signal import Signal |
87
ee5ea9671f28
Add core Widget, Container. Add widgets Label.
Radek Brich <radek.brich@devl.cz>
parents:
86
diff
changeset
|
3 |
from tuikit.core.container import Container |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
4 |
from tuikit.core.coords import Point |
89 | 5 |
from tuikit.core.theme import default_theme |
86
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
6 |
|
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
7 |
|
87
ee5ea9671f28
Add core Widget, Container. Add widgets Label.
Radek Brich <radek.brich@devl.cz>
parents:
86
diff
changeset
|
8 |
class Window(Container): |
86
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
9 |
|
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
10 |
"""Window is rectangular part of screen containing widgets. |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
11 |
|
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
12 |
Widgets are drawn into window, events are routed to widgets through window. |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
13 |
|
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
14 |
""" |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
15 |
|
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
16 |
def __init__(self, buffer=None): |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
17 |
"""New buffer for the window will be created unless given existing |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
18 |
`buffer` as parameter.""" |
87
ee5ea9671f28
Add core Widget, Container. Add widgets Label.
Radek Brich <radek.brich@devl.cz>
parents:
86
diff
changeset
|
19 |
Container.__init__(self) |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
20 |
self.pos = Point() |
86
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
21 |
self._buffer = None |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
22 |
self.sig_resized = Signal() |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
23 |
self.buffer = buffer or Buffer() |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
24 |
|
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
25 |
@property |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
26 |
def x(self): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
27 |
return self.pos.x |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
28 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
29 |
@property |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
30 |
def y(self): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
31 |
return self.pos.y |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
32 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
33 |
@property |
86
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
34 |
def buffer(self): |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
35 |
return self._buffer |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
36 |
|
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
37 |
@buffer.setter |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
38 |
def buffer(self, buffer): |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
39 |
# disconnect signals from old buffer |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
40 |
if self._buffer: |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
41 |
self.sig_resized.disconnect(self._buffer.resize) |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
42 |
# replace the buffer |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
43 |
self._buffer = buffer |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
44 |
# resize buffer when window gets resized |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
45 |
self.sig_resized.connect(buffer.resize) |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
46 |
|
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
47 |
@property |
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
48 |
def size(self): |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
49 |
return self.buffer.size.readonly() |
86
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
50 |
|
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
51 |
def resize(self, w, h): |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
52 |
self.buffer.resize(w, h) |
86
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
53 |
self.sig_resized(w, h) |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
54 |
self.redraw() |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
55 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
56 |
def redraw(self): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
57 |
Container.draw(self, self.buffer) |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
58 |
self.buffer.puts(10, 5, '{0.w} {0.h}'.format(self.size)) |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
59 |
self.buffer.frame() |
86
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
60 |
|
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
61 |
def draw(self, buffer, x=0, y=0): |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
62 |
"""Draw this window into `buffer` at x/y coords.""" |
86
0978fb755d31
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
63 |
buffer.draw(self.buffer, x, y) |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
64 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
65 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
66 |
class WindowManager: |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
67 |
|
89 | 68 |
def __init__(self, theme=default_theme): |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
69 |
self.windows = [] |
89 | 70 |
self.theme = theme |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
71 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
72 |
def add(self, window): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
73 |
self.windows.append(window) |
89 | 74 |
window.set_theme(self.theme) |
75 |
||
76 |
def set_theme(self, theme): |
|
77 |
self.theme = theme |
|
78 |
for window in self.windows: |
|
79 |
window.set_theme(theme) |
|
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
80 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
81 |
def resize(self, w, h): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
82 |
self.windows[0].resize(w, h) |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
83 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
84 |
def draw(self, buffer, x=0, y=0): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
85 |
for window in self.windows: |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
86 |
window.draw(buffer, |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
87 |
x + window.x, |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
88 |
y + window.y) |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
89 |
|
89 | 90 |
# def keypress(self, keyname, char, mod=0): |
91 |
||
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
92 |
def handle_event(self, event_name, *args): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
93 |
"""Handle input event to managed windows.""" |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
94 |
handler = getattr(self, event_name, None) |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
95 |
if handler: |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
96 |
handler(*args) |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
97 |
else: |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
98 |
raise Exception('Unknown event: %r %r' % (event_name, args)) |