#!/usr/bin/python
# -*- coding: utf-8 -*-
#
+# qweechat.py - WeeChat remote GUI using Qt toolkit
+#
# Copyright (C) 2011-2013 Sebastien Helleu <flashcode@flashtux.org>
#
# This file is part of QWeeChat, a Qt remote GUI for WeeChat.
#
#
-# 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:
#
# start dev
#
-import sys, struct
+import sys, struct, traceback
import qt_compat
QtCore = qt_compat.import_module('QtCore')
QtGui = qt_compat.import_module('QtGui')
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()):
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')
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:]
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):
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':
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):