MUC chat states; closes #845
This commit is contained in:
parent
3836656737
commit
4bf0ac5703
47
src/chat.py
47
src/chat.py
|
@ -92,6 +92,10 @@ class Chat:
|
||||||
self.notebook.set_show_tabs(gajim.config.get('tabs_always_visible'))
|
self.notebook.set_show_tabs(gajim.config.get('tabs_always_visible'))
|
||||||
self.notebook.set_show_border(gajim.config.get('tabs_border'))
|
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):
|
def update_font(self):
|
||||||
font = pango.FontDescription(gajim.config.get('conversation_font'))
|
font = pango.FontDescription(gajim.config.get('conversation_font'))
|
||||||
for jid in self.tagIn:
|
for jid in self.tagIn:
|
||||||
|
@ -164,12 +168,6 @@ class Chat:
|
||||||
def redraw_tab(self, jid, chatstate = None):
|
def redraw_tab(self, jid, chatstate = None):
|
||||||
'''redraw the label of the tab
|
'''redraw the label of the tab
|
||||||
if chatstate is given that means we have HE SENT US a chatstate'''
|
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
|
# Update status images
|
||||||
self.set_state_image(jid)
|
self.set_state_image(jid)
|
||||||
|
|
||||||
|
@ -179,6 +177,13 @@ class Chat:
|
||||||
nickname = hb.get_children()[1]
|
nickname = hb.get_children()[1]
|
||||||
close_button = hb.get_children()[2]
|
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
|
# Draw tab label using chatstate
|
||||||
theme = gajim.config.get('roster_theme')
|
theme = gajim.config.get('roster_theme')
|
||||||
color = None
|
color = None
|
||||||
|
@ -227,6 +232,31 @@ class Chat:
|
||||||
nickname = hb.get_children()[0]
|
nickname = hb.get_children()[0]
|
||||||
close_button = hb.get_children()[1]
|
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'):
|
if gajim.config.get('tabs_close_button'):
|
||||||
close_button.show()
|
close_button.show()
|
||||||
else:
|
else:
|
||||||
|
@ -301,7 +331,10 @@ class Chat:
|
||||||
if widget.props.urgency_hint:
|
if widget.props.urgency_hint:
|
||||||
widget.props.urgency_hint = False
|
widget.props.urgency_hint = False
|
||||||
# Undo "unread" state display, etc.
|
# Undo "unread" state display, etc.
|
||||||
# NOTE: we do not send any chatstate
|
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)
|
self.redraw_tab(jid)
|
||||||
|
|
||||||
def on_compact_view_menuitem_activate(self, widget):
|
def on_compact_view_menuitem_activate(self, widget):
|
||||||
|
|
|
@ -228,6 +228,10 @@ class Config:
|
||||||
'state_composing_color': [ opt_color, 'green4' ],
|
'state_composing_color': [ opt_color, 'green4' ],
|
||||||
'state_paused_color': [ opt_color, 'mediumblue' ],
|
'state_paused_color': [ opt_color, 'mediumblue' ],
|
||||||
'state_gone_color': [ opt_color, 'grey' ],
|
'state_gone_color': [ opt_color, 'grey' ],
|
||||||
|
|
||||||
|
# MUC chat states
|
||||||
|
'state_muc_msg': [ opt_color, 'mediumblue' ],
|
||||||
|
'state_muc_directed_msg': [ opt_color, 'red2' ],
|
||||||
}, {}),
|
}, {}),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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_in_event': self.on_groupchat_window_focus_in_event,
|
||||||
'on_groupchat_window_focus_out_event': self.on_groupchat_window_focus_out_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_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)
|
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)
|
chat.Chat.on_chat_notebook_key_press_event(self, widget, event)
|
||||||
|
|
||||||
def on_chat_notebook_switch_page(self, notebook, page, page_num):
|
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)
|
new_child = notebook.get_nth_page(page_num)
|
||||||
|
old_jid = ''
|
||||||
new_jid = ''
|
new_jid = ''
|
||||||
for room_jid in self.xmls:
|
for room_jid in self.xmls:
|
||||||
if self.childs[room_jid] == new_child:
|
if self.childs[room_jid] == new_child:
|
||||||
new_jid = room_jid
|
new_jid = room_jid
|
||||||
break
|
self.redraw_tab(new_jid, 'active')
|
||||||
subject = self.subjects[new_jid]
|
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)
|
subject = gtkgui_helpers.escape_for_pango_markup(subject)
|
||||||
new_jid = gtkgui_helpers.escape_for_pango_markup(new_jid)
|
new_jid = gtkgui_helpers.escape_for_pango_markup(new_jid)
|
||||||
|
|
||||||
name_label = self.name_labels[new_jid]
|
name_label = self.name_labels[new_jid]
|
||||||
name_label.set_markup('<span weight="heavy" size="x-large">%s</span>\n%s' % (new_jid, subject))
|
name_label.set_markup('<span weight="heavy" size="x-large">%s</span>\n%s' %\
|
||||||
|
(new_jid, subject))
|
||||||
event_box = name_label.get_parent()
|
event_box = name_label.get_parent()
|
||||||
if subject == '':
|
if subject == '':
|
||||||
subject = _('This room has no subject')
|
subject = _('This room has no subject')
|
||||||
self.subject_tooltip[new_jid].set_tip(event_box, subject)
|
self.subject_tooltip[new_jid].set_tip(event_box, subject)
|
||||||
|
|
||||||
chat.Chat.on_chat_notebook_switch_page(self, notebook, page, page_num)
|
chat.Chat.on_chat_notebook_switch_page(self, notebook, page, page_num)
|
||||||
|
|
||||||
def get_role_iter(self, room_jid, role):
|
def get_role_iter(self, room_jid, role):
|
||||||
|
@ -718,12 +728,15 @@ class GroupchatWindow(chat.Chat):
|
||||||
kind = 'outgoing'
|
kind = 'outgoing'
|
||||||
else:
|
else:
|
||||||
kind = 'incoming'
|
kind = 'incoming'
|
||||||
|
# muc-specific chatstate
|
||||||
|
self.redraw_tab(room_jid, 'newmsg')
|
||||||
else:
|
else:
|
||||||
kind = 'status'
|
kind = 'status'
|
||||||
|
|
||||||
nick = self.nicks[room_jid]
|
nick = self.nicks[room_jid]
|
||||||
if kind == 'incoming' and \
|
if kind == 'incoming' and text.lower().find(nick.lower()) != -1:
|
||||||
text.lower().find(nick.lower()) != -1:
|
# muc-specific chatstate
|
||||||
|
self.redraw_tab(room_jid, 'attention')
|
||||||
other_tags_for_name.append('bold')
|
other_tags_for_name.append('bold')
|
||||||
other_tags_for_text.append('marked')
|
other_tags_for_text.append('marked')
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue