Groupchat hacking
This commit is contained in:
parent
8ab5887301
commit
733549f3b0
3 changed files with 137 additions and 19 deletions
|
@ -121,9 +121,6 @@ class ConversationTextview(gtk.TextView):
|
||||||
|
|
||||||
buffer.create_tag('focus-out-line', justification = gtk.JUSTIFY_CENTER)
|
buffer.create_tag('focus-out-line', justification = gtk.JUSTIFY_CENTER)
|
||||||
|
|
||||||
# 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 = []
|
|
||||||
self.line_tooltip = tooltips.BaseTooltip()
|
self.line_tooltip = tooltips.BaseTooltip()
|
||||||
|
|
||||||
def update_tags(self):
|
def update_tags(self):
|
||||||
|
|
|
@ -67,10 +67,17 @@ class GroupchatControl(ChatControlBase):
|
||||||
# alphanum sorted
|
# alphanum sorted
|
||||||
self.muc_cmds = ['ban', 'chat', 'query', 'clear', 'close', 'compact', 'help', 'invite',
|
self.muc_cmds = ['ban', 'chat', 'query', 'clear', 'close', 'compact', 'help', 'invite',
|
||||||
'join', 'kick', 'leave', 'me', 'msg', 'nick', 'part', 'say', 'topic']
|
'join', 'kick', 'leave', 'me', 'msg', 'nick', 'part', 'say', 'topic']
|
||||||
# muc attention states (when we are mentioned in a muc)
|
# muc attention flag (when we are mentioned in a muc)
|
||||||
# if the room jid is in the list, the room has mentioned us
|
# if True, the room has mentioned us
|
||||||
self.muc_attentions = []
|
self.attention_flag = False
|
||||||
self.list_treeview = None
|
self.room_creation = time.time()
|
||||||
|
self.nick_hits = 0
|
||||||
|
self.cmd_hits = 0
|
||||||
|
self.last_key_tabs = False
|
||||||
|
|
||||||
|
self.subject = ''
|
||||||
|
self.subject_tooltip = gtk.Tooltips()
|
||||||
|
|
||||||
self.allow_focus_out_line = True
|
self.allow_focus_out_line = True
|
||||||
# holds the iter's offset which points to the end of --- line
|
# holds the iter's offset which points to the end of --- line
|
||||||
self.focus_out_end_iter_offset = None
|
self.focus_out_end_iter_offset = None
|
||||||
|
@ -80,6 +87,49 @@ class GroupchatControl(ChatControlBase):
|
||||||
xm.signal_autoconnect(self)
|
xm.signal_autoconnect(self)
|
||||||
self.gc_popup_menu = xm.get_widget('gc_popup_menu')
|
self.gc_popup_menu = xm.get_widget('gc_popup_menu')
|
||||||
|
|
||||||
|
self.name_label = self.xml.get_widget('banner_name_label')
|
||||||
|
self.hpaneds = self.xml.get_widget('hpaned')
|
||||||
|
|
||||||
|
list_treeview = self.list_treeview = self.xml.get_widget('list_treeview')
|
||||||
|
list_treeview.get_selection().connect('changed',
|
||||||
|
self.on_list_treeview_selection_changed)
|
||||||
|
list_treeview.connect('style-set', self.on_list_treeview_style_set)
|
||||||
|
|
||||||
|
self._last_selected_contact = None # None or holds jid, account tuple
|
||||||
|
|
||||||
|
def iter_contact_rows(self):
|
||||||
|
'''iterate over all contact rows in the tree model'''
|
||||||
|
model = self.list_treeview.get_model()
|
||||||
|
role_iter = model.get_iter_root()
|
||||||
|
while role_iter:
|
||||||
|
contact_iter = model.iter_children(role_iter)
|
||||||
|
while contact_iter:
|
||||||
|
yield model[contact_iter]
|
||||||
|
contact_iter = model.iter_next(contact_iter)
|
||||||
|
role_iter = model.iter_next(role_iter)
|
||||||
|
|
||||||
|
def on_list_treeview_style_set(self, treeview, style):
|
||||||
|
'''When style (theme) changes, redraw all contacts'''
|
||||||
|
# Get the room_jid from treeview
|
||||||
|
for contact in self.iter_contact_rows():
|
||||||
|
nick = contact[C_NICK].decode('utf-8')
|
||||||
|
self.draw_contact(nick)
|
||||||
|
|
||||||
|
def on_list_treeview_selection_changed(self, selection):
|
||||||
|
model, selected_iter = selection.get_selected()
|
||||||
|
self.draw_contact(nick)
|
||||||
|
if self._last_selected_contact is not None:
|
||||||
|
self.draw_contact(self._last_selected_contact)
|
||||||
|
if selected_iter is None:
|
||||||
|
self._last_selected_contact = None
|
||||||
|
return
|
||||||
|
contact = model[selected_iter]
|
||||||
|
nick = contact[C_NICK].decode('utf-8')
|
||||||
|
self._last_selected_contact = nick
|
||||||
|
if contact[C_TYPE] != 'contact':
|
||||||
|
return
|
||||||
|
self.draw_contact(nick, selected=True, focus=True)
|
||||||
|
|
||||||
def get_tab_label(self, chatstate):
|
def get_tab_label(self, chatstate):
|
||||||
'''Markup the label if necessary. Returns a tuple such as:
|
'''Markup the label if necessary. Returns a tuple such as:
|
||||||
(new_label_str, color)
|
(new_label_str, color)
|
||||||
|
@ -93,26 +143,19 @@ class GroupchatControl(ChatControlBase):
|
||||||
color = None
|
color = None
|
||||||
theme = gajim.config.get('roster_theme')
|
theme = gajim.config.get('roster_theme')
|
||||||
if chatstate == 'attention' and (not has_focus or not current_tab):
|
if chatstate == 'attention' and (not has_focus or not current_tab):
|
||||||
if self.room_jid not in self.muc_attentions:
|
attention_flag = True
|
||||||
self.muc_attentions.append(self.room_jid)
|
|
||||||
color = gajim.config.get_per('themes', theme,
|
color = gajim.config.get_per('themes', theme,
|
||||||
'state_muc_directed_msg')
|
'state_muc_directed_msg')
|
||||||
elif chatstate:
|
elif chatstate:
|
||||||
if chatstate == 'active' or (current_tab and has_focus):
|
if chatstate == 'active' or (current_tab and has_focus):
|
||||||
if self.room_jid in self.muc_attentions:
|
attention_flag = False
|
||||||
self.muc_attentions.remove(self.room_jid)
|
|
||||||
color = gajim.config.get_per('themes', theme,
|
color = gajim.config.get_per('themes', theme,
|
||||||
'state_active_color')
|
'state_active_color')
|
||||||
elif chatstate == 'newmsg' and (not has_focus or not current_tab) and\
|
elif chatstate == 'newmsg' and (not has_focus or not current_tab) and\
|
||||||
self.room_jid not in self.muc_attentions:
|
not self.attention_flag:
|
||||||
color = gajim.config.get_per('themes', theme, 'state_muc_msg')
|
color = gajim.config.get_per('themes', theme, 'state_muc_msg')
|
||||||
if color:
|
if color:
|
||||||
color = gtk.gdk.colormap_get_system().alloc_color(color)
|
color = gtk.gdk.colormap_get_system().alloc_color(color)
|
||||||
# We set the color for when it's the current tab or not
|
|
||||||
# FIXME: why was this only happening for inactive or gone
|
|
||||||
#if chatstate in ('inactive', 'gone'):
|
|
||||||
# In inactive tab color to be lighter against the darker inactive
|
|
||||||
# background
|
|
||||||
if self.parent_win.get_active_control() != self:
|
if self.parent_win.get_active_control() != self:
|
||||||
color = self.lighten_color(color)
|
color = self.lighten_color(color)
|
||||||
|
|
||||||
|
@ -362,3 +405,81 @@ class GroupchatControl(ChatControlBase):
|
||||||
if word.startswith(special_word):
|
if word.startswith(special_word):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def set_subject(self, subject):
|
||||||
|
self.subject= subject
|
||||||
|
full_subject = None
|
||||||
|
|
||||||
|
subject = gtkgui_helpers.reduce_chars_newlines(subject, 0, 2)
|
||||||
|
subject = gtkgui_helpers.escape_for_pango_markup(subject)
|
||||||
|
self.name_label.set_markup(
|
||||||
|
'<span weight="heavy" size="x-large">%s</span>\n%s' % (self.room_jid, subject))
|
||||||
|
event_box = name_label.get_parent()
|
||||||
|
if subject == '':
|
||||||
|
subject = _('This room has no subject')
|
||||||
|
|
||||||
|
if full_subject is not None:
|
||||||
|
subject = full_subject # tooltip must always hold ALL the subject
|
||||||
|
self.subject_tooltip.set_tip(event_box, subject)
|
||||||
|
|
||||||
|
def save_var(self):
|
||||||
|
return {
|
||||||
|
'nick': self.nick,
|
||||||
|
'model': self.list_treeview.get_model(),
|
||||||
|
'subject': self.subject,
|
||||||
|
}
|
||||||
|
|
||||||
|
def load_var(self, room_jid, var):
|
||||||
|
self.list_treeview.set_model(var['model'])
|
||||||
|
self.list_treeviewexpand_all()
|
||||||
|
self.set_subject(var['subject'])
|
||||||
|
self.subject= var['subject']
|
||||||
|
if gajim.gc_connected[self.account][room_jid]:
|
||||||
|
self.got_connected()
|
||||||
|
|
||||||
|
def got_connected(self):
|
||||||
|
gajim.gc_connected[self.account][self.room_jid] = True
|
||||||
|
message_textview = self.message_textviews[room_jid]
|
||||||
|
self.msg_textview.set_sensitive(True)
|
||||||
|
self.xml.get_widget('send_button').set_sensitive(True)
|
||||||
|
|
||||||
|
def got_disconnected(self):
|
||||||
|
model = self.list_treeview.get_model()
|
||||||
|
model.clear()
|
||||||
|
nick_list = gajim.contacts.get_nick_list(self.account, self.room_jid)
|
||||||
|
for nick in nick_list:
|
||||||
|
gc_contact = gajim.contacts.get_gc_contact(self.account, self.room_jid,
|
||||||
|
nick)
|
||||||
|
gajim.contacts.remove_gc_contact(self.account, gc_contact)
|
||||||
|
gajim.gc_connected[self.account][self.room_jid] = False
|
||||||
|
self.msg_textview.set_sensitive(False)
|
||||||
|
self.xml.get_widget('send_button').set_sensitive(False)
|
||||||
|
|
||||||
|
def draw_contact(self, nick, selected=False, focus=False):
|
||||||
|
iter = self.get_contact_iter(self.room_jid, nick)
|
||||||
|
if not iter:
|
||||||
|
return
|
||||||
|
model = self.list_treeview.get_model()
|
||||||
|
gc_contact = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick)
|
||||||
|
state_images = gajim.interface.roster.jabber_state_images['16']
|
||||||
|
if gajim.awaiting_events[self.account].has_key(self.room_jid + '/' + nick):
|
||||||
|
image = state_images['message']
|
||||||
|
else:
|
||||||
|
image = state_images[gc_contact.show]
|
||||||
|
|
||||||
|
name = gtkgui_helpers.escape_for_pango_markup(gc_contact.name)
|
||||||
|
status = gc_contact.status
|
||||||
|
# add status msg, if not empty, under contact name in the treeview
|
||||||
|
if status and gajim.config.get('show_status_msgs_in_roster'):
|
||||||
|
status = status.strip()
|
||||||
|
if status != '':
|
||||||
|
status = gtkgui_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.list_treeview,
|
||||||
|
selected, focus)
|
||||||
|
colorstring = "#%04x%04x%04x" % (color.red, color.green, color.blue)
|
||||||
|
name += '\n' '<span size="small" style="italic" foreground="%s">%s</span>'\
|
||||||
|
% (colorstring, gtkgui_helpers.escape_for_pango_markup(status))
|
||||||
|
|
||||||
|
model[iter][C_IMG] = image
|
||||||
|
model[iter][C_TEXT] = name
|
||||||
|
|
|
@ -19800,7 +19800,7 @@ topic</property>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkHPaned" id="hpaned1">
|
<widget class="GtkHPaned" id="hpaned">
|
||||||
<property name="border_width">3</property>
|
<property name="border_width">3</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
|
@ -19884,7 +19884,7 @@ topic</property>
|
||||||
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
|
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkTreeView" id="treeview4">
|
<widget class="GtkTreeView" id="list_treeview">
|
||||||
<property name="border_width">1</property>
|
<property name="border_width">1</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
|
|
Loading…
Add table
Reference in a new issue