scroll to the end when we shrink conversation window. fixes #3078
This commit is contained in:
		
							parent
							
								
									c78a8b4380
								
							
						
					
					
						commit
						230eadd010
					
				
					 1 changed files with 24 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -144,6 +144,11 @@ class ChatControlBase(MessageControl):
 | 
			
		|||
		id = widget.connect('value-changed',
 | 
			
		||||
			self.on_conversation_vadjustment_value_changed)
 | 
			
		||||
		self.handlers[id] = widget
 | 
			
		||||
		id = widget.connect('changed',
 | 
			
		||||
			self.on_conversation_vadjustment_changed)
 | 
			
		||||
		self.handlers[id] = widget
 | 
			
		||||
		self.scroll_to_end_id = None
 | 
			
		||||
		self.was_at_the_end = True
 | 
			
		||||
		# add MessageTextView to UI and connect signals
 | 
			
		||||
		self.msg_scrolledwindow = self.xml.get_widget('message_scrolledwindow')
 | 
			
		||||
		self.msg_textview = MessageTextView()
 | 
			
		||||
| 
						 | 
				
			
			@ -551,7 +556,7 @@ class ChatControlBase(MessageControl):
 | 
			
		|||
		full_jid = self.get_full_jid()
 | 
			
		||||
		textview = self.conv_textview
 | 
			
		||||
		end = False
 | 
			
		||||
		if textview.at_the_end() or kind == 'outgoing':
 | 
			
		||||
		if self.was_at_the_end or kind == 'outgoing':
 | 
			
		||||
			end = True
 | 
			
		||||
		textview.print_conversation_line(text, jid, kind, name, tim,
 | 
			
		||||
			other_tags_for_name, other_tags_for_time, other_tags_for_text,
 | 
			
		||||
| 
						 | 
				
			
			@ -657,7 +662,7 @@ class ChatControlBase(MessageControl):
 | 
			
		|||
	def set_control_active(self, state):
 | 
			
		||||
		if state:
 | 
			
		||||
			jid = self.contact.jid
 | 
			
		||||
			if self.conv_textview.at_the_end():
 | 
			
		||||
			if self.was_at_the_end:
 | 
			
		||||
				# we are at the end
 | 
			
		||||
				type_ = 'printed_' + self.type_id
 | 
			
		||||
				if self.type_id == message_control.TYPE_GC:
 | 
			
		||||
| 
						 | 
				
			
			@ -672,18 +677,23 @@ class ChatControlBase(MessageControl):
 | 
			
		|||
 | 
			
		||||
	def bring_scroll_to_end(self, textview, diff_y = 0):
 | 
			
		||||
		''' scrolls to the end of textview if end is not visible '''
 | 
			
		||||
		if self.scroll_to_end_id:
 | 
			
		||||
			# a scroll is already planned
 | 
			
		||||
			return
 | 
			
		||||
		buffer = textview.get_buffer()
 | 
			
		||||
		end_iter = buffer.get_end_iter()
 | 
			
		||||
		end_rect = textview.get_iter_location(end_iter)
 | 
			
		||||
		visible_rect = textview.get_visible_rect()
 | 
			
		||||
		# scroll only if expected end is not visible
 | 
			
		||||
		if end_rect.y >= (visible_rect.y + visible_rect.height + diff_y):
 | 
			
		||||
			gobject.idle_add(self.scroll_to_end_iter, textview)
 | 
			
		||||
			self.scroll_to_end_id = gobject.idle_add(self.scroll_to_end_iter,
 | 
			
		||||
				textview)
 | 
			
		||||
 | 
			
		||||
	def scroll_to_end_iter(self, textview):
 | 
			
		||||
		buffer = textview.get_buffer()
 | 
			
		||||
		end_iter = buffer.get_end_iter()
 | 
			
		||||
		textview.scroll_to_iter(end_iter, 0, False, 1, 1)
 | 
			
		||||
		self.scroll_to_end_id = None
 | 
			
		||||
		return False
 | 
			
		||||
 | 
			
		||||
	def size_request(self, msg_textview , requisition):
 | 
			
		||||
| 
						 | 
				
			
			@ -741,7 +751,15 @@ class ChatControlBase(MessageControl):
 | 
			
		|||
 | 
			
		||||
		return True
 | 
			
		||||
 | 
			
		||||
	def on_conversation_vadjustment_value_changed(self, widget):
 | 
			
		||||
	def on_conversation_vadjustment_changed(self, adjustment):
 | 
			
		||||
		# used to stay at the end of the textview when we shrink conversation
 | 
			
		||||
		# textview.
 | 
			
		||||
		if self.was_at_the_end:
 | 
			
		||||
			self.conv_textview.bring_scroll_to_end(-18)
 | 
			
		||||
		self.was_at_the_end = (adjustment.upper - adjustment.value - adjustment.page_size) < 18
 | 
			
		||||
 | 
			
		||||
	def on_conversation_vadjustment_value_changed(self, adjustment):
 | 
			
		||||
		self.was_at_the_end = (adjustment.upper - adjustment.value - adjustment.page_size) < 18
 | 
			
		||||
		if self.resource:
 | 
			
		||||
			jid = self.contact.get_full_jid()
 | 
			
		||||
		else:
 | 
			
		||||
| 
						 | 
				
			
			@ -753,12 +771,9 @@ class ChatControlBase(MessageControl):
 | 
			
		|||
		type_])):
 | 
			
		||||
			return
 | 
			
		||||
		if self.conv_textview.at_the_end() and \
 | 
			
		||||
				self.parent_win.get_active_control() == self and \
 | 
			
		||||
				self.parent_win.window.is_active():
 | 
			
		||||
		self.parent_win.get_active_control() == self and \
 | 
			
		||||
		self.parent_win.window.is_active():
 | 
			
		||||
			# we are at the end
 | 
			
		||||
			type_ = self.type_id
 | 
			
		||||
			if type_ == message_control.TYPE_GC:
 | 
			
		||||
				type_ = 'gc_msg'
 | 
			
		||||
			if not gajim.events.remove_events(self.account, self.get_full_jid(),
 | 
			
		||||
			types = ['printed_' + type_, type_]):
 | 
			
		||||
				# There were events to remove
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue