don't remove contact instance when we remove last event if a chat is stil opened, but when we close the window. Should fix #4272
This commit is contained in:
		
							parent
							
								
									3e2f9fcbec
								
							
						
					
					
						commit
						c876e8f65e
					
				
					 2 changed files with 37 additions and 22 deletions
				
			
		| 
						 | 
				
			
			@ -2185,6 +2185,14 @@ class ChatControl(ChatControlBase):
 | 
			
		|||
		# Clean events
 | 
			
		||||
		gajim.events.remove_events(self.account, self.get_full_jid(),
 | 
			
		||||
			types = ['printed_' + self.type_id, self.type_id])
 | 
			
		||||
		# Remove contact instance if contact has been removed
 | 
			
		||||
		key = (self.contact.jid, self.account)
 | 
			
		||||
		roster = gajim.interface.roster
 | 
			
		||||
		if key in roster.contacts_to_be_removed.keys():
 | 
			
		||||
			backend = roster.contacts_to_be_removed[key]['backend']
 | 
			
		||||
			del roster.contacts_to_be_removed[key]
 | 
			
		||||
			roster.remove_contact(self.contact.jid, self.account, force=True,
 | 
			
		||||
				backend=backend)
 | 
			
		||||
		# remove all register handlers on widgets, created by self.xml
 | 
			
		||||
		# to prevent circular references among objects
 | 
			
		||||
		for i in self.handlers.keys():
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -732,18 +732,23 @@ class RosterWindow:
 | 
			
		|||
 | 
			
		||||
		'''
 | 
			
		||||
		contact = gajim.contacts.get_contact_with_highest_priority(account, jid)
 | 
			
		||||
 | 
			
		||||
		iters = self._get_contact_iter(jid, account, contact, self.model)
 | 
			
		||||
		if not iters:
 | 
			
		||||
		if not contact:
 | 
			
		||||
			return
 | 
			
		||||
 | 
			
		||||
		if not force and self.contact_has_pending_roster_events(contact, account):
 | 
			
		||||
			# Contact has pending events
 | 
			
		||||
		if not force and (self.contact_has_pending_roster_events(contact,
 | 
			
		||||
		account) or gajim.interface.msg_win_mgr.get_control(jid, account)):
 | 
			
		||||
			# Contact has pending events or window
 | 
			
		||||
			#TODO: or single message windows? Bur they are not listed for the
 | 
			
		||||
			# moment
 | 
			
		||||
			key = (jid, account)
 | 
			
		||||
			if not key in self.contacts_to_be_removed:
 | 
			
		||||
				self.contacts_to_be_removed[key] = {'backend': backend}
 | 
			
		||||
			return False
 | 
			
		||||
		else:
 | 
			
		||||
			# if more pending event, don't remove from roster
 | 
			
		||||
			if self.contact_has_pending_roster_events(contact, account):
 | 
			
		||||
				return False
 | 
			
		||||
 | 
			
		||||
		iters = self._get_contact_iter(jid, account, contact, self.model)
 | 
			
		||||
		if iters:
 | 
			
		||||
			# no more pending events
 | 
			
		||||
			# Remove contact from roster directly
 | 
			
		||||
			family = gajim.contacts.get_metacontacts_family(account, jid)
 | 
			
		||||
| 
						 | 
				
			
			@ -753,27 +758,29 @@ class RosterWindow:
 | 
			
		|||
			else:
 | 
			
		||||
				self._remove_entity(contact, account)
 | 
			
		||||
 | 
			
		||||
			if backend:
 | 
			
		||||
				# Remove contact before redrawing, otherwise the old
 | 
			
		||||
				# numbers will still be show
 | 
			
		||||
				gajim.contacts.remove_jid(account, jid, remove_meta=True)
 | 
			
		||||
				if family:
 | 
			
		||||
					# reshow the rest of the family
 | 
			
		||||
					brothers = self._add_metacontact_family(family, account)
 | 
			
		||||
					for c, acc in brothers:
 | 
			
		||||
						self.draw_contact(c.jid, acc)
 | 
			
		||||
						self.draw_mood(c.jid, acc)
 | 
			
		||||
						self.draw_activity(c.jid, acc)
 | 
			
		||||
						self.draw_tune(c.jid, acc)
 | 
			
		||||
						self.draw_avatar(c.jid, acc)
 | 
			
		||||
		if backend and (not gajim.interface.msg_win_mgr.get_control(jid, account)\
 | 
			
		||||
		or force):
 | 
			
		||||
			# If a window is still opened: don't remove contact instance
 | 
			
		||||
			# Remove contact before redrawing, otherwise the old
 | 
			
		||||
			# numbers will still be show
 | 
			
		||||
			gajim.contacts.remove_jid(account, jid, remove_meta=True)
 | 
			
		||||
			if iters and family:
 | 
			
		||||
				# reshow the rest of the family
 | 
			
		||||
				brothers = self._add_metacontact_family(family, account)
 | 
			
		||||
				for c, acc in brothers:
 | 
			
		||||
					self.draw_contact(c.jid, acc)
 | 
			
		||||
					self.draw_mood(c.jid, acc)
 | 
			
		||||
					self.draw_activity(c.jid, acc)
 | 
			
		||||
					self.draw_tune(c.jid, acc)
 | 
			
		||||
					self.draw_avatar(c.jid, acc)
 | 
			
		||||
 | 
			
		||||
		if iters:
 | 
			
		||||
			# Draw all groups of the contact
 | 
			
		||||
			for group in contact.get_shown_groups():
 | 
			
		||||
				self.draw_group(group, account)
 | 
			
		||||
			self.draw_account(account)
 | 
			
		||||
 | 
			
		||||
			return True
 | 
			
		||||
 | 
			
		||||
		return True
 | 
			
		||||
 | 
			
		||||
	def add_groupchat(self, jid, account, status=''):
 | 
			
		||||
		'''Add groupchat to roster and draw it.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue