author | Radek Brich <radek.brich@devl.cz> |
Tue, 18 Mar 2014 22:39:21 +0100 | |
changeset 88 | 90d00354dc70 |
parent 87 | ee5ea9671f28 |
child 89 | 94f5baef19ac |
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 |
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
|
5 |
|
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 |
|
87
ee5ea9671f28
Add core Widget, Container. Add widgets Label.
Radek Brich <radek.brich@devl.cz>
parents:
86
diff
changeset
|
7 |
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
|
8 |
|
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 |
"""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
|
10 |
|
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 |
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
|
12 |
|
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 |
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
|
16 |
"""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
|
17 |
`buffer` as parameter.""" |
87
ee5ea9671f28
Add core Widget, Container. Add widgets Label.
Radek Brich <radek.brich@devl.cz>
parents:
86
diff
changeset
|
18 |
Container.__init__(self) |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
19 |
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
|
20 |
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
|
21 |
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
|
22 |
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
|
23 |
|
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 |
@property |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
25 |
def x(self): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
26 |
return self.pos.x |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
27 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
28 |
@property |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
29 |
def y(self): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
30 |
return self.pos.y |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
31 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
32 |
@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
|
33 |
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
|
34 |
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
|
35 |
|
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 |
@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
|
37 |
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
|
38 |
# 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
|
39 |
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
|
40 |
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
|
41 |
# 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
|
42 |
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
|
43 |
# 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
|
44 |
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
|
45 |
|
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 |
@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
|
47 |
def size(self): |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
48 |
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
|
49 |
|
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 |
def resize(self, w, h): |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
51 |
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
|
52 |
self.sig_resized(w, h) |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
53 |
self.redraw() |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
54 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
55 |
def redraw(self): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
56 |
Container.draw(self, self.buffer) |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
57 |
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
|
58 |
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
|
59 |
|
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 |
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
|
61 |
"""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
|
62 |
buffer.draw(self.buffer, x, y) |
88
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
63 |
|
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 |
class WindowManager: |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
66 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
67 |
def __init__(self): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
68 |
self.windows = [] |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
69 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
70 |
def add(self, window): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
71 |
self.windows.append(window) |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
72 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
73 |
def resize(self, w, h): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
74 |
self.windows[0].resize(w, h) |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
75 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
76 |
def draw(self, buffer, x=0, y=0): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
77 |
for window in self.windows: |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
78 |
window.draw(buffer, |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
79 |
x + window.x, |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
80 |
y + window.y) |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
81 |
|
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
82 |
def handle_event(self, event_name, *args): |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
83 |
"""Handle input event to managed windows.""" |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
84 |
handler = getattr(self, event_name, None) |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
85 |
if handler: |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
86 |
handler(*args) |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
87 |
else: |
90d00354dc70
Add WindowManager, basic event handling.
Radek Brich <radek.brich@devl.cz>
parents:
87
diff
changeset
|
88 |
raise Exception('Unknown event: %r %r' % (event_name, args)) |