cpython/Demo/sgi/cd/cdwin.py

105 lines
2.3 KiB
Python
Executable File

# Window interface to (some of) the CD player's vital audio functions
import cd
import CD
import stdwin
from stdwinevents import *
import mainloop
def main():
player = cd.open()
stdwin.setdefscrollbars(0, 0)
win = stdwin.open('CD')
win.player = player
win.dispatch = cddispatch
mainloop.register(win)
win.settimer(10)
mainloop.mainloop()
def cddispatch(type, win, detail):
if type == WE_NULL:
pass
elif type == WE_CLOSE:
mainloop.unregister(win)
win.close()
elif type == WE_DRAW:
draw(win)
elif type == WE_TIMER:
update(win)
elif type == WE_MOUSE_UP:
left, top, right, bottom, v1, v2 = getgeo(win)
h, v = detail[0]
if left < h < right:
if top < v < v1:
but1(win)
elif v1 < v < v2:
but2(win)
elif v2 < v < bottom:
but3(win)
else:
stdwin.fleep()
def but1(win):
update(win)
def but2(win):
state = win.player.getstatus()[0]
if state == CD.READY:
win.player.play(1, 1)
elif state in (CD.PLAYING, CD.PAUSED):
win.player.togglepause()
else:
stdwin.fleep()
update(win)
def but3(win):
win.player.stop()
update(win)
def update(win):
d = win.begindrawing()
drawstatus(win, d)
d.enddrawing()
win.settimer(10)
statedict = ['ERROR', 'NODISK', 'READY', 'PLAYING', 'PAUSED', 'STILL']
def draw(win):
left, top, right, bottom, v1, v2 = getgeo(win)
d = win.begindrawing()
drawstatus(win, d)
box(d, left, v1, right, v2, 'Play/Pause')
box(d, left, v2, right, bottom, 'Stop')
d.enddrawing()
def drawstatus(win, d):
left, top, right, bottom, v1, v2 = getgeo(win)
state, track, curtime, abstime, totaltime, first, last, \
scsi_audio, cur_block, dummy = win.player.getstatus()
if 0 <= state < len(statedict):
message = statedict[state]
else:
message = `status`
message = message + ' track ' + `track` + ' of ' + `last`
d.erase((left, top), (right, v1))
box(d, left, top, right, v1, message)
def box(d, left, top, right, bottom, label):
R = (left+1, top+1), (right-1, bottom-1)
width = d.textwidth(label)
height = d.lineheight()
h = (left + right - width) / 2
v = (top + bottom - height) / 2
d.box(R)
d.cliprect(R)
d.text((h, v), label)
d.noclip()
def getgeo(win):
(left, top), (right, bottom) = (0, 0), win.getwinsize()
v1 = top + (bottom - top) / 3
v2 = top + (bottom - top) * 2 / 3
return left, top, right, bottom, v1, v2
main()