4 from form import bookForm,categoryForm
11 commands = [(' /', 'search'), (' n', 'find next'), (' N', 'find previous'), (' q', 'quit')]
12 # column definitions are in (label, weight, specified width) triples
13 columnDefs = [('something',1,None)]
20 def __init__(self,window,helpbar):
25 def sortByColumn(self, col):
26 self.entries.sort(key=lambda k: k.get(col)) # key=dict.get(col))
27 self.selected = map(lambda x: False, self.selected)
29 def updateGeometry(self):
30 (self.my,self.mx)=self.w.getmaxyx()
31 (y,x) = self.w.getbegyx()
32 self.cx = x + self.mx/2
33 self.cy = y + self.my/2
34 self.pageSize = self.my-3
37 def calcColWidths(self):
39 available_space = self.mx - len(self.columnDefs)
41 for label,weight,value in self.columnDefs:
43 available_space -= value
47 for label,weight,value in self.columnDefs:
49 cols.append((label,value))
51 cols.append((label,available_space*weight/total_weights))
55 self.hb.commands = self.commands
58 for r in range(0,self.pageSize):
67 def centreChild(self,child):
68 (y,x)=child.getmaxyx()
69 child.mvwin(self.cy-y/2,self.cx-x/2)
72 def displayHeader(self):
74 for header,width in self.columns:
75 self.w.addnstr(0,cursor,header+" "*width,width)
76 self.w.addstr(1,cursor,"-"*width)
79 def displayRow(self,row):
80 if self.topline+row < len(self.entries):
81 entry = self.entries[self.topline+row]
83 if self.selected[self.topline+row]:
84 self.w.addstr(row+2, 0, "*")
86 self.w.addstr(row+2, 0, " ")
87 for k,width in self.columns:
88 if k.lower() in entry:
89 self.w.addnstr(row+2,cursor,str(entry[k.lower()])+" "*width,width)
92 self.w.addstr(row+2,0," "*self.mx)
95 row = self.hl-self.topline+2
96 if row > 1 and row < self.my:
97 self.w.chgat(row,0,self.mx,curses.A_REVERSE)
99 def unHighlight(self):
100 row = self.hl-self.topline+2
101 if row > 1 and row < self.my:
102 self.w.chgat(row,0,self.mx,curses.A_NORMAL)
104 def mvHighlight(self,delta):
107 new = min(new,len(self.entries)-1)
112 def scroll(self,delta):
114 self.topline += delta
115 self.topline = max(self.topline,0)
116 self.topline = min(self.topline,len(self.entries)-1)
119 def search(self, string):
122 for e in self.entries:
123 for k,v in e.items():
124 if str(v).find(string) != -1:
130 self.last_search = string
131 self.search_index = i
134 self.search_index = -1
138 if self.last_search == "" or self.search_index == -1:
141 for i in range(self.hl+1,len(self.entries)-1):
142 for k,v in self.entries[i].items():
143 if str(v).find(self.last_search) != -1:
148 self.search_index = i
153 def findPrevious(self):
154 if self.last_search == "" or self.search_index == -1:
157 for i in range(self.hl-1, 0, -1):
158 for k,v in self.entries[i].items():
159 if str(v).find(self.last_search) != -1:
164 self.search_index = i
175 while ch != 27 and ch != 113:
176 ch = self.handleInput(ch)
183 def handleInput(self,ch):
184 if ch == curses.KEY_UP or ch == 107 or ch == 16:
185 if self.hl == self.topline:
186 self.scroll(-self.pageSize/2-1)
188 elif ch == curses.KEY_DOWN or ch == 106 or ch == 14:
189 if self.hl == self.topline+self.pageSize-1:
190 self.scroll(+self.pageSize/2+1)
192 elif ch == curses.KEY_PPAGE:
193 self.scroll(-self.pageSize)
194 self.mvHighlight(-self.pageSize)
195 elif ch == curses.KEY_NPAGE:
196 self.scroll(+self.pageSize)
197 self.mvHighlight(+self.pageSize)
198 elif ch == 47: # forward slash
199 string = self.hb.getSearch()
200 hl = self.search(string)
204 self.mvHighlight(delta)
206 self.hb.display(string+' not found')
212 self.mvHighlight(delta)
214 self.hb.display(self.last_search+' not found')
216 hl = self.findPrevious()
220 self.mvHighlight(delta)
222 self.hb.display(self.last_search+' not found')
224 self.selected[self.hl] = not self.selected[self.hl]
225 self.displayRow(self.hl-self.topline)
230 class bookBrowser(browserWindow):
231 columnDefs = [('ID',0,3),
236 commands = [(' u', 'update'), (' d', 'delete selected'), (' q', 'quit')]
238 # redefinable functions
239 def updateSelection(self,book):
243 bf=bookForm(w,self.hb,book)
245 bf.caption='Update Book '+str(bookid)
247 newbook = bf.eventLoop()
249 db.updateBook(newbook,bookid)
252 def viewSelection(self,book):
254 w=curses.newwin(1,1,20,20)
255 bf = bookForm(w,self.hb,book)
257 bf.caption='Viewing Book '+str(bookid)
262 def categorizeSelection(self,book):
263 w = curses.newwin(40,20,20,20)
264 cs = categorySelector(w,self.hb)
267 cs.refreshCategories()
271 def delSelected(self):
273 for sel,book in zip(self.selected, self.entries):
276 db.removeBooks(books)
278 def refreshBooks(self):
279 self.entries = db.getBooks()
280 self.selected = map(lambda x:False, self.entries)
282 def handleInput(self,ch):
283 browserWindow.handleInput(self,ch)
284 if ch == 117: #update on 'u'
285 book = self.entries[self.hl]
286 self.updateSelection(book)
287 self.entries[self.hl]=db.getBookByID(book['id'])
290 book = self.entries[self.hl]
291 self.viewSelection(book)
294 book = self.entries[self.hl]
295 self.categorizeSelection(book)
299 for s in self.selected[0:self.hl-1]:
306 self.mvHighlight(-count)
309 class categoryBrowser(browserWindow):
310 columnDefs = [('Category',100,None)]
311 commands = [(' a', 'add category'), (' d', 'delete selected'), (' q', 'quit')]
314 def refreshCategories(self):
315 self.entries = db.getCategories()
316 self.sortByColumn('category')
317 self.selected = map(lambda x:False, self.entries)
319 def addCategory(self):
320 w = curses.newwin(1,1,10,10)
321 cf = categoryForm(w,self.hb)
323 cats = cf.eventLoop()
328 def delSelected(self):
330 for sel,cat in zip(self.selected, self.entries):
332 categories.append(cat)
333 db.deleteCategories(categories)
335 def handleInput(self,ch):
336 browserWindow.handleInput(self,ch)
339 self.refreshCategories()
343 for s in self.selected[0:self.hl-1]:
347 self.refreshCategories()
350 self.mvHighlight(-count)
353 class categorySelector(browserWindow):
354 columnDefs = [('Category',100,None)]
355 commands = [(' a', 'add category'), (' c', 'commit'), (' q', 'quit')]
360 def refreshCategories(self):
361 self.entries = db.getCategories()
362 self.sortByColumn('category')
363 self.refreshSelected()
365 def refreshSelected(self):
366 self.original = map(lambda x:False, self.entries)
367 cats = db.getBookCategories(self.book)
369 cats.sort(key=lambda k: k.get('category')) # key=dict.get(col))
372 for cat in self.entries:
375 if cat['id']==cats[i]['cat_id']:
376 self.original[j] = True;
379 self.selected = self.original[:]
382 def addCategory(self):
383 w = curses.newwin(1,1,10,10)
384 cf = categoryForm(w,self.hb)
386 cats = cf.eventLoop()
391 def updateCategories(self):
392 # first removed the deselected ones
395 for old, new, category in zip(self.original, self.selected, self.entries):
396 if old and (not new):
397 uncats.append(category)
398 if (not old) and new:
399 cats.append(category)
400 db.uncategorizeBook(self.book, uncats)
401 # add the newly selected categories
402 db.categorizeBook(self.book, cats)
405 def handleInput(self,ch):
406 browserWindow.handleInput(self,ch)
409 self.refreshCategories()
412 self.updateCategories()