|
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() |