48 lines
1.2 KiB
Python
48 lines
1.2 KiB
Python
|
# Module 'listwin'
|
||
|
# List windows, a subclass of gwin
|
||
|
|
||
|
import gwin
|
||
|
import stdwin
|
||
|
|
||
|
def maxlinewidth(a): # Compute maximum textwidth of lines in a sequence
|
||
|
max = 0
|
||
|
for line in a:
|
||
|
width = stdwin.textwidth(line)
|
||
|
if width > max: max = width
|
||
|
return max
|
||
|
|
||
|
def action(w, string, i, detail): # Default item selection method
|
||
|
pass
|
||
|
|
||
|
def mup(w, detail): # Mouse up method
|
||
|
(h, v), clicks, button, mask = detail
|
||
|
i = divmod(v, w.lineheight)[0]
|
||
|
if 0 <= i < len(w.data):
|
||
|
w.action(w, w.data[i], i, detail)
|
||
|
|
||
|
def draw(w, ((left, top), (right, bottom))): # Text window draw method
|
||
|
data = w.data
|
||
|
d = w.begindrawing()
|
||
|
lh = w.lineheight
|
||
|
itop = top/lh
|
||
|
ibot = (bottom-1)/lh + 1
|
||
|
if itop < 0: itop = 0
|
||
|
if ibot > len(data): ibot = len(data)
|
||
|
for i in range(itop, ibot): d.text((0, i*lh), data[i])
|
||
|
|
||
|
def open(title, data): # Display a list of texts in a window
|
||
|
lineheight = stdwin.lineheight()
|
||
|
h, v = maxlinewidth(data), len(data)*lineheight
|
||
|
h0, v0 = h + stdwin.textwidth(' '), v + lineheight
|
||
|
if h0 > stdwin.textwidth(' ')*80: h0 = 0
|
||
|
if v0 > stdwin.lineheight()*24: v0 = 0
|
||
|
stdwin.setdefwinsize(h0, v0)
|
||
|
w = gwin.open(title)
|
||
|
w.setdocsize(h, v)
|
||
|
w.lineheight = lineheight
|
||
|
w.data = data
|
||
|
w.draw = draw
|
||
|
w.action = action
|
||
|
w.mup = mup
|
||
|
return w
|