Fix some bugs and improve coding of minimized groupchats.

This commit is contained in:
Julien Pivotto 2007-05-07 21:02:48 +00:00
parent fb95530daf
commit 19df2a0f9e
8 changed files with 152 additions and 175 deletions

View File

@ -553,6 +553,7 @@ class ChatControlBase(MessageControl):
subject = None, old_kind = None, xhtml = None):
'''prints 'chat' type messages'''
jid = self.contact.jid
account = self.account
full_jid = self.get_full_jid()
textview = self.conv_textview
end = False
@ -566,24 +567,27 @@ class ChatControlBase(MessageControl):
return
if kind == 'incoming':
gajim.last_message_time[self.account][full_jid] = time.time()
if (not self.parent_win.get_active_jid() or \
full_jid != self.parent_win.get_active_jid() or \
not self.parent_win.is_active() or not end) and \
kind in ('incoming', 'incoming_queue'):
if kind in ('incoming', 'incoming_queue'):
gc_message = False
if self.type_id == message_control.TYPE_GC:
gc_message = True
if not gc_message or \
(gc_message and (other_tags_for_text == ['marked'] or \
gajim.config.get('notify_on_all_muc_messages'))):
gajim.config.get('notify_on_all_muc_messages'))) or \
(gc_message and \
gajim.interface.minimized_controls.has_key(account) and \
jid in gajim.interface.minimized_controls[account]):
# we want to have save this message in events list
# other_tags_for_text == ['marked'] --> highlighted gc message
type_ = 'printed_' + self.type_id
event = 'message_received'
if gc_message:
type_ = 'printed_gc_msg'
show_in_roster = notify.get_show_in_roster('message_received',
event = 'gc_message_received'
show_in_roster = notify.get_show_in_roster(event,
self.account, self.contact)
show_in_systray = notify.get_show_in_systray('message_received',
show_in_systray = notify.get_show_in_systray(event,
self.account, self.contact)
event = gajim.events.create_event(type_, None,
show_in_roster = show_in_roster,
@ -593,6 +597,14 @@ class ChatControlBase(MessageControl):
if show_in_roster:
gajim.interface.roster.draw_contact(self.contact.jid,
self.account)
if not self.parent_win:
return
if (not self.parent_win.get_active_jid() or \
full_jid != self.parent_win.get_active_jid() or \
not self.parent_win.is_active() or not end) and \
kind in ('incoming', 'incoming_queue'):
self.parent_win.redraw_tab(self)
ctrl = gajim.interface.msg_win_mgr.get_control(full_jid, self.account)
if not self.parent_win.is_active():
@ -669,8 +681,12 @@ class ChatControlBase(MessageControl):
win.notebook.remove_page(ctrl_page)
control.unparent()
ctrl.parent_win = None
if not gajim.interface.minimized_controls.has_key(self.account):
gajim.interface.minimized_controls[self.account] = {}
gajim.interface.minimized_controls[self.account][self.contact.jid] = ctrl
gajim.connections[self.account].hidden_groupchats[self.contact.jid] = ctrl
del win._controls[self.account][self.contact.jid]
win.check_tabs()
@ -788,6 +804,8 @@ class ChatControlBase(MessageControl):
if not len(gajim.events.get_events(self.account, jid, ['printed_' + type_,
type_])):
return
if not self.parent_win:
return
if self.conv_textview.at_the_end() and \
self.parent_win.get_active_control() == self and \
self.parent_win.window.is_active():

View File

@ -70,7 +70,6 @@ class Connection(ConnectionHandlers):
self.last_time_to_reconnect = None
self.new_account_info = None
self.bookmarks = []
self.hidden_groupchats = {}
self.annotations = {}
self.on_purpose = False
self.last_io = gajim.idlequeue.current_time()

View File

@ -155,9 +155,8 @@ class Events:
self._events[account][new_jid] = self._events[account][old_jid]
del self._events[account][old_jid]
def get_nb_events(self, types = [], account = None, ignore_types = []):
return self._get_nb_events(types = types, account = account,
ignore_types = ignore_types)
def get_nb_events(self, types = [], account = None):
return self._get_nb_events(types = types, account = account)
def get_events(self, account, jid = None, types = []):
'''if event is not specified, get all events from this jid,
@ -187,7 +186,7 @@ class Events:
return first_event
def _get_nb_events(self, account = None, jid = None, attribute = None,
types = [], ignore_types = []):
types = []):
'''return the number of pending events'''
nb = 0
if account:
@ -207,8 +206,6 @@ class Events:
for event in self._events[acct][j]:
if types and event.type_ not in types:
continue
if ignore_types and event.type_ in ignore_types:
continue
if not attribute or \
attribute == 'systray' and event.show_in_systray or \
attribute == 'roster' and event.show_in_roster:

View File

@ -1052,9 +1052,10 @@ class Interface:
show = array[1]
status = array[2]
ctrl = self.msg_win_mgr.get_control(fjid, account)
# print status in chat window and update status/GPG image
if self.msg_win_mgr.has_window(fjid, account):
ctrl = self.msg_win_mgr.get_control(fjid, account)
if ctrl:
contact = ctrl.contact
contact.show = show
contact.status = status
@ -1066,44 +1067,42 @@ class Interface:
else:
ctrl.print_conversation(_('%s is now %s') % (nick, uf_show),
'status')
ctrl.parent_win.redraw_tab(ctrl)
if ctrl.parent_win:
ctrl.parent_win.redraw_tab(ctrl)
if self.remote_ctrl:
self.remote_ctrl.raise_signal('GCPresence', (account, array))
if room_jid in gajim.connections[account].hidden_groupchats:
my_nick = gajim.connections[account].hidden_groupchats[room_jid].nick
first = False
if not gajim.events.get_events(account, room_jid, ['change_status']):
first = True
array = array + (time.localtime(),)
event = gajim.events.create_event('change_status', array,
show_in_roster = False, show_in_systray = False)
gajim.events.add_event(account, room_jid, event)
# Change status icon if kicked or deconnected from gc
if array[3] == my_nick and array[1] in ('offline', 'error') and \
array[9] != '303':
gajim.gc_connected[account][room_jid] = False
gajim.interface.roster.draw_contact(room_jid, account)
elif array[3] == my_nick:
gajim.gc_connected[account][room_jid] = True
gajim.interface.roster.draw_contact(room_jid, account)
return
# Get the window and control for the updated status, this may be a
# PrivateChatControl
control = self.msg_win_mgr.get_control(room_jid, account)
if not control and \
self.minimized_controls.has_key(account) and \
room_jid in self.minimized_controls[account]:
control = self.minimized_controls[account][room_jid]
if control and control.type_id != message_control.TYPE_GC:
return
if control:
control.chg_contact_status(nick, show, status, array[4], array[5],
array[6], array[7], array[8], array[9], array[10])
if not control.parent_win:
gajim.interface.roster.draw_contact(room_jid, account)
def handle_event_gc_msg(self, account, array):
# ('GC_MSG', account, (jid, msg, time, has_timestamp, htmlmsg))
jids = array[0].split('/', 1)
room_jid = jids[0]
gc_control = self.msg_win_mgr.get_control(room_jid, account)
if not gc_control and \
self.minimized_controls.has_key(account) and \
room_jid in self.minimized_controls[account]:
gc_control = self.minimized_controls[account][room_jid]
if not gc_control:
return
xhtml = array[4]
if gajim.config.get('ignore_incoming_xhtml'):
xhtml = None
if len(jids) == 1:
@ -1113,47 +1112,13 @@ class Interface:
# message from someone
nick = jids[1]
if room_jid in gajim.connections[account].hidden_groupchats:
message = array[1]
tim = array[2]
first = False
if not gajim.events.get_events(account, room_jid, ['gc_msg',
'gc_chat']):
first = True
contact = gajim.contacts.get_contact_with_highest_priority(
account, room_jid)
advanced_notif_num = notify.get_advanced_notification\
('message_received', account, contact)
ctrl = gajim.connections[account].hidden_groupchats[room_jid]
type_event = 'gc_msg'
do_popup = False
is_history = False
show_in_systray = False
show_in_roster = True
if not array[3] and ctrl.needs_visual_notification(message):
do_popup = True
show_in_systray = True
if array[3] or nick == '':
is_history = True
type_event = 'gc_history'
show_in_roster = False
if not array[3]:
notify.notify('new_gc_message', room_jid, account, [do_popup,
first, nick, message, is_history], advanced_notif_num)
event = gajim.events.create_event(type_event, (nick, array[1],
array[2], array[3], xhtml), show_in_roster = show_in_roster,
show_in_systray = show_in_systray)
gajim.events.add_event(account, room_jid, event)
gajim.interface.roster.draw_contact(room_jid, account)
gajim.interface.roster.show_title()
return
gc_control = self.msg_win_mgr.get_control(room_jid, account)
if not gc_control:
return
gc_control.on_message(nick, array[1], array[2], array[3], xhtml)
contact = gajim.contacts.\
get_contact_with_highest_priority(account, room_jid)
if contact:
gajim.interface.roster.draw_contact(room_jid, account)
if self.remote_ctrl:
self.remote_ctrl.raise_signal('GCMessage', (account, array))
@ -1161,18 +1126,20 @@ class Interface:
#('GC_SUBJECT', account, (jid, subject, body, has_timestamp))
jids = array[0].split('/', 1)
jid = jids[0]
if jid in gajim.connections[account].hidden_groupchats:
array = (array[0], array[1], array[2]) + (time.localtime(),)
event = gajim.events.create_event('change_subject',
array, show_in_roster = False, show_in_systray = False)
gajim.events.add_event(account, jid, event)
contact = gajim.contacts.\
get_contact_with_highest_priority(account, jid)
contact.status = array[1]
gajim.interface.roster.draw_contact(jid, account)
return
gc_control = self.msg_win_mgr.get_control(jid, account)
if not gc_control and \
self.minimized_controls.has_key(account) and \
jid in self.minimized_controls[account]:
gc_control = self.minimized_controls[account][jid]
contact = gajim.contacts.\
get_contact_with_highest_priority(account, jid)
if contact:
contact.status = array[1]
gajim.interface.roster.draw_contact(jid, account)
if not gc_control:
return
gc_control.set_subject(array[1])
@ -2203,6 +2170,7 @@ class Interface:
self.emoticons_menu = None
# handler when an emoticon is clicked in emoticons_menu
self.emoticon_menuitem_clicked = None
self.minimized_controls = {}
self.default_colors = {
'inmsgcolor': gajim.config.get('inmsgcolor'),
'outmsgcolor': gajim.config.get('outmsgcolor'),

View File

@ -614,7 +614,8 @@ class GroupchatControl(ChatControlBase):
else:
kind = 'incoming'
# muc-specific chatstate
self.parent_win.redraw_tab(self, 'newmsg')
if self.parent_win:
self.parent_win.redraw_tab(self, 'newmsg')
else:
kind = 'status'
@ -636,7 +637,8 @@ class GroupchatControl(ChatControlBase):
str(self.gc_count_nicknames_colors))
if highlight:
# muc-specific chatstate
self.parent_win.redraw_tab(self, 'attention')
if self.parent_win:
self.parent_win.redraw_tab(self, 'attention')
other_tags_for_name.append('bold')
other_tags_for_text.append('marked')
if sound == 'received':
@ -647,7 +649,8 @@ class GroupchatControl(ChatControlBase):
other_tags_for_text.append('gc_nickname_color_' + \
str(self.gc_custom_colors[contact]))
self.check_and_possibly_add_focus_out_line()
if self.parent_win:
self.check_and_possibly_add_focus_out_line()
ChatControlBase.print_conversation_line(self, text, kind, contact, tim,
other_tags_for_name, [], other_tags_for_text, xhtml = xhtml)
@ -918,7 +921,12 @@ class GroupchatControl(ChatControlBase):
c.status = status
if nick == self.nick and statusCode != '303': # We became offline
self.got_disconnected()
self.parent_win.redraw_tab(self)
contact = gajim.contacts.\
get_contact_with_highest_priority(self.account, self.room_jid)
if contact:
gajim.interface.roster.draw_contact(self.room_jid, self.account)
if self.parent_win:
self.parent_win.redraw_tab(self)
else:
iter = self.get_contact_iter(nick)
if not iter:
@ -943,8 +951,8 @@ class GroupchatControl(ChatControlBase):
c.affiliation = affiliation
c.status = status
self.draw_contact(nick)
self.parent_win.redraw_tab(self)
if self.parent_win:
self.parent_win.redraw_tab(self)
if (time.time() - self.room_creation) > 30 and \
nick != self.nick and statusCode != '303':
st = ''
@ -2017,47 +2025,47 @@ class GroupchatControl(ChatControlBase):
else:
self.revoke_owner(widget, jid)
def read_queue(self, jid, account):
'''read queue and print messages containted in it'''
events = gajim.events.get_events(account, jid)
#~ def read_queue(self, jid, account):
#~ '''read queue and print messages containted in it'''
#~ events = gajim.events.get_events(account, jid)
for event in events:
if event.type_ == 'change_subject':
array = event.parameters
jids = array[0].split('/', 1)
jid = jids[0]
self.set_subject(array[1])
text = None
if len(jids) > 1:
text = _('%s has set the subject to %s') % (jids[1], array[1])
elif array[2]:
text = array[2]
if text is not None:
self.print_conversation(text, tim = array[3])
#~ for event in events:
#~ if event.type_ == 'change_subject':
#~ array = event.parameters
#~ jids = array[0].split('/', 1)
#~ jid = jids[0]
#~ self.set_subject(array[1])
#~ text = None
#~ if len(jids) > 1:
#~ text = _('%s has set the subject to %s') % (jids[1], array[1])
#~ elif array[2]:
#~ text = array[2]
#~ if text is not None:
#~ self.print_conversation(text, tim = array[3])
if event.type_ == 'change_status':
array = event.parameters
nick = array[3]
if not nick:
return
room_jid = array[0]
fjid = room_jid + '/' + nick
show = array[1]
status = array[2]
self.chg_contact_status(nick, show, status, array[4], array[5],
array[6], array[7], array[8], array[9], array[10], array[11])
#~ if event.type_ == 'change_status':
#~ array = event.parameters
#~ nick = array[3]
#~ if not nick:
#~ return
#~ room_jid = array[0]
#~ fjid = room_jid + '/' + nick
#~ show = array[1]
#~ status = array[2]
#~ self.chg_contact_status(nick, show, status, array[4], array[5],
#~ array[6], array[7], array[8], array[9], array[10], array[11])
self.parent_win.redraw_tab(self)
#~ self.parent_win.redraw_tab(self)
if event.type_ in ['gc_msg', 'gc_history']:
array = event.parameters
kind = array[0]
if kind == 'error' or kind == 'status':
kind = 'info'
self.on_message(kind, array[1], array[2], array[3], array[4])
#~ if event.type_ in ['gc_msg', 'gc_history']:
#~ array = event.parameters
#~ kind = array[0]
#~ if kind == 'error' or kind == 'status':
#~ kind = 'info'
#~ self.on_message(kind, array[1], array[2], array[3], array[4])
gajim.events.remove_events(account, jid,
types = ['change_status', 'gc_msg', 'gc_history',
'change_subject'])
gajim.interface.roster.draw_contact(jid, account)
gajim.interface.roster.show_title()
#~ gajim.events.remove_events(account, jid,
#~ types = ['change_status', 'gc_msg', 'gc_history',
#~ 'change_subject'])
#~ gajim.interface.roster.draw_contact(jid, account)
#~ gajim.interface.roster.show_title()

View File

@ -42,6 +42,8 @@ except ImportError:
def get_show_in_roster(event, account, contact):
'''Return True if this event must be shown in roster, else False'''
if event == 'gc_message_received':
return True
num = get_advanced_notification(event, account, contact)
if num != None:
if gajim.config.get_per('notifications', str(num), 'roster') == 'yes':
@ -153,25 +155,10 @@ def notify(event, jid, account, parameters, advanced_notif_num = None):
is_first_message = parameters[1]
nickname = parameters[2]
message = parameters[3]
if is_first_message and helpers.allow_sound_notification(
'first_message_received', advanced_notif_num):
do_sound = True
elif not is_first_message and helpers.allow_sound_notification(
'next_message_received', advanced_notif_num):
do_sound = True
if helpers.allow_showing_notification(account, 'notify_on_new_message',
advanced_notif_num, is_first_message):
do_popup = True
elif event == 'new_gc_message':
message_type = 'gc_msg'
do_popup = parameters[0]
is_first_message = parameters[1]
nickname = parameters[2]
message = parameters[3]
is_history = parameters[4]
if is_history:
pass
elif is_first_message and helpers.allow_sound_notification(
if is_first_message and helpers.allow_sound_notification(
'first_message_received', advanced_notif_num):
do_sound = True
elif not is_first_message and helpers.allow_sound_notification(
@ -260,19 +247,6 @@ def notify(event, jid, account, parameters, advanced_notif_num = None):
path = gtkgui_helpers.get_path_to_generic_or_avatar(img)
popup(event_type, jid, account, message_type,
path_to_image = path, title = title, text = text)
elif event == 'new_gc_message':
event_type = _('New Groupchat Message')
room_jid = jid
name = gajim.connections[account].hidden_groupchats[room_jid].name
img = os.path.join(gajim.DATA_DIR, 'pixmaps', 'events',
'gc_invitation.png')
title = _('New Message on %s') % name
text = _('%(nickname)s: %(message)s') % {'nickname': nickname,
'message': message}
path = gtkgui_helpers.get_path_to_generic_or_avatar(img)
popup(event_type, jid, account, message_type,
path_to_image = path, title = title, text = text)
if do_sound:
snd_file = None
@ -462,8 +436,6 @@ class DesktopNotification:
ntype = 'presence.status'
elif event_type == _('Connection Failed'):
ntype = 'connection.failed'
elif event_type == _('New Groupchat Message'):
ntype = 'im'
else:
# default failsafe values
self.path_to_image = os.path.abspath(

View File

@ -728,7 +728,8 @@ class RosterWindow:
win.set_active_tab(room_jid, account)
dialogs.ErrorDialog(_('You are already in group chat %s') % room_jid)
return
if gajim.connections[account].hidden_groupchats.has_key(room_jid):
if gajim.interface.minimized_controls.has_key(account) and \
room_jid in gajim.interface.minimized_controls[account]:
self.on_groupchat_maximized(None, room_jid, account)
return
invisible_show = gajim.SHOW_LIST.index('invisible')
@ -739,7 +740,11 @@ class RosterWindow:
if minimize:
contact = gajim.contacts.create_contact(jid = room_jid, name = nick)
gc_control = GroupchatControl(None, contact, account)
gajim.connections[account].hidden_groupchats[room_jid] = gc_control
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:
@ -2401,7 +2406,13 @@ class RosterWindow:
def on_groupchat_maximized(self, widget, jid, account):
'''When a groupshat is maximised'''
ctrl = gajim.connections[account].hidden_groupchats[jid]
if not gajim.interface.minimized_controls.has_key(account):
return
if not gajim.interface.minimized_controls[account].has_key(jid):
return
ctrl = gajim.interface.minimized_controls[account][jid]
mw = gajim.interface.msg_win_mgr.get_window(ctrl.contact.jid, ctrl.account)
if not mw:
mw = gajim.interface.msg_win_mgr.create_window(ctrl.contact, \
@ -2410,12 +2421,12 @@ class RosterWindow:
mw.new_tab(ctrl)
mw.set_active_tab(jid, account)
mw.window.present()
ctrl.read_queue(jid, account)
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)
del gajim.connections[account].hidden_groupchats[jid]
del gajim.interface.minimized_controls[account][jid]
def make_group_menu(self, event, iter):
'''Make group's popup menu'''
@ -3177,8 +3188,11 @@ class RosterWindow:
else:
gajim.connections[account].change_status(status, txt, auto)
if not gajim.interface.minimized_controls.has_key(account):
gajim.interface.minimized_controls[account] = {}
for gc_control in gajim.interface.msg_win_mgr.get_controls(
message_control.TYPE_GC):
message_control.TYPE_GC) + \
gajim.interface.minimized_controls[account].values():
if gc_control.account == account:
if gajim.gc_connected[account][gc_control.room_jid]:
gajim.connections[account].send_gc_status(gc_control.nick,
@ -3786,8 +3800,7 @@ class RosterWindow:
# check if we have unread or recent mesages
unread = False
recent = False
if gajim.events.get_nb_events(ignore_types = ['gc_history',
'change_status', 'change_subject']) > 0:
if gajim.events.get_nb_events() > 0:
unread = True
for win in gajim.interface.msg_win_mgr.windows():
unrd = 0
@ -3908,7 +3921,8 @@ class RosterWindow:
self.tree.collapse_row(path)
else:
self.tree.expand_row(path, False)
elif gajim.connections[account].hidden_groupchats.has_key(jid):
elif gajim.interface.minimized_controls.has_key(account) and \
gajim.interface.minimized_controls[account].has_key(jid):
self.on_groupchat_maximized(None, jid, account)
else:
first_ev = gajim.events.get_first_event(account, jid)

View File

@ -412,8 +412,9 @@ class RosterTooltip(NotificationAreaTooltip):
if self.account and prim_contact.jid in gajim.connections[
self.account].blocked_contacts:
name_markup += _(' [blocked]')
if self.account and gajim.connections[self.account].\
hidden_groupchats.has_key(prim_contact.jid):
if self.account and \
gajim.interface.minimized_controls.has_key(self.account) and \
prim_contact.jid in gajim.interface.minimized_controls[self.account]:
name_markup += _(' [minimized]')
properties.append((name_markup, None))