Cooperation/ChatWidget.py

changeset 149
a134031209be
child 155
375e3c884874
equal deleted inserted replaced
148:727a907b8305 149:a134031209be
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2010 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the chat dialog.
8 """
9
10 from PyQt4.QtCore import Qt, pyqtSlot, QDateTime
11 from PyQt4.QtGui import QWidget, QColor, QListWidgetItem
12
13 from .CooperationClient import CooperationClient
14
15 from .Ui_ChatWidget import Ui_ChatWidget
16
17 import Preferences
18 import UI.PixmapCache
19
20 class ChatWidget(QWidget, Ui_ChatWidget):
21 """
22 Class implementing the chat dialog.
23 """
24 def __init__(self, port = -1, parent = None):
25 """
26 Constructor
27
28 @param port port to be used for the cooperation server (integer)
29 @param parent reference to the parent widget (QWidget)
30 """
31 QWidget.__init__(self, parent)
32 self.setupUi(self)
33
34 self.__client = CooperationClient()
35 self.__myNickName = self.__client.nickName()
36
37 self.messageEdit.returnPressed.connect(self.__handleMessage)
38 self.sendButton.clicked.connect(self.__handleMessage)
39 self.__client.newMessage.connect(self.appendMessage)
40 self.__client.newParticipant.connect(self.__newParticipant)
41 self.__client.participantLeft.connect(self.__participantLeft)
42 self.__client.connectionError.connect(self.__showErrorMessage)
43 self.__client.cannotConnect.connect(self.__initialConnectionRefused)
44
45 self.serverButton.setText(self.trUtf8("Start Server"))
46 self.serverLed.setColor(QColor(Qt.red))
47 if port == -1:
48 port = Preferences.getCooperation("ServerPort")
49
50 self.portSpin.setValue(port)
51 self.serverPortSpin.setValue(port)
52
53 self.__setConnected(False)
54
55 if Preferences.getCooperation("AutoStartServer"):
56 self.on_serverButton_clicked()
57
58 def __handleMessage(self):
59 """
60 Private slot handling the Return key pressed in the message edit.
61 """
62 text = self.messageEdit.text()
63 if text == "":
64 return
65
66 if text.startswith("/"):
67 self.__showErrorMessage(
68 self.trUtf8("! Unknown command: {0}\n").format(text.split()[0]))
69 else:
70 self.__client.sendMessage(text)
71 self.appendMessage(self.__myNickName, text)
72
73 self.messageEdit.clear()
74
75 def __newParticipant(self, nick):
76 """
77 Private slot handling a new participant joining.
78
79 @param nick nick name of the new participant (string)
80 """
81 if nick == "":
82 return
83
84 color = self.chatEdit.textColor()
85 self.chatEdit.setTextColor(Qt.gray)
86 self.chatEdit.append(
87 QDateTime.currentDateTime().toString(Qt.SystemLocaleLongDate) + ":")
88 self.chatEdit.append(self.trUtf8("* {0} has joined.\n").format(nick))
89 self.chatEdit.setTextColor(color)
90
91 QListWidgetItem(
92 UI.PixmapCache.getIcon(
93 "chatUser{0}.png".format(1 + self.usersList.count() % 6)),
94 nick, self.usersList)
95
96 if not self.__connected:
97 self.__setConnected(True)
98
99 def __participantLeft(self, nick):
100 """
101 Private slot handling a participant leaving the session.
102
103 @param nick nick name of the participant (string)
104 """
105 if nick == "":
106 return
107
108 items = self.usersList.findItems(nick, Qt.MatchExactly)
109 for item in items:
110 self.usersList.takeItem(self.usersList.row(item))
111 del item
112
113 color = self.chatEdit.textColor()
114 self.chatEdit.setTextColor(Qt.gray)
115 self.chatEdit.append(
116 QDateTime.currentDateTime().toString(Qt.SystemLocaleLongDate) + ":")
117 self.chatEdit.append(self.trUtf8("* {0} has left.\n").format(nick))
118 self.chatEdit.setTextColor(color)
119
120 if not self.__client.hasConnections():
121 self.__setConnected(False)
122
123 def appendMessage(self, from_, message):
124 """
125 Public slot to append a message to the display.
126
127 @param from_ originator of the message (string)
128 @param message message to be appended (string)
129 """
130 if from_ == "" or message == "":
131 return
132
133 self.chatEdit.append(
134 QDateTime.currentDateTime().toString(Qt.SystemLocaleLongDate) + \
135 " <" + from_ + ">:")
136 self.chatEdit.append(message + "\n")
137 bar = self.chatEdit.verticalScrollBar()
138 bar.setValue(bar.maximum())
139
140 @pyqtSlot(str)
141 def on_hostEdit_textChanged(self, host):
142 """
143 Private slot handling the entry of a host to connect to.
144
145 @param host host to connect to (string)
146 """
147 if not self.__connected:
148 self.connectButton.setEnabled(host != "")
149
150 @pyqtSlot()
151 def on_connectButton_clicked(self):
152 """
153 Private slot initiating the connection.
154 """
155 if not self.__connected:
156 if not self.__client.server().isListening():
157 self.on_serverButton_clicked()
158 if self.__client.server().isListening():
159 self.__client.connectToHost(self.hostEdit.text(), self.portSpin.value())
160 self.__setConnected(True)
161 else:
162 self.__client.disconnectConnections()
163 self.__setConnected(False)
164
165 @pyqtSlot()
166 def on_serverButton_clicked(self):
167 """
168 Private slot to start the server.
169 """
170 if self.__client.server().isListening():
171 self.__client.server().close()
172 self.serverButton.setText(self.trUtf8("Start Server"))
173 self.serverPortSpin.setEnabled(True)
174 if self.serverPortSpin.value() != Preferences.getCooperation("ServerPort"):
175 self.serverPortSpin.setValue(Preferences.getCooperation("ServerPort"))
176 self.serverLed.setColor(QColor(Qt.red))
177 else:
178 res, port = self.__client.server().startListening(self.serverPortSpin.value())
179 if res:
180 self.serverButton.setText(self.trUtf8("Stop Server"))
181 self.serverPortSpin.setValue(port)
182 self.serverPortSpin.setEnabled(False)
183 self.serverLed.setColor(QColor(Qt.green))
184 else:
185 self.__showErrorMessage(
186 self.trUtf8("! Server Error: {0}\n").format(
187 self.__client.server().errorString())
188 )
189
190 def __setConnected(self, connected):
191 """
192 Private slot to set the connected state.
193
194 @param connected new connected state (boolean)
195 """
196 if connected:
197 self.__connected = True
198 self.connectButton.setText(self.trUtf8("Disconnect"))
199 self.connectButton.setEnabled(True)
200 self.hostEdit.setEnabled(False)
201 self.portSpin.setEnabled(False)
202 self.connectionLed.setColor(QColor(Qt.green))
203 self.serverButton.setEnabled(False)
204 else:
205 self.__connected = False
206 self.connectButton.setText(self.trUtf8("Connect"))
207 self.connectButton.setEnabled(self.hostEdit.text() != "")
208 self.hostEdit.setEnabled(True)
209 self.portSpin.setEnabled(True)
210 self.connectionLed.setColor(QColor(Qt.red))
211 self.serverButton.setEnabled(True)
212
213 def __showErrorMessage(self, message):
214 """
215 Private slot to show an error message.
216
217 @param message error message to show (string)
218 """
219 color = self.chatEdit.textColor()
220 self.chatEdit.setTextColor(Qt.red)
221 self.chatEdit.append(
222 QDateTime.currentDateTime().toString(Qt.SystemLocaleLongDate) + ":")
223 self.chatEdit.append(message)
224 self.chatEdit.setTextColor(color)
225
226 def __initialConnectionRefused(self):
227 """
228 Private slot to handle the refusal of the initial connection.
229 """
230 self.__setConnected(False)
231
232 def preferencesChanged(self):
233 """
234 Public slot to handle a change of preferences.
235 """
236 if not self.__client.server().isListening():
237 self.serverPortSpin.setValue(Preferences.getCooperation("ServerPort"))
238 if Preferences.getCooperation("AutoStartServer"):
239 self.on_serverButton_clicked()

eric ide

mercurial