Skip to content

Commit 117dbcb

Browse files
committed
Added window list management functionality.
Automatically call self.destroy() if WE_CLOSE event dispatched. Added keyboard, alternate drawing and getwindow interface. Call child's realize method.
1 parent 4f4794a commit 117dbcb

File tree

2 files changed

+126
-12
lines changed

2 files changed

+126
-12
lines changed

Lib/lib-stdwin/WindowParent.py

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# A 'WindowParent' is the only module that uses real stdwin functionality.
22
# It is the root of the tree.
33
# It should have exactly one child when realized.
4+
#
5+
# There is also some support for a standard main loop here.
46

57
import stdwin
68
from stdwinevents import *
@@ -9,6 +11,8 @@
911

1012
Error = 'WindowParent.Error' # Exception
1113

14+
WindowList = [] # List containing all windows
15+
1216
class WindowParent() = ManageOneChild():
1317
#
1418
def create(self, (title, size)):
@@ -22,34 +26,55 @@ def _reset(self):
2226
self.win = 0
2327
self.itimer = 0
2428
self.do_mouse = 0
29+
self.do_keybd = 0
2530
self.do_timer = 0
31+
self.do_altdraw = 0
2632
#
2733
def destroy(self):
34+
if self.win in WindowList:
35+
import util
36+
util.remove(self.win, WindowList)
2837
if self.child: self.child.destroy()
2938
self._reset()
3039
#
3140
def need_mouse(self, child): self.do_mouse = 1
3241
def no_mouse(self, child): self.do_mouse = 0
3342
#
43+
def need_keybd(self, child): self.do_keybd = 1
44+
def no_keybd(self, child): self.do_keybd = 0
45+
#
3446
def need_timer(self, child): self.do_timer = 1
3547
def no_timer(self, child): self.do_timer = 0
3648
#
49+
def need_altdraw(self, child): self.do_altdraw = 1
50+
def no_altdraw(self, child): self.do_altdraw = 0
51+
#
3752
def realize(self):
3853
if self.win:
3954
raise Error, 'realize(): called twice'
4055
if not self.child:
4156
raise Error, 'realize(): no child'
4257
size = self.child.minsize(self.beginmeasuring())
4358
self.size = max(self.size[0], size[0]), \
44-
max(self.size[1], size[1])
45-
#stdwin.setdefwinsize(self.size)
59+
max(self.size[1], size[1])
60+
# XXX stdwin.setdefwinsize(self.size)
4661
# XXX Compensate stdwin bug:
47-
stdwin.setdefwinsize(self.size[0]+4, self.size[1]+2)
62+
stdwin.setdefwinsize(self.size[0]+4, min(300, self.size[1]+2))
4863
self.win = stdwin.open(self.title)
64+
self.win.setdocsize(self.size)
4965
if self.itimer:
5066
self.win.settimer(self.itimer)
5167
bounds = (0, 0), self.win.getwinsize()
5268
self.child.setbounds(bounds)
69+
self.child.realize()
70+
self.win.dispatch = self.dispatch
71+
WindowList.append(self.win)
72+
#
73+
def fixup(self):
74+
self.size = self.child.minsize(self.beginmeasuring())
75+
self.win.setdocsize(self.size)
76+
bounds = (0, 0), self.win.getwinsize()
77+
self.child.setbounds(bounds)
5378
#
5479
def beginmeasuring(self):
5580
# Return something with which a child can measure text
@@ -64,6 +89,12 @@ def begindrawing(self):
6489
else:
6590
raise Error, 'begindrawing(): not realized yet'
6691
#
92+
def getwindow(self):
93+
if self.win:
94+
return self.win
95+
else:
96+
raise Error, 'getwindow(): not realized yet'
97+
#
6798
def change(self, area):
6899
if self.win:
69100
self.win.change(area)
@@ -86,16 +117,42 @@ def dispatch(self, (type, win, detail)):
86117
elif type = WE_DRAW:
87118
d = self.win.begindrawing()
88119
self.child.draw(d, detail)
120+
del d
121+
if self.do_altdraw: self.child.altdraw(detail)
89122
elif type = WE_MOUSE_DOWN:
90123
if self.do_mouse: self.child.mouse_down(detail)
91124
elif type = WE_MOUSE_MOVE:
92125
if self.do_mouse: self.child.mouse_move(detail)
93126
elif type = WE_MOUSE_UP:
94127
if self.do_mouse: self.child.mouse_up(detail)
128+
elif type in (WE_CHAR, WE_COMMAND):
129+
if self.do_keybd: self.child.keybd(type, detail)
95130
elif type = WE_TIMER:
96131
if self.do_timer: self.child.timer()
97132
elif type = WE_SIZE:
98-
self.win.change((0, 0), (10000, 10000)) # XXX
99-
bounds = (0, 0), self.win.getwinsize()
100-
self.child.setbounds(bounds)
133+
self.fixup()
134+
elif type = WE_CLOSE:
135+
self.destroy()
101136
#
137+
138+
def MainLoop():
139+
while WindowList:
140+
Dispatch(stdwin.getevent())
141+
142+
def Dispatch(event):
143+
window = event[1]
144+
if window in WindowList:
145+
window.dispatch(event)
146+
else:
147+
stdwin.fleep()
148+
149+
# Interface used by WindowSched:
150+
151+
def CountWindows():
152+
return len(WindowList)
153+
154+
def AnyWindow():
155+
if not WindowList:
156+
return None
157+
else:
158+
return WindowList[0]

Lib/stdwin/WindowParent.py

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# A 'WindowParent' is the only module that uses real stdwin functionality.
22
# It is the root of the tree.
33
# It should have exactly one child when realized.
4+
#
5+
# There is also some support for a standard main loop here.
46

57
import stdwin
68
from stdwinevents import *
@@ -9,6 +11,8 @@
911

1012
Error = 'WindowParent.Error' # Exception
1113

14+
WindowList = [] # List containing all windows
15+
1216
class WindowParent() = ManageOneChild():
1317
#
1418
def create(self, (title, size)):
@@ -22,34 +26,55 @@ def _reset(self):
2226
self.win = 0
2327
self.itimer = 0
2428
self.do_mouse = 0
29+
self.do_keybd = 0
2530
self.do_timer = 0
31+
self.do_altdraw = 0
2632
#
2733
def destroy(self):
34+
if self.win in WindowList:
35+
import util
36+
util.remove(self.win, WindowList)
2837
if self.child: self.child.destroy()
2938
self._reset()
3039
#
3140
def need_mouse(self, child): self.do_mouse = 1
3241
def no_mouse(self, child): self.do_mouse = 0
3342
#
43+
def need_keybd(self, child): self.do_keybd = 1
44+
def no_keybd(self, child): self.do_keybd = 0
45+
#
3446
def need_timer(self, child): self.do_timer = 1
3547
def no_timer(self, child): self.do_timer = 0
3648
#
49+
def need_altdraw(self, child): self.do_altdraw = 1
50+
def no_altdraw(self, child): self.do_altdraw = 0
51+
#
3752
def realize(self):
3853
if self.win:
3954
raise Error, 'realize(): called twice'
4055
if not self.child:
4156
raise Error, 'realize(): no child'
4257
size = self.child.minsize(self.beginmeasuring())
4358
self.size = max(self.size[0], size[0]), \
44-
max(self.size[1], size[1])
45-
#stdwin.setdefwinsize(self.size)
59+
max(self.size[1], size[1])
60+
# XXX stdwin.setdefwinsize(self.size)
4661
# XXX Compensate stdwin bug:
47-
stdwin.setdefwinsize(self.size[0]+4, self.size[1]+2)
62+
stdwin.setdefwinsize(self.size[0]+4, min(300, self.size[1]+2))
4863
self.win = stdwin.open(self.title)
64+
self.win.setdocsize(self.size)
4965
if self.itimer:
5066
self.win.settimer(self.itimer)
5167
bounds = (0, 0), self.win.getwinsize()
5268
self.child.setbounds(bounds)
69+
self.child.realize()
70+
self.win.dispatch = self.dispatch
71+
WindowList.append(self.win)
72+
#
73+
def fixup(self):
74+
self.size = self.child.minsize(self.beginmeasuring())
75+
self.win.setdocsize(self.size)
76+
bounds = (0, 0), self.win.getwinsize()
77+
self.child.setbounds(bounds)
5378
#
5479
def beginmeasuring(self):
5580
# Return something with which a child can measure text
@@ -64,6 +89,12 @@ def begindrawing(self):
6489
else:
6590
raise Error, 'begindrawing(): not realized yet'
6691
#
92+
def getwindow(self):
93+
if self.win:
94+
return self.win
95+
else:
96+
raise Error, 'getwindow(): not realized yet'
97+
#
6798
def change(self, area):
6899
if self.win:
69100
self.win.change(area)
@@ -86,16 +117,42 @@ def dispatch(self, (type, win, detail)):
86117
elif type = WE_DRAW:
87118
d = self.win.begindrawing()
88119
self.child.draw(d, detail)
120+
del d
121+
if self.do_altdraw: self.child.altdraw(detail)
89122
elif type = WE_MOUSE_DOWN:
90123
if self.do_mouse: self.child.mouse_down(detail)
91124
elif type = WE_MOUSE_MOVE:
92125
if self.do_mouse: self.child.mouse_move(detail)
93126
elif type = WE_MOUSE_UP:
94127
if self.do_mouse: self.child.mouse_up(detail)
128+
elif type in (WE_CHAR, WE_COMMAND):
129+
if self.do_keybd: self.child.keybd(type, detail)
95130
elif type = WE_TIMER:
96131
if self.do_timer: self.child.timer()
97132
elif type = WE_SIZE:
98-
self.win.change((0, 0), (10000, 10000)) # XXX
99-
bounds = (0, 0), self.win.getwinsize()
100-
self.child.setbounds(bounds)
133+
self.fixup()
134+
elif type = WE_CLOSE:
135+
self.destroy()
101136
#
137+
138+
def MainLoop():
139+
while WindowList:
140+
Dispatch(stdwin.getevent())
141+
142+
def Dispatch(event):
143+
window = event[1]
144+
if window in WindowList:
145+
window.dispatch(event)
146+
else:
147+
stdwin.fleep()
148+
149+
# Interface used by WindowSched:
150+
151+
def CountWindows():
152+
return len(WindowList)
153+
154+
def AnyWindow():
155+
if not WindowList:
156+
return None
157+
else:
158+
return WindowList[0]

0 commit comments

Comments
 (0)