diff --git a/src/chat.py b/src/chat.py index fb70c1508..bb6a09d1a 100644 --- a/src/chat.py +++ b/src/chat.py @@ -92,6 +92,10 @@ class Chat: self.notebook.set_show_tabs(gajim.config.get('tabs_always_visible')) self.notebook.set_show_border(gajim.config.get('tabs_border')) + # muc attention states (when we are mentioned in a muc) + # if the room jid is in the list, the room has mentioned us + self.muc_attentions = [] + def update_font(self): font = pango.FontDescription(gajim.config.get('conversation_font')) for jid in self.tagIn: @@ -164,12 +168,6 @@ class Chat: def redraw_tab(self, jid, chatstate = None): '''redraw the label of the tab if chatstate is given that means we have HE SENT US a chatstate''' - unread = '' - num_unread = self.nb_unread[jid] - if num_unread == 1 and not gajim.config.get('show_unread_tab_icon'): - unread = '* ' - elif num_unread > 1: - unread = '[' + unicode(num_unread) + '] ' # Update status images self.set_state_image(jid) @@ -179,6 +177,13 @@ class Chat: nickname = hb.get_children()[1] close_button = hb.get_children()[2] + unread = '' + num_unread = self.nb_unread[jid] + if num_unread == 1 and not gajim.config.get('show_unread_tab_icon'): + unread = '* ' + elif num_unread > 1: + unread = '[' + unicode(num_unread) + '] ' + # Draw tab label using chatstate theme = gajim.config.get('roster_theme') color = None @@ -227,6 +232,31 @@ class Chat: nickname = hb.get_children()[0] close_button = hb.get_children()[1] + unread = '' + has_focus = self.window.get_property('has-toplevel-focus') + current_tab = (self.notebook.page_num(child) == self.notebook.get_current_page()) + color = None + theme = gajim.config.get('roster_theme') + if chatstate == 'attention' and (not has_focus or not current_tab): + if jid not in self.muc_attentions: + self.muc_attentions.append(jid) + color = gajim.config.get_per('themes', theme, 'state_muc_directed_msg') + elif chatstate: + if chatstate == 'active' or (current_tab and has_focus): + if jid in self.muc_attentions: + self.muc_attentions.remove(jid) + color = gajim.config.get_per('themes', theme, 'state_active_color') + elif chatstate == 'newmsg' and (not has_focus or not current_tab) and\ + jid not in self.muc_attentions: + color = gajim.config.get_per('themes', theme, 'state_muc_msg') + if color: + color = gtk.gdk.colormap_get_system().alloc_color(color) + # The widget state depend on whether this tab is the "current" tab + if current_tab: + nickname.modify_fg(gtk.STATE_NORMAL, color) + else: + nickname.modify_fg(gtk.STATE_ACTIVE, color) + if gajim.config.get('tabs_close_button'): close_button.show() else: @@ -301,8 +331,11 @@ class Chat: if widget.props.urgency_hint: widget.props.urgency_hint = False # Undo "unread" state display, etc. - # NOTE: we do not send any chatstate - self.redraw_tab(jid) + if self.widget_name == 'groupchat_window': + self.redraw_tab(jid, 'active') + else: + # NOTE: we do not send any chatstate to preserve inactive, gone, etc. + self.redraw_tab(jid) def on_compact_view_menuitem_activate(self, widget): isactive = widget.get_active() diff --git a/src/common/config.py b/src/common/config.py index 31fd207d8..77912ec46 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -228,6 +228,10 @@ class Config: 'state_composing_color': [ opt_color, 'green4' ], 'state_paused_color': [ opt_color, 'mediumblue' ], 'state_gone_color': [ opt_color, 'grey' ], + + # MUC chat states + 'state_muc_msg': [ opt_color, 'mediumblue' ], + 'state_muc_directed_msg': [ opt_color, 'red2' ], }, {}), } diff --git a/src/groupchat_window.py b/src/groupchat_window.py index 9df679a84..846f3dea5 100644 --- a/src/groupchat_window.py +++ b/src/groupchat_window.py @@ -76,6 +76,7 @@ class GroupchatWindow(chat.Chat): 'on_groupchat_window_focus_in_event': self.on_groupchat_window_focus_in_event, 'on_groupchat_window_focus_out_event': self.on_groupchat_window_focus_out_event, 'on_chat_notebook_key_press_event': self.on_chat_notebook_key_press_event, +'on_chat_notebook_switch_page': self.on_chat_notebook_switch_page, } self.xml.signal_autoconnect(signal_dict) @@ -184,23 +185,32 @@ class GroupchatWindow(chat.Chat): chat.Chat.on_chat_notebook_key_press_event(self, widget, event) def on_chat_notebook_switch_page(self, notebook, page, page_num): + old_child = notebook.get_nth_page(notebook.get_current_page()) new_child = notebook.get_nth_page(page_num) + old_jid = '' new_jid = '' for room_jid in self.xmls: - if self.childs[room_jid] == new_child: + if self.childs[room_jid] == new_child: new_jid = room_jid - break - subject = self.subjects[new_jid] + self.redraw_tab(new_jid, 'active') + elif self.childs[room_jid] == old_child: + old_jid = room_jid + self.redraw_tab(old_jid, 'active') + if old_jid != '' and new_jid != '': # we found both jids + break # so stop looping + subject = self.subjects[new_jid] subject = gtkgui_helpers.escape_for_pango_markup(subject) new_jid = gtkgui_helpers.escape_for_pango_markup(new_jid) name_label = self.name_labels[new_jid] - name_label.set_markup('%s\n%s' % (new_jid, subject)) + name_label.set_markup('%s\n%s' %\ + (new_jid, subject)) event_box = name_label.get_parent() if subject == '': subject = _('This room has no subject') self.subject_tooltip[new_jid].set_tip(event_box, subject) + chat.Chat.on_chat_notebook_switch_page(self, notebook, page, page_num) def get_role_iter(self, room_jid, role): @@ -718,12 +728,15 @@ class GroupchatWindow(chat.Chat): kind = 'outgoing' else: kind = 'incoming' + # muc-specific chatstate + self.redraw_tab(room_jid, 'newmsg') else: kind = 'status' nick = self.nicks[room_jid] - if kind == 'incoming' and \ - text.lower().find(nick.lower()) != -1: + if kind == 'incoming' and text.lower().find(nick.lower()) != -1: + # muc-specific chatstate + self.redraw_tab(room_jid, 'attention') other_tags_for_name.append('bold') other_tags_for_text.append('marked')