|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing the identities management dialog. |
|
8 """ |
|
9 |
|
10 import copy |
|
11 |
|
12 from PyQt4.QtCore import pyqtSlot |
|
13 from PyQt4.QtGui import QDialog, QInputDialog, QLineEdit, QItemSelectionModel |
|
14 |
|
15 from E5Gui import E5MessageBox |
|
16 from E5Gui.E5Application import e5App |
|
17 |
|
18 from .Ui_IrcIdentitiesEditDialog import Ui_IrcIdentitiesEditDialog |
|
19 |
|
20 from .IrcNetworkManager import IrcIdentity |
|
21 |
|
22 import Utilities |
|
23 import UI.PixmapCache |
|
24 |
|
25 |
|
26 # TODO: implement "Away" page |
|
27 # TODO: implement "Advanced" page |
|
28 class IrcIdentitiesEditDialog(QDialog, Ui_IrcIdentitiesEditDialog): |
|
29 """ |
|
30 Class implementing the identities management dialog. |
|
31 """ |
|
32 def __init__(self, manager, identityName, parent=None): |
|
33 """ |
|
34 Constructor |
|
35 |
|
36 @param manager reference to the IRC network manager object (IrcNetworkManager) |
|
37 @param identityName name of the identity to be selected (string) |
|
38 @param parent reference to the parent widget (QWidget) |
|
39 """ |
|
40 super().__init__(parent) |
|
41 self.setupUi(self) |
|
42 |
|
43 self.addButton.setIcon(UI.PixmapCache.getIcon("plus.png")) |
|
44 self.copyButton.setIcon(UI.PixmapCache.getIcon("editCopy.png")) |
|
45 self.renameButton.setIcon(UI.PixmapCache.getIcon("editRename.png")) |
|
46 self.deleteButton.setIcon(UI.PixmapCache.getIcon("minus.png")) |
|
47 self.nicknameAddButton.setIcon(UI.PixmapCache.getIcon("plus.png")) |
|
48 self.nicknameDeleteButton.setIcon(UI.PixmapCache.getIcon("minus.png")) |
|
49 self.nicknameUpButton.setIcon(UI.PixmapCache.getIcon("1uparrow.png")) |
|
50 self.nicknameDownButton.setIcon(UI.PixmapCache.getIcon("1downarrow.png")) |
|
51 |
|
52 self.__manager = manager |
|
53 |
|
54 self.__identities = self.__manager.getIdentities() |
|
55 self.__currentIdentity = None |
|
56 |
|
57 identities = list(sorted(self.__manager.getIdentityNames())) |
|
58 identities[identities.index(IrcIdentity.DefaultIdentityName)] = \ |
|
59 IrcIdentity.DefaultIdentityDisplay |
|
60 self.identitiesCombo.addItems(identities) |
|
61 if identityName == IrcIdentity.DefaultIdentityName: |
|
62 identityName = IrcIdentity.DefaultIdentityDisplay |
|
63 index = self.identitiesCombo.findText(identityName) |
|
64 if index == -1: |
|
65 index = 0 |
|
66 identityName = self.identitiesCombo.itemText(0) |
|
67 self.identitiesCombo.setCurrentIndex(index) |
|
68 |
|
69 self.on_identitiesCombo_currentIndexChanged(identityName) |
|
70 |
|
71 def __updateIdentitiesButtons(self): |
|
72 """ |
|
73 Private slot to update the status of the identity related buttons. |
|
74 """ |
|
75 enable = self.identitiesCombo.currentText() != IrcIdentity.DefaultIdentityDisplay |
|
76 self.renameButton.setEnabled(enable) |
|
77 self.deleteButton.setEnabled(enable) |
|
78 |
|
79 @pyqtSlot(str) |
|
80 def on_identitiesCombo_currentIndexChanged(self, identity): |
|
81 """ |
|
82 Private slot to handle the selection of an identity. |
|
83 """ |
|
84 if identity == IrcIdentity.DefaultIdentityDisplay: |
|
85 identity = IrcIdentity.DefaultIdentityName |
|
86 self.__updateIdentitiesButtons() |
|
87 |
|
88 if self.__currentIdentity and not self.__checkCurrentIdentity(): |
|
89 return |
|
90 |
|
91 self.__refreshCurrentIdentity() |
|
92 |
|
93 self.__currentIdentity = self.__identities[identity] |
|
94 |
|
95 # TODO: update of tab widget not implemented yet |
|
96 self.realnameEdit.setText(self.__currentIdentity.getRealName()) |
|
97 self.nicknamesList.clear() |
|
98 self.nicknamesList.addItems(self.__currentIdentity.getNickNames()) |
|
99 self.serviceEdit.setText(self.__currentIdentity.getServiceName()) |
|
100 self.passwordEdit.setText(self.__currentIdentity.getPassword()) |
|
101 |
|
102 self.__updateIdentitiesButtons() |
|
103 self.__updateNicknameUpDownButtons() |
|
104 self.__updateNicknameButtons() |
|
105 ## void IdentityDialog::updateIdentity(int index) |
|
106 ## { |
|
107 ## m_insertRememberLineOnAwayChBox->setChecked(m_currentIdentity->getInsertRememberLineOnAway()); |
|
108 ## m_awayMessageEdit->setText(m_currentIdentity->getAwayMessage()); |
|
109 ## m_awayNickEdit->setText(m_currentIdentity->getAwayNickname()); |
|
110 ## awayCommandsGroup->setChecked(m_currentIdentity->getRunAwayCommands()); |
|
111 ## m_awayEdit->setText(m_currentIdentity->getAwayCommand()); |
|
112 ## m_unAwayEdit->setText(m_currentIdentity->getReturnCommand()); |
|
113 ## automaticAwayGroup->setChecked(m_currentIdentity->getAutomaticAway()); |
|
114 ## m_awayInactivitySpin->setValue(m_currentIdentity->getAwayInactivity()); |
|
115 ## m_automaticUnawayChBox->setChecked(m_currentIdentity->getAutomaticUnaway()); |
|
116 ## |
|
117 ## m_sCommandEdit->setText(m_currentIdentity->getShellCommand()); |
|
118 ## m_codecCBox->setCurrentIndex(Konversation::IRCCharsets::self()->shortNameToIndex(m_currentIdentity->getCodecName())); |
|
119 ## m_loginEdit->setText(m_currentIdentity->getIdent()); |
|
120 ## m_quitEdit->setText(m_currentIdentity->getQuitReason()); |
|
121 ## m_partEdit->setText(m_currentIdentity->getPartReason()); |
|
122 ## m_kickEdit->setText(m_currentIdentity->getKickReason()); |
|
123 ## } |
|
124 |
|
125 def __refreshCurrentIdentity(self): |
|
126 """ |
|
127 Private method to read back the data for the current identity. |
|
128 """ |
|
129 if self.__currentIdentity is None: |
|
130 return |
|
131 |
|
132 self.__currentIdentity.setRealName(self.realnameEdit.text()) |
|
133 self.__currentIdentity.setNickNames([self.nicknamesList.item(row).text() |
|
134 for row in range(self.nicknamesList.count())]) |
|
135 self.__currentIdentity.setServiceName(self.serviceEdit.text()) |
|
136 self.__currentIdentity.setPassword(self.passwordEdit.text()) |
|
137 ## |
|
138 ## void IdentityDialog::refreshCurrentIdentity() |
|
139 ## { |
|
140 ## m_currentIdentity->setInsertRememberLineOnAway(m_insertRememberLineOnAwayChBox->isChecked()); |
|
141 ## m_currentIdentity->setAwayMessage(m_awayMessageEdit->text()); |
|
142 ## m_currentIdentity->setAwayNickname(m_awayNickEdit->text()); |
|
143 ## m_currentIdentity->setRunAwayCommands(awayCommandsGroup->isChecked()); |
|
144 ## m_currentIdentity->setAwayCommand(m_awayEdit->text()); |
|
145 ## m_currentIdentity->setReturnCommand(m_unAwayEdit->text()); |
|
146 ## m_currentIdentity->setAutomaticAway(automaticAwayGroup->isChecked()); |
|
147 ## m_currentIdentity->setAwayInactivity(m_awayInactivitySpin->value()); |
|
148 ## m_currentIdentity->setAutomaticUnaway(m_automaticUnawayChBox->isChecked()); |
|
149 ## |
|
150 ## m_currentIdentity->setShellCommand(m_sCommandEdit->text()); |
|
151 ## if(m_codecCBox->currentIndex() >= 0 && m_codecCBox->currentIndex() < Konversation::IRCCharsets::self()->availableEncodingShortNames().count()) |
|
152 ## m_currentIdentity->setCodecName(Konversation::IRCCharsets::self()->availableEncodingShortNames()[m_codecCBox->currentIndex()]); |
|
153 ## m_currentIdentity->setIdent(m_loginEdit->text()); |
|
154 ## m_currentIdentity->setQuitReason(m_quitEdit->text()); |
|
155 ## m_currentIdentity->setPartReason(m_partEdit->text()); |
|
156 ## m_currentIdentity->setKickReason(m_kickEdit->text()); |
|
157 ## } |
|
158 ## |
|
159 |
|
160 def __checkCurrentIdentity(self): |
|
161 """ |
|
162 Private method to check the data for the current identity. |
|
163 |
|
164 @return flag indicating a successful check (boolean) |
|
165 """ |
|
166 if self.nicknamesList.count() == 0: |
|
167 E5MessageBox.critical(self, |
|
168 self.trUtf8("Edit Identity"), |
|
169 self.trUtf8("""The identity must contain at least one nick name.""")) |
|
170 block = self.identitiesCombo.blockSignals(True) |
|
171 identity = self.__currentIdentity.getName() |
|
172 if identity == IrcIdentity.DefaultIdentityName: |
|
173 identity = IrcIdentity.DefaultIdentityDisplay |
|
174 self.identitiesCombo.setCurrentIndex(self.identitiesCombo.findText(identity)) |
|
175 self.identitiesCombo.blockSignals(block) |
|
176 self.identityTabWidget.setCurrentIndex(0) |
|
177 self.nicknameEdit.setFocus() |
|
178 return False |
|
179 |
|
180 if not self.realnameEdit.text(): |
|
181 E5MessageBox.critical(self, |
|
182 self.trUtf8("Edit Identity"), |
|
183 self.trUtf8("""The identity must have a real name.""")) |
|
184 block = self.identitiesCombo.blockSignals(True) |
|
185 identity = self.__currentIdentity.getName() |
|
186 if identity == IrcIdentity.DefaultIdentityName: |
|
187 identity = IrcIdentity.DefaultIdentityDisplay |
|
188 self.identitiesCombo.setCurrentIndex(self.identitiesCombo.findText(identity)) |
|
189 self.identitiesCombo.blockSignals(block) |
|
190 self.identityTabWidget.setCurrentIndex(0) |
|
191 self.realnameEdit.setFocus() |
|
192 return False |
|
193 |
|
194 return True |
|
195 |
|
196 @pyqtSlot() |
|
197 def on_addButton_clicked(self): |
|
198 """ |
|
199 Private slot to add a new idntity. |
|
200 """ |
|
201 name, ok = QInputDialog.getText( |
|
202 self, |
|
203 self.trUtf8("Add Identity"), |
|
204 self.trUtf8("Identity Name:"), |
|
205 QLineEdit.Normal) |
|
206 |
|
207 if ok: |
|
208 if name: |
|
209 if name in self.__identities: |
|
210 E5MessageBox.critical(self, |
|
211 self.trUtf8("Add Identity"), |
|
212 self.trUtf8("""An identity named <b>{0}</b> already exists.""" |
|
213 """ You must provide a different name.""").format( |
|
214 name)) |
|
215 self.on_addButton_clicked() |
|
216 else: |
|
217 identity = IrcIdentity(name) |
|
218 identity.setIdent(Utilities.getUserName()) |
|
219 identity.setRealName(Utilities.getRealName()) |
|
220 self.__identities[name] = identity |
|
221 self.identitiesCombo.addItem(name) |
|
222 self.identitiesCombo.setCurrentIndex(self.identitiesCombo.count() - 1) |
|
223 else: |
|
224 E5MessageBox.critical(self, |
|
225 self.trUtf8("Add Identity"), |
|
226 self.trUtf8("""The identity has to have a name.""")) |
|
227 self.on_addButton_clicked() |
|
228 |
|
229 @pyqtSlot() |
|
230 def on_copyButton_clicked(self): |
|
231 """ |
|
232 Private slot to copy the selected identity. |
|
233 """ |
|
234 currentIdentity = self.identitiesCombo.currentText() |
|
235 name, ok = QInputDialog.getText( |
|
236 self, |
|
237 self.trUtf8("Copy Identity"), |
|
238 self.trUtf8("Identity Name:"), |
|
239 QLineEdit.Normal, |
|
240 currentIdentity) |
|
241 |
|
242 if ok: |
|
243 if name: |
|
244 if name in self.__identities: |
|
245 E5MessageBox.critical(self, |
|
246 self.trUtf8("Copy Identity"), |
|
247 self.trUtf8("""An identity named <b>{0}</b> already exists.""" |
|
248 """ You must provide a different name.""").format( |
|
249 name)) |
|
250 self.on_copyButton_clicked() |
|
251 else: |
|
252 identity = copy.deepcopy(self.__currentIdentity) |
|
253 identity.setName(name) |
|
254 self.__identities[name] = identity |
|
255 self.identitiesCombo.addItem(name) |
|
256 self.identitiesCombo.setCurrentIndex(self.identitiesCombo.count() - 1) |
|
257 else: |
|
258 E5MessageBox.critical(self, |
|
259 self.trUtf8("Copy Identity"), |
|
260 self.trUtf8("""The identity has to have a name.""")) |
|
261 self.on_copyButton_clicked() |
|
262 |
|
263 @pyqtSlot() |
|
264 def on_renameButton_clicked(self): |
|
265 """ |
|
266 Private slot to rename the selected identity. |
|
267 """ |
|
268 currentIdentity = self.identitiesCombo.currentText() |
|
269 name, ok = QInputDialog.getText( |
|
270 self, |
|
271 self.trUtf8("Rename Identity"), |
|
272 self.trUtf8("Identity Name:"), |
|
273 QLineEdit.Normal, |
|
274 currentIdentity) |
|
275 |
|
276 if ok and name != currentIdentity: |
|
277 if name: |
|
278 if name in self.__identities: |
|
279 E5MessageBox.critical(self, |
|
280 self.trUtf8("Rename Identity"), |
|
281 self.trUtf8("""An identity named <b>{0}</b> already exists.""" |
|
282 """ You must provide a different name.""").format( |
|
283 name)) |
|
284 self.on_renameButton_clicked() |
|
285 else: |
|
286 del self.__identities[currentIdentity] |
|
287 self.__currentIdentity.setName(name) |
|
288 self.__identities[name] = self.__currentIdentity |
|
289 self.identitiesCombo.setItemText( |
|
290 self.identitiesCombo.currentIndex(), name) |
|
291 else: |
|
292 E5MessageBox.critical(self, |
|
293 self.trUtf8("Copy Identity"), |
|
294 self.trUtf8("""The identity has to have a name.""")) |
|
295 self.on_renameButton_clicked() |
|
296 |
|
297 @pyqtSlot() |
|
298 def on_deleteButton_clicked(self): |
|
299 """ |
|
300 Private slot to rename the selected identity. |
|
301 """ |
|
302 currentIdentity = self.identitiesCombo.currentText() |
|
303 if currentIdentity == IrcIdentity.DefaultIdentityDisplay: |
|
304 return |
|
305 |
|
306 inUse = False |
|
307 for networkName in self.__manager.getNetworkNames(): |
|
308 inUse = ( |
|
309 self.__manager.getNetwork(networkName).getIdentityName() == |
|
310 currentIdentity) |
|
311 if inUse: |
|
312 break |
|
313 |
|
314 if inUse: |
|
315 msg = self.trUtf8("""This identity is in use. If you remove it, the network""" |
|
316 """ settings using it will fall back to the default""" |
|
317 """ identity. Should it be deleted anyway?""") |
|
318 else: |
|
319 msg = self.trUtf8("""Do you really want to delete all information for""" |
|
320 """ this identity?""") |
|
321 res = E5MessageBox.yesNo(self, |
|
322 self.trUtf8("Delete Identity"), |
|
323 msg, |
|
324 icon = E5MessageBox.Warning) |
|
325 if res: |
|
326 del self.__identities[currentIdentity] |
|
327 self.identitiesCombo.removeItem( |
|
328 self.identitiesCombo.findText(currentIdentity)) |
|
329 |
|
330 def __updateNicknameUpDownButtons(self): |
|
331 """ |
|
332 Private method to set the enabled state of the nick name up and down buttons. |
|
333 """ |
|
334 if len(self.nicknamesList.selectedItems()) == 0: |
|
335 self.nicknameUpButton.setEnabled(False) |
|
336 self.nicknameDownButton.setEnabled(False) |
|
337 else: |
|
338 if self.nicknamesList.currentRow() == 0: |
|
339 self.nicknameUpButton.setEnabled(False) |
|
340 self.nicknameDownButton.setEnabled(True) |
|
341 elif self.nicknamesList.currentRow() == self.nicknamesList.count() - 1: |
|
342 self.nicknameUpButton.setEnabled(True) |
|
343 self.nicknameDownButton.setEnabled(False) |
|
344 else: |
|
345 self.nicknameUpButton.setEnabled(True) |
|
346 self.nicknameDownButton.setEnabled(True) |
|
347 |
|
348 def __updateNicknameButtons(self): |
|
349 """ |
|
350 Private slot to update the nick name buttons except the up and down buttons. |
|
351 """ |
|
352 self.nicknameDeleteButton.setEnabled( |
|
353 len(self.nicknamesList.selectedItems()) != 0) |
|
354 |
|
355 self.nicknameAddButton.setEnabled(self.nicknameEdit.text() != "") |
|
356 |
|
357 @pyqtSlot(str) |
|
358 def on_nicknameEdit_textEdited(self, nick): |
|
359 """ |
|
360 Private slot handling a change of the nick name. |
|
361 """ |
|
362 itm = self.nicknamesList.currentItem() |
|
363 if itm: |
|
364 itm.setText(nick) |
|
365 |
|
366 self.__updateNicknameButtons() |
|
367 |
|
368 @pyqtSlot() |
|
369 def on_nicknamesList_itemSelectionChanged(self): |
|
370 """ |
|
371 Private slot handling the selection of a nick name. |
|
372 """ |
|
373 items = self.nicknamesList.selectedItems() |
|
374 if items: |
|
375 self.nicknameEdit.setText(items[0].text()) |
|
376 |
|
377 self.__updateNicknameUpDownButtons() |
|
378 self.__updateNicknameButtons() |
|
379 |
|
380 self.nicknameEdit.setFocus() |
|
381 |
|
382 @pyqtSlot() |
|
383 def on_nicknameAddButton_clicked(self): |
|
384 """ |
|
385 Private slot to add a new nickname. |
|
386 """ |
|
387 nick = self.nicknameEdit.text() |
|
388 if nick not in [self.nicknamesList.item(row).text() |
|
389 for row in range(self.nicknamesList.count())]: |
|
390 self.nicknamesList.insertItem(0, nick) |
|
391 self.nicknamesList.setCurrentRow(0, QItemSelectionModel.Clear) |
|
392 self.nicknameEdit.clear() |
|
393 self.__updateNicknameButtons() |
|
394 |
|
395 @pyqtSlot() |
|
396 def on_nicknameDeleteButton_clicked(self): |
|
397 """ |
|
398 Private slot to delete a nick name. |
|
399 """ |
|
400 itm = self.nicknamesList.takeItem(self.nicknamesList.currentRow()) |
|
401 del itm |
|
402 self.__updateNicknameButtons() |
|
403 |
|
404 @pyqtSlot() |
|
405 def on_nicknameUpButton_clicked(self): |
|
406 """ |
|
407 Private slot to move the selected entry up one row. |
|
408 """ |
|
409 row = self.nicknamesList.currentRow() |
|
410 if row > 0: |
|
411 itm = self.nicknamesList.takeItem(row) |
|
412 row -= 1 |
|
413 self.nicknamesList.insertItem(row, itm) |
|
414 self.nicknamesList.setCurrentItem(itm) |
|
415 |
|
416 @pyqtSlot() |
|
417 def on_nicknameDownButton_clicked(self): |
|
418 """ |
|
419 Private slot to move the selected entry down one row. |
|
420 """ |
|
421 row = self.nicknamesList.currentRow() |
|
422 if row < self.nicknamesList.count() - 1: |
|
423 itm = self.nicknamesList.takeItem(row) |
|
424 row += 1 |
|
425 self.nicknamesList.insertItem(row, itm) |
|
426 self.nicknamesList.setCurrentItem(itm) |
|
427 |
|
428 def accept(self): |
|
429 """ |
|
430 Public slot handling the acceptance of the dialog. |
|
431 """ |
|
432 if not self.__checkCurrentIdentity(): |
|
433 return |
|
434 |
|
435 self.__refreshCurrentIdentity() |
|
436 self.__manager.setIdentities(self.__identities) |
|
437 |
|
438 super().accept() |