Primitivus: main_widget is now in its own class (PrimitivusTopWidget), menu and notification bar (un)hidding is cleaner

This commit is contained in:
Goffi 2014-09-08 15:50:51 +02:00
commit 4b53275a9a

View file

@ -177,6 +177,60 @@ class EditBar(sat_widgets.ModalEdit):
return super(EditBar, self).keypress(size, key)
class PrimitivusTopWidget(sat_widgets.FocusPile):
"""Top most widget used in Primitivus"""
_focus_inversed = True
positions = ('menu', 'body', 'notif_bar', 'edit_bar')
can_hide = ('menu', 'notif_bar')
def __init__(self, body, menu, notif_bar, edit_bar):
self._body = body
self._menu = menu
self._notif_bar = notif_bar
self._edit_bar = edit_bar
self._hidden = {'notif_bar'}
super(PrimitivusTopWidget, self).__init__([('pack', self._menu), self._body, ('pack', self._edit_bar)])
for position in self.positions:
setattr(self,
position,
property(lambda: self, self.widgetGet(position=position),
lambda pos, new_wid: self.widgetSet(new_wid, position=pos))
)
self.focus_position = len(self.contents)-1
def widgetGet(self, position):
if not position in self.positions:
raise ValueError("Unknown position {}".format(position))
return getattr(self, "_{}".format(position))
def widgetSet(self, widget, position):
if not position in self.positions:
raise ValueError("Unknown position {}".format(position))
return setattr(self, "_{}".format(position), widget)
def hideSwitch(self, position):
if not position in self.can_hide:
raise ValueError("Can't switch position {}".format(position))
hide = not position in self._hidden
visible_positions = [pos for pos in self.positions if pos == position or pos not in self._hidden] # we need to keep position to find its index
widget = self.widgetGet(position)
idx = visible_positions.index(position)
if hide:
del self.contents[idx]
self._hidden.add(position)
else:
self.contents.insert(idx, (widget, ('pack', None)))
self._hidden.remove(position)
def show(self, position):
if position in self._hidden:
self.hideSwitch(position)
def hide(self, position):
if not position in self._hidden:
self.hideSwitch(position)
class PrimitivusApp(QuickApp, InputHistory):
def __init__(self):
@ -188,10 +242,10 @@ class PrimitivusApp(QuickApp, InputHistory):
##misc setup##
self.chat_wins = ChatList(self)
self.notBar = sat_widgets.NotificationBar()
urwid.connect_signal(self.notBar, 'change', self.onNotification)
self.notif_bar = sat_widgets.NotificationBar()
urwid.connect_signal(self.notif_bar, 'change', self.onNotification)
self.progress_wid = Progress(self)
urwid.connect_signal(self.notBar.progress, 'click', lambda x: self.addWindow(self.progress_wid))
urwid.connect_signal(self.notif_bar.progress, 'click', lambda x: self.addWindow(self.progress_wid))
self.__saved_overlay = None
self.x_notify = Notify()
@ -268,15 +322,12 @@ class PrimitivusApp(QuickApp, InputHistory):
if input_ == a_key['MENU_HIDE']:
"""User want to (un)hide the menu roller"""
try:
if self.main_widget.header == None:
self.main_widget.header = self.menu_roller
else:
self.main_widget.header = None
self.main_widget.hideSwitch('menu')
except AttributeError:
pass
elif input_ == a_key['NOTIFICATION_NEXT']:
"""User wants to see next notification"""
self.notBar.showNext()
self.notif_bar.showNext()
elif input_ == a_key['OVERLAY_HIDE']:
"""User wants to (un)hide overlay window"""
if isinstance(self.loop.widget,urwid.Overlay):
@ -357,7 +408,7 @@ class PrimitivusApp(QuickApp, InputHistory):
self.editBar = EditBar(self)
self.menu_roller = self._buildMenuRoller()
self.main_widget = sat_widgets.FocusFrame(self.center_part, header=self.menu_roller, footer=self.editBar, focus_part='footer')
self.main_widget = PrimitivusTopWidget(self.center_part, self.menu_roller, self.notif_bar, self.editBar)
return self.main_widget
def plug_profile_1(self, profile_key='@DEFAULT@'):
@ -375,7 +426,7 @@ class PrimitivusApp(QuickApp, InputHistory):
def removePopUp(self, widget=None):
"Remove current pop-up, and if there is other in queue, show it"
self.loop.widget = self.main_widget
next_popup = self.notBar.getNextPopup()
next_popup = self.notif_bar.getNextPopup()
if next_popup:
#we still have popup to show, we display it
self.showPopUp(next_popup)
@ -387,11 +438,11 @@ class PrimitivusApp(QuickApp, InputHistory):
self.loop.widget = display_widget
self.redraw()
else:
self.notBar.addPopUp(pop_up_widget)
self.notif_bar.addPopUp(pop_up_widget)
def notify(self, message):
""""Notify message to user via notification bar"""
self.notBar.addMessage(message)
self.notif_bar.addMessage(message)
self.redraw()
def addWindow(self, widget):
@ -422,7 +473,7 @@ class PrimitivusApp(QuickApp, InputHistory):
def setProgress(self, percentage):
"""Set the progression shown in notification bar"""
self.notBar.setProgress(percentage)
self.notif_bar.setProgress(percentage)
def contactSelected(self, contact_list):
contact = contact_list.getContact()
@ -469,23 +520,16 @@ class PrimitivusApp(QuickApp, InputHistory):
log.error(_('unmanaged dialog type: %s'), type_)
self.showPopUp(popup)
def onNotification(self, notBar):
def onNotification(self, notif_bar):
"""Called when a new notification has been received"""
if not isinstance(self.main_widget, sat_widgets.FocusFrame):
if not isinstance(self.main_widget, PrimitivusTopWidget):
#if we are not in the main configuration, we ignore the notifications bar
return
if isinstance(self.main_widget.footer,sat_widgets.AdvancedEdit):
if not self.notBar.canHide():
#the notification bar is not visible and has usefull informations, we show it
pile = urwid.Pile([self.notBar, self.editBar])
self.main_widget.footer = pile
else:
if not isinstance(self.main_widget.footer, urwid.Pile):
log.error(_("INTERNAL ERROR: Unexpected class for main widget's footer"))
assert(False)
if self.notBar.canHide():
if self.notif_bar.canHide():
#No notification left, we can hide the bar
self.main_widget.footer = self.editBar
self.main_widget.hide('notif_bar')
else:
self.main_widget.show('notif_bar')
def launchAction(self, callback_id, data=None, profile_key="@NONE@"):
""" Launch a dynamic action