More work on book data form.
[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.clear()
41         w.refresh()
42         ch = w.getch()
43
44 # items is a list of (label, value) pairs
45 def drawForm(w, title, items, highlight):
46     w.addstr(1,1,title)
47     r=3;
48     m=0;
49     for l, v in items:
50         m = max(len(l),m)
51     m+=3
52     for l, v in items:
53         c = m-len(l)-2
54         w.addstr(r,c,l+":")
55         w.addstr(r,m,v)
56         r+=2
57     return m
58
59
60 def addMenu():
61     formdata = [("ISBN","112733"),
62                 ("Title", "Poo"),
63                 ("Author","")]
64     w=curses.newwin(10,50,10,10)
65     (y,x)=w.getmaxyx()
66     w.border()
67     w.keypad(1)
68     curses.curs_set(1)
69     highlight=0
70     r=3
71     m = drawForm(w,"Add a Book", formdata, highlight)
72     w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
73     w.move(r,m+len(formdata[highlight][1]))
74     ch = w.getch()
75     while (ch!=113):
76         if ch==curses.KEY_UP:
77             if highlight!=0:
78                 w.chgat(r,m,x-m-2,curses.A_NORMAL)
79                 highlight -= 1
80                 r=3+2*highlight
81                 w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
82                 w.move(r,m+len(formdata[highlight][1]))
83         if ch==curses.KEY_DOWN:
84             if highlight != len(formdata) -1:
85                 w.chgat(r,m,x-m-2,curses.A_NORMAL)
86                 highlight += 1
87                 r=3+2*highlight
88                 w.chgat(r,m,x-m-2,curses.A_UNDERLINE)
89                 w.move(r,m+len(formdata[highlight][1]))
90         w.refresh()
91         ch = w.getch()
92
93     curses.curs_set(0)
94     w.refresh()
95
96 def updateMenu():
97     w=curses.newwin(1,50,10,10)
98     w.addstr("I will be used to update or modify book records")
99     w.refresh()
100
101 def deleteMenu():
102     w=curses.newwin(1,50,10,10)
103     w.addstr("I will be used to delete book records")
104     w.refresh()
105
106 def browseMenu():
107     w=curses.newwin(1,50,10,10)
108     w.addstr("I will be used to browse book records")
109     w.refresh()
110
111 m = [("Browse Library", browseMenu),
112      ("Add Book or other item", addMenu),
113      ("Modify/Update record", updateMenu),
114      ("Remove book from catalogue", deleteMenu)]
115 curses.wrapper(menutest, m)