# HG changeset patch # User Goffi # Date 1470172304 -7200 # Node ID 01aff34e88730a2ee13610d257d29be4abbe0160 # Parent 224c8b0886bc3da7086ceb0cf5e8401d97617686 quick frontends, primitivus: messageState signal handling diff -r 224c8b0886bc -r 01aff34e8873 frontends/src/primitivus/chat.py --- a/frontends/src/primitivus/chat.py Thu Jul 28 19:11:31 2016 +0200 +++ b/frontends/src/primitivus/chat.py Tue Aug 02 23:11:44 2016 +0200 @@ -81,6 +81,7 @@ def redraw(self): self._w.set_text(self.markup) + self.mess_data.parent.host.redraw() # FIXME: should not be necessary def selectable(self): return True @@ -108,6 +109,14 @@ d = self.mess_data mention = d.mention + # message status + if d.status is None: + markup.append(u' ') + elif d.status == "delivered": + markup.append(('msg_status_received', u'✔')) + else: + log.warning(u"Unknown status: {}".format(d.status)) + # timestamp if self.parent.show_timestamp: # if the message was sent before today, we print the full date @@ -134,6 +143,10 @@ return markup + # events + def updated(self, attributes): + self.redraw() + @total_ordering class OccupantWidget(urwid.WidgetWrap): diff -r 224c8b0886bc -r 01aff34e8873 frontends/src/primitivus/constants.py --- a/frontends/src/primitivus/constants.py Thu Jul 28 19:11:31 2016 +0200 +++ b/frontends/src/primitivus/constants.py Tue Aug 02 23:11:44 2016 +0200 @@ -42,6 +42,7 @@ ('info_msg', 'yellow', 'default', 'bold'), ('msg_lang', 'dark cyan', 'default'), ('msg_mention', 'dark red, bold', 'default'), + ('msg_status_received', 'light green, bold', 'default'), ('menubar', 'light gray,bold', 'dark red'), ('menubar_focus', 'light gray,bold', 'dark green'), diff -r 224c8b0886bc -r 01aff34e8873 frontends/src/quick_frontend/quick_app.py --- a/frontends/src/quick_frontend/quick_app.py Thu Jul 28 19:11:31 2016 +0200 +++ b/frontends/src/quick_frontend/quick_app.py Tue Aug 02 23:11:44 2016 +0200 @@ -254,6 +254,7 @@ self.registerSignal("mucRoomUserChangedNick", iface="plugin") self.registerSignal("mucRoomNewSubject", iface="plugin") self.registerSignal("chatStateReceived", iface="plugin") + self.registerSignal("messageState", iface="plugin") self.registerSignal("psEvent", iface="plugin") # FIXME: do it dynamically @@ -491,6 +492,10 @@ chat_widget.messageNew(uid, timestamp, from_jid, target, msg, subject, type_, extra, profile) + def messageStateHandler(self, uid, status, profile): + for widget in self.widgets.getWidgets(quick_chat.QuickChat, profiles=(profile,)): + widget.onMessageState(uid, status, profile) + def messageSend(self, to_jid, message, subject=None, mess_type="auto", extra=None, callback=None, errback=None, profile_key=C.PROF_KEY_NONE): if subject is None: subject = {} diff -r 224c8b0886bc -r 01aff34e8873 frontends/src/quick_frontend/quick_chat.py --- a/frontends/src/quick_frontend/quick_chat.py Thu Jul 28 19:11:31 2016 +0200 +++ b/frontends/src/quick_frontend/quick_chat.py Tue Aug 02 23:11:44 2016 +0200 @@ -55,6 +55,7 @@ self.type = type_ self.extra = extra self.nick = self.getNick(from_jid) + self._status = None # own_mess is True if message was sent by profile's jid self.own_mess = (from_jid.resource == self.parent.nick) if self.parent.type == C.CHAT_GROUP else (from_jid.bare == self.host.profiles[profile].whoami.bare) # is user mentioned here ? @@ -112,6 +113,16 @@ return contact_list.getCache(entity, 'nick') or contact_list.getCache(entity, 'name') or entity.node or entity return entity.node or entity + @property + def status(self): + return self._status + + @status.setter + def status(self, status): + self._status = status + for w in self.widgets: + w.updated(["status"]) + class Occupant(object): """Occupant metadata""" @@ -468,5 +479,13 @@ log.warning(u"{nick} not found in {room}, ignoring new chat state".format( nick=nick, room=self.target.bare)) + def onMessageState(self, uid, status, profile): + try: + mess_data = self.messages[uid] + except KeyError: + pass + else: + mess_data.status = status + quick_widgets.register(QuickChat)