Add sync of buffers/nicklists
This commit is contained in:
		
							parent
							
								
									02cba1c1c4
								
							
						
					
					
						commit
						ca67c3a7dc
					
				
					 2 changed files with 84 additions and 21 deletions
				
			
		|  | @ -29,9 +29,10 @@ QtCore = qt_compat.import_module('QtCore') | ||||||
| QtNetwork = qt_compat.import_module('QtNetwork') | QtNetwork = qt_compat.import_module('QtNetwork') | ||||||
| 
 | 
 | ||||||
| _PROTO_INIT_CMDS = ['init password=%(password)s,compression=gzip', | _PROTO_INIT_CMDS = ['init password=%(password)s,compression=gzip', | ||||||
|                     '(listbuffers) hdata buffer:gui_buffers(*) number,full_name,nicklist,title', |                     '(listbuffers) hdata buffer:gui_buffers(*) number,full_name,short_name,nicklist,title', | ||||||
|                     '(listlines) hdata buffer:gui_buffers(*)/own_lines/first_line(*)/data date,displayed,prefix,message', |                     '(listlines) hdata buffer:gui_buffers(*)/own_lines/first_line(*)/data date,displayed,prefix,message', | ||||||
|                     '(nicklist) nicklist', |                     '(nicklist) nicklist', | ||||||
|  |                     'sync', | ||||||
|                     ''] |                     ''] | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -261,33 +261,95 @@ class MainWindow(QtGui.QMainWindow): | ||||||
|                         self.stacked_buffers.removeWidget(buf) |                         self.stacked_buffers.removeWidget(buf) | ||||||
|                     self.buffers = [] |                     self.buffers = [] | ||||||
|                     for item in obj.value['items']: |                     for item in obj.value['items']: | ||||||
|                         self.list_buffers.addItem('%d. %s' % (item['number'], item['full_name'])) |                         buf = self.create_buffer(item) | ||||||
|                         self.buffers.append(Buffer(item)) |                         self.insert_buffer(len(self.buffers), buf) | ||||||
|                         self.stacked_buffers.addWidget(self.buffers[-1].widget) |  | ||||||
|                         self.buffers[-1].bufferInput.connect(self.buffer_input) |  | ||||||
|                         self.buffers[-1].widget.input.bufferSwitchPrev.connect(self.list_buffers.switch_prev_buffer) |  | ||||||
|                         self.buffers[-1].widget.input.bufferSwitchNext.connect(self.list_buffers.switch_next_buffer) |  | ||||||
|                     self.list_buffers.setCurrentRow(0) |                     self.list_buffers.setCurrentRow(0) | ||||||
|                     self.buffers[0].widget.input.setFocus() |                     self.buffers[0].widget.input.setFocus() | ||||||
|         elif message.msgid == 'listlines': |         elif message.msgid in ('listlines', '_buffer_line_added'): | ||||||
|             for obj in message.objects: |             for obj in message.objects: | ||||||
|                 if obj.objtype == 'hda' and obj.value['path'][-1] == 'line_data': |                 if obj.objtype == 'hda' and obj.value['path'][-1] == 'line_data': | ||||||
|                     for item in obj.value['items']: |                     for item in obj.value['items']: | ||||||
|                         pointer = item['__path'][0] |                         if message.msgid == 'listlines': | ||||||
|                         buf = filter(lambda b: b.pointer() == pointer, self.buffers) |                             ptrbuf = item['__path'][0] | ||||||
|                         if buf: |                         else: | ||||||
|                             buf[0].widget.chat.display(item['date'], |                             ptrbuf = item['buffer'] | ||||||
|                                                        color.remove(item['prefix']), |                         index = [i for i, b in enumerate(self.buffers) if b.pointer() == ptrbuf] | ||||||
|                                                        color.remove(item['message'])) |                         if index: | ||||||
|         elif message.msgid == 'nicklist': |                             self.buffers[index[0]].widget.chat.display(item['date'], | ||||||
|  |                                                                        color.remove(item['prefix']), | ||||||
|  |                                                                        color.remove(item['message'])) | ||||||
|  |         elif message.msgid in ('_nicklist', 'nicklist'): | ||||||
|  |             buffer_nicklist = {} | ||||||
|             for obj in message.objects: |             for obj in message.objects: | ||||||
|                 if obj.objtype == 'hda' and obj.value['path'][-1] == 'nick_group': |                 if obj.objtype == 'hda' and obj.value['path'][-1] == 'nicklist_item': | ||||||
|                     for item in obj.value['items']: |                     for item in obj.value['items']: | ||||||
|                         if not item['group'] and item['visible']: |                         index = [i for i, b in enumerate(self.buffers) if b.pointer() == item['__path'][0]] | ||||||
|                             pointer = item['__path'][0] |                         if index: | ||||||
|                             buf = filter(lambda b: b.pointer() == pointer, self.buffers) |                             if not item['__path'][0] in buffer_nicklist: | ||||||
|                             if buf: |                                 self.buffers[index[0]].remove_all_nicks() | ||||||
|                                 buf[0].add_nick(item['prefix'], item['name']) |                             buffer_nicklist[item['__path'][0]] = True | ||||||
|  |                             if not item['group'] and item['visible']: | ||||||
|  |                                 self.buffers[index[0]].add_nick(item['prefix'], item['name']) | ||||||
|  |         elif message.msgid == '_buffer_opened': | ||||||
|  |             for obj in message.objects: | ||||||
|  |                 if obj.objtype == 'hda' and obj.value['path'][-1] == 'buffer': | ||||||
|  |                     for item in obj.value['items']: | ||||||
|  |                         buf = self.create_buffer(item) | ||||||
|  |                         index = self.find_buffer_index_for_insert(item['next_buffer']) | ||||||
|  |                         self.insert_buffer(index, buf) | ||||||
|  |         elif message.msgid.startswith('_buffer_'): | ||||||
|  |             for obj in message.objects: | ||||||
|  |                 if obj.objtype == 'hda' and obj.value['path'][-1] == 'buffer': | ||||||
|  |                     for item in obj.value['items']: | ||||||
|  |                         index = [i for i, b in enumerate(self.buffers) if b.pointer() == item['__path'][0]] | ||||||
|  |                         if index: | ||||||
|  |                             index = index[0] | ||||||
|  |                             if message.msgid in ('_buffer_moved', '_buffer_merged'): | ||||||
|  |                                 buf = self.buffers[index] | ||||||
|  |                                 buf.data['number'] = item['number'] | ||||||
|  |                                 self.remove_buffer(index) | ||||||
|  |                                 index2 = self.find_buffer_index_for_insert(item['next_buffer']) | ||||||
|  |                                 self.insert_buffer(index2, buf) | ||||||
|  |                             elif message.msgid == '_buffer_renamed': | ||||||
|  |                                 self.buffers[index].data['full_name'] = item['full_name'] | ||||||
|  |                                 self.buffers[index].data['short_name'] = item['short_name'] | ||||||
|  |                             elif message.msgid == '_buffer_title_changed': | ||||||
|  |                                 self.buffers[index].data['title'] = item['title'] | ||||||
|  |                                 self.buffers[index].widget.set_title(item['title']) | ||||||
|  |                             elif message.msgid == '_buffer_closing': | ||||||
|  |                                 self.remove_buffer(index) | ||||||
|  | 
 | ||||||
|  |     def create_buffer(self, item): | ||||||
|  |         buf = Buffer(item) | ||||||
|  |         buf.bufferInput.connect(self.buffer_input) | ||||||
|  |         buf.widget.input.bufferSwitchPrev.connect(self.list_buffers.switch_prev_buffer) | ||||||
|  |         buf.widget.input.bufferSwitchNext.connect(self.list_buffers.switch_next_buffer) | ||||||
|  |         return buf | ||||||
|  | 
 | ||||||
|  |     def insert_buffer(self, index, buf): | ||||||
|  |         self.buffers.insert(index, buf) | ||||||
|  |         self.list_buffers.insertItem(index, '%d. %s' % (buf.data['number'], buf.data['full_name'])) | ||||||
|  |         self.stacked_buffers.insertWidget(index, buf.widget) | ||||||
|  | 
 | ||||||
|  |     def remove_buffer(self, index): | ||||||
|  |         if self.list_buffers.currentRow == index and index > 0: | ||||||
|  |             self.list_buffers.setCurrentRow(index - 1) | ||||||
|  |         self.list_buffers.takeItem(index) | ||||||
|  |         self.stacked_buffers.removeWidget(self.stacked_buffers.widget(index)) | ||||||
|  |         self.buffers.pop(index) | ||||||
|  | 
 | ||||||
|  |     def find_buffer_index_for_insert(self, next_buffer): | ||||||
|  |         index = -1 | ||||||
|  |         if next_buffer == '0x0': | ||||||
|  |             index = len(self.buffers) | ||||||
|  |         else: | ||||||
|  |             index = [i for i, b in enumerate(self.buffers) if b.pointer() == next_buffer] | ||||||
|  |             if index: | ||||||
|  |                 index = index[0] | ||||||
|  |         if index < 0: | ||||||
|  |             print('Warning: unable to find position for buffer, using end of list by default') | ||||||
|  |             index = len(self.buffers) | ||||||
|  |         return index | ||||||
| 
 | 
 | ||||||
|     def closeEvent(self, event): |     def closeEvent(self, event): | ||||||
|         self.network.disconnect_weechat() |         self.network.disconnect_weechat() | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Sebastien Helleu
						Sebastien Helleu