now on focus out and on tab switch groupchat window adds seperator to point where we where when we force losing focus in the conversation. TODO: position it better, add tooltip what ------ is

This commit is contained in:
Nikos Kouremenos 2005-10-07 22:29:06 +00:00
parent 6e50f0bbc0
commit 835e48b64d
2 changed files with 69 additions and 15 deletions

View File

@ -548,7 +548,6 @@ class Chat:
def bring_scroll_to_end(self, textview, diff_y = 0): def bring_scroll_to_end(self, textview, diff_y = 0):
''' scrolls to the end of textview if end is not visible ''' ''' scrolls to the end of textview if end is not visible '''
buffer = textview.get_buffer() buffer = textview.get_buffer()
buffer.begin_user_action()
at_the_end = False at_the_end = False
end_iter = buffer.get_end_iter() end_iter = buffer.get_end_iter()
end_rect = textview.get_iter_location(end_iter) end_rect = textview.get_iter_location(end_iter)
@ -1193,7 +1192,7 @@ class Chat:
def print_conversation_line(self, text, jid, kind, name, tim, def print_conversation_line(self, text, jid, kind, name, tim,
other_tags_for_name = [], other_tags_for_time = [], other_tags_for_name = [], other_tags_for_time = [],
other_tags_for_text = [], count_as_new = True, subject = None): other_tags_for_text = [], count_as_new = True, subject = None):
'''' prints 'chat' type messages ''' '''prints 'chat' type messages'''
textview = self.xmls[jid].get_widget('conversation_textview') textview = self.xmls[jid].get_widget('conversation_textview')
buffer = textview.get_buffer() buffer = textview.get_buffer()
buffer.begin_user_action() buffer.begin_user_action()
@ -1236,7 +1235,7 @@ class Chat:
end_rect = textview.get_iter_location(end_iter) end_rect = textview.get_iter_location(end_iter)
visible_rect = textview.get_visible_rect() visible_rect = textview.get_visible_rect()
text_tags = other_tags_for_text[:] text_tags = other_tags_for_text[:] # create a new list
if kind == 'status': if kind == 'status':
text_tags.append(kind) text_tags.append(kind)
elif text.startswith('/me ') or text.startswith('/me\n'): elif text.startswith('/me ') or text.startswith('/me\n'):
@ -1269,7 +1268,7 @@ class Chat:
if at_the_end or kind == 'outgoing': if at_the_end or kind == 'outgoing':
# we are at the end or we are sending something # we are at the end or we are sending something
end = True end = True
# We scroll to the end after the scrollbar has appeared # scroll to the end (via idle in case the scrollbar has appeared)
gobject.idle_add(self.scroll_to_end, textview) gobject.idle_add(self.scroll_to_end, textview)
buffer.end_user_action() buffer.end_user_action()

View File

@ -29,6 +29,7 @@ import gtkgui_helpers
import history_window import history_window
import tooltips import tooltips
import sre import sre
import unicodedata
from gajim import Contact from gajim import Contact
from common import gajim from common import gajim
@ -73,6 +74,8 @@ class GroupchatWindow(chat.Chat):
self.cmd_hits = {} # possible candidates for command completion self.cmd_hits = {} # possible candidates for command completion
self.last_key_tabs = {} self.last_key_tabs = {}
self.hpaneds = {} # used for auto positioning self.hpaneds = {} # used for auto positioning
# holds the iter's offset which points to the end of --- line per jid
self.focus_out_end_iter_offset = {}
self.hpaned_position = gajim.config.get('gc-hpaned-position') self.hpaned_position = gajim.config.get('gc-hpaned-position')
self.gc_refer_to_nick_char = gajim.config.get('gc_refer_to_nick_char') self.gc_refer_to_nick_char = gajim.config.get('gc_refer_to_nick_char')
self.new_room(room_jid, nick) self.new_room(room_jid, nick)
@ -187,12 +190,60 @@ class GroupchatWindow(chat.Chat):
'''When window gets focus''' '''When window gets focus'''
chat.Chat.on_chat_window_focus_in_event(self, widget, event) chat.Chat.on_chat_window_focus_in_event(self, widget, event)
def check_and_possibly_add_focus_out_line(self, room_jid):
'''checks and possibly adds focus out line for room(s) that need it
and do not already have it as last event'''
print_focus_out_line = False
textview = self.xmls[room_jid].get_widget('conversation_textview')
buffer = textview.get_buffer()
if self.focus_out_end_iter_offset[room_jid] is None:
# this happens only first time we focus out on this room
print_focus_out_line = True
else:
if self.focus_out_end_iter_offset[room_jid] != buffer.get_end_iter().get_offset():
# this means after last-focus something was printed
# (else end_iter's offset is the same as before)
# only then print ---- line (eg. we avoid printing many following
# ---- lines)
print_focus_out_line = True
if print_focus_out_line and buffer.get_char_count() > 0:
buffer.begin_user_action()
# remove previous focus out line if such focus out line exists
if self.focus_out_end_iter_offset[room_jid] is not None:
end_iter_for_previous_line = buffer.get_iter_at_offset(
self.focus_out_end_iter_offset[room_jid])
begin_iter_for_previous_line = end_iter_for_previous_line.copy()
begin_iter_for_previous_line.backward_chars(16) # FIXME: position stuff not always 15+1 (the '\n') after fix
# remove focus out line
buffer.delete(begin_iter_for_previous_line,
end_iter_for_previous_line)
# add the new focus out line
dash_char = unicodedata.lookup(
'BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL').encode('utf-8')
focus_out_line = '\n' + dash_char * 15 # FIXME: do better position stuff
end_iter = buffer.get_end_iter()
buffer.insert(end_iter, focus_out_line)
# update the iter we hold to make comparison the next time
self.focus_out_end_iter_offset[room_jid] = buffer.get_end_iter(
).get_offset()
buffer.end_user_action()
# scroll to the end (via idle in case the scrollbar has appeared)
gobject.idle_add(self.scroll_to_end, textview)
def on_groupchat_window_focus_out_event(self, widget, event): def on_groupchat_window_focus_out_event(self, widget, event):
'''When window loses focus''' '''When window loses focus, we print focus-out-line in every tab'''
#chat.Chat.on_chat_window_focus_out_event(self, widget, event) for room_jid in self.xmls:
#FIXME: merge with on_tabbed_chat_window_focus_out_event in chat.py self.check_and_possibly_add_focus_out_line(room_jid)
#do the you were here in MUC conversation thing
pass
def on_chat_notebook_key_press_event(self, widget, event): def on_chat_notebook_key_press_event(self, widget, event):
chat.Chat.on_chat_notebook_key_press_event(self, widget, event) chat.Chat.on_chat_notebook_key_press_event(self, widget, event)
@ -224,6 +275,9 @@ class GroupchatWindow(chat.Chat):
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)
if len(self.xmls) > 1: # if we have more than one tab
# then add the focus-out line to the tab we are leaving
self.check_and_possibly_add_focus_out_line(old_jid)
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):
@ -866,8 +920,8 @@ current room topic.') % command, room_jid)
def print_conversation(self, text, room_jid, contact = '', tim = None): def print_conversation(self, text, room_jid, contact = '', tim = None):
'''Print a line in the conversation: '''Print a line in the conversation:
if contact is set: it's a message from someone if contact is set: it's a message from someone
if contact is not set: it's a message from the server''' if contact is not set: it's a message from the server or help'''
if type(text) == str: if isinstance(text, str):
text = unicode(text, 'utf-8') text = unicode(text, 'utf-8')
other_tags_for_name = [] other_tags_for_name = []
other_tags_for_text = [] other_tags_for_text = []
@ -1222,6 +1276,7 @@ current room topic.') % command, room_jid)
self.room_creation[room_jid] = time.time() self.room_creation[room_jid] = time.time()
self.nick_hits[room_jid] = [] self.nick_hits[room_jid] = []
self.cmd_hits[room_jid] = [] self.cmd_hits[room_jid] = []
self.focus_out_end_iter_offset[room_jid] = None
self.last_key_tabs[room_jid] = False self.last_key_tabs[room_jid] = False
self.hpaneds[room_jid] = self.xmls[room_jid].get_widget('hpaned') self.hpaneds[room_jid] = self.xmls[room_jid].get_widget('hpaned')
self.list_treeview[room_jid] = self.xmls[room_jid].get_widget( self.list_treeview[room_jid] = self.xmls[room_jid].get_widget(