From 52c6c6cbb7de814a61eab3d9e5bb1c15759d7283 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sun, 3 Jun 2007 13:40:14 +0000 Subject: [PATCH] [roidelapluie] better groupchat support in roster and systray. Better nick support --- src/common/helpers.py | 5 +++ src/gajim.py | 8 +++++ src/groupchat_control.py | 12 +++++-- src/roster_window.py | 67 ++++++++++++++++++++++++---------------- 4 files changed, 63 insertions(+), 29 deletions(-) diff --git a/src/common/helpers.py b/src/common/helpers.py index 12388bf81..ed74c9a15 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -552,6 +552,11 @@ def get_icon_name_to_show(contact, account = None): contact.jid in gajim.interface.minimized_controls[account] and gajim.interface.\ minimized_controls[account][contact.jid].get_nb_unread_pm() > 0: return 'message' + if account and gajim.gc_connected[account].has_key(contact.jid): + if gajim.gc_connected[account][contact.jid]: + return 'muc_active' + else: + return 'muc_inactive' if contact.jid.find('@') <= 0: # if not '@' or '@' starts the jid ==> agent return contact.show if contact.sub in ('both', 'to'): diff --git a/src/gajim.py b/src/gajim.py index 15cb1b726..50dfba7a0 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -2127,6 +2127,14 @@ class Interface: jid = gajim.get_jid_without_resource(fjid) if type_ in ('printed_gc_msg', 'printed_marked_gc_msg', 'gc_msg'): w = self.msg_win_mgr.get_window(jid, account) + if gajim.interface.minimized_controls.has_key(account) and \ + gajim.interface.minimized_controls[account].has_key(fjid): + ctrl = gajim.interface.minimized_controls[account][fjid] + if not w: + w = gajim.interface.msg_win_mgr.create_window(ctrl.contact, \ + ctrl.account, ctrl.type_id) + ctrl.parent_win = w + w.new_tab(ctrl) elif type_ in ('printed_chat', 'chat', ''): # '' is for log in/out notifications if self.msg_win_mgr.has_window(fjid, account): diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 5757b865f..7d787908e 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -697,7 +697,7 @@ class GroupchatControl(ChatControlBase): if self.needs_visual_notification(text): highlight = True if gajim.config.get_per('soundevents', 'muc_message_highlight', - 'enabled'): + 'enabled'): sound = 'highlight' # Is it a history message? Don't want sound-floods when we join. @@ -891,8 +891,7 @@ class GroupchatControl(ChatControlBase): 'reason': reason } self.print_conversation(s, 'info', tim = tim) elif statusCode == '303': # Someone changed his or her nick - if nick == self.nick: # We changed our nick - self.nick = new_nick + if new_nick == self.nick: # We changed our nick s = _('You are now known as %s') % new_nick else: s = _('%s is now known as %s') % (nick, new_nick) @@ -902,6 +901,8 @@ class GroupchatControl(ChatControlBase): # after that, but that doesn't hurt self.add_contact_to_roster(new_nick, show, role, affiliation, status, jid) + if nick in self.attention_list: + self.attention_list.remove(nick) # keep nickname color if nick in self.gc_custom_colors: self.gc_custom_colors[new_nick] = self.gc_custom_colors[nick] @@ -1011,6 +1012,9 @@ class GroupchatControl(ChatControlBase): # delete ressource simple_jid = gajim.get_jid_without_resource(jid) nick_jid += ' (%s)' % simple_jid + if show == 'offline': + if nick in self.attention_list: + self.attention_list.remove(nick) if show == 'offline' and print_status in ('all', 'in_and_out') and \ statusCode != '307': st = _('%s has left') % nick_jid @@ -1127,6 +1131,7 @@ class GroupchatControl(ChatControlBase): nick = message_array[0] nick = helpers.parse_resource(nick) gajim.connections[self.account].join_gc(nick, self.room_jid, None) + self.nick = nick self.clear(self.msg_textview) else: self.get_command_help(command) @@ -1408,6 +1413,7 @@ class GroupchatControl(ChatControlBase): nick = instance.input_entry.get_text().decode('utf-8') nick = helpers.parse_resource(nick) gajim.connections[self.account].join_gc(nick, self.room_jid, None) + self.nick = nick instance = dialogs.InputDialog(title, prompt, proposed_nick, is_modal = False, ok_handler = on_ok) diff --git a/src/roster_window.py b/src/roster_window.py index 8c2423d53..2a331c972 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -370,7 +370,7 @@ class RosterWindow: typestr = 'contact' if group == _('Transports'): typestr = 'agent' - if group == _('Groupchats'): + if gajim.gc_connected[account].has_key(jid): typestr = 'groupchat' name = contact.get_shown_name() @@ -426,12 +426,18 @@ class RosterWindow: contact = gajim.contacts.get_contact_with_highest_priority(account, jid) if contact == None: contact = gajim.contacts.create_contact(jid = jid, name = jid, - groups = [_('Groupchats')], show = 'muc_active', + groups = [_('Groupchats')], show = 'online', status = status, sub = 'none', resource = resource) gajim.contacts.add_contact(account, contact) self.add_contact_to_roster(jid, account) - self.draw_group(_('Groupchats'), account) + self.draw_group(_('Groupchats'), account) + else: + contact.show = 'online' + self.draw_contact(jid, account) + self.add_contact_to_roster(jid, account) + for group in contact.groups: + self.draw_group(group, account) return contact def get_self_contact_iter(self, account): @@ -645,22 +651,28 @@ class RosterWindow: status = helpers.reduce_chars_newlines(status, max_lines = 1) # escape markup entities and make them small italic and fg color color = gtkgui_helpers._get_fade_color(self.tree, selected, focus) - colorstring = "#%04x%04x%04x" % (color.red, color.green, color.blue) + colorstring = '#%04x%04x%04x' % (color.red, color.green, color.blue) name += \ '\n%s' \ % (colorstring, gobject.markup_escape_text(status)) iter = iters[0] # choose the icon with the first iter + + if gajim.gc_connected[account].has_key(jid): + contact.show = 'online' + model[iter][C_TYPE] = 'groupchat' + icon_name = helpers.get_icon_name_to_show(contact, account) # look if another resource has awaiting events for c in contact_instances: c_icon_name = helpers.get_icon_name_to_show(c, account) - if c_icon_name == 'message': + if c_icon_name in ('message', 'muc_active', 'muc_inactive'): icon_name = c_icon_name break path = model.get_path(iter) if model.iter_has_child(iter): - if not self.tree.row_expanded(path) and icon_name != 'message': + if not self.tree.row_expanded(path) and \ + icon_name not in ('message', 'muc_active', 'muc_inactive'): child_iter = model.iter_children(iter) if icon_name in ('error', 'offline'): # get the icon from the first child as they are sorted by show @@ -691,13 +703,6 @@ class RosterWindow: self.draw_parent_contact(jid, account) state_images = self.get_appropriate_state_images(jid, icon_name = icon_name) - - if icon_name != 'message' and gajim.gc_connected[account].\ - has_key(jid): - if gajim.gc_connected[account][jid]: - icon_name = 'muc_active' - else: - icon_name = 'muc_inactive' img = state_images[icon_name] @@ -754,18 +759,20 @@ class RosterWindow: if minimize: contact = gajim.contacts.create_contact(jid = room_jid, name = nick) gc_control = GroupchatControl(None, contact, account) - if not gajim.interface.minimized_controls.has_key(account): gajim.interface.minimized_controls[account] = {} gajim.interface.minimized_controls[account][room_jid] = gc_control - - self.add_groupchat_to_roster(account, room_jid) gajim.connections[account].join_gc(nick, room_jid, password) if password: gajim.gc_passwords[room_jid] = password + self.add_groupchat_to_roster(account, room_jid) return if not gajim.interface.msg_win_mgr.has_window(room_jid, account): self.new_room(room_jid, nick, account) + contact = gajim.contacts.get_contact_with_highest_priority(account, \ + room_jid) + if contact: + self.add_groupchat_to_roster(account, room_jid) gc_win = gajim.interface.msg_win_mgr.get_window(room_jid, account) gc_win.set_active_tab(room_jid, account) gc_win.window.present() @@ -2403,14 +2410,17 @@ class RosterWindow: menu = gtk.Menu() - maximize_menuitem = gtk.ImageMenuItem(_('_Maximize')) - icon = gtk.image_new_from_stock(gtk.STOCK_GOTO_TOP, gtk.ICON_SIZE_MENU) - maximize_menuitem.set_image(icon) - maximize_menuitem.connect('activate', self.on_groupchat_maximized, \ - jid, account) + if gajim.interface.minimized_controls.has_key(account) and \ + jid in gajim.interface.minimized_controls[account]: + maximize_menuitem = gtk.ImageMenuItem(_('_Maximize')) + icon = gtk.image_new_from_stock(gtk.STOCK_GOTO_TOP, gtk.ICON_SIZE_MENU) + maximize_menuitem.set_image(icon) + maximize_menuitem.connect('activate', self.on_groupchat_maximized, \ + jid, account) + menu.append(maximize_menuitem) + + - menu.append(maximize_menuitem) - event_button = gtkgui_helpers.get_possible_button_event(event) menu.attach_to_widget(self.tree, None) @@ -2437,9 +2447,10 @@ class RosterWindow: mw.window.present() contact = gajim.contacts.get_contact_with_highest_priority(account, jid) - self.remove_contact(contact, account) - gajim.contacts.remove_contact(account, contact) - self.draw_group(_('Groupchats'), account) + if contact.groups == [_('Groupchats')]: + self.remove_contact(contact, account) + gajim.contacts.remove_contact(account, contact) + self.draw_group(_('Groupchats'), account) del gajim.interface.minimized_controls[account][jid] def make_group_menu(self, event, iter): @@ -4374,6 +4385,10 @@ class RosterWindow: return 1 if name2 == _('Not in Roster'): return -1 + if name1 == _('Groupchats'): + return 1 + if name2 == _('Groupchats'): + return -1 account1 = model[iter1][C_ACCOUNT] account2 = model[iter2][C_ACCOUNT] if not account1 or not account2: