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