| # 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 |