f0515074874dcdd9f2a5419ec91bb777f59991ec
[public/library.git] / librarian.py
1 #!/usr/bin/env python
2
3 import curses
4
5 def menutest(stdscr, l):
6     curses.curs_set(0)
7     (rows,cols)=stdscr.getmaxyx()
8     w = curses.newwin(10,40,(rows-10)/2, (cols-40)/2)
9
10     menu(w, l)
11     
12     curses.curs_set(1)
13
14 # item is a list of (string, callable) tuples
15 def menu(w, items):
16     w.keypad(1)
17     highlight=0
18     for (mitem,fun) in items:
19         w.addstr(highlight,0, mitem)
20         highlight +=1
21
22     highlight=0
23     w.chgat(highlight, 0, curses.A_REVERSE)
24     w.refresh()
25     ch=w.getch()
26     while (ch!=113): # leave on q
27         if ch==curses.KEY_UP:
28             if highlight!=0:
29                 w.chgat(highlight,0, 0)
30                 highlight -= 1
31                 w.chgat(highlight,0, curses.A_REVERSE)
32         if ch==curses.KEY_DOWN:
33             if highlight!=len(items)-1:
34                 w.chgat(highlight,0, 0)
35                 highlight += 1
36                 w.chgat(highlight,0, curses.A_REVERSE)
37         if ch==114 or ch==10:
38             (s,f)=items[highlight]
39             f()
40         w.refresh()
41         ch = w.getch()
42
43 # items is a list of (label, value) pairs
44 def drawForm(w, title, items, highlight):
45     w.addstr(1,1,title)
46     r=3;
47     m=0;
48     for l, v in items:
49         m = max(len(l),m)
50     m+=3
51     for l, v in items:
52         c = m-len(l)-2
53         w.addstr(r,c,l+":")
54         w.addstr(r,m,v)
55         r+=2
56     return m
57
58
59 def addMenu():
60     formdata = [("ISBN","112733"),
61                 ("Title", "Poo"),
62                 ("Author","")]
63     w=curses.newwin(10,50,10,10)
64     (y,x)=w.getmaxyx()
65     w.border()
66     w.keypad(1)
67     curses.curs_set(1)
68     highlight=0
69     r=3
70     m = drawForm(w,"Add a Book", formdata, highlight)
71     w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
72     w.move(r,m+len(formdata[highlight][1]))
73     ch = w.getch()
74     while (ch!=113):
75         if ch==curses.KEY_UP:
76             if highlight!=0:
77                 w.chgat(r,m,x-m-2,curses.A_NORMAL)
78                 highlight -= 1
79                 r=3+2*highlight
80                 w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
81                 w.move(r,m+len(formdata[highlight][1]))
82         if ch==curses.KEY_DOWN:
83             if highlight != len(formdata) -1:
84                 w.chgat(r,m,x-m-2,curses.A_NORMAL)
85                 highlight += 1
86                 r=3+2*highlight
87                 w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
88                 w.move(r,m+len(formdata[highlight][1]))
89         w.refresh()
90         ch = w.getch()
91
92     curses.curs_set(0)
93     w.refresh()
94
95 def updateMenu():
96     w=curses.newwin(1,50,10,10)
97     w.addstr("I will be used to update or modify book records")
98     w.refresh()
99
100 def deleteMenu():
101     w=curses.newwin(1,50,10,10)
102     w.addstr("I will be used to delete book records")
103     w.refresh()
104
105 def browseMenu():
106     w=curses.newwin(1,50,10,10)
107     w.addstr("I will be used to browse book records")
108     w.refresh()
109
110 m = [("Browse Library", browseMenu),
111      ("Add Book or other item", addMenu),
112      ("Modify/Update record", updateMenu),
113      ("Remove book from catalogue", deleteMenu)]
114 curses.wrapper(menutest, m)