Clarify portability and main program.
[python/dscho.git] / Demo / sgi / cd / cdwin.py
blob284ad825ea939e696abb4c340a998e06f34f050f
1 # Window interface to (some of) the CD player's vital audio functions
3 import cd
4 import stdwin
5 from stdwinevents import *
6 import mainloop
8 def main():
9 player = cd.open()
10 stdwin.setdefscrollbars(0, 0)
11 win = stdwin.open('CD')
12 win.player = player
13 win.dispatch = cddispatch
14 mainloop.register(win)
15 win.settimer(10)
16 mainloop.mainloop()
18 def cddispatch(type, win, detail):
19 if type == WE_NULL:
20 pass
21 elif type == WE_CLOSE:
22 mainloop.unregister(win)
23 win.close()
24 elif type == WE_DRAW:
25 draw(win)
26 elif type == WE_TIMER:
27 update(win)
28 elif type == WE_MOUSE_UP:
29 left, top, right, bottom, v1, v2 = getgeo(win)
30 h, v = detail[0]
31 if left < h < right:
32 if top < v < v1:
33 but1(win)
34 elif v1 < v < v2:
35 but2(win)
36 elif v2 < v < bottom:
37 but3(win)
38 else:
39 stdwin.fleep()
41 def but1(win):
42 update(win)
44 def but2(win):
45 state = win.player.getstatus()[0]
46 if state == cd.ready:
47 win.player.play(1, 1)
48 elif state in (cd.playing, cd.paused):
49 win.player.togglepause()
50 else:
51 stdwin.fleep()
52 update(win)
54 def but3(win):
55 win.player.stop()
56 update(win)
58 def update(win):
59 d = win.begindrawing()
60 drawstatus(win, d)
61 d.enddrawing()
62 win.settimer(10)
64 statedict = ['ERROR', 'NODISK', 'READY', 'PLAYING', 'PAUSED', 'STILL']
66 def draw(win):
67 left, top, right, bottom, v1, v2 = getgeo(win)
68 d = win.begindrawing()
69 drawstatus(win, d)
70 box(d, left, v1, right, v2, 'Play/Pause')
71 box(d, left, v2, right, bottom, 'Stop')
72 d.enddrawing()
74 def drawstatus(win, d):
75 left, top, right, bottom, v1, v2 = getgeo(win)
76 state, track, curtime, abstime, totaltime, first, last, \
77 scsi_audio, cur_block, dummy = win.player.getstatus()
78 if 0 <= state < len(statedict):
79 message = statedict[state]
80 else:
81 message = `status`
82 message = message + ' track ' + `track` + ' of ' + `last`
83 d.erase((left, top), (right, v1))
84 box(d, left, top, right, v1, message)
86 def box(d, left, top, right, bottom, label):
87 R = (left+1, top+1), (right-1, bottom-1)
88 width = d.textwidth(label)
89 height = d.lineheight()
90 h = (left + right - width) / 2
91 v = (top + bottom - height) / 2
92 d.box(R)
93 d.cliprect(R)
94 d.text((h, v), label)
95 d.noclip()
97 def getgeo(win):
98 (left, top), (right, bottom) = (0, 0), win.getwinsize()
99 v1 = top + (bottom - top) / 3
100 v2 = top + (bottom - top) * 2 / 3
101 return left, top, right, bottom, v1, v2
103 main()