def fill_table_with_accounts(self, accounts): iconset = gajim.config.get('iconset') if not iconset: iconset = 'dcraven' file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for acct in accounts: message = acct['message'] # before reducing the chars we should assure we send unicode, else # there are possible pango TBs on 'set_markup' if isinstance(message, str): message = unicode(message, encoding='utf-8') message = helpers.reduce_chars_newlines(message, 100, 1) message = gobject.markup_escape_text(message) if acct['name'] in gajim.con_types and \ gajim.con_types[acct['name']] in ('tls', 'ssl'): show_lock = True else: show_lock = False if message: self.add_status_row(file_path, acct['show'], gobject.markup_escape_text(acct['name']) + \ ' - ' + message, show_lock=show_lock, indent=False) else: self.add_status_row(file_path, acct['show'], gobject.markup_escape_text(acct['name']), show_lock=show_lock, indent=False) for line in acct['event_lines']: self.add_text_row(' ' + line, 1)
def fill_table_with_accounts(self, accounts): iconset = gajim.config.get('iconset') if not iconset: iconset = 'dcraven' file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for acct in accounts: message = acct['message'] # before reducing the chars we should assure we send unicode, else # there are possible pango TBs on 'set_markup' if isinstance(message, str): message = unicode(message, encoding = 'utf-8') message = helpers.reduce_chars_newlines(message, 100, 1) message = gobject.markup_escape_text(message) if acct['name'] in gajim.con_types and \ gajim.con_types[acct['name']] in ('tls', 'ssl'): show_lock = True else: show_lock = False if message: self.add_status_row(file_path, acct['show'], gobject.markup_escape_text(acct['name']) + \ ' - ' + message, show_lock=show_lock, indent=False) else: self.add_status_row(file_path, acct['show'], gobject.markup_escape_text(acct['name']) , show_lock=show_lock, indent=False) for line in acct['event_lines']: self.add_text_row(' ' + line, 1)
def get_status_info(self, resource, priority, show, status): str_status = resource + ' (' + str(priority) + ')' if status: status = status.strip() if status != '': # reduce to 100 chars, 1 line status = helpers.reduce_chars_newlines(status, 100, 1) str_status = GLib.markup_escape_text(str_status) status = GLib.markup_escape_text(status) str_status += ' - <i>' + status + '</i>' return str_status
def get_status_info(self, resource, priority, show, status): str_status = resource + ' (' + unicode(priority) + ')' if status: status = status.strip() if status != '': # make sure 'status' is unicode before we send to to reduce_chars if isinstance(status, str): status = unicode(status, encoding='utf-8') # reduce to 100 chars, 1 line status = helpers.reduce_chars_newlines(status, 100, 1) str_status = gobject.markup_escape_text(str_status) status = gobject.markup_escape_text(status) str_status += ' - <i>' + status + '</i>' return str_status
def chatstate_received(self, obj): if not self.active: return contact = gajim.contacts.get_contact_from_full_jid(obj.conn.name, obj.fjid) if not contact: return chatstate = obj.chatstate if chatstate not in self.chatstates.keys(): return self.model = gajim.interface.roster.model child_iters = gajim.interface.roster._get_contact_iter(obj.jid, obj.conn.name, contact, self.model) name = gobject.markup_escape_text(contact.get_shown_name()) contact_instances = gajim.contacts.get_contacts(obj.conn.name, contact.jid) # Show resource counter nb_connected_contact = 0 for c in contact_instances: if c.show not in ('error', 'offline'): nb_connected_contact += 1 if nb_connected_contact > 1: name += paragraph_direction_mark(unicode(name)) name += u' (%d)' % nb_connected_contact for child_iter in child_iters: if chatstate != 'gone': color = self.chatstates[chatstate] name = '<span foreground="%s">%s</span>' % (color, name) if contact.status and gajim.config.get( 'show_status_msgs_in_roster'): status = contact.status.strip() if status != '': status = helpers.reduce_chars_newlines(status, max_lines=1) name += '\n<span size="small" style="italic" ' \ 'foreground="%s">%s</span>' % (self.status_color, gobject.markup_escape_text(status)) self.model[child_iter][1] = name
def chatstate_received(self, obj): if not self.active: return contact = gajim.contacts.get_contact_from_full_jid( obj.conn.name, obj.fjid) if not contact: return chatstate = obj.chatstate if chatstate not in self.chatstates.keys(): return self.model = gajim.interface.roster.model child_iters = gajim.interface.roster._get_contact_iter( obj.jid, obj.conn.name, contact, self.model) name = gobject.markup_escape_text(contact.get_shown_name()) contact_instances = gajim.contacts.get_contacts( obj.conn.name, contact.jid) # Show resource counter nb_connected_contact = 0 for c in contact_instances: if c.show not in ('error', 'offline'): nb_connected_contact += 1 if nb_connected_contact > 1: name += paragraph_direction_mark(unicode(name)) name += u' (%d)' % nb_connected_contact for child_iter in child_iters: if chatstate != 'gone': color = self.chatstates[chatstate] name = '<span foreground="%s">%s</span>' % (color, name) if contact.status and gajim.config.get( 'show_status_msgs_in_roster'): status = contact.status.strip() if status != '': status = helpers.reduce_chars_newlines(status, max_lines=1) name += '\n<span size="small" style="italic" ' \ 'foreground="%s">%s</span>' % (self.status_color, gobject.markup_escape_text(status)) self.model[child_iter][1] = name
def fill_table_with_accounts(self, accounts): iconset = gajim.config.get('iconset') if not iconset: iconset = 'dcraven' file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for acct in accounts: message = acct['message'] message = helpers.reduce_chars_newlines(message, 100, 1) message = GLib.markup_escape_text(message) if acct['name'] in gajim.con_types and \ gajim.con_types[acct['name']] in ('tls', 'ssl'): show_lock = True else: show_lock = False if message: self.add_status_row(file_path, acct['show'], GLib.markup_escape_text(acct['name']) + ' - ' + message, show_lock=show_lock, indent=False) else: self.add_status_row(file_path, acct['show'], GLib.markup_escape_text(acct['name']), show_lock=show_lock, indent=False) for line in acct['event_lines']: self.add_text_row(' ' + line, 1)
def populate(self, contact): if not contact: return self.create_window() vcard_table = Gtk.Grid() vcard_table.insert_row(0) vcard_table.insert_row(0) vcard_table.insert_row(0) vcard_table.insert_column(0) vcard_table.set_property('column-spacing', 2) vcard_current_row = 1 properties = [] nick_markup = '<b>' + GLib.markup_escape_text(contact.get_shown_name())\ + '</b>' properties.append((nick_markup, None)) if contact.status: # status message status = contact.status.strip() if status != '': # escape markup entities status = helpers.reduce_chars_newlines(status, 300, 5) status = '<i>' + GLib.markup_escape_text(status) + '</i>' properties.append((status, None)) show = helpers.get_uf_show(contact.show) show = self.colorize_status(show) properties.append((show, None)) if contact.jid.strip(): properties.append((_('Jabber ID: '), '\u200E' + "<b>%s</b>" % \ contact.jid)) if hasattr(contact, 'resource') and contact.resource.strip(): properties.append((_('Resource: '), GLib.markup_escape_text( contact.resource))) if contact.affiliation != 'none': uf_affiliation = helpers.get_uf_affiliation(contact.affiliation) uf_affiliation = \ _('%(owner_or_admin_or_member)s of this group chat') % \ {'owner_or_admin_or_member': uf_affiliation} uf_affiliation = self.colorize_affiliation(uf_affiliation) properties.append((uf_affiliation, None)) # Add avatar puny_name = helpers.sanitize_filename(contact.name) puny_room = helpers.sanitize_filename(contact.room_jid) file_ = helpers.get_avatar_path(os.path.join(gajim.AVATAR_PATH, puny_room, puny_name)) if file_: with open(file_, 'rb') as file_data: pix = gtkgui_helpers.get_pixbuf_from_data(file_data.read()) pix = gtkgui_helpers.get_scaled_pixbuf(pix, 'tooltip') self.avatar_image.set_from_pixbuf(pix) else: self.avatar_image.set_from_pixbuf(None) while properties: property_ = properties.pop(0) vcard_current_row += 1 label = Gtk.Label() if not properties: label.set_vexpand(True) label.set_alignment(0, 0) if property_[1]: label.set_markup(property_[0]) vcard_table.attach(label, 1, vcard_current_row, 1, 1) label = Gtk.Label() if not properties: label.set_vexpand(True) label.set_alignment(0, 0) label.set_markup(property_[1]) label.set_line_wrap(True) vcard_table.attach(label, 2, vcard_current_row, 1, 1) else: label.set_markup(property_[0]) label.set_line_wrap(True) vcard_table.attach(label, 1, vcard_current_row, 2, 1) self.avatar_image.set_alignment(0, 0) vcard_table.attach(self.avatar_image, 3, 2, 1, vcard_current_row - 1) gajim.plugin_manager.gui_extension_point('gc_tooltip_populate', self, contact, vcard_table) self.win.add(vcard_table)
def on_textview_populate_popup(self, textview, menu): '''we override the default context menu and we prepend Clear (only if used_in_history_window is False) and if we have sth selected we show a submenu with actions on the phrase (see on_conversation_textview_button_press_event)''' separator_menuitem_was_added = False if not self.used_in_history_window: item = gtk.SeparatorMenuItem() menu.prepend(item) separator_menuitem_was_added = True item = gtk.ImageMenuItem(gtk.STOCK_CLEAR) menu.prepend(item) id = item.connect('activate', self.clear) self.handlers[id] = item if self.selected_phrase: if not separator_menuitem_was_added: item = gtk.SeparatorMenuItem() menu.prepend(item) self.selected_phrase = helpers.reduce_chars_newlines( self.selected_phrase, 25, 2) item = gtk.MenuItem(_('_Actions for "%s"') % self.selected_phrase) menu.prepend(item) submenu = gtk.Menu() item.set_submenu(submenu) always_use_en = gajim.config.get('always_english_wikipedia') if always_use_en: link = 'http://en.wikipedia.org/wiki/Special:Search?search=%s'\ % self.selected_phrase else: link = 'http://%s.wikipedia.org/wiki/Special:Search?search=%s'\ % (gajim.LANG, self.selected_phrase) item = gtk.MenuItem(_('Read _Wikipedia Article')) id = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id] = item submenu.append(item) item = gtk.MenuItem(_('Look it up in _Dictionary')) dict_link = gajim.config.get('dictionary_url') if dict_link == 'WIKTIONARY': # special link (yeah undocumented but default) always_use_en = gajim.config.get('always_english_wiktionary') if always_use_en: link = 'http://en.wiktionary.org/wiki/Special:Search?search=%s'\ % self.selected_phrase else: link = 'http://%s.wiktionary.org/wiki/Special:Search?search=%s'\ % (gajim.LANG, self.selected_phrase) id = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id] = item else: if dict_link.find('%s') == -1: # we must have %s in the url if not WIKTIONARY item = gtk.MenuItem(_( 'Dictionary URL is missing an "%s" and it is not WIKTIONARY')) item.set_property('sensitive', False) else: link = dict_link % self.selected_phrase id = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id] = item submenu.append(item) search_link = gajim.config.get('search_engine') if search_link.find('%s') == -1: # we must have %s in the url item = gtk.MenuItem(_('Web Search URL is missing an "%s"')) item.set_property('sensitive', False) else: item = gtk.MenuItem(_('Web _Search for it')) link = search_link % self.selected_phrase id = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id] = item submenu.append(item) item = gtk.MenuItem(_('Open as _Link')) id = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id] = item submenu.append(item) menu.show_all()
def populate(self, contacts): self.create_window() self.create_table() if not contacts or len(contacts) == 0: # Tooltip for merged accounts row accounts = helpers.get_notification_icon_tooltip_dict() self.spacer_label = '' self.fill_table_with_accounts(accounts) self.win.add(self.table) return # primary contact prim_contact = gajim.contacts.get_highest_prio_contact_from_contacts( contacts) puny_jid = helpers.sanitize_filename(prim_contact.jid) table_size = 3 file_ = helpers.get_avatar_path(os.path.join(gajim.AVATAR_PATH, puny_jid)) if file_: with open(file_, 'rb') as file_data: pix = gtkgui_helpers.get_pixbuf_from_data(file_data.read()) pix = gtkgui_helpers.get_scaled_pixbuf(pix, 'tooltip') self.avatar_image.set_from_pixbuf(pix) table_size = 4 else: self.avatar_image.set_from_pixbuf(None) vcard_table = Gtk.Grid() vcard_table.insert_row(0) for i in range(0, table_size): vcard_table.insert_column(0) vcard_table.set_property('column-spacing', 2) vcard_current_row = 1 properties = [] name_markup = '<span weight="bold">' + GLib.markup_escape_text( prim_contact.get_shown_name()) + '</span>' if gajim.config.get('mergeaccounts'): name_markup += " <span foreground='%s'>(%s)</span>" % ( gajim.config.get('tooltip_account_name_color'), GLib.markup_escape_text(prim_contact.account.name)) if self.account and helpers.jid_is_blocked(self.account, prim_contact.jid): name_markup += _(' [blocked]') if self.account and \ self.account in gajim.interface.minimized_controls and \ prim_contact.jid in gajim.interface.minimized_controls[self.account]: name_markup += _(' [minimized]') properties.append((name_markup, None)) num_resources = 0 # put contacts in dict, where key is priority contacts_dict = {} for contact in contacts: if contact.resource: num_resources += 1 if contact.priority in contacts_dict: contacts_dict[int(contact.priority)].append(contact) else: contacts_dict[int(contact.priority)] = [contact] if num_resources > 1: properties.append((_('Status: '), ' ')) transport = gajim.get_transport_name_from_jid(prim_contact.jid) if transport: file_path = os.path.join(helpers.get_transport_path(transport), '16x16') else: iconset = gajim.config.get('iconset') if not iconset: iconset = 'dcraven' file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') contact_keys = sorted(contacts_dict.keys()) contact_keys.reverse() for priority in contact_keys: for acontact in contacts_dict[priority]: status_line = self.get_status_info(acontact.resource, acontact.priority, acontact.show, acontact.status) icon_name = self._get_icon_name_for_tooltip(acontact) self.add_status_row(file_path, icon_name, status_line, acontact.last_status_time) properties.append((self.table, None)) else: # only one resource if contact.show: show = helpers.get_uf_show(contact.show) if not self.check_last_time and self.account: if contact.show == 'offline': if not contact.last_status_time: gajim.connections[self.account].\ request_last_status_time(contact.jid, '') else: self.check_last_time = contact.last_status_time elif contact.resource: gajim.connections[self.account].\ request_last_status_time( contact.jid, contact.resource) if contact.last_activity_time: self.check_last_time = contact.last_activity_time else: self.check_last_time = None if contact.last_status_time: vcard_current_row += 1 if contact.show == 'offline': text = ' - ' + _('Last status: %s') else: text = _(' since %s') if time.strftime('%j', time.localtime()) == \ time.strftime('%j', contact.last_status_time): # it's today, show only the locale hour representation local_time = time.strftime('%X', contact.last_status_time) else: # time.strftime returns locale encoded string local_time = time.strftime('%c', contact.last_status_time) text = text % local_time show += text if self.account and \ prim_contact.jid in gajim.gc_connected[self.account]: if gajim.gc_connected[self.account][prim_contact.jid]: show = _('Connected') else: show = _('Disconnected') show = self.colorize_status(show) if contact.status: status = contact.status.strip() if status: # reduce long status # (no more than 300 chars on line and no more than # 5 lines) # status is wrapped status = helpers.reduce_chars_newlines(status, 300, 5) # escape markup entities. status = GLib.markup_escape_text(status) properties.append(('<i>%s</i>' % status, None)) properties.append((show, None)) self._append_pep_info(contact, properties) properties.append((_('Jabber ID: '), '\u200E' + "<b>%s</b>" % \ prim_contact.jid)) # contact has only one ressource if num_resources == 1 and contact.resource: properties.append((_('Resource: '), GLib.markup_escape_text( contact.resource) + ' (' + str(contact.priority) + ')')) if self.account and prim_contact.sub and prim_contact.sub != 'both' and\ prim_contact.jid not in gajim.gc_connected[self.account]: # ('both' is the normal sub so we don't show it) properties.append(( _('Subscription: '), GLib.markup_escape_text( helpers.get_uf_sub(prim_contact.sub)))) if prim_contact.keyID: keyID = None if len(prim_contact.keyID) == 8: keyID = prim_contact.keyID elif len(prim_contact.keyID) == 16: keyID = prim_contact.keyID[8:] if keyID: properties.append((_('OpenPGP: '), GLib.markup_escape_text( keyID))) if contact.last_activity_time: last_active = datetime(*contact.last_activity_time[:6]) current = datetime.now() diff = current - last_active diff = timedelta(diff.days, diff.seconds) if last_active.date() == current.date(): formatted = last_active.strftime("%X") else: formatted = last_active.strftime("%c") # Do not show the "Idle since" and "Idle for" items if there # is no meaningful difference between last activity time and # current time. if diff.days > 0 or diff.seconds > 0: cs = "<span foreground='%s'>" % gajim.config.get( 'tooltip_idle_color') cs += '%s</span>' properties.append((str(), None)) idle_since = cs % _("Idle since %s") properties.append((idle_since % formatted, None)) idle_for = cs % _("Idle for %s") properties.append((idle_for % str(diff), None)) while properties: property_ = properties.pop(0) vcard_current_row += 1 label = Gtk.Label() if not properties and table_size == 4: label.set_vexpand(True) label.set_halign(Gtk.Align.START) label.set_valign(Gtk.Align.START) if property_[1]: label.set_markup(property_[0]) vcard_table.attach(label, 1, vcard_current_row, 1, 1) label = Gtk.Label() if not properties and table_size == 4: label.set_vexpand(True) label.set_halign(Gtk.Align.START) label.set_valign(Gtk.Align.START) label.set_markup(property_[1]) label.set_line_wrap(True) vcard_table.attach(label, 2, vcard_current_row, 1, 1) else: if isinstance(property_[0], str): label.set_markup(property_[0]) label.set_line_wrap(True) else: label = property_[0] vcard_table.attach(label, 1, vcard_current_row, 2, 1) self.avatar_image.set_halign(Gtk.Align.START) self.avatar_image.set_valign(Gtk.Align.START) if table_size == 4: vcard_table.attach(self.avatar_image, 3, 2, 1, vcard_current_row - 1) gajim.plugin_manager.gui_extension_point('roster_tooltip_populate', self, contacts, vcard_table) self.win.add(vcard_table)
def populate(self, contact): if not contact: return self.create_window() vcard_table = Gtk.Grid() vcard_table.insert_row(0) vcard_table.insert_row(0) vcard_table.insert_row(0) vcard_table.insert_column(0) vcard_table.set_property('column-spacing', 2) vcard_current_row = 1 properties = [] nick_markup = '<b>' + GLib.markup_escape_text(contact.get_shown_name())\ + '</b>' properties.append((nick_markup, None)) if contact.status: # status message status = contact.status.strip() if status != '': # escape markup entities status = helpers.reduce_chars_newlines(status, 300, 5) status = '<i>' + GLib.markup_escape_text(status) + '</i>' properties.append((status, None)) show = helpers.get_uf_show(contact.show) show = self.colorize_status(show) properties.append((show, None)) if contact.jid.strip(): properties.append((_('Jabber ID: '), '\u200E' + "<b>%s</b>" % \ contact.jid)) if hasattr(contact, 'resource') and contact.resource.strip(): properties.append((_('Resource: '), GLib.markup_escape_text( contact.resource))) if contact.affiliation != 'none': uf_affiliation = helpers.get_uf_affiliation(contact.affiliation) uf_affiliation = \ _('%(owner_or_admin_or_member)s of this group chat') % \ {'owner_or_admin_or_member': uf_affiliation} uf_affiliation = self.colorize_affiliation(uf_affiliation) properties.append((uf_affiliation, None)) # Add avatar puny_name = helpers.sanitize_filename(contact.name) puny_room = helpers.sanitize_filename(contact.room_jid) file_ = helpers.get_avatar_path(os.path.join(gajim.AVATAR_PATH, puny_room, puny_name)) if file_: with open(file_, 'rb') as file_data: pix = gtkgui_helpers.get_pixbuf_from_data(file_data.read()) pix = gtkgui_helpers.get_scaled_pixbuf(pix, 'tooltip') self.avatar_image.set_from_pixbuf(pix) else: self.avatar_image.set_from_pixbuf(None) while properties: property_ = properties.pop(0) vcard_current_row += 1 label = Gtk.Label() if not properties: label.set_vexpand(True) label.set_halign(Gtk.Align.START) label.set_valign(Gtk.Align.START) if property_[1]: label.set_markup(property_[0]) vcard_table.attach(label, 1, vcard_current_row, 1, 1) label = Gtk.Label() if not properties: label.set_vexpand(True) label.set_halign(Gtk.Align.START) label.set_valign(Gtk.Align.START) label.set_markup(property_[1]) label.set_line_wrap(True) vcard_table.attach(label, 2, vcard_current_row, 1, 1) else: label.set_markup(property_[0]) label.set_line_wrap(True) vcard_table.attach(label, 1, vcard_current_row, 2, 1) self.avatar_image.set_halign(Gtk.Align.START) self.avatar_image.set_valign(Gtk.Align.START) vcard_table.attach(self.avatar_image, 3, 2, 1, vcard_current_row - 1) gajim.plugin_manager.gui_extension_point('gc_tooltip_populate', self, contact, vcard_table) self.win.add(vcard_table)
def populate(self, contact): if not contact: return self.create_window() vcard_table = gtk.Table(3, 1) vcard_table.set_property('column-spacing', 2) vcard_table.set_homogeneous(False) vcard_current_row = 1 properties = [] nick_markup = '<b>' + \ gobject.markup_escape_text(contact.get_shown_name()) \ + '</b>' properties.append((nick_markup, None)) if contact.status: # status message status = contact.status.strip() if status != '': # escape markup entities status = helpers.reduce_chars_newlines(status, 300, 5) status = '<i>' +\ gobject.markup_escape_text(status) + '</i>' properties.append((status, None)) else: # no status message, show SHOW instead show = helpers.get_uf_show(contact.show) show = '<i>' + show + '</i>' properties.append((show, None)) if contact.jid.strip() != '': properties.append((_('Jabber ID: '), contact.jid)) if hasattr(contact, 'resource') and contact.resource.strip() != '': properties.append((_('Resource: '), gobject.markup_escape_text(contact.resource))) if contact.affiliation != 'none': uf_affiliation = helpers.get_uf_affiliation(contact.affiliation) affiliation_str = \ _('%(owner_or_admin_or_member)s of this group chat') %\ {'owner_or_admin_or_member': uf_affiliation} properties.append((affiliation_str, None)) # Add avatar puny_name = helpers.sanitize_filename(contact.name) puny_room = helpers.sanitize_filename(contact.room_jid) file = helpers.get_avatar_path( os.path.join(gajim.AVATAR_PATH, puny_room, puny_name)) if file: self.avatar_image.set_from_file(file) pix = self.avatar_image.get_pixbuf() pix = gtkgui_helpers.get_scaled_pixbuf(pix, 'tooltip') self.avatar_image.set_from_pixbuf(pix) else: self.avatar_image.set_from_pixbuf(None) while properties: property = properties.pop(0) vcard_current_row += 1 vertical_fill = gtk.FILL if not properties: vertical_fill |= gtk.EXPAND label = gtk.Label() label.set_alignment(0, 0) if property[1]: label.set_markup(property[0]) vcard_table.attach(label, 1, 2, vcard_current_row, vcard_current_row + 1, gtk.FILL, vertical_fill, 0, 0) label = gtk.Label() label.set_alignment(0, 0) label.set_markup(property[1]) label.set_line_wrap(True) vcard_table.attach(label, 2, 3, vcard_current_row, vcard_current_row + 1, gtk.EXPAND | gtk.FILL, vertical_fill, 0, 0) else: label.set_markup(property[0]) label.set_line_wrap(True) vcard_table.attach(label, 1, 3, vcard_current_row, vcard_current_row + 1, gtk.FILL, vertical_fill, 0) self.avatar_image.set_alignment(0, 0) vcard_table.attach(self.avatar_image, 3, 4, 2, vcard_current_row + 1, gtk.FILL, gtk.FILL | gtk.EXPAND, 3, 3) self.win.add(vcard_table)
def populate(self, contacts): self.create_window() self.create_table() if not contacts or len(contacts) == 0: # Tooltip for merged accounts row accounts = helpers.get_notification_icon_tooltip_dict() self.table.resize(2, 1) self.spacer_label = '' self.fill_table_with_accounts(accounts) self.win.add(self.table) return # primary contact prim_contact = gajim.contacts.get_highest_prio_contact_from_contacts( contacts) puny_jid = helpers.sanitize_filename(prim_contact.jid) table_size = 3 file = helpers.get_avatar_path( os.path.join(gajim.AVATAR_PATH, puny_jid)) if file: self.avatar_image.set_from_file(file) pix = self.avatar_image.get_pixbuf() pix = gtkgui_helpers.get_scaled_pixbuf(pix, 'tooltip') self.avatar_image.set_from_pixbuf(pix) table_size = 4 else: self.avatar_image.set_from_pixbuf(None) vcard_table = gtk.Table(table_size, 1) vcard_table.set_property('column-spacing', 2) vcard_table.set_homogeneous(False) vcard_current_row = 1 properties = [] name_markup = u'<span weight="bold">' + \ gobject.markup_escape_text(prim_contact.get_shown_name())\ + '</span>' if self.account and prim_contact.jid in gajim.connections[ self.account].blocked_contacts: name_markup += _(' [blocked]') if self.account and \ self.account in gajim.interface.minimized_controls and \ prim_contact.jid in gajim.interface.minimized_controls[self.account]: name_markup += _(' [minimized]') properties.append((name_markup, None)) num_resources = 0 # put contacts in dict, where key is priority contacts_dict = {} for contact in contacts: if contact.resource: num_resources += 1 if contact.priority in contacts_dict: contacts_dict[contact.priority].append(contact) else: contacts_dict[contact.priority] = [contact] if num_resources > 1: properties.append((_('Status: '), ' ')) transport = gajim.get_transport_name_from_jid(prim_contact.jid) if transport: file_path = os.path.join(helpers.get_transport_path(transport), '16x16') else: iconset = gajim.config.get('iconset') if not iconset: iconset = 'dcraven' file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') contact_keys = sorted(contacts_dict.keys()) contact_keys.reverse() for priority in contact_keys: for contact in contacts_dict[priority]: status_line = self.get_status_info(contact.resource, contact.priority, contact.show, contact.status) icon_name = self._get_icon_name_for_tooltip(contact) self.add_status_row(file_path, icon_name, status_line, contact.last_status_time) properties.append((self.table, None)) else: # only one resource if contact.show: show = helpers.get_uf_show(contact.show) if contact.last_status_time: vcard_current_row += 1 if contact.show == 'offline': text = ' - ' + _('Last status: %s') else: text = _(' since %s') if time.strftime('%j', time.localtime())== \ time.strftime('%j', contact.last_status_time): # it's today, show only the locale hour representation local_time = time.strftime('%X', contact.last_status_time) else: # time.strftime returns locale encoded string local_time = time.strftime('%c', contact.last_status_time) local_time = local_time.decode( locale.getpreferredencoding()) text = text % local_time show += text if self.account and \ prim_contact.jid in gajim.gc_connected[self.account]: if gajim.gc_connected[self.account][prim_contact.jid]: show = _('Connected') else: show = _('Disconnected') show = '<i>' + show + '</i>' # we append show below if contact.status: status = contact.status.strip() if status: # reduce long status # (no more than 300 chars on line and no more than 5 lines) # status is wrapped status = helpers.reduce_chars_newlines(status, 300, 5) # escape markup entities. status = gobject.markup_escape_text(status) properties.append(('<i>%s</i>' % status, None)) properties.append((show, None)) self._append_pep_info(contact, properties) properties.append((_('Jabber ID: '), prim_contact.jid)) # contact has only one ressource if num_resources == 1 and contact.resource: properties.append((_('Resource: '), gobject.markup_escape_text(contact.resource) +\ ' (' + unicode(contact.priority) + ')')) if self.account and prim_contact.sub and prim_contact.sub != 'both' and\ prim_contact.jid not in gajim.gc_connected[self.account]: # ('both' is the normal sub so we don't show it) properties.append((_('Subscription: '), gobject.markup_escape_text( helpers.get_uf_sub(prim_contact.sub)))) if prim_contact.keyID: keyID = None if len(prim_contact.keyID) == 8: keyID = prim_contact.keyID elif len(prim_contact.keyID) == 16: keyID = prim_contact.keyID[8:] if keyID: properties.append( (_('OpenPGP: '), gobject.markup_escape_text(keyID))) while properties: property = properties.pop(0) vcard_current_row += 1 vertical_fill = gtk.FILL if not properties and table_size == 4: vertical_fill |= gtk.EXPAND label = gtk.Label() label.set_alignment(0, 0) if property[1]: label.set_markup(property[0]) vcard_table.attach(label, 1, 2, vcard_current_row, vcard_current_row + 1, gtk.FILL, vertical_fill, 0, 0) label = gtk.Label() label.set_alignment(0, 0) label.set_markup(property[1]) label.set_line_wrap(True) vcard_table.attach(label, 2, 3, vcard_current_row, vcard_current_row + 1, gtk.EXPAND | gtk.FILL, vertical_fill, 0, 0) else: if isinstance(property[0], (unicode, str)): #FIXME: rm unicode? label.set_markup(property[0]) label.set_line_wrap(True) else: label = property[0] vcard_table.attach(label, 1, 3, vcard_current_row, vcard_current_row + 1, gtk.FILL, vertical_fill, 0) self.avatar_image.set_alignment(0, 0) if table_size == 4: vcard_table.attach(self.avatar_image, 3, 4, 2, vcard_current_row + 1, gtk.FILL, gtk.FILL | gtk.EXPAND, 3, 3) self.win.add(vcard_table)
def populate(self, contact): if not contact: return self.create_window() vcard_table = gtk.Table(3, 1) vcard_table.set_property('column-spacing', 2) vcard_table.set_homogeneous(False) vcard_current_row = 1 properties = [] nick_markup = '<b>' + \ gobject.markup_escape_text(contact.get_shown_name()) \ + '</b>' properties.append((nick_markup, None)) if contact.status: # status message status = contact.status.strip() if status != '': # escape markup entities status = helpers.reduce_chars_newlines(status, 300, 5) status = '<i>' +\ gobject.markup_escape_text(status) + '</i>' properties.append((status, None)) else: # no status message, show SHOW instead show = helpers.get_uf_show(contact.show) show = '<i>' + show + '</i>' properties.append((show, None)) if contact.jid.strip() != '': properties.append((_('Jabber ID: '), contact.jid)) if hasattr(contact, 'resource') and contact.resource.strip() != '': properties.append((_('Resource: '), gobject.markup_escape_text(contact.resource) )) if contact.affiliation != 'none': uf_affiliation = helpers.get_uf_affiliation(contact.affiliation) affiliation_str = \ _('%(owner_or_admin_or_member)s of this group chat') %\ {'owner_or_admin_or_member': uf_affiliation} properties.append((affiliation_str, None)) # Add avatar puny_name = helpers.sanitize_filename(contact.name) puny_room = helpers.sanitize_filename(contact.room_jid) file = helpers.get_avatar_path(os.path.join(gajim.AVATAR_PATH, puny_room, puny_name)) if file: self.avatar_image.set_from_file(file) pix = self.avatar_image.get_pixbuf() pix = gtkgui_helpers.get_scaled_pixbuf(pix, 'tooltip') self.avatar_image.set_from_pixbuf(pix) else: self.avatar_image.set_from_pixbuf(None) while properties: property = properties.pop(0) vcard_current_row += 1 vertical_fill = gtk.FILL if not properties: vertical_fill |= gtk.EXPAND label = gtk.Label() label.set_alignment(0, 0) if property[1]: label.set_markup(property[0]) vcard_table.attach(label, 1, 2, vcard_current_row, vcard_current_row + 1, gtk.FILL, vertical_fill, 0, 0) label = gtk.Label() label.set_alignment(0, 0) label.set_markup(property[1]) label.set_line_wrap(True) vcard_table.attach(label, 2, 3, vcard_current_row, vcard_current_row + 1, gtk.EXPAND | gtk.FILL, vertical_fill, 0, 0) else: label.set_markup(property[0]) label.set_line_wrap(True) vcard_table.attach(label, 1, 3, vcard_current_row, vcard_current_row + 1, gtk.FILL, vertical_fill, 0) self.avatar_image.set_alignment(0, 0) vcard_table.attach(self.avatar_image, 3, 4, 2, vcard_current_row + 1, gtk.FILL, gtk.FILL | gtk.EXPAND, 3, 3) self.win.add(vcard_table)
def populate(self, contacts): self.create_window() self.create_table() if not contacts or len(contacts) == 0: # Tooltip for merged accounts row accounts = helpers.get_notification_icon_tooltip_dict() self.table.resize(2, 1) self.spacer_label = '' self.fill_table_with_accounts(accounts) self.win.add(self.table) return # primary contact prim_contact = gajim.contacts.get_highest_prio_contact_from_contacts( contacts) puny_jid = helpers.sanitize_filename(prim_contact.jid) table_size = 3 file = helpers.get_avatar_path(os.path.join(gajim.AVATAR_PATH, puny_jid)) if file: self.avatar_image.set_from_file(file) pix = self.avatar_image.get_pixbuf() pix = gtkgui_helpers.get_scaled_pixbuf(pix, 'tooltip') self.avatar_image.set_from_pixbuf(pix) table_size = 4 else: self.avatar_image.set_from_pixbuf(None) vcard_table = gtk.Table(table_size, 1) vcard_table.set_property('column-spacing', 2) vcard_table.set_homogeneous(False) vcard_current_row = 1 properties = [] name_markup = u'<span weight="bold">' + \ gobject.markup_escape_text(prim_contact.get_shown_name())\ + '</span>' if self.account and prim_contact.jid in gajim.connections[ self.account].blocked_contacts: name_markup += _(' [blocked]') if self.account and \ self.account in gajim.interface.minimized_controls and \ prim_contact.jid in gajim.interface.minimized_controls[self.account]: name_markup += _(' [minimized]') properties.append((name_markup, None)) num_resources = 0 # put contacts in dict, where key is priority contacts_dict = {} for contact in contacts: if contact.resource: num_resources += 1 if contact.priority in contacts_dict: contacts_dict[contact.priority].append(contact) else: contacts_dict[contact.priority] = [contact] if num_resources > 1: properties.append((_('Status: '), ' ')) transport = gajim.get_transport_name_from_jid( prim_contact.jid) if transport: file_path = os.path.join(helpers.get_transport_path(transport), '16x16') else: iconset = gajim.config.get('iconset') if not iconset: iconset = 'dcraven' file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') contact_keys = sorted(contacts_dict.keys()) contact_keys.reverse() for priority in contact_keys: for contact in contacts_dict[priority]: status_line = self.get_status_info(contact.resource, contact.priority, contact.show, contact.status) icon_name = self._get_icon_name_for_tooltip(contact) self.add_status_row(file_path, icon_name, status_line, contact.last_status_time) properties.append((self.table, None)) else: # only one resource if contact.show: show = helpers.get_uf_show(contact.show) if contact.last_status_time: vcard_current_row += 1 if contact.show == 'offline': text = ' - ' + _('Last status: %s') else: text = _(' since %s') if time.strftime('%j', time.localtime())== \ time.strftime('%j', contact.last_status_time): # it's today, show only the locale hour representation local_time = time.strftime('%X', contact.last_status_time) else: # time.strftime returns locale encoded string local_time = time.strftime('%c', contact.last_status_time) local_time = local_time.decode( locale.getpreferredencoding()) text = text % local_time show += text if self.account and \ prim_contact.jid in gajim.gc_connected[self.account]: if gajim.gc_connected[self.account][prim_contact.jid]: show = _('Connected') else: show = _('Disconnected') show = '<i>' + show + '</i>' # we append show below if contact.status: status = contact.status.strip() if status: # reduce long status # (no more than 300 chars on line and no more than 5 lines) # status is wrapped status = helpers.reduce_chars_newlines(status, 300, 5) # escape markup entities. status = gobject.markup_escape_text(status) properties.append(('<i>%s</i>' % status, None)) properties.append((show, None)) self._append_pep_info(contact, properties) properties.append((_('Jabber ID: '), prim_contact.jid )) # contact has only one ressource if num_resources == 1 and contact.resource: properties.append((_('Resource: '), gobject.markup_escape_text(contact.resource) +\ ' (' + unicode(contact.priority) + ')')) if self.account and prim_contact.sub and prim_contact.sub != 'both' and\ prim_contact.jid not in gajim.gc_connected[self.account]: # ('both' is the normal sub so we don't show it) properties.append(( _('Subscription: '), gobject.markup_escape_text(helpers.get_uf_sub(prim_contact.sub)))) if prim_contact.keyID: keyID = None if len(prim_contact.keyID) == 8: keyID = prim_contact.keyID elif len(prim_contact.keyID) == 16: keyID = prim_contact.keyID[8:] if keyID: properties.append((_('OpenPGP: '), gobject.markup_escape_text(keyID))) while properties: property = properties.pop(0) vcard_current_row += 1 vertical_fill = gtk.FILL if not properties and table_size == 4: vertical_fill |= gtk.EXPAND label = gtk.Label() label.set_alignment(0, 0) if property[1]: label.set_markup(property[0]) vcard_table.attach(label, 1, 2, vcard_current_row, vcard_current_row + 1, gtk.FILL, vertical_fill, 0, 0) label = gtk.Label() label.set_alignment(0, 0) label.set_markup(property[1]) label.set_line_wrap(True) vcard_table.attach(label, 2, 3, vcard_current_row, vcard_current_row + 1, gtk.EXPAND | gtk.FILL, vertical_fill, 0, 0) else: if isinstance(property[0], (unicode, str)): #FIXME: rm unicode? label.set_markup(property[0]) label.set_line_wrap(True) else: label = property[0] vcard_table.attach(label, 1, 3, vcard_current_row, vcard_current_row + 1, gtk.FILL, vertical_fill, 0) self.avatar_image.set_alignment(0, 0) if table_size == 4: vcard_table.attach(self.avatar_image, 3, 4, 2, vcard_current_row + 1, gtk.FILL, gtk.FILL | gtk.EXPAND, 3, 3) self.win.add(vcard_table)
def populate(self, contacts): self.create_window() self.create_table() if not contacts or len(contacts) == 0: # Tooltip for merged accounts row accounts = helpers.get_notification_icon_tooltip_dict() self.spacer_label = '' self.fill_table_with_accounts(accounts) self.win.add(self.table) return # primary contact prim_contact = gajim.contacts.get_highest_prio_contact_from_contacts( contacts) puny_jid = helpers.sanitize_filename(prim_contact.jid) table_size = 3 file_ = helpers.get_avatar_path(os.path.join(gajim.AVATAR_PATH, puny_jid)) if file_: with open(file_, 'rb') as file_data: pix = gtkgui_helpers.get_pixbuf_from_data(file_data.read()) pix = gtkgui_helpers.get_scaled_pixbuf(pix, 'tooltip') self.avatar_image.set_from_pixbuf(pix) table_size = 4 else: self.avatar_image.set_from_pixbuf(None) vcard_table = Gtk.Grid() vcard_table.insert_row(0) for i in range(0, table_size): vcard_table.insert_column(0) vcard_table.set_property('column-spacing', 2) vcard_current_row = 1 properties = [] name_markup = '<span weight="bold">' + GLib.markup_escape_text( prim_contact.get_shown_name()) + '</span>' if gajim.config.get('mergeaccounts'): name_markup += " <span foreground='%s'>(%s)</span>" % ( gajim.config.get('tooltip_account_name_color'), GLib.markup_escape_text(prim_contact.account.name)) if self.account and helpers.jid_is_blocked(self.account, prim_contact.jid): name_markup += _(' [blocked]') if self.account and \ self.account in gajim.interface.minimized_controls and \ prim_contact.jid in gajim.interface.minimized_controls[self.account]: name_markup += _(' [minimized]') properties.append((name_markup, None)) num_resources = 0 # put contacts in dict, where key is priority contacts_dict = {} for contact in contacts: if contact.resource: num_resources += 1 if contact.priority in contacts_dict: contacts_dict[int(contact.priority)].append(contact) else: contacts_dict[int(contact.priority)] = [contact] if num_resources > 1: properties.append((_('Status: '), ' ')) transport = gajim.get_transport_name_from_jid(prim_contact.jid) if transport: file_path = os.path.join(helpers.get_transport_path(transport), '16x16') else: iconset = gajim.config.get('iconset') if not iconset: iconset = 'dcraven' file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') contact_keys = sorted(contacts_dict.keys()) contact_keys.reverse() for priority in contact_keys: for acontact in contacts_dict[priority]: status_line = self.get_status_info(acontact.resource, acontact.priority, acontact.show, acontact.status) icon_name = self._get_icon_name_for_tooltip(acontact) self.add_status_row(file_path, icon_name, status_line, acontact.last_status_time) properties.append((self.table, None)) else: # only one resource if contact.show: show = helpers.get_uf_show(contact.show) if not self.check_last_time and self.account: if contact.show == 'offline': if not contact.last_status_time: gajim.connections[self.account].\ request_last_status_time(contact.jid, '') else: self.check_last_time = contact.last_status_time elif contact.resource: gajim.connections[self.account].\ request_last_status_time( contact.jid, contact.resource) if contact.last_activity_time: self.check_last_time = contact.last_activity_time else: self.check_last_time = None if contact.last_status_time: vcard_current_row += 1 if contact.show == 'offline': text = ' - ' + _('Last status: %s') else: text = _(' since %s') if time.strftime('%j', time.localtime()) == \ time.strftime('%j', contact.last_status_time): # it's today, show only the locale hour representation local_time = time.strftime('%X', contact.last_status_time) else: # time.strftime returns locale encoded string local_time = time.strftime('%c', contact.last_status_time) text = text % local_time show += text if self.account and \ prim_contact.jid in gajim.gc_connected[self.account]: if gajim.gc_connected[self.account][prim_contact.jid]: show = _('Connected') else: show = _('Disconnected') show = self.colorize_status(show) if contact.status: status = contact.status.strip() if status: # reduce long status # (no more than 300 chars on line and no more than # 5 lines) # status is wrapped status = helpers.reduce_chars_newlines(status, 300, 5) # escape markup entities. status = GLib.markup_escape_text(status) properties.append(('<i>%s</i>' % status, None)) properties.append((show, None)) self._append_pep_info(contact, properties) properties.append((_('Jabber ID: '), '\u200E' + "<b>%s</b>" % \ prim_contact.jid)) # contact has only one ressource if num_resources == 1 and contact.resource: properties.append((_('Resource: '), GLib.markup_escape_text( contact.resource) + ' (' + str(contact.priority) + ')')) if self.account and prim_contact.sub and prim_contact.sub != 'both' and\ prim_contact.jid not in gajim.gc_connected[self.account]: # ('both' is the normal sub so we don't show it) properties.append(( _('Subscription: '), GLib.markup_escape_text( helpers.get_uf_sub(prim_contact.sub)))) if prim_contact.keyID: keyID = None if len(prim_contact.keyID) == 8: keyID = prim_contact.keyID elif len(prim_contact.keyID) == 16: keyID = prim_contact.keyID[8:] if keyID: properties.append((_('OpenPGP: '), GLib.markup_escape_text( keyID))) if contact.last_activity_time: last_active = datetime(*contact.last_activity_time[:6]) current = datetime.now() diff = current - last_active diff = timedelta(diff.days, diff.seconds) if last_active.date() == current.date(): formatted = last_active.strftime("%X") else: formatted = last_active.strftime("%c") # Do not show the "Idle since" and "Idle for" items if there # is no meaningful difference between last activity time and # current time. if diff.days > 0 or diff.seconds > 0: cs = "<span foreground='%s'>" % gajim.config.get( 'tooltip_idle_color') cs += '%s</span>' properties.append((str(), None)) idle_since = cs % _("Idle since %s") properties.append((idle_since % formatted, None)) idle_for = cs % _("Idle for %s") properties.append((idle_for % str(diff), None)) while properties: property_ = properties.pop(0) vcard_current_row += 1 label = Gtk.Label() if not properties and table_size == 4: label.set_vexpand(True) label.set_alignment(0, 0) if property_[1]: label.set_markup(property_[0]) vcard_table.attach(label, 1, vcard_current_row, 1, 1) label = Gtk.Label() if not properties and table_size == 4: label.set_vexpand(True) label.set_alignment(0, 0) label.set_markup(property_[1]) label.set_line_wrap(True) vcard_table.attach(label, 2, vcard_current_row, 1, 1) else: if isinstance(property_[0], str): label.set_markup(property_[0]) label.set_line_wrap(True) else: label = property_[0] vcard_table.attach(label, 1, vcard_current_row, 2, 1) self.avatar_image.set_alignment(0, 0) if table_size == 4: vcard_table.attach(self.avatar_image, 3, 2, 1, vcard_current_row - 1) gajim.plugin_manager.gui_extension_point('roster_tooltip_populate', self, contacts, vcard_table) self.win.add(vcard_table)