diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5166ef7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.pyc +.project +.pydevproject +.settings + diff --git a/pytalk/BuddyItem.py b/pytalk/BuddyItem.py index 0030057..33c7769 100644 --- a/pytalk/BuddyItem.py +++ b/pytalk/BuddyItem.py @@ -8,71 +8,73 @@ from jabber import STATUS_IMAGE class BuddyItem(QTreeWidgetItem): - """ - BuddyItem implements the view of a Buddy from the Roster - """ + """ + BuddyItem implements the view of a Buddy from the Roster + """ - dialog = None - msg = None + dialog = None + msg = None - def __init__(self, parent, jid, con): - QTreeWidgetItem.__init__(self, parent, [jid], QTreeWidgetItem.UserType+1) + def __init__(self, parent, jid, con): + QTreeWidgetItem.__init__(self, parent, [jid], QTreeWidgetItem.UserType+1) - # QTreeWidgetItem configuration - self.setFlags(Qt.ItemIsDragEnabled | Qt.ItemIsEnabled) # we can move a contact - self.parent = parent - self.jid = jid - self.name = jid - self.setStatus(STATUS.unavailable) - self.connectionThread = con - - def setStatus(self, status): - self.status = status - if self.status.index not in range(6): - self.status = STATUS.unavailable - settings = QSettings("Trunat", "PyTalk") - settings.beginGroup("preferences") - repStatus = settings.value("images_status", QVariant("images/status/")).toString() - fileStatus = settings.value(str(self.status), QVariant(STATUS_IMAGE[self.status.index])).toString() - settings.endGroup() - self.setIcon(0, QIcon(repStatus+fileStatus)) + # QTreeWidgetItem configuration + self.setFlags(Qt.ItemIsDragEnabled | Qt.ItemIsEnabled) # we can move a contact + self.parent = parent + self.jid = jid + self.name = jid + self.setStatus(STATUS.unavailable) + self.connectionThread = con + + def setStatus(self, status): + self.status = status + if self.status not in range(6): + self.status = STATUS.unavailable + settings = QSettings("Trunat", "PyTalk") + settings.beginGroup("preferences") + repStatus = settings.value("images_status", QVariant("images/status/")).toString() + fileStatus = settings.value(str(self.status), QVariant(STATUS_IMAGE[self.status])).toString() + settings.endGroup() + self.setIcon(0, QIcon(repStatus+fileStatus)) - def setName(self, name): - if name: - self.name = name - self.setText(0, name) + def setName(self, name): + if name: + self.name = name + self.setText(0, name) - def status(self): - return status + def DEAstatus(self): + return status - def isAway(self): - return (self.status == STATUS.away or self.status == STATUS.xa) + def isAway(self): + return (self.status == STATUS.away or self.status == STATUS.xa) - def isOffline(self): - if self.status == STATUS.unavailable: - return True - else: - return False + def isOffline(self): + if self.status == STATUS.unavailable: + return True + else: + return False - def createDialog(self): - if not self.dialog: - self.dialog = QDialog() - self.dialog.setWindowIcon(QIcon("images/mail.png")) + def createDialog(self): + if not self.dialog: + self.dialog = QDialog() + self.dialog.setWindowIcon(QIcon("images/mail.png")) - self.msg = MessageBox(self.dialog, self.connectionThread, self.jid, self.name) - layout = QVBoxLayout(self.dialog) - layout.addWidget(self.msg) - self.dialog.setLayout(layout) - self.dialog.setWindowTitle(self.dialog.tr("Chat with ") + self.name) - self.dialog.show() - self.dialog.raise_() + self.msg = MessageBox(self.dialog, self.connectionThread, self.jid, self.name) + layout = QVBoxLayout(self.dialog) + layout.addWidget(self.msg) + self.dialog.setLayout(layout) + self.dialog.setWindowTitle(self.dialog.tr("Chat with ") + self.name) + self.dialog.show() + self.dialog.raise_() - def receiveMessage(self, event): - self.createDialog() - self.msg.receiveMessage(event) + def receiveMessage(self, event): + print "recieveMessage" + self.createDialog() + self.msg.receiveMessage(event) - def sendMessage(self): - self.createDialog() + def sendMessage(self): + print "sendMessage" + self.createDialog() - def __str__(self): - return u'%s' % self.name + def __str__(self): + return u'%s' % self.name diff --git a/pytalk/BuddyList.py b/pytalk/BuddyList.py index 43b39e6..a43f0ea 100644 --- a/pytalk/BuddyList.py +++ b/pytalk/BuddyList.py @@ -11,6 +11,7 @@ class BuddyList(QTreeWidget): def __init__(self, parent): QTreeWidget.__init__(self, parent) + self.connection = None # QTreeWidgetItem configuration self.header().hide() @@ -33,17 +34,17 @@ def __init__(self, parent): def setConnection(self, con): self.connection = con - def addItem(self, jid): + def add_item(self, jid): if self.connection: group = self.connection.getGroups(jid)[0] - self.addGroup(group) + self.add_group(group) if jid not in self.buddies.keys(): self.buddies[jid] = BuddyItem(self.groups[group],jid, self.connection) self.buddies[jid].setName(self.connection.getName(jid)) self.groups[group].addChild(self.buddies[jid]) self.tree[group][jid] = self.buddies[jid] - def addGroup(self, group): + def add_group(self, group): if group: if group not in self.groups.keys(): self.groups[group] = BuddyGroup(group) diff --git a/pytalk/ConnectionDialog.py b/pytalk/ConnectionDialog.py index ae7c9d7..da20483 100644 --- a/pytalk/ConnectionDialog.py +++ b/pytalk/ConnectionDialog.py @@ -2,7 +2,8 @@ from PyQt4.QtCore import QSettings, QVariant, SIGNAL from ui.ui_ConnectionDialog import Ui_ConnectionDialog -class ConnectionDialog(QDialog, Ui_ConnectionDialog): + +class DEADConnectionDialog(QDialog, Ui_ConnectionDialog): def __init__(self, parent): QDialog.__init__(self, parent) self.setupUi(self) diff --git a/pytalk/ConnectorThread.py b/pytalk/ConnectorThread.py index 3fa4e2f..0922e97 100644 --- a/pytalk/ConnectorThread.py +++ b/pytalk/ConnectorThread.py @@ -1,207 +1,212 @@ +# -*- coding: utf-8 -*- + +import xmpp import time -import xmpp import sys import settings import platform from PyQt4.QtCore import QSettings, QVariant, QThread, SIGNAL from PyQt4.QtGui import QMessageBox -from jabber import STATUS +from jabber import STATUS, STATUS_TEXT class ConnectorThread(QThread): - """ - ConnectorThread is the class which manage the connection between the - Jabber server and the PyTalk client. - """ - - def __init__(self, status): - "We initialise a new Thread and create the connection with the Jabber Server" - QThread.__init__(self) - self.status = status - - def run(self): - "We are running the thread and are reading and sending informations to the Jabber server" - - if self.connect(): - self.Terminated = False - self.emit(SIGNAL("connected()")) - else: - self.Terminated = True - - while not self.Terminated: - self.jabber.Process(1) - time.sleep(2.0) - sys.stderr.write('Thread correctly stopped'+unicode(self.Terminated)+'\n\n') - - def connect(self): - settings = QSettings("Trunat", "PyTalk") - settings.beginGroup("Connection") - - self.userID = settings.value("userID").toString().__str__() - self.password = settings.value("password").toString().__str__() - self.server = settings.value("server").toString().__str__() - self.useSSL = settings.value("useSSL", QVariant(True)).toBool() - - if self.useSSL: - self.port = settings.value("port", QVariant("5223")).toInt() - else: - self.port = settings.value("port", QVariant("5222")).toInt() - - self.port = int(self.port[0]) - - self.ressource = settings.value("ressource", QVariant("PyTalk")).toString().__str__() - - settings.endGroup() - - self.jid = xmpp.protocol.JID(self.userID.__str__()) - self.jabber = xmpp.Client(self.jid.getDomain(), debug=[]) - - if self.server: - server = (self.server, self.port) - else: - server = None - connection = self.jabber.connect(server) - - if not connection: - self.emit(SIGNAL("error"), self.tr("Connection Error"), self.tr("Could not connect")) - return False - sys.stderr.write('Connected with %s\n' % connection) - - auth = self.jabber.auth(self.jid.getNode(), self.password, self.ressource) - if not auth: - self.emit(SIGNAL("error"), self.tr("Authentication Error"), self.tr("Could not authenticate")) - return False - sys.stderr.write('Authenticate using %s\n' % auth) - - self.register_handlers() - self.jabber.sendInitPresence(requestRoster=1) - - return connection - - def disconnect(self): - "We stop to speak with the server and disconnect from it" - self.Terminated = True - if self.jabber.isConnected(): - self.jabber.disconnect() - - def register_handlers(self): - self.jabber.RegisterHandler('message', self.xmpp_message) - self.jabber.RegisterHandler("iq", self.handle_version, typ = "get", ns = xmpp.NS_VERSION) - self.jabber.RegisterHandler("iq", self.handle_disco_info, typ = "get", ns = xmpp.NS_DISCO_INFO) - self.jabber.RegisterHandler("iq", self.rosterChange, typ = "set", ns = xmpp.NS_ROSTER) - self.jabber.RegisterHandler("presence", self.subscriptionRequest, typ = "subscribe") - self.jabber.RegisterHandler("presence", self.addBuddy, typ = "suscribed") - self.jabber.RegisterHandler("presence", self.presence) - self.jabber.RegisterHandler("iq", self.request) - self.jabber.RegisterDisconnectHandler(lambda: self.emit(SIGNAL("connect()"))) - - def request(self, con, packet): - self.emit(SIGNAL("debug"), unicode(packet)+"\n\n") - - def xmpp_message(self, con, event): - self.emit(SIGNAL("debug"), unicode(event)+"\n\n") - type = event.getType() - if type: - if type in ['message', 'chat']: - message = event.getBody() - if message: - self.emit(SIGNAL("message"), event) - - def send_message(self, tojid, message): - m = xmpp.protocol.Message(to=tojid, body=message, typ='chat') - - self.emit(SIGNAL("debug"), unicode(m)+"\n\n") - self.jabber.send(m) - - def changeStatus(self, showId, status): - """Send a presence packet""" - p = xmpp.protocol.Presence() - p.setShow(STATUS[showId]) - if status: - p.setStatus(status) - if showId == STATUS.available: - p.setPriority(5) - self.jabber.send(p) - self.emit(SIGNAL("debug"), unicode(p)+"\n\n") - - def handle_version(self, con, iq): - """Respond to a version info request.""" - self.emit(SIGNAL("debug"), unicode(iq)+"\n") - reply = iq.buildReply('result') - #add and in accordance with XEP-0092 - reply.T.query.addChild(name="name", payload=settings.APPNAME) - reply.T.query.addChild(name="version", payload=settings.VERSION) - if platform.mac_ver()[0]: - plateforme = "Mac OS %s" % platform.mac_ver()[0] - elif platform.win32_ver()[0]: - plateforme = "Windows %s" % platform.win32_ver()[0] - else: - plateforme = "%s %s" % (platform.uname()[0], platform.uname()[2]) - reply.T.query.addChild(name="os", payload=plateforme) - - self.emit(SIGNAL("debug"), unicode(reply)+"\n") - self.jabber.send(reply) - - def handle_disco_info(self, con, iq): - self.emit(SIGNAL("debug"), unicode(iq)+"\n") - reply = iq.buildReply('result') - reply.T.query.addChild(name="feature", attrs={'var':'jabber:iq:version'}) - self.emit(SIGNAL("debug"), unicode(reply)+"\n") - self.jabber.send(reply) - - def getRoster(self): - self.roster = self.jabber.getRoster() - return self.roster.getItems() - - - def getGroups(self, jid): - if self.roster.getGroups(jid): - return self.roster.getGroups(jid) - else: - return ['Buddies'] - - def getName(self, jid): - return self.roster.getName(jid) - - def getStatus(self, jid): - pass - - def presence(self, con, presence): - # Somebody change his presence - # Usefull Informations : - # - typ is unavailable -> Contact gone offline - self.emit(SIGNAL("debug"), unicode(presence)+"\n") - jid = presence.getFrom().getStripped() - if presence.getType() == "unavailable": - self.emit(SIGNAL("presence"), jid, unicode(STATUS.unavailable)) - if not presence.getType(): - if not presence.getShow(): - self.emit(SIGNAL("presence"), jid, STATUS.available, presence.getStatus()) - else: - status = presence.getShow() - if status == "chat": - stat = STATUS.chat - elif status == "dnd": - stat = STATUS.dnd - elif status == "away": - stat= STATUS.away - elif status == "xa": - stat = STATUS.xa - else: - stat = STATUS.available - self.emit(SIGNAL("presence"), jid, stat, presence.getStatus()) - - - def subscriptionRequest(self, con, presence): - self.emit(SIGNAL("debug"), unicode(presence)+"\n") - self.emit(SIGNAL("subscriptionRequest"), presence) - - def addBuddy(self, con, presence): - self.emit(SIGNAL("debug"), unicode(presence)+"\n") - self.emit(SIGNAL("addBuddy"), presence) - - def rosterChange(self, con, iq): - self.emit(SIGNAL("rosterChange"), iq) - - def isConnected(self): - return self.jabber.isConnected() + """ + ConnectorThread is the class which manage the connection between the + Jabber server and the PyTalk client. + """ + + def __init__(self, status, debug=True): + "We initialise a new Thread and create the connection with the Jabber Server" + QThread.__init__(self) + + self.status = status + self.debug = debug + + def run(self): + "We are running the thread and are reading and sending informations to the Jabber server" + print "run" + if self.connect(): + self.Terminated = False + self.emit(SIGNAL("connected()")) + else: + self.Terminated = True + + while not self.Terminated: + self.jabber.Process(1) + time.sleep(2.0) + sys.stderr.write('Thread correctly stopped'+unicode(self.Terminated)+'\n\n') + + def connect(self): + settings = QSettings("Trunat", "PyTalk") + settings.beginGroup("Connection") + + self.userID = settings.value("userID").toString().__str__() + self.password = settings.value("password").toString().__str__() + self.server = settings.value("server").toString().__str__() + self.useSSL = settings.value("useSSL", QVariant(True)).toBool() + + if self.useSSL: + self.port = settings.value("port", QVariant("5223")).toInt() + else: + self.port = settings.value("port", QVariant("5222")).toInt() + + self.port = int(self.port[0]) + + self.ressource = settings.value("ressource", QVariant("PyTalk")).toString().__str__() + + settings.endGroup() + + self.jid = xmpp.protocol.JID(self.userID.__str__()) + self.jabber = xmpp.Client(self.jid.getDomain(), debug=[]) + + if self.server: + server = (self.server, self.port) + else: + server = None + connection = self.jabber.connect(server) + + if not connection: + self.emit(SIGNAL("error"), self.tr("Connection Error"), self.tr("Could not connect")) + return False + sys.stderr.write('Connected with %s\n' % connection) + + auth = self.jabber.auth(self.jid.getNode(), self.password, self.ressource) + if not auth: + self.emit(SIGNAL("error"), self.tr("Authentication Error"), self.tr("Could not authenticate")) + return False + sys.stderr.write('Authenticate using %s\n' % auth) + + self.register_handlers() + self.jabber.sendInitPresence(requestRoster=1) + + return connection + + def disconnect(self): + "We stop to speak with the server and disconnect from it" + self.Terminated = True + if self.jabber.isConnected(): + self.jabber.disconnect() + + def register_handlers(self): + self.jabber.RegisterHandler('message', self.xmpp_message) + self.jabber.RegisterHandler("iq", self.handle_version, typ = "get", ns = xmpp.NS_VERSION) + self.jabber.RegisterHandler("iq", self.handle_disco_info, typ = "get", ns = xmpp.NS_DISCO_INFO) + self.jabber.RegisterHandler("iq", self.rosterChange, typ = "set", ns = xmpp.NS_ROSTER) + self.jabber.RegisterHandler("presence", self.subscriptionRequest, typ = "subscribe") + self.jabber.RegisterHandler("presence", self.addBuddy, typ = "suscribed") + self.jabber.RegisterHandler("presence", self.presence) + self.jabber.RegisterHandler("iq", self.request) + self.jabber.RegisterDisconnectHandler(lambda: self.emit(SIGNAL("connect()"))) + + def request(self, con, packet): + self.emit(SIGNAL("debug"), unicode(packet)+"\n\n") + + def xmpp_message(self, con, event): + self.emit(SIGNAL("debug"), unicode(event)+"\n\n") + type = event.getType() + if type: + if type in ['message', 'chat']: + message = event.getBody() + if message: + self.emit(SIGNAL("message"), event) + + def send_message(self, tojid, message): + m = xmpp.protocol.Message(to=tojid, body=message, typ='chat') + + self.emit(SIGNAL("debug"), unicode(m)+"\n\n") + self.jabber.send(m) + + def set_status(self, showId, status): + """Send a presence packet""" + print "change_status", showId, status + p = xmpp.protocol.Presence() + p.setShow(STATUS_TEXT[showId]) + if status: + p.setStatus(status) + if showId == STATUS.available: + p.setPriority(5) + self.jabber.send(p) + self.emit(SIGNAL("debug"), unicode(p)+"\n\n") + + def handle_version(self, con, iq): + """Respond to a version info request.""" + self.emit(SIGNAL("debug"), unicode(iq)+"\n") + reply = iq.buildReply('result') + #add and in accordance with XEP-0092 + reply.T.query.addChild(name="name", payload=settings.APPNAME) + reply.T.query.addChild(name="version", payload=settings.VERSION) + if platform.mac_ver()[0]: + plateforme = "Mac OS %s" % platform.mac_ver()[0] + elif platform.win32_ver()[0]: + plateforme = "Windows %s" % platform.win32_ver()[0] + else: + plateforme = "%s %s" % (platform.uname()[0], platform.uname()[2]) + reply.T.query.addChild(name="os", payload=plateforme) + + self.emit(SIGNAL("debug"), unicode(reply)+"\n") + self.jabber.send(reply) + + def handle_disco_info(self, con, iq): + self.emit(SIGNAL("debug"), unicode(iq)+"\n") + reply = iq.buildReply('result') + reply.T.query.addChild(name="feature", attrs={'var':'jabber:iq:version'}) + self.emit(SIGNAL("debug"), unicode(reply)+"\n") + self.jabber.send(reply) + + def getRoster(self): + self.roster = self.jabber.getRoster() + return self.roster.getItems() + + + def getGroups(self, jid): + if self.roster.getGroups(jid): + return self.roster.getGroups(jid) + else: + return ['Buddies'] + + def getName(self, jid): + return self.roster.getName(jid) + + def getStatus(self, jid): + pass + + def presence(self, con, presence): + # Somebody change his presence + # Usefull Informations : + # - typ is unavailable -> Contact gone offline + self.emit(SIGNAL("debug"), unicode(presence)+"\n") + jid = presence.getFrom().getStripped() + if presence.getType() == "unavailable": + self.emit(SIGNAL("presence"), jid, unicode(STATUS.unavailable)) + if not presence.getType(): + if not presence.getShow(): + self.emit(SIGNAL("presence"), jid, STATUS.available, presence.getStatus()) + else: + status = presence.getShow() + if status == "chat": + stat = STATUS.chat + elif status == "dnd": + stat = STATUS.dnd + elif status == "away": + stat= STATUS.away + elif status == "xa": + stat = STATUS.xa + else: + stat = STATUS.available + self.emit(SIGNAL("presence"), jid, stat, presence.getStatus()) + + + def subscriptionRequest(self, con, presence): + self.emit(SIGNAL("debug"), unicode(presence)+"\n") + self.emit(SIGNAL("subscriptionRequest"), presence) + + def addBuddy(self, con, presence): + self.emit(SIGNAL("debug"), unicode(presence)+"\n") + self.emit(SIGNAL("addBuddy"), presence) + + def rosterChange(self, con, iq): + self.emit(SIGNAL("rosterChange"), iq) + + def isConnected(self): + return self.jabber.isConnected() diff --git a/pytalk/__init__.py b/pytalk/__init__.py index e69de29..7fd094c 100644 --- a/pytalk/__init__.py +++ b/pytalk/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- + +import os, sys +PROJECT_ROOT = os.path.abspath( os.path.dirname( __file__ ) + '/../' ) + + +print "===DDDDDd=====", PROJECT_ROOT \ No newline at end of file diff --git a/pytalk/jabber.py b/pytalk/jabber.py index 05b6172..0d3644f 100644 --- a/pytalk/jabber.py +++ b/pytalk/jabber.py @@ -3,8 +3,18 @@ from enum import Enum def tr(string): - return QApplication.translate("Status", string, None, QApplication.UnicodeUTF8) + return QApplication.translate("Status", string, None, QApplication.UnicodeUTF8) -STATUS = Enum('available', 'chat', 'dnd', 'away', 'xa', 'unavailable', 'invisible') +class STATUS: + available = 0 + chat = 1 + dnd = 2 + away = 3 + xa = 4 + unavailable = 5 + invisible = 6 + +DEADSTATUS = Enum('available', 'chat', 'dnd', 'away', 'xa', 'unavailable', 'invisible') +STATUS_TEXT = ['available', 'chat', 'dnd', 'away', 'xa', 'unavailable', 'invisible'] DISPLAY_STATUS = (tr('Available'), tr('Chat'), tr('Do not Disturb'), tr('Away'), tr('Unavailable'), tr('Offline'), tr('Invisible')) STATUS_IMAGE = ('available.png', 'chat.png', 'busy.png', 'away.png', 'extended-away.png', 'offline.png', 'offline.png') diff --git a/pytalk/pytalk.py b/pytalk/pytalk.py old mode 100644 new mode 100755 index 7e8c998..48c461d --- a/pytalk/pytalk.py +++ b/pytalk/pytalk.py @@ -1,12 +1,35 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -import sys, datetime + +import sys, os +ROOT = os.path.abspath( os.path.dirname( __file__ ) + '/../' ) +""" +print "===========", project_path +if not project_path in sys.path: + sys.path.append(project_path) +""" +import settings + +inc_paths = ["enum-0.4.3", "pydns-2.3.1", "xmpppy-CVS20080120"] + +for ip in inc_paths: + p = ROOT + "/deps/" + ip + print p + if not p in sys.path: + sys.path.insert(0, p) + + + +import datetime + from PyQt4.QtGui import * -from PyQt4.QtCore import SIGNAL, SLOT, Qt, QSize -from ui.ui_mainwindow import Ui_MainWindow +from PyQt4.QtCore import SIGNAL, SLOT, Qt, QSize, QTimer + +from ui.MainWindow import MainWindow +from ui.ConnectionDialog import ConnectionDialog from AboutDialog import AboutDialog -from ConnectionDialog import ConnectionDialog + from ConnectorThread import ConnectorThread from MessageBox import MessageBox from BuddyList import BuddyList @@ -16,169 +39,184 @@ from jabber import STATUS -class MainWindow(QMainWindow, Ui_MainWindow): - connectorThread = None - - def __init__(self, parent = None): - - QMainWindow.__init__(self, parent) - self.setupUi(self) - - self.console = QDialog() - self.te = QTextEdit(self.console) - self.te.setReadOnly(True) - vl = QVBoxLayout() - vl.addWidget(self.te) - self.console.setLayout(vl) - - # Set status Offline - self.statusBox.setCurrentIndex(5) - self.statusEdit.hide() - - # Set connect - self.connect(self.statusBox, SIGNAL("currentIndexChanged(int)"), self.changeStatus) - self.connect(self.statusEdit, SIGNAL("returnPressed()"), self.changeStatus) - - # Set BuddyList - self.BuddyList = BuddyList(self) - self.vboxlayout.insertWidget(0, self.BuddyList) - self.connect(self.BuddyList, SIGNAL("rename"), self.addBuddy) - - # Connection - connection = ConnectionDialog(self) - self.connect(self.actionConnection, SIGNAL("triggered()"), connection, SLOT("exec()")) - self.connect(self.actionDeconnection, SIGNAL("triggered()"), self.disconnect) - self.connect(connection, SIGNAL("configured()"), self.connection) - - # Contacts - self.connect(self.actionAdd_a_buddy, SIGNAL("triggered()"), self.addBuddy) - self.connect(self.actionAdd_a_group, SIGNAL("triggered()"), self.addGroup) - - # View - self.connect(self.actionAway_buddies, SIGNAL("toogled()"), self.setAway) - self.connect(self.actionOffline_buddies, SIGNAL("toogled()"), self.setOffline) - self.connect(self.actionAway_buddies, SIGNAL("triggered()"), self.setAway) - self.connect(self.actionOffline_buddies, SIGNAL("triggered()"), self.setOffline) - - # Tools - self.connect(self.actionConsole, SIGNAL("triggered()"), self.swapConsole) - - # About Dialog - about = AboutDialog(self) - self.connect(self.actionAbout, SIGNAL("triggered()"), about, SLOT("exec()")) - self.connect(self.actionAboutQt, SIGNAL("triggered()"), QApplication.instance(), SLOT("aboutQt()")) - - # Quit Signal connection - self.connect(self.actionQuit, SIGNAL("triggered()"), self.quit) - - def connection(self, status=STATUS.available): - if not self.connectorThread: - self.connectorThread = ConnectorThread(status) - self.connectorThread.start() - self.connect(self.connectorThread, SIGNAL("message"), self.BuddyList.message) - self.connect(self.connectorThread, SIGNAL("error"), self.error) - self.connect(self.connectorThread, SIGNAL("connected()"), self.connected) - self.connect(self.connectorThread, SIGNAL("disconnected()"), self.disconnect) - self.connect(self.connectorThread, SIGNAL("presence"), self.BuddyList.presence) - self.connect(self.connectorThread, SIGNAL("debug"), self.debug) - self.connect(self.connectorThread, SIGNAL("subscriptionRequest"), self.subscriptionRequest) - self.connect(self.connectorThread, SIGNAL("addBuddy"), self.addBuddy) - elif self.connectorThread.isConnected(): - self.connectorThread.changeStatus(status, self.statusEdit.text()) - self.statusEdit.clearFocus() - - def disconnect(self): - self.actionConnection.setEnabled(True) - self.actionDeconnection.setEnabled(False) - self.statusEdit.hide() - self.statusBox.setCurrentIndex(STATUS.unavailable.index) - if self.connectorThread: - self.connectorThread.disconnect() - self.connectorThread = None - self.BuddyList.clear() - QApplication.instance().quit() - - - def connected(self): - self.actionConnection.setEnabled(False) - self.actionDeconnection.setEnabled(True) - if self.statusBox.currentIndex() == STATUS.unavailable.index: - self.statusBox.setCurrentIndex(STATUS.available.index) - else: - self.connectorThread.changeStatus(self.statusBox.currentIndex(), self.statusEdit.text()) - self.statusEdit.show() - self.statusEdit.setFocus() - self.BuddyList.setConnection(self.connectorThread) - self.getRoster() - self.setAway() - self.setOffline() - - def error(self, title, content): - QMessageBox.critical(self, title, content, QMessageBox.Ok) - - def closeEvent(self, event): - self.quit() - - def quit(self): - self.disconnect() - - def changeStatus(self, index=-1): - if index == -1: - index = self.statusBox.currentIndex() - if index == STATUS.unavailable.index: - self.statusEdit.hide() - self.disconnect() - else: - self.connection(index) - - def getRoster(self): - roster = self.connectorThread.getRoster() - for buddy in roster: - self.BuddyList.addItem(buddy) - self.connect(self.BuddyList, SIGNAL("itemDoubleClicked(QTreeWidgetItem *,int)"), self.sendMessage) - - def sendMessage(self, item, col): - if item and item.type() == QTreeWidgetItem.UserType+1: - item.sendMessage() - - def setAway(self, checked=-1): - if checked == -1: - checked = self.actionAway_buddies.isChecked() - self.BuddyList.setAway(not checked) - - def setOffline(self, checked=-1): - if checked == -1: - checked = self.actionOffline_buddies.isChecked() - self.BuddyList.setOffline(not checked) - - def subscriptionRequest(self, presence): - request = RosterRequest(self, self.connectorThread.jabber, presence) - request.show() - - def debug(self, message): - self.te.append(datetime.datetime.now().strftime("[%H:%M:%S]")+" : \n"+message) - - def swapConsole(self): - self.console.setWindowTitle("XML Console") - self.console.resize(QSize(1024, 500)) - self.console.show() - self.console.raise_() - - def addBuddy(self, item=None): - if self.connectorThread: - if item: - jid = item.jid - else: - jid = "" - newBuddy = AddBuddyDialog(self, self.connectorThread.jabber, self.BuddyList.groups.keys(), jid) - newBuddy.show() - - def addGroup(self): - newGroup = AddGroupDialog(self, self.BuddyList) - newGroup.show() + + +class DEDMainWindow(QMainWindow):# Ui_MainWindow): + connectorThread = None + + def __init__(self, parent = None): + + QMainWindow.__init__(self, parent) + self.setupUi(self) + + self.console = QDialog() + self.te = QTextEdit(self.console) + self.te.setReadOnly(True) + vl = QVBoxLayout() + vl.addWidget(self.te) + self.console.setLayout(vl) + + # Set status Offline + self.statusBox.setCurrentIndex(5) + self.statusEdit.hide() + + # Set connect + self.connect(self.statusBox, SIGNAL("currentIndexChanged(int)"), self.changeStatus) + self.connect(self.statusEdit, SIGNAL("returnPressed()"), self.changeStatus) + + # Set BuddyList + self.BuddyList = BuddyList(self) + self.vboxlayout.insertWidget(0, self.BuddyList) + self.connect(self.BuddyList, SIGNAL("rename"), self.addBuddy) + + # Connection + """ + connection = ConnectionDialog(self) + self.connect(self.actionConnection, SIGNAL("triggered()"), connection, SLOT("exec()")) + self.connect(self.actionDeconnection, SIGNAL("triggered()"), self.disconnect) + self.connect(connection, SIGNAL("configured()"), self.on_connection) + """ + # Contacts + self.connect(self.actionAdd_a_buddy, SIGNAL("triggered()"), self.addBuddy) + self.connect(self.actionAdd_a_group, SIGNAL("triggered()"), self.addGroup) + + # View + self.connect(self.actionAway_buddies, SIGNAL("toogled()"), self.setAway) + self.connect(self.actionOffline_buddies, SIGNAL("toogled()"), self.setOffline) + self.connect(self.actionAway_buddies, SIGNAL("triggered()"), self.setAway) + self.connect(self.actionOffline_buddies, SIGNAL("triggered()"), self.setOffline) + + # Tools + self.connect(self.actionConsole, SIGNAL("triggered()"), self.swapConsole) + + # About Dialog + about = AboutDialog(self) + self.connect(self.actionAbout, SIGNAL("triggered()"), about, SLOT("exec()")) + self.connect(self.actionAboutQt, SIGNAL("triggered()"), QApplication.instance(), SLOT("aboutQt()")) + + # Quit Signal connection + self.connect(self.actionQuit, SIGNAL("triggered()"), self.quit) + + QTimer.singleShot(500, self.show_connection_dialog) + + def show_connection_dialog(self): + d = ConnectionDialog(self) + d.exec_() + + + def on_connection(self, status=STATUS.available): + if not self.connectorThread: + self.connectorThread = ConnectorThread(status) + self.connectorThread.start() + self.connect(self.connectorThread, SIGNAL("message"), self.BuddyList.message) + self.connect(self.connectorThread, SIGNAL("error"), self.error) + self.connect(self.connectorThread, SIGNAL("connected()"), self.connected) + self.connect(self.connectorThread, SIGNAL("disconnected()"), self.disconnect) + self.connect(self.connectorThread, SIGNAL("presence"), self.BuddyList.presence) + self.connect(self.connectorThread, SIGNAL("debug"), self.debug) + self.connect(self.connectorThread, SIGNAL("subscriptionRequest"), self.subscriptionRequest) + self.connect(self.connectorThread, SIGNAL("addBuddy"), self.addBuddy) + elif self.connectorThread.isConnected(): + self.connectorThread.changeStatus(status, self.statusEdit.text()) + self.statusEdit.clearFocus() + + def disconnect(self): + self.actionConnection.setEnabled(True) + self.actionDeconnection.setEnabled(False) + self.statusEdit.hide() + self.statusBox.setCurrentIndex(STATUS.unavailable.index) + if self.connectorThread: + self.connectorThread.disconnect() + self.connectorThread = None + self.BuddyList.clear() + QApplication.instance().quit() + + + def connected(self): + self.actionConnection.setEnabled(False) + self.actionDeconnection.setEnabled(True) + if self.statusBox.currentIndex() == STATUS.unavailable.index: + self.statusBox.setCurrentIndex(STATUS.available.index) + else: + self.connectorThread.changeStatus(self.statusBox.currentIndex(), self.statusEdit.text()) + self.statusEdit.show() + self.statusEdit.setFocus() + self.BuddyList.setConnection(self.connectorThread) + self.getRoster() + self.setAway() + self.setOffline() + + def error(self, title, content): + QMessageBox.critical(self, title, content, QMessageBox.Ok) + + def closeEvent(self, event): + self.quit() + + def quit(self): + self.disconnect() + sys.exit(0) + + def on_change_status(self, index=-1): + if index == -1: + index = self.statusBox.currentIndex() + if index == STATUS.unavailable.index: + self.statusEdit.hide() + self.disconnect() + else: + self.connection(index) + + def getRoster(self): + roster = self.connectorThread.getRoster() + for buddy in roster: + self.BuddyList.addItem(buddy) + self.connect(self.BuddyList, SIGNAL("itemDoubleClicked(QTreeWidgetItem *,int)"), self.sendMessage) + + def sendMessage(self, item, col): + if item and item.type() == QTreeWidgetItem.UserType+1: + item.sendMessage() + + def setAway(self, checked=-1): + if checked == -1: + checked = self.actionAway_buddies.isChecked() + self.BuddyList.setAway(not checked) + + def setOffline(self, checked=-1): + if checked == -1: + checked = self.actionOffline_buddies.isChecked() + self.BuddyList.setOffline(not checked) + + def subscriptionRequest(self, presence): + request = RosterRequest(self, self.connectorThread.jabber, presence) + request.show() + + def debug(self, message): + self.te.append(datetime.datetime.now().strftime("[%H:%M:%S]")+" : \n"+message) + + def swapConsole(self): + self.console.setWindowTitle("XML Console") + self.console.resize(QSize(1024, 500)) + self.console.show() + self.console.raise_() + + def addBuddy(self, item=None): + if self.connectorThread: + if item: + jid = item.jid + else: + jid = "" + newBuddy = AddBuddyDialog(self, self.connectorThread.jabber, self.BuddyList.groups.keys(), jid) + newBuddy.show() + + def addGroup(self): + newGroup = AddGroupDialog(self, self.BuddyList) + newGroup.show() if __name__ == "__main__": - app = QApplication(sys.argv) - window = MainWindow() - window.show() - sys.exit(app.exec_()) + app = QApplication(sys.argv) + app.setOrganizationName( "GSTL" ); + app.setOrganizationDomain( "pytalk.trunat.fr" ); + app.setApplicationName( settings.APPNAME ); + app.setApplicationVersion( settings.VERSION ); + window = MainWindow() + window.show() + sys.exit(app.exec_()) diff --git a/pytalk/ui/ConnectionDialog.py b/pytalk/ui/ConnectionDialog.py new file mode 100644 index 0000000..43fd49d --- /dev/null +++ b/pytalk/ui/ConnectionDialog.py @@ -0,0 +1,135 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'ui_ConnectionDialog.ui' +# +# Created: Sun Jan 20 13:55:46 2008 +# by: PyQt4 UI code generator 4.3.1 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui +from PyQt4.QtCore import SIGNAL, SLOT + +class ConnectionDialog(QtGui.QDialog): + + def __init__(self, parent=None): + QtGui.QDialog.__init__(self) + + #self.setObjectName("ConnectionDialog") + #ConnectionDialog.resize(QtCore.QSize(QtCore.QRect(0,0,289,277).size()).expandedTo(ConnectionDialog.minimumSizeHint())) + + self.vboxlayout = QtGui.QVBoxLayout(self) + self.groupBox = QtGui.QGroupBox() + + self.gridlayout = QtGui.QGridLayout(self.groupBox) + + self.label = QtGui.QLabel(self.groupBox) + self.gridlayout.addWidget(self.label,0,0,1,1) + + self.userID = QtGui.QLineEdit(self.groupBox) + self.userID.setObjectName("userID") + self.gridlayout.addWidget(self.userID,0,1,1,1) + + self.label_2 = QtGui.QLabel(self.groupBox) + self.label_2.setObjectName("label_2") + self.gridlayout.addWidget(self.label_2,1,0,1,1) + + self.password = QtGui.QLineEdit(self.groupBox) + self.password.setEchoMode(QtGui.QLineEdit.Password) + self.password.setObjectName("password") + self.gridlayout.addWidget(self.password,1,1,1,1) + self.vboxlayout.addWidget(self.groupBox) + + self.groupBox_2 = QtGui.QGroupBox() + self.groupBox_2.setObjectName("groupBox_2") + + self.gridlayout1 = QtGui.QGridLayout(self.groupBox_2) + self.gridlayout1.setObjectName("gridlayout1") + + self.label_3 = QtGui.QLabel(self.groupBox_2) + self.label_3.setObjectName("label_3") + self.gridlayout1.addWidget(self.label_3,0,0,1,1) + + self.server = QtGui.QLineEdit(self.groupBox_2) + self.server.setObjectName("server") + self.gridlayout1.addWidget(self.server,0,1,1,2) + + self.label_4 = QtGui.QLabel(self.groupBox_2) + self.label_4.setObjectName("label_4") + self.gridlayout1.addWidget(self.label_4,1,0,1,1) + + self.port = QtGui.QLineEdit(self.groupBox_2) + self.port.setObjectName("port") + self.gridlayout1.addWidget(self.port,1,1,1,1) + + self.label_5 = QtGui.QLabel(self.groupBox_2) + self.label_5.setObjectName("label_5") + self.gridlayout1.addWidget(self.label_5,2,0,1,1) + + self.ressource = QtGui.QLineEdit(self.groupBox_2) + self.ressource.setObjectName("ressource") + self.gridlayout1.addWidget(self.ressource,2,1,1,2) + + self.useSSL = QtGui.QCheckBox(self.groupBox_2) + self.useSSL.setObjectName("useSSL") + self.gridlayout1.addWidget(self.useSSL,1,2,1,1) + self.vboxlayout.addWidget(self.groupBox_2) + + self.buttonBox = QtGui.QDialogButtonBox() + self.buttonBox.setOrientation(QtCore.Qt.Horizontal) + self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.NoButton|QtGui.QDialogButtonBox.Ok) + self.buttonBox.setObjectName("buttonBox") + self.vboxlayout.addWidget(self.buttonBox) + + self.retranslateUi() + QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), self.on_accept) + QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), self.reject) + #QtCore.QMetaObject.connectSlotsByName() + #self.connect(self, SIGNAL("accepted()"), self.saveSettings) + self.readSettings() + + + def on_accept(self): + self.saveSettings() + self.accept() + + def readSettings(self): + settings = QtCore.QSettings("Trunat", "PyTalk") + settings.beginGroup("Connection") + self.userID.setText(settings.value("userID").toString()) + self.password.setText(settings.value("password").toString()) + self.server.setText(settings.value("server").toString()) + self.useSSL.setChecked(settings.value("useSSL", QtCore.QVariant(True)).toBool()) + + if self.useSSL.isChecked(): + self.port.setText(settings.value("port", QtCore.QVariant("5223")).toString()) + else: + self.port.setText(settings.value("port", QtCore.QVariant("5222")).toString()) + + self.ressource.setText(settings.value("ressource", QtCore.QVariant("PyTalk")).toString()) + settings.endGroup() + + def saveSettings(self): + settings = QtCore.QSettings("Trunat", "PyTalk") + settings.beginGroup("Connection") + settings.setValue("userID", QtCore.QVariant(self.userID.text())) + settings.setValue("password", QtCore.QVariant(self.password.text())) + settings.setValue("server", QtCore.QVariant(self.server.text())) + settings.setValue("port", QtCore.QVariant(int(self.port.text()))) + settings.setValue("ressource", QtCore.QVariant(self.ressource.text())) + settings.setValue("useSSL", QtCore.QVariant(self.useSSL.isChecked())) + settings.endGroup() + self.emit( SIGNAL("configured()") ) + + def retranslateUi(self): + self.setWindowTitle(QtGui.QApplication.translate("ConnectionDialog", "Connection Dialog", None, QtGui.QApplication.UnicodeUTF8)) + self.groupBox.setTitle(QtGui.QApplication.translate("ConnectionDialog", "Login\'s informations", None, QtGui.QApplication.UnicodeUTF8)) + self.label.setText(QtGui.QApplication.translate("ConnectionDialog", "Jabber ID:", None, QtGui.QApplication.UnicodeUTF8)) + self.label_2.setText(QtGui.QApplication.translate("ConnectionDialog", "Password:", None, QtGui.QApplication.UnicodeUTF8)) + self.groupBox_2.setTitle(QtGui.QApplication.translate("ConnectionDialog", "Server's informations", None, QtGui.QApplication.UnicodeUTF8)) + self.label_3.setText(QtGui.QApplication.translate("ConnectionDialog", "Server:", None, QtGui.QApplication.UnicodeUTF8)) + self.label_4.setText(QtGui.QApplication.translate("ConnectionDialog", "Port:", None, QtGui.QApplication.UnicodeUTF8)) + self.label_5.setText(QtGui.QApplication.translate("ConnectionDialog", "Ressource:", None, QtGui.QApplication.UnicodeUTF8)) + self.ressource.setText(QtGui.QApplication.translate("ConnectionDialog", "PyTalk", None, QtGui.QApplication.UnicodeUTF8)) + self.useSSL.setText(QtGui.QApplication.translate("ConnectionDialog", "Using SSL", None, QtGui.QApplication.UnicodeUTF8)) + diff --git a/pytalk/ui/MainWindow.py b/pytalk/ui/MainWindow.py new file mode 100644 index 0000000..9a68fa3 --- /dev/null +++ b/pytalk/ui/MainWindow.py @@ -0,0 +1,342 @@ +# -*- coding: utf-8 -*- + +import sys +import datetime + +from PyQt4 import QtCore, QtGui +from PyQt4.QtCore import SIGNAL, SLOT + +from jabber import STATUS + +from BuddyList import BuddyList + +from ui.ConnectionDialog import ConnectionDialog +from ConnectorThread import ConnectorThread + +class MainWindow(QtGui.QMainWindow): + + def __init__(self, parent=None): + QtGui.QMainWindow.__init__(self, parent) + + self.connectorThread = None + + self.setObjectName("MainWindow") + self.setMaximumWidth(300) + self.setMaximumHeight(600) + + #self.resize(QtCore.QSize(QtCore.QRect(0,0,316,407).size()).expandedTo(MainWindow.minimumSizeHint())) + self.setWindowIcon(QtGui.QIcon("images/im-jabber.png")) + self.setUnifiedTitleAndToolBarOnMac(False) + + toolbar = QtGui.QToolBar() + self.addToolBar(QtCore.Qt.TopToolBarArea, toolbar) + + ## Central Widget and Layout + self.centralwidget = QtGui.QWidget() + #self.centralwidget.setObjectName("centralwidget") + + self.vboxlayout = QtGui.QVBoxLayout(self.centralwidget) + #self.vboxlayout.setObjectName("vboxlayout") + + self.statusCombo = QtGui.QComboBox(self.centralwidget) + #self.statusBox.setObjectName("statusBox") + self.vboxlayout.addWidget(self.statusCombo) + + self.statusEdit = QtGui.QLineEdit(self.centralwidget) + #self.statusEdit.setObjectName("statusEdit") + self.vboxlayout.addWidget(self.statusEdit) + self.setCentralWidget(self.centralwidget) + + self.menubar = QtGui.QMenuBar() + self.menubar.setGeometry(QtCore.QRect(0,0,316,29)) + #self.menubar.setObjectName("menubar") + + self.menuContacts = QtGui.QMenu(self.menubar) + #self.menuContacts.setObjectName("menuContacts") + + self.menuAffichage = QtGui.QMenu(self.menubar) + #self.menuAffichage.setObjectName("menuAffichage") + + self.menuHelp = QtGui.QMenu(self.menubar) + self.menuHelp.setObjectName("menuHelp") + + self.menuBuddies = QtGui.QMenu(self.menubar) + self.menuBuddies.setObjectName("menuBuddies") + + self.menuTools = QtGui.QMenu(self.menubar) + self.menuTools.setObjectName("menuTools") + self.setMenuBar(self.menubar) + + self.actionConnection = QtGui.QAction(self) + self.actionConnection.setIcon(QtGui.QIcon("images/status/log-in.png")) + + self.actionDeconnection = QtGui.QAction(self) + self.actionDeconnection.setEnabled(False) + self.actionDeconnection.setIcon(QtGui.QIcon("images/status/log-out.png")) + self.actionDeconnection.setObjectName("actionDeconnection") + + self.actionOffline_buddies = QtGui.QAction(self) + self.actionOffline_buddies.setCheckable(True) + self.actionOffline_buddies.setObjectName("actionOffline_buddies") + + self.actionAway_buddies = QtGui.QAction(self) + self.actionAway_buddies.setCheckable(True) + self.actionAway_buddies.setChecked(True) + self.actionAway_buddies.setObjectName("actionAway_buddies") + + self.actionAbout = QtGui.QAction(self) + self.actionAbout.setIcon(QtGui.QIcon("images/about.png")) + self.actionAbout.setObjectName("actionAbout") + + self.actionAboutQt = QtGui.QAction(self) + self.actionAboutQt.setIcon(QtGui.QIcon("images/qt4.png")) + self.actionAboutQt.setObjectName("actionAboutQt") + + self.actionQuit = QtGui.QAction(self) + self.actionQuit.setIcon(QtGui.QIcon("images/exit.png")) + self.actionQuit.setObjectName("actionQuit") + + self.actionAdd_a_buddy = QtGui.QAction(self) + self.actionAdd_a_buddy.setIcon(QtGui.QIcon("images/plus.png")) + self.actionAdd_a_buddy.setObjectName("actionAdd_a_buddy") + + self.actionAdd_a_group = QtGui.QAction(self) + self.actionAdd_a_group.setIcon(QtGui.QIcon("images/plus.png")) + self.actionAdd_a_group.setObjectName("actionAdd_a_group") + + self.actionPreferences = QtGui.QAction(self) + self.actionPreferences.setIcon(QtGui.QIcon("images/preferences.png")) + self.actionPreferences.setObjectName("actionPreferences") + + self.actionConsole = QtGui.QAction(self) + self.actionConsole.setObjectName("actionConsole") + + self.menuContacts.addAction(self.actionConnection) + toolbar.addAction(self.actionConnection) + + self.menuContacts.addAction(self.actionDeconnection) + toolbar.addAction(self.actionDeconnection) + + self.menuContacts.addAction(self.actionQuit) + self.menuAffichage.addAction(self.actionOffline_buddies) + self.menuAffichage.addAction(self.actionAway_buddies) + self.menuHelp.addAction(self.actionAbout) + self.menuHelp.addAction(self.actionAboutQt) + self.menuBuddies.addAction(self.actionAdd_a_buddy) + self.menuBuddies.addAction(self.actionAdd_a_group) + self.menuTools.addAction(self.actionPreferences) + self.menuTools.addAction(self.actionConsole) + self.menubar.addAction(self.menuContacts.menuAction()) + self.menubar.addAction(self.menuBuddies.menuAction()) + self.menubar.addAction(self.menuAffichage.menuAction()) + self.menubar.addAction(self.menuTools.menuAction()) + self.menubar.addAction(self.menuHelp.menuAction()) + + self.console = QtGui.QDialog() + self.te = QtGui.QTextEdit(self.console) + self.te.setReadOnly(True) + vl = QtGui.QVBoxLayout() + vl.addWidget(self.te) + self.console.setLayout(vl) + + # Set status Offline + self.statusCombo.setCurrentIndex(5) + self.statusEdit.hide() + + # Set connect + self.connect(self.statusCombo, SIGNAL("currentIndexChanged(int)"), self.on_change_status) + self.connect(self.statusEdit, SIGNAL("returnPressed()"), self.on_change_status) + + # Set BuddyList + self.buddyList = BuddyList(self) + self.vboxlayout.insertWidget(0, self.buddyList) + self.connect(self.buddyList, SIGNAL("rename"), self.on_add_buddy) + + self.retranslateUi(MainWindow) + QtCore.QMetaObject.connectSlotsByName(self) + + + + # Connection + """ + connection = ConnectionDialog(self) + self.connect(self.actionConnection, SIGNAL("triggered()"), connection, SLOT("exec()")) + self.connect(self.actionDeconnection, SIGNAL("triggered()"), self.disconnect) + self.connect(connection, SIGNAL("configured()"), self.on_connection) + """ + + # Contacts + self.connect(self.actionAdd_a_buddy, SIGNAL("triggered()"), self.on_add_buddy) + self.connect(self.actionAdd_a_group, SIGNAL("triggered()"), self.on_add_group) + + # View + self.connect(self.actionAway_buddies, SIGNAL("toogled()"), self.setAway) + self.connect(self.actionOffline_buddies, SIGNAL("toogled()"), self.setOffline) + self.connect(self.actionAway_buddies, SIGNAL("triggered()"), self.setAway) + self.connect(self.actionOffline_buddies, SIGNAL("triggered()"), self.setOffline) + + # Tools + self.connect(self.actionConsole, SIGNAL("triggered()"), self.swapConsole) + + # About Dialog + """ + about = AboutDialog(self) + self.connect(self.actionAbout, SIGNAL("triggered()"), about, SLOT("exec()")) + """ + self.connect(self.actionAboutQt, SIGNAL("triggered()"), QtGui.QApplication.instance(), SLOT("aboutQt()")) + + + # Quit Signal connection + self.connect(self.actionQuit, SIGNAL("triggered()"), self.quit) + + ## Show the Connection dialog after a few moments + QtCore.QTimer.singleShot(500, self.show_connection_dialog) + + def retranslateUi(self, MainWindow): + self.setWindowTitle(QtGui.QApplication.translate("MainWindow", "PyTalk", None, QtGui.QApplication.UnicodeUTF8)) + + self.statusCombo.addItem(QtGui.QIcon("images/status/available.png"),QtGui.QApplication.translate("MainWindow", "Available", None, QtGui.QApplication.UnicodeUTF8)) + self.statusCombo.addItem(QtGui.QIcon("images/status/chat.png"),QtGui.QApplication.translate("MainWindow", "Chat", None, QtGui.QApplication.UnicodeUTF8)) + self.statusCombo.addItem(QtGui.QIcon("images/status/busy.png"),QtGui.QApplication.translate("MainWindow", "Do not disturb", None, QtGui.QApplication.UnicodeUTF8)) + self.statusCombo.addItem(QtGui.QIcon("images/status/away.png"),QtGui.QApplication.translate("MainWindow", "Away", None, QtGui.QApplication.UnicodeUTF8)) + self.statusCombo.addItem(QtGui.QIcon("images/status/extended-away.png"),QtGui.QApplication.translate("MainWindow", "Extended Away", None, QtGui.QApplication.UnicodeUTF8)) + self.statusCombo.addItem(QtGui.QIcon("images/status/offline.png"),QtGui.QApplication.translate("MainWindow", "Offline", None, QtGui.QApplication.UnicodeUTF8)) + + self.menuContacts.setTitle(QtGui.QApplication.translate("MainWindow", "Account", None, QtGui.QApplication.UnicodeUTF8)) + self.menuAffichage.setTitle(QtGui.QApplication.translate("MainWindow", "View", None, QtGui.QApplication.UnicodeUTF8)) + self.menuHelp.setTitle(QtGui.QApplication.translate("MainWindow", "Help", None, QtGui.QApplication.UnicodeUTF8)) + self.menuBuddies.setTitle(QtGui.QApplication.translate("MainWindow", "Buddies", None, QtGui.QApplication.UnicodeUTF8)) + self.menuTools.setTitle(QtGui.QApplication.translate("MainWindow", "Tools", None, QtGui.QApplication.UnicodeUTF8)) + self.actionConnection.setText(QtGui.QApplication.translate("MainWindow", "L&og in", None, QtGui.QApplication.UnicodeUTF8)) + self.actionConnection.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+O", None, QtGui.QApplication.UnicodeUTF8)) + self.actionDeconnection.setText(QtGui.QApplication.translate("MainWindow", "Log out", None, QtGui.QApplication.UnicodeUTF8)) + self.actionOffline_buddies.setText(QtGui.QApplication.translate("MainWindow", "Offline buddies", None, QtGui.QApplication.UnicodeUTF8)) + self.actionAway_buddies.setText(QtGui.QApplication.translate("MainWindow", "Away buddies", None, QtGui.QApplication.UnicodeUTF8)) + self.actionAbout.setText(QtGui.QApplication.translate("MainWindow", "About pyTalk", None, QtGui.QApplication.UnicodeUTF8)) + self.actionAboutQt.setText(QtGui.QApplication.translate("MainWindow", "About Qt", None, QtGui.QApplication.UnicodeUTF8)) + self.actionQuit.setText(QtGui.QApplication.translate("MainWindow", "&Quit", None, QtGui.QApplication.UnicodeUTF8)) + self.actionQuit.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+Q", None, QtGui.QApplication.UnicodeUTF8)) + self.actionAdd_a_buddy.setText(QtGui.QApplication.translate("MainWindow", "Add a buddy", None, QtGui.QApplication.UnicodeUTF8)) + self.actionAdd_a_group.setText(QtGui.QApplication.translate("MainWindow", "Add a group", None, QtGui.QApplication.UnicodeUTF8)) + self.actionPreferences.setText(QtGui.QApplication.translate("MainWindow", "&Preferences", None, QtGui.QApplication.UnicodeUTF8)) + self.actionPreferences.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+P", None, QtGui.QApplication.UnicodeUTF8)) + self.actionConsole.setText(QtGui.QApplication.translate("MainWindow", "XML Console", None, QtGui.QApplication.UnicodeUTF8)) + + + + def show_connection_dialog(self): + d = ConnectionDialog(self) + if d.exec_(): + self.on_connection() + self.on_change_status(0) + #self.statusCombo.set + + def on_connection(self, status=STATUS.available): + if not self.connectorThread: + self.connectorThread = ConnectorThread(status) + self.connectorThread.start() + self.connect(self.connectorThread, SIGNAL("message"), self.buddyList.message) + self.connect(self.connectorThread, SIGNAL("error"), self.error) + self.connect(self.connectorThread, SIGNAL("connected()"), self.connected) + self.connect(self.connectorThread, SIGNAL("disconnected()"), self.disconnect) + self.connect(self.connectorThread, SIGNAL("presence"), self.buddyList.presence) + self.connect(self.connectorThread, SIGNAL("debug"), self.debug) + self.connect(self.connectorThread, SIGNAL("subscriptionRequest"), self.subscriptionRequest) + self.connect(self.connectorThread, SIGNAL("addBuddy"), self.on_add_buddy) + + elif self.connectorThread.isConnected(): + self.connectorThread.change_status(status, self.statusEdit.text()) + self.statusEdit.clearFocus() + + def disconnect(self): + self.actionConnection.setEnabled(True) + self.actionDeconnection.setEnabled(False) + self.statusEdit.hide() + self.statusCombo.setCurrentIndex(STATUS.unavailable.index) + if self.connectorThread: + self.connectorThread.disconnect() + self.connectorThread = None + self.buddyList.clear() + QtGui.QApplication.instance().quit() + + + def connected(self): + self.actionConnection.setEnabled(False) + self.actionDeconnection.setEnabled(True) + if self.statusCombo.currentIndex() == STATUS.unavailable: + self.statusCombo.setCurrentIndex(STATUS.available) + else: + self.connectorThread.set_status(self.statusCombo.currentIndex(), self.statusEdit.text()) + self.statusEdit.show() + self.statusEdit.setFocus() + self.buddyList.setConnection(self.connectorThread) + self.getRoster() + self.setAway() + self.setOffline() + + def error(self, title, content): + QtGui.QMessageBox.critical(self, title, content, QtGui.QMessageBox.Ok) + + def closeEvent(self, event): + self.quit() + + def quit(self): + self.disconnect() + sys.exit(0) + + def on_change_status(self, index=-1): + print "on_status", index + if index == -1: + index = self.statusCombo.currentIndex() + if index == STATUS.unavailable: + self.statusEdit.hide() + self.disconnect() + #else: + # self.connection(index) + + def getRoster(self): + roster = self.connectorThread.getRoster() + for buddy in roster: + self.buddyList.add_item(buddy) + self.connect(self.buddyList, SIGNAL("itemDoubleClicked(QTreeWidgetItem *,int)"), self.on_send_message) + + def on_send_message(self, item, col): + print "on_send_message", item, col + if item and item.type() == QtGui.QTreeWidgetItem.UserType+1: + item.sendMessage() + + def setAway(self, checked=-1): + if checked == -1: + checked = self.actionAway_buddies.isChecked() + self.buddyList.setAway(not checked) + + def setOffline(self, checked=-1): + if checked == -1: + checked = self.actionOffline_buddies.isChecked() + self.buddyList.setOffline(not checked) + + def subscriptionRequest(self, presence): + request = RosterRequest(self, self.connectorThread.jabber, presence) + request.show() + + def debug(self, message): + self.te.append(datetime.datetime.now().strftime("[%H:%M:%S]")+" : \n"+message) + + def swapConsole(self): + self.console.setWindowTitle("XML Console") + self.console.resize(QtCore.QSize(1024, 500)) + self.console.show() + self.console.raise_() + + def on_add_buddy(self, item=None): + if self.connectorThread: + if item: + jid = item.jid + else: + jid = "" + newBuddy = AddBuddyDialog(self, self.connectorThread.jabber, self.buddyList.groups.keys(), jid) + newBuddy.show() + + def on_add_group(self): + newGroup = AddGroupDialog(self, self.BuddyList) + newGroup.show() diff --git a/pytalk/ui/ui_ConnectionDialog.py b/pytalk/ui/ui_ConnectionDialog.py index d247d88..3435787 100644 --- a/pytalk/ui/ui_ConnectionDialog.py +++ b/pytalk/ui/ui_ConnectionDialog.py @@ -87,7 +87,7 @@ def setupUi(self, ConnectionDialog): QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL("rejected()"),ConnectionDialog.reject) QtCore.QMetaObject.connectSlotsByName(ConnectionDialog) - def retranslateUi(self, ConnectionDialog): + def rsetranslateUi(self, ConnectionDialog): ConnectionDialog.setWindowTitle(QtGui.QApplication.translate("ConnectionDialog", "Connection Dialog", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox.setTitle(QtGui.QApplication.translate("ConnectionDialog", "Login\'s informations", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("ConnectionDialog", "Jabber ID:", None, QtGui.QApplication.UnicodeUTF8))