comparison frontends/primitivus/custom_widgets.py @ 159:2fa58703f1b7

Primitivus: notification bar, first draft - popup queue is now managed - notifications can auto-hide when nothing to show - ctrl-n show next notification Primitivus: ctrl-s allow to temporarily hide a popup Primitivus: cards in card_game now answer to mouse click Primitivus: notification is shown when invalid card is played in card_game Primitivus: SelectableText has now methods get_text and set_text
author Goffi <goffi@goffi.org>
date Wed, 04 Aug 2010 17:57:51 +0800
parents 7fcb4f083686
children ae50b53ff868
comparison
equal deleted inserted replaced
158:74aaf230a7c3 159:2fa58703f1b7
112 self.align = align 112 self.align = align
113 self.__selected=selected 113 self.__selected=selected
114 114
115 def getValue(self): 115 def getValue(self):
116 return self.text 116 return self.text
117
118 def get_text(self):
119 """for compatibility with urwid.Text"""
120 return self.getValue()
121
122 def set_text(self, text):
123 self.text=unicode(text)
124 self._invalidate()
117 125
118 def setAttribute(self, name, value): 126 def setAttribute(self, name, value):
119 """Change attribut used for rendering widget 127 """Change attribut used for rendering widget
120 @param name: one of 128 @param name: one of
121 -default: when not selected 129 -default: when not selected
356 height = min(list_size,self.max_height) or 1 364 height = min(list_size,self.max_height) or 1
357 return urwid.BoxAdapter(self.genericList, height) 365 return urwid.BoxAdapter(self.genericList, height)
358 366
359 ## MISC ## 367 ## MISC ##
360 368
369 class NotificationBar(urwid.WidgetWrap):
370 """Bar used to show misc information to user"""
371 signals = ['change']
372
373 def __init__(self):
374 self.waitNotifs = urwid.Text('')
375 self.message = ClickableText('', default_attr='notifs')
376 urwid.connect_signal(self.message, 'click', lambda wid: self.showNext())
377 self.columns = urwid.Columns([('fixed',6,self.waitNotifs),self.message])
378 urwid.WidgetWrap.__init__(self, urwid.AttrMap(self.columns,'notifs'))
379 self.notifs = []
380
381 def __modQueue(self):
382 """must be called each time the notifications queue is changed"""
383 self.waitNotifs.set_text("(%i)" % len(self.notifs) if self.notifs else '')
384 self._emit('change')
385
386 def addPopUp(self, pop_up_widget):
387 """Add a popup to the waiting queue"""
388 self.notifs.append(('popup',pop_up_widget))
389 self.__modQueue()
390
391 def addMessage(self, message):
392 "Add a message to the notificatio bar"
393 if not self.message.get_text():
394 self.message.set_text(message)
395 self._invalidate()
396 self._emit('change')
397 else:
398 self.notifs.append(('message',message))
399 self.__modQueue()
400
401 def showNext(self):
402 """Show next message if any, else delete current message"""
403 found = None
404 for notif in self.notifs:
405 if notif[0] == "message":
406 found = notif
407 break
408 if found:
409 self.notifs.remove(found)
410 self.message.set_text(found[1])
411 self.__modQueue()
412 else:
413 self.message.set_text('')
414 self._emit('change')
415
416 def getNextPopup(self):
417 """Return next pop-up and remove it from the queue
418 @return: pop-up or None if there is no more in the queue"""
419 ret = None
420 for notif in self.notifs:
421 if notif[0] == 'popup':
422 ret = notif[1]
423 break
424 if ret:
425 self.notifs.remove(notif)
426 self.__modQueue()
427 return ret
428
429 def isQueueEmpty(self):
430 return not bool(self.notifs)
431
432 def canHide(self):
433 """Return True if there is now important information to show"""
434 return self.isQueueEmpty() and not self.message.get_text()
435
436
361 class MenuBox(urwid.WidgetWrap): 437 class MenuBox(urwid.WidgetWrap):
362 """Show menu items of a category in a box""" 438 """Show menu items of a category in a box"""
363 signals = ['click'] 439 signals = ['click']
364 440
365 def __init__(self,parent,items): 441 def __init__(self,parent,items):