Network/IRC/IrcIdentitiesEditDialog.py

changeset 2239
a47b50e80a20
child 2240
11445430c553
equal deleted inserted replaced
2238:9977d3081ab6 2239:a47b50e80a20
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()

eric ide

mercurial