X-Git-Url: https://jfr.im/git/irc/weechat/qweechat.git/blobdiff_plain/b51e6ba7d737a423e1d85e91f7ec1c7a4a15d2ce..0cf8a9befc25998c944e667cc4dc463015a3d27f:/src/qweechat/qweechat.py diff --git a/src/qweechat/qweechat.py b/src/qweechat/qweechat.py index 55bd70b..e589f22 100755 --- a/src/qweechat/qweechat.py +++ b/src/qweechat/qweechat.py @@ -1,6 +1,8 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # +# qweechat.py - WeeChat remote GUI using Qt toolkit +# # Copyright (C) 2011-2013 Sebastien Helleu # # This file is part of QWeeChat, a Qt remote GUI for WeeChat. @@ -20,8 +22,7 @@ # # -# QWeeChat - WeeChat remote GUI using Qt toolkit. -# (this script requires WeeChat 0.3.7 or newer, running on local or remote host) +# This script requires WeeChat 0.3.7 or newer, running on local or remote host. # # History: # @@ -29,7 +30,7 @@ # start dev # -import sys, struct +import sys, struct, traceback import qt_compat QtCore = qt_compat.import_module('QtCore') QtGui = qt_compat.import_module('QtGui') @@ -90,12 +91,13 @@ class MainWindow(QtGui.QMainWindow): self.statusBar().visible = True # actions for menu and toolbar - actions_def = {'connect' : ['network-connect.png', 'Connect to WeeChat', 'Ctrl+O', self.open_connection_dialog], - 'disconnect' : ['network-disconnect.png', 'Disconnect from WeeChat', 'Ctrl+D', self.network.disconnect_weechat], - 'debug' : ['edit-find.png', 'Debug console window', 'Ctrl+B', self.open_debug_dialog], - 'preferences': ['preferences-other.png', 'Preferences', 'Ctrl+P', self.open_preferences_dialog], - 'about' : ['help-about.png', 'About', 'Ctrl+H', self.open_about_dialog], - 'quit' : ['application-exit.png', 'Quit application', 'Ctrl+Q', self.close], + actions_def = {'connect' : ['network-connect.png', 'Connect to WeeChat', 'Ctrl+O', self.open_connection_dialog], + 'disconnect' : ['network-disconnect.png', 'Disconnect from WeeChat', 'Ctrl+D', self.network.disconnect_weechat], + 'debug' : ['edit-find.png', 'Debug console window', 'Ctrl+B', self.open_debug_dialog], + 'preferences' : ['preferences-other.png', 'Preferences', 'Ctrl+P', self.open_preferences_dialog], + 'about' : ['help-about.png', 'About', 'Ctrl+H', self.open_about_dialog], + 'save connection': ['document-save.png', 'Save connection configuration', 'Ctrl+S', self.save_connection], + 'quit' : ['application-exit.png', 'Quit application', 'Ctrl+Q', self.close], } self.actions = {} for name, action in list(actions_def.items()): @@ -108,7 +110,7 @@ class MainWindow(QtGui.QMainWindow): self.menu = self.menuBar() menu_file = self.menu.addMenu('&File') menu_file.addActions([self.actions['connect'], self.actions['disconnect'], - self.actions['preferences'], self.actions['quit']]) + self.actions['preferences'], self.actions['save connection'], self.actions['quit']]) menu_window = self.menu.addMenu('&Window') menu_window.addAction(self.actions['debug']) menu_help = self.menu.addMenu('&Help') @@ -158,6 +160,12 @@ class MainWindow(QtGui.QMainWindow): def open_preferences_dialog(self): pass # TODO + def save_connection(self): + if self.network: + options = self.network.get_options() + for option in options.keys(): + self.config.set('relay', option, options[option]) + def debug_display(self, *args, **kwargs): self.debug_lines.append((args, kwargs)) self.debug_lines = self.debug_lines[-DEBUG_NUM_LINES:] @@ -253,7 +261,7 @@ class MainWindow(QtGui.QMainWindow): self.debug_display(0, '', 'Message: %s' % message) self.parse_message(message) except: - print("Error while decoding message from WeeChat") + print('Error while decoding message from WeeChat:\n%s' % traceback.format_exc()) self.network.disconnect_weechat() def parse_message(self, message): @@ -287,17 +295,40 @@ class MainWindow(QtGui.QMainWindow): item['prefix'], item['message']) elif message.msgid in ('_nicklist', 'nicklist'): - buffer_nicklist = {} + buffer_refresh = {} + for obj in message.objects: + if obj.objtype == 'hda' and obj.value['path'][-1] == 'nicklist_item': + group = '__root' + for item in obj.value['items']: + index = [i for i, b in enumerate(self.buffers) if b.pointer() == item['__path'][0]] + if index: + if not index[0] in buffer_refresh: + self.buffers[index[0]].nicklist = {} + buffer_refresh[index[0]] = True + if item['group']: + group = item['name'] + self.buffers[index[0]].nicklist_add_item(group, item['group'], item['prefix'], item['name'], item['visible']) + for index in buffer_refresh: + self.buffers[index].nicklist_refresh() + elif message.msgid == '_nicklist_diff': + buffer_refresh = {} for obj in message.objects: if obj.objtype == 'hda' and obj.value['path'][-1] == 'nicklist_item': + group = '__root' for item in obj.value['items']: index = [i for i, b in enumerate(self.buffers) if b.pointer() == item['__path'][0]] if index: - if not item['__path'][0] in buffer_nicklist: - self.buffers[index[0]].remove_all_nicks() - buffer_nicklist[item['__path'][0]] = True - if not item['group'] and item['visible']: - self.buffers[index[0]].add_nick(item['prefix'], item['name']) + buffer_refresh[index[0]] = True + if item['_diff'] == ord('^'): + group = item['name'] + elif item['_diff'] == ord('+'): + self.buffers[index[0]].nicklist_add_item(group, item['group'], item['prefix'], item['name'], item['visible']) + elif item['_diff'] == ord('-'): + self.buffers[index[0]].nicklist_remove_item(group, item['group'], item['name']) + elif item['_diff'] == ord('*'): + self.buffers[index[0]].nicklist_update_item(group, item['group'], item['prefix'], item['name'], item['visible']) + for index in buffer_refresh: + self.buffers[index].nicklist_refresh() elif message.msgid == '_buffer_opened': for obj in message.objects: if obj.objtype == 'hda' and obj.value['path'][-1] == 'buffer': @@ -345,7 +376,7 @@ class MainWindow(QtGui.QMainWindow): 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.list_buffers.insertItem(index, '%d. %s' % (buf.data['number'], buf.data['full_name'].decode('utf-8'))) self.stacked_buffers.insertWidget(index, buf.widget) def remove_buffer(self, index):