move the draw og the focus out line to conversation_textview.py
reset focus_out_end_iter_offset var when we clear the textview. Fixes #2175
This commit is contained in:
parent
1ef77d8e5d
commit
2d876923d9
3 changed files with 71 additions and 64 deletions
|
@ -250,7 +250,7 @@ class ChatControlBase(MessageControl):
|
||||||
if event.state & gtk.gdk.CONTROL_MASK:
|
if event.state & gtk.gdk.CONTROL_MASK:
|
||||||
# CTRL + l|L: clear conv_textview
|
# CTRL + l|L: clear conv_textview
|
||||||
if event.keyval == gtk.keysyms.l or event.keyval == gtk.keysyms.L:
|
if event.keyval == gtk.keysyms.l or event.keyval == gtk.keysyms.L:
|
||||||
self.conv_textview.tv.get_buffer().set_text('')
|
self.conv_textview.clear()
|
||||||
return True
|
return True
|
||||||
# CTRL + v: Paste into msg_textview
|
# CTRL + v: Paste into msg_textview
|
||||||
elif event.keyval == gtk.keysyms.v:
|
elif event.keyval == gtk.keysyms.v:
|
||||||
|
|
|
@ -28,6 +28,7 @@ import pango
|
||||||
import gobject
|
import gobject
|
||||||
import time
|
import time
|
||||||
import sys
|
import sys
|
||||||
|
import os
|
||||||
import tooltips
|
import tooltips
|
||||||
import dialogs
|
import dialogs
|
||||||
import locale
|
import locale
|
||||||
|
@ -132,6 +133,10 @@ class ConversationTextview:
|
||||||
|
|
||||||
buffer.create_tag('focus-out-line', justification = gtk.JUSTIFY_CENTER)
|
buffer.create_tag('focus-out-line', justification = gtk.JUSTIFY_CENTER)
|
||||||
|
|
||||||
|
self.allow_focus_out_line = True
|
||||||
|
# holds the iter's offset which points to the end of --- line
|
||||||
|
self.focus_out_end_iter_offset = None
|
||||||
|
|
||||||
self.line_tooltip = tooltips.BaseTooltip()
|
self.line_tooltip = tooltips.BaseTooltip()
|
||||||
|
|
||||||
def del_handlers(self):
|
def del_handlers(self):
|
||||||
|
@ -187,6 +192,68 @@ class ConversationTextview:
|
||||||
self.tv.scroll_to_iter(end_iter, 0, False, 1, 1)
|
self.tv.scroll_to_iter(end_iter, 0, False, 1, 1)
|
||||||
return False # when called in an idle_add, just do it once
|
return False # when called in an idle_add, just do it once
|
||||||
|
|
||||||
|
def show_focus_out_line(self):
|
||||||
|
if not self.allow_focus_out_line:
|
||||||
|
# if room did not receive focus-in from the last time we added
|
||||||
|
# --- line then do not readd
|
||||||
|
return
|
||||||
|
|
||||||
|
print_focus_out_line = False
|
||||||
|
buffer = self.tv.get_buffer()
|
||||||
|
|
||||||
|
if self.focus_out_end_iter_offset 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 != 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 is not None:
|
||||||
|
end_iter_for_previous_line = buffer.get_iter_at_offset(
|
||||||
|
self.focus_out_end_iter_offset)
|
||||||
|
begin_iter_for_previous_line = end_iter_for_previous_line.copy()
|
||||||
|
# img_char+1 (the '\n')
|
||||||
|
begin_iter_for_previous_line.backward_chars(2)
|
||||||
|
|
||||||
|
# remove focus out line
|
||||||
|
buffer.delete(begin_iter_for_previous_line,
|
||||||
|
end_iter_for_previous_line)
|
||||||
|
|
||||||
|
# add the new focus out line
|
||||||
|
# FIXME: Why is this loaded from disk everytime
|
||||||
|
path_to_file = os.path.join(gajim.DATA_DIR, 'pixmaps', 'muc_separator.png')
|
||||||
|
focus_out_line_pixbuf = gtk.gdk.pixbuf_new_from_file(path_to_file)
|
||||||
|
end_iter = buffer.get_end_iter()
|
||||||
|
buffer.insert(end_iter, '\n')
|
||||||
|
buffer.insert_pixbuf(end_iter, focus_out_line_pixbuf)
|
||||||
|
|
||||||
|
end_iter = buffer.get_end_iter()
|
||||||
|
before_img_iter = end_iter.copy()
|
||||||
|
before_img_iter.backward_char() # one char back (an image also takes one char)
|
||||||
|
buffer.apply_tag_by_name('focus-out-line', before_img_iter, end_iter)
|
||||||
|
#FIXME: remove this workaround when bug is fixed
|
||||||
|
# c http://bugzilla.gnome.org/show_bug.cgi?id=318569
|
||||||
|
|
||||||
|
self.allow_focus_out_line = False
|
||||||
|
|
||||||
|
# update the iter we hold to make comparison the next time
|
||||||
|
self.focus_out_end_iter_offset = 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)
|
||||||
|
|
||||||
def show_line_tooltip(self):
|
def show_line_tooltip(self):
|
||||||
pointer = self.tv.get_pointer()
|
pointer = self.tv.get_pointer()
|
||||||
x, y = self.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, pointer[0],
|
x, y = self.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, pointer[0],
|
||||||
|
@ -241,6 +308,7 @@ class ConversationTextview:
|
||||||
buffer = self.tv.get_buffer()
|
buffer = self.tv.get_buffer()
|
||||||
start, end = buffer.get_bounds()
|
start, end = buffer.get_bounds()
|
||||||
buffer.delete(start, end)
|
buffer.delete(start, end)
|
||||||
|
self.focus_out_end_iter_offset = None
|
||||||
|
|
||||||
def visit_url_from_menuitem(self, widget, link):
|
def visit_url_from_menuitem(self, widget, link):
|
||||||
'''basically it filters out the widget instance'''
|
'''basically it filters out the widget instance'''
|
||||||
|
|
|
@ -196,10 +196,6 @@ class GroupchatControl(ChatControlBase):
|
||||||
|
|
||||||
self.tooltip = tooltips.GCTooltip()
|
self.tooltip = tooltips.GCTooltip()
|
||||||
|
|
||||||
self.allow_focus_out_line = True
|
|
||||||
# holds the iter's offset which points to the end of --- line
|
|
||||||
self.focus_out_end_iter_offset = None
|
|
||||||
|
|
||||||
# connect the menuitems to their respective functions
|
# connect the menuitems to their respective functions
|
||||||
xm = gtkgui_helpers.get_glade('gc_control_popup_menu.glade')
|
xm = gtkgui_helpers.get_glade('gc_control_popup_menu.glade')
|
||||||
|
|
||||||
|
@ -332,7 +328,7 @@ class GroupchatControl(ChatControlBase):
|
||||||
def _on_window_focus_in_event(self, widget, event):
|
def _on_window_focus_in_event(self, widget, event):
|
||||||
'''When window gets focus'''
|
'''When window gets focus'''
|
||||||
if self.parent_win.get_active_jid() == self.room_jid:
|
if self.parent_win.get_active_jid() == self.room_jid:
|
||||||
self.allow_focus_out_line = True
|
self.conv_textview.allow_focus_out_line = True
|
||||||
|
|
||||||
def on_treeview_size_allocate(self, widget, allocation):
|
def on_treeview_size_allocate(self, widget, allocation):
|
||||||
'''The MUC treeview has resized. Move the hpaned in all tabs to match'''
|
'''The MUC treeview has resized. Move the hpaned in all tabs to match'''
|
||||||
|
@ -603,64 +599,7 @@ class GroupchatControl(ChatControlBase):
|
||||||
# we have full focus (we are reading it!)
|
# we have full focus (we are reading it!)
|
||||||
return
|
return
|
||||||
|
|
||||||
if not self.allow_focus_out_line:
|
self.conv_textview.show_focus_out_line()
|
||||||
# if room did not receive focus-in from the last time we added
|
|
||||||
# --- line then do not readd
|
|
||||||
return
|
|
||||||
|
|
||||||
print_focus_out_line = False
|
|
||||||
buffer = self.conv_textview.tv.get_buffer()
|
|
||||||
|
|
||||||
if self.focus_out_end_iter_offset 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 != 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 is not None:
|
|
||||||
end_iter_for_previous_line = buffer.get_iter_at_offset(
|
|
||||||
self.focus_out_end_iter_offset)
|
|
||||||
begin_iter_for_previous_line = end_iter_for_previous_line.copy()
|
|
||||||
begin_iter_for_previous_line.backward_chars(2) # img_char+1 (the '\n')
|
|
||||||
|
|
||||||
# remove focus out line
|
|
||||||
buffer.delete(begin_iter_for_previous_line,
|
|
||||||
end_iter_for_previous_line)
|
|
||||||
|
|
||||||
# add the new focus out line
|
|
||||||
# FIXME: Why is this loaded from disk everytime
|
|
||||||
path_to_file = os.path.join(gajim.DATA_DIR, 'pixmaps', 'muc_separator.png')
|
|
||||||
focus_out_line_pixbuf = gtk.gdk.pixbuf_new_from_file(path_to_file)
|
|
||||||
end_iter = buffer.get_end_iter()
|
|
||||||
buffer.insert(end_iter, '\n')
|
|
||||||
buffer.insert_pixbuf(end_iter, focus_out_line_pixbuf)
|
|
||||||
|
|
||||||
end_iter = buffer.get_end_iter()
|
|
||||||
before_img_iter = end_iter.copy()
|
|
||||||
before_img_iter.backward_char() # one char back (an image also takes one char)
|
|
||||||
buffer.apply_tag_by_name('focus-out-line', before_img_iter, end_iter)
|
|
||||||
#FIXME: remove this workaround when bug is fixed
|
|
||||||
# c http://bugzilla.gnome.org/show_bug.cgi?id=318569
|
|
||||||
|
|
||||||
self.allow_focus_out_line = False
|
|
||||||
|
|
||||||
# update the iter we hold to make comparison the next time
|
|
||||||
self.focus_out_end_iter_offset = 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.conv_textview.scroll_to_end)
|
|
||||||
|
|
||||||
def needs_visual_notification(self, text):
|
def needs_visual_notification(self, text):
|
||||||
'''checks text to see whether any of the words in (muc_highlight_words
|
'''checks text to see whether any of the words in (muc_highlight_words
|
||||||
|
|
Loading…
Add table
Reference in a new issue