# HG changeset patch # User Goffi # Date 1410184251 -7200 # Node ID ca8ce5a47969431d791b96ac3d6b4317cd9d294c # Parent 69aace10b46d8c02d55940323eb16feb03628338 Primitivus: main_widget is now in its own class (PrimitivusTopWidget), menu and notification bar (un)hidding is cleaner diff -r 69aace10b46d -r ca8ce5a47969 frontends/src/primitivus/primitivus --- a/frontends/src/primitivus/primitivus Mon Sep 08 15:50:51 2014 +0200 +++ b/frontends/src/primitivus/primitivus Mon Sep 08 15:50:51 2014 +0200 @@ -177,6 +177,60 @@ 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 @@ ##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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 + if self.notif_bar.canHide(): + #No notification left, we can hide the bar + self.main_widget.hide('notif_bar') 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(): - #No notification left, we can hide the bar - self.main_widget.footer = self.editBar + self.main_widget.show('notif_bar') def launchAction(self, callback_id, data=None, profile_key="@NONE@"): """ Launch a dynamic action