diff --git a/src/common/helpers.py b/src/common/helpers.py index 96a1b790e..61235c1a0 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -28,8 +28,10 @@ from encodings.punycode import punycode_encode import gajim from i18n import Q_ +from i18n import ngettext from xmpp_stringprep import nodeprep, resourceprep, nameprep + try: import winsound # windows-only built-in module for playing wav import win32api @@ -814,3 +816,84 @@ def get_chat_control(account, contact): highest_contact.resource: return None return gajim.interface.msg_win_mgr.get_control(contact.jid, account) + +def get_notification_icon_tooltip_text(): + text = None + unread_chat = gajim.events.get_nb_events(types = ['printed_chat', + 'chat']) + unread_single_chat = gajim.events.get_nb_events(types = ['normal']) + unread_gc = gajim.events.get_nb_events(types = ['printed_gc_msg', + 'gc_msg']) + unread_pm = gajim.events.get_nb_events(types = ['printed_pm', 'pm']) + + accounts = get_accounts_info() + + if unread_chat or unread_single_chat or unread_gc or unread_pm: + text = 'Gajim ' + awaiting_events = unread_chat + unread_single_chat + unread_gc + unread_pm + if awaiting_events == unread_chat or awaiting_events == unread_single_chat \ + or awaiting_events == unread_gc or awaiting_events == unread_pm: + # This condition is like previous if but with xor... + # Print in one line + text += '-' + else: + # Print in multiple lines + text += '\n ' + if unread_chat: + text += ngettext( + ' %d unread message', + ' %d unread messages', + unread_chat, unread_chat, unread_chat) + text += '\n ' + if unread_single_chat: + text += ngettext( + ' %d unread single message', + ' %d unread single messages', + unread_single_chat, unread_single_chat, unread_single_chat) + text += '\n ' + if unread_gc: + text += ngettext( + ' %d unread group chat message', + ' %d unread group chat messages', + unread_gc, unread_gc, unread_gc) + text += '\n ' + if unread_pm: + text += ngettext( + ' %d unread private message', + ' %d unread private messages', + unread_pm, unread_pm, unread_pm) + text += '\n ' + text = text[:-4] # remove latest '\n ' + elif len(accounts) > 1: + text = _('Gajim') + elif len(accounts) == 1: + message = accounts[0]['status_line'] + message = gtkgui_helpers.reduce_chars_newlines(message, 100, 1) + message = gtkgui_helpers.escape_for_pango_markup(message) + text = _('Gajim - %s') % message + else: + text = _('Gajim - %s') % get_uf_show('offline') + + return text + +def get_accounts_info(): + '''helper for notification icon tooltip''' + accounts = [] + accounts_list = gajim.contacts.get_accounts() + accounts_list.sort() + for account in accounts_list: + status_idx = gajim.connections[account].connected + # uncomment the following to hide offline accounts + # if status_idx == 0: continue + status = gajim.SHOW_LIST[status_idx] + message = gajim.connections[account].status + single_line = get_uf_show(status) + if message is None: + message = '' + else: + message = message.strip() + if message != '': + single_line += ': ' + message + accounts.append({'name': account, 'status_line': single_line, + 'show': status, 'message': message}) + return accounts diff --git a/src/tooltips.py b/src/tooltips.py index 574e94249..8beebd843 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -38,7 +38,7 @@ class BaseTooltip: tooltip.hide_tooltip() * data - the text to be displayed (extenders override this argument and - dislpay more complex contents) + display more complex contents) * widget_height - the height of the widget on which we want to show tooltip * widget_y_position - the vertical position of the widget on the screen @@ -135,7 +135,7 @@ class BaseTooltip: preferred_y = widget_y_position + widget_height + 4 self.preferred_position = [pointer_x, preferred_y] - self.widget_height =widget_height + self.widget_height = widget_height self.win.ensure_style() self.win.show_all() @@ -222,27 +222,6 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): BaseTooltip.__init__(self) StatusTable.__init__(self) - def get_accounts_info(self): - accounts = [] - accounts_list = gajim.contacts.get_accounts() - accounts_list.sort() - for account in accounts_list: - status_idx = gajim.connections[account].connected - # uncomment the following to hide offline accounts - # if status_idx == 0: continue - status = gajim.SHOW_LIST[status_idx] - message = gajim.connections[account].status - single_line = helpers.get_uf_show(status) - if message is None: - message = '' - else: - message = message.strip() - if message != '': - single_line += ': ' + message - accounts.append({'name': account, 'status_line': single_line, - 'show': status, 'message': message}) - return accounts - def fill_table_with_accounts(self, accounts): iconset = gajim.config.get('iconset') if not iconset: @@ -273,67 +252,15 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): def populate(self, data): self.create_window() self.create_table() - self.hbox = gtk.HBox() - self.table.set_property('column-spacing', 1) - text, single_line = '', '' - - unread_chat = gajim.events.get_nb_events(types = ['printed_chat', 'chat']) - unread_single_chat = gajim.events.get_nb_events(types = ['normal']) - unread_gc = gajim.events.get_nb_events(types = ['printed_gc_msg', - 'gc_msg']) - unread_pm = gajim.events.get_nb_events(types = ['printed_pm', 'pm']) - - accounts = self.get_accounts_info() - - if unread_chat or unread_single_chat or unread_gc or unread_pm: - text = 'Gajim ' - awaiting_events = unread_chat + unread_single_chat + unread_gc + unread_pm - if awaiting_events == unread_chat or awaiting_events == unread_single_chat \ - or awaiting_events == unread_gc or awaiting_events == unread_pm: - # This condition is like previous if but with xor... - # Print in one line - text += '-' - else: - # Print in multiple lines - text += '\n ' - if unread_chat: - text += i18n.ngettext( - ' %d unread message', - ' %d unread messages', - unread_chat, unread_chat, unread_chat) - text += '\n ' - if unread_single_chat: - text += i18n.ngettext( - ' %d unread single message', - ' %d unread single messages', - unread_single_chat, unread_single_chat, unread_single_chat) - text += '\n ' - if unread_gc: - text += i18n.ngettext( - ' %d unread group chat message', - ' %d unread group chat messages', - unread_gc, unread_gc, unread_gc) - text += '\n ' - if unread_pm: - text += i18n.ngettext( - ' %d unread private message', - ' %d unread private messages', - unread_pm, unread_pm, unread_pm) - text += '\n ' - text = text[:-4] # remove latest '\n ' - elif len(accounts) > 1: - text = _('Gajim') - self.current_current_row = 1 + accounts = helpers.get_accounts_info() + if len(accounts) > 1: self.table.resize(2, 1) self.fill_table_with_accounts(accounts) + self.hbox = gtk.HBox() + self.table.set_property('column-spacing', 1) - elif len(accounts) == 1: - message = accounts[0]['status_line'] - message = gtkgui_helpers.reduce_chars_newlines(message, 100, 1) - message = gtkgui_helpers.escape_for_pango_markup(message) - text = _('Gajim - %s') % message - else: - text = _('Gajim - %s') % helpers.get_uf_show('offline') + text = helpers.get_notification_icon_tooltip_text() + self.add_text_row(text) self.hbox.add(self.table) self.win.add(self.hbox) @@ -449,8 +376,7 @@ class RosterTooltip(NotificationAreaTooltip): self.create_table() if not contacts or len(contacts) == 0: # Tooltip for merged accounts row - accounts = self.get_accounts_info() - self.current_current_row = 0 + accounts = helpers.get_accounts_info() self.table.resize(2, 1) self.spacer_label = '' self.fill_table_with_accounts(accounts)