Sat, 01 Dec 2012 19:51:46 +0100
Continued with the IRC management.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Network/IRC/IrcIdentitiesEditDialog.py Sat Dec 01 19:51:46 2012 +0100 @@ -0,0 +1,438 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the identities management dialog. +""" + +import copy + +from PyQt4.QtCore import pyqtSlot +from PyQt4.QtGui import QDialog, QInputDialog, QLineEdit, QItemSelectionModel + +from E5Gui import E5MessageBox +from E5Gui.E5Application import e5App + +from .Ui_IrcIdentitiesEditDialog import Ui_IrcIdentitiesEditDialog + +from .IrcNetworkManager import IrcIdentity + +import Utilities +import UI.PixmapCache + + +# TODO: implement "Away" page +# TODO: implement "Advanced" page +class IrcIdentitiesEditDialog(QDialog, Ui_IrcIdentitiesEditDialog): + """ + Class implementing the identities management dialog. + """ + def __init__(self, manager, identityName, parent=None): + """ + Constructor + + @param manager reference to the IRC network manager object (IrcNetworkManager) + @param identityName name of the identity to be selected (string) + @param parent reference to the parent widget (QWidget) + """ + super().__init__(parent) + self.setupUi(self) + + self.addButton.setIcon(UI.PixmapCache.getIcon("plus.png")) + self.copyButton.setIcon(UI.PixmapCache.getIcon("editCopy.png")) + self.renameButton.setIcon(UI.PixmapCache.getIcon("editRename.png")) + self.deleteButton.setIcon(UI.PixmapCache.getIcon("minus.png")) + self.nicknameAddButton.setIcon(UI.PixmapCache.getIcon("plus.png")) + self.nicknameDeleteButton.setIcon(UI.PixmapCache.getIcon("minus.png")) + self.nicknameUpButton.setIcon(UI.PixmapCache.getIcon("1uparrow.png")) + self.nicknameDownButton.setIcon(UI.PixmapCache.getIcon("1downarrow.png")) + + self.__manager = manager + + self.__identities = self.__manager.getIdentities() + self.__currentIdentity = None + + identities = list(sorted(self.__manager.getIdentityNames())) + identities[identities.index(IrcIdentity.DefaultIdentityName)] = \ + IrcIdentity.DefaultIdentityDisplay + self.identitiesCombo.addItems(identities) + if identityName == IrcIdentity.DefaultIdentityName: + identityName = IrcIdentity.DefaultIdentityDisplay + index = self.identitiesCombo.findText(identityName) + if index == -1: + index = 0 + identityName = self.identitiesCombo.itemText(0) + self.identitiesCombo.setCurrentIndex(index) + + self.on_identitiesCombo_currentIndexChanged(identityName) + + def __updateIdentitiesButtons(self): + """ + Private slot to update the status of the identity related buttons. + """ + enable = self.identitiesCombo.currentText() != IrcIdentity.DefaultIdentityDisplay + self.renameButton.setEnabled(enable) + self.deleteButton.setEnabled(enable) + + @pyqtSlot(str) + def on_identitiesCombo_currentIndexChanged(self, identity): + """ + Private slot to handle the selection of an identity. + """ + if identity == IrcIdentity.DefaultIdentityDisplay: + identity = IrcIdentity.DefaultIdentityName + self.__updateIdentitiesButtons() + + if self.__currentIdentity and not self.__checkCurrentIdentity(): + return + + self.__refreshCurrentIdentity() + + self.__currentIdentity = self.__identities[identity] + + # TODO: update of tab widget not implemented yet + self.realnameEdit.setText(self.__currentIdentity.getRealName()) + self.nicknamesList.clear() + self.nicknamesList.addItems(self.__currentIdentity.getNickNames()) + self.serviceEdit.setText(self.__currentIdentity.getServiceName()) + self.passwordEdit.setText(self.__currentIdentity.getPassword()) + + self.__updateIdentitiesButtons() + self.__updateNicknameUpDownButtons() + self.__updateNicknameButtons() +## void IdentityDialog::updateIdentity(int index) +## { +## m_insertRememberLineOnAwayChBox->setChecked(m_currentIdentity->getInsertRememberLineOnAway()); +## m_awayMessageEdit->setText(m_currentIdentity->getAwayMessage()); +## m_awayNickEdit->setText(m_currentIdentity->getAwayNickname()); +## awayCommandsGroup->setChecked(m_currentIdentity->getRunAwayCommands()); +## m_awayEdit->setText(m_currentIdentity->getAwayCommand()); +## m_unAwayEdit->setText(m_currentIdentity->getReturnCommand()); +## automaticAwayGroup->setChecked(m_currentIdentity->getAutomaticAway()); +## m_awayInactivitySpin->setValue(m_currentIdentity->getAwayInactivity()); +## m_automaticUnawayChBox->setChecked(m_currentIdentity->getAutomaticUnaway()); +## +## m_sCommandEdit->setText(m_currentIdentity->getShellCommand()); +## m_codecCBox->setCurrentIndex(Konversation::IRCCharsets::self()->shortNameToIndex(m_currentIdentity->getCodecName())); +## m_loginEdit->setText(m_currentIdentity->getIdent()); +## m_quitEdit->setText(m_currentIdentity->getQuitReason()); +## m_partEdit->setText(m_currentIdentity->getPartReason()); +## m_kickEdit->setText(m_currentIdentity->getKickReason()); +## } + + def __refreshCurrentIdentity(self): + """ + Private method to read back the data for the current identity. + """ + if self.__currentIdentity is None: + return + + self.__currentIdentity.setRealName(self.realnameEdit.text()) + self.__currentIdentity.setNickNames([self.nicknamesList.item(row).text() + for row in range(self.nicknamesList.count())]) + self.__currentIdentity.setServiceName(self.serviceEdit.text()) + self.__currentIdentity.setPassword(self.passwordEdit.text()) +## +## void IdentityDialog::refreshCurrentIdentity() +## { +## m_currentIdentity->setInsertRememberLineOnAway(m_insertRememberLineOnAwayChBox->isChecked()); +## m_currentIdentity->setAwayMessage(m_awayMessageEdit->text()); +## m_currentIdentity->setAwayNickname(m_awayNickEdit->text()); +## m_currentIdentity->setRunAwayCommands(awayCommandsGroup->isChecked()); +## m_currentIdentity->setAwayCommand(m_awayEdit->text()); +## m_currentIdentity->setReturnCommand(m_unAwayEdit->text()); +## m_currentIdentity->setAutomaticAway(automaticAwayGroup->isChecked()); +## m_currentIdentity->setAwayInactivity(m_awayInactivitySpin->value()); +## m_currentIdentity->setAutomaticUnaway(m_automaticUnawayChBox->isChecked()); +## +## m_currentIdentity->setShellCommand(m_sCommandEdit->text()); +## if(m_codecCBox->currentIndex() >= 0 && m_codecCBox->currentIndex() < Konversation::IRCCharsets::self()->availableEncodingShortNames().count()) +## m_currentIdentity->setCodecName(Konversation::IRCCharsets::self()->availableEncodingShortNames()[m_codecCBox->currentIndex()]); +## m_currentIdentity->setIdent(m_loginEdit->text()); +## m_currentIdentity->setQuitReason(m_quitEdit->text()); +## m_currentIdentity->setPartReason(m_partEdit->text()); +## m_currentIdentity->setKickReason(m_kickEdit->text()); +## } +## + + def __checkCurrentIdentity(self): + """ + Private method to check the data for the current identity. + + @return flag indicating a successful check (boolean) + """ + if self.nicknamesList.count() == 0: + E5MessageBox.critical(self, + self.trUtf8("Edit Identity"), + self.trUtf8("""The identity must contain at least one nick name.""")) + block = self.identitiesCombo.blockSignals(True) + identity = self.__currentIdentity.getName() + if identity == IrcIdentity.DefaultIdentityName: + identity = IrcIdentity.DefaultIdentityDisplay + self.identitiesCombo.setCurrentIndex(self.identitiesCombo.findText(identity)) + self.identitiesCombo.blockSignals(block) + self.identityTabWidget.setCurrentIndex(0) + self.nicknameEdit.setFocus() + return False + + if not self.realnameEdit.text(): + E5MessageBox.critical(self, + self.trUtf8("Edit Identity"), + self.trUtf8("""The identity must have a real name.""")) + block = self.identitiesCombo.blockSignals(True) + identity = self.__currentIdentity.getName() + if identity == IrcIdentity.DefaultIdentityName: + identity = IrcIdentity.DefaultIdentityDisplay + self.identitiesCombo.setCurrentIndex(self.identitiesCombo.findText(identity)) + self.identitiesCombo.blockSignals(block) + self.identityTabWidget.setCurrentIndex(0) + self.realnameEdit.setFocus() + return False + + return True + + @pyqtSlot() + def on_addButton_clicked(self): + """ + Private slot to add a new idntity. + """ + name, ok = QInputDialog.getText( + self, + self.trUtf8("Add Identity"), + self.trUtf8("Identity Name:"), + QLineEdit.Normal) + + if ok: + if name: + if name in self.__identities: + E5MessageBox.critical(self, + self.trUtf8("Add Identity"), + self.trUtf8("""An identity named <b>{0}</b> already exists.""" + """ You must provide a different name.""").format( + name)) + self.on_addButton_clicked() + else: + identity = IrcIdentity(name) + identity.setIdent(Utilities.getUserName()) + identity.setRealName(Utilities.getRealName()) + self.__identities[name] = identity + self.identitiesCombo.addItem(name) + self.identitiesCombo.setCurrentIndex(self.identitiesCombo.count() - 1) + else: + E5MessageBox.critical(self, + self.trUtf8("Add Identity"), + self.trUtf8("""The identity has to have a name.""")) + self.on_addButton_clicked() + + @pyqtSlot() + def on_copyButton_clicked(self): + """ + Private slot to copy the selected identity. + """ + currentIdentity = self.identitiesCombo.currentText() + name, ok = QInputDialog.getText( + self, + self.trUtf8("Copy Identity"), + self.trUtf8("Identity Name:"), + QLineEdit.Normal, + currentIdentity) + + if ok: + if name: + if name in self.__identities: + E5MessageBox.critical(self, + self.trUtf8("Copy Identity"), + self.trUtf8("""An identity named <b>{0}</b> already exists.""" + """ You must provide a different name.""").format( + name)) + self.on_copyButton_clicked() + else: + identity = copy.deepcopy(self.__currentIdentity) + identity.setName(name) + self.__identities[name] = identity + self.identitiesCombo.addItem(name) + self.identitiesCombo.setCurrentIndex(self.identitiesCombo.count() - 1) + else: + E5MessageBox.critical(self, + self.trUtf8("Copy Identity"), + self.trUtf8("""The identity has to have a name.""")) + self.on_copyButton_clicked() + + @pyqtSlot() + def on_renameButton_clicked(self): + """ + Private slot to rename the selected identity. + """ + currentIdentity = self.identitiesCombo.currentText() + name, ok = QInputDialog.getText( + self, + self.trUtf8("Rename Identity"), + self.trUtf8("Identity Name:"), + QLineEdit.Normal, + currentIdentity) + + if ok and name != currentIdentity: + if name: + if name in self.__identities: + E5MessageBox.critical(self, + self.trUtf8("Rename Identity"), + self.trUtf8("""An identity named <b>{0}</b> already exists.""" + """ You must provide a different name.""").format( + name)) + self.on_renameButton_clicked() + else: + del self.__identities[currentIdentity] + self.__currentIdentity.setName(name) + self.__identities[name] = self.__currentIdentity + self.identitiesCombo.setItemText( + self.identitiesCombo.currentIndex(), name) + else: + E5MessageBox.critical(self, + self.trUtf8("Copy Identity"), + self.trUtf8("""The identity has to have a name.""")) + self.on_renameButton_clicked() + + @pyqtSlot() + def on_deleteButton_clicked(self): + """ + Private slot to rename the selected identity. + """ + currentIdentity = self.identitiesCombo.currentText() + if currentIdentity == IrcIdentity.DefaultIdentityDisplay: + return + + inUse = False + for networkName in self.__manager.getNetworkNames(): + inUse = ( + self.__manager.getNetwork(networkName).getIdentityName() == + currentIdentity) + if inUse: + break + + if inUse: + msg = self.trUtf8("""This identity is in use. If you remove it, the network""" + """ settings using it will fall back to the default""" + """ identity. Should it be deleted anyway?""") + else: + msg = self.trUtf8("""Do you really want to delete all information for""" + """ this identity?""") + res = E5MessageBox.yesNo(self, + self.trUtf8("Delete Identity"), + msg, + icon = E5MessageBox.Warning) + if res: + del self.__identities[currentIdentity] + self.identitiesCombo.removeItem( + self.identitiesCombo.findText(currentIdentity)) + + def __updateNicknameUpDownButtons(self): + """ + Private method to set the enabled state of the nick name up and down buttons. + """ + if len(self.nicknamesList.selectedItems()) == 0: + self.nicknameUpButton.setEnabled(False) + self.nicknameDownButton.setEnabled(False) + else: + if self.nicknamesList.currentRow() == 0: + self.nicknameUpButton.setEnabled(False) + self.nicknameDownButton.setEnabled(True) + elif self.nicknamesList.currentRow() == self.nicknamesList.count() - 1: + self.nicknameUpButton.setEnabled(True) + self.nicknameDownButton.setEnabled(False) + else: + self.nicknameUpButton.setEnabled(True) + self.nicknameDownButton.setEnabled(True) + + def __updateNicknameButtons(self): + """ + Private slot to update the nick name buttons except the up and down buttons. + """ + self.nicknameDeleteButton.setEnabled( + len(self.nicknamesList.selectedItems()) != 0) + + self.nicknameAddButton.setEnabled(self.nicknameEdit.text() != "") + + @pyqtSlot(str) + def on_nicknameEdit_textEdited(self, nick): + """ + Private slot handling a change of the nick name. + """ + itm = self.nicknamesList.currentItem() + if itm: + itm.setText(nick) + + self.__updateNicknameButtons() + + @pyqtSlot() + def on_nicknamesList_itemSelectionChanged(self): + """ + Private slot handling the selection of a nick name. + """ + items = self.nicknamesList.selectedItems() + if items: + self.nicknameEdit.setText(items[0].text()) + + self.__updateNicknameUpDownButtons() + self.__updateNicknameButtons() + + self.nicknameEdit.setFocus() + + @pyqtSlot() + def on_nicknameAddButton_clicked(self): + """ + Private slot to add a new nickname. + """ + nick = self.nicknameEdit.text() + if nick not in [self.nicknamesList.item(row).text() + for row in range(self.nicknamesList.count())]: + self.nicknamesList.insertItem(0, nick) + self.nicknamesList.setCurrentRow(0, QItemSelectionModel.Clear) + self.nicknameEdit.clear() + self.__updateNicknameButtons() + + @pyqtSlot() + def on_nicknameDeleteButton_clicked(self): + """ + Private slot to delete a nick name. + """ + itm = self.nicknamesList.takeItem(self.nicknamesList.currentRow()) + del itm + self.__updateNicknameButtons() + + @pyqtSlot() + def on_nicknameUpButton_clicked(self): + """ + Private slot to move the selected entry up one row. + """ + row = self.nicknamesList.currentRow() + if row > 0: + itm = self.nicknamesList.takeItem(row) + row -= 1 + self.nicknamesList.insertItem(row, itm) + self.nicknamesList.setCurrentItem(itm) + + @pyqtSlot() + def on_nicknameDownButton_clicked(self): + """ + Private slot to move the selected entry down one row. + """ + row = self.nicknamesList.currentRow() + if row < self.nicknamesList.count() - 1: + itm = self.nicknamesList.takeItem(row) + row += 1 + self.nicknamesList.insertItem(row, itm) + self.nicknamesList.setCurrentItem(itm) + + def accept(self): + """ + Public slot handling the acceptance of the dialog. + """ + if not self.__checkCurrentIdentity(): + return + + self.__refreshCurrentIdentity() + self.__manager.setIdentities(self.__identities) + + super().accept()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Network/IRC/IrcIdentitiesEditDialog.ui Sat Dec 01 19:51:46 2012 +0100 @@ -0,0 +1,285 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>IrcIdentitiesEditDialog</class> + <widget class="QDialog" name="IrcIdentitiesEditDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>580</width> + <height>510</height> + </rect> + </property> + <property name="windowTitle"> + <string>IRC Identities</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Identity:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="identitiesCombo"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Select the identity to work on</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="addButton"> + <property name="toolTip"> + <string>Press to add a new identity</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="copyButton"> + <property name="toolTip"> + <string>Press to copy the selected identity</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="renameButton"> + <property name="toolTip"> + <string>Press to rename the selected identity</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="deleteButton"> + <property name="toolTip"> + <string>Press to delete the selected identity</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QTabWidget" name="identityTabWidget"> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="generalTab"> + <attribute name="title"> + <string>General</string> + </attribute> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Real Name:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="realnameEdit"> + <property name="toolTip"> + <string>Enter the real name</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="2"> + <widget class="QGroupBox" name="nickNameGroup"> + <property name="title"> + <string>Nick Names</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0" colspan="2"> + <widget class="QLineEdit" name="nicknameEdit"> + <property name="toolTip"> + <string>Enter a nick name to add</string> + </property> + </widget> + </item> + <item row="1" column="0" rowspan="5"> + <widget class="QListWidget" name="nicknamesList"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QToolButton" name="nicknameAddButton"> + <property name="toolTip"> + <string>Press to add the entered nick name</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QToolButton" name="nicknameDeleteButton"> + <property name="toolTip"> + <string>Press to delete the selected nick name</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QToolButton" name="nicknameUpButton"> + <property name="toolTip"> + <string>Press to move the selected nick name up</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QToolButton" name="nicknameDownButton"> + <property name="toolTip"> + <string>Press to move the selected nick name down</string> + </property> + </widget> + </item> + <item row="5" column="1"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>87</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QGroupBox" name="autoIdentifyGroup"> + <property name="title"> + <string>Auto Identify</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Service:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="serviceEdit"> + <property name="toolTip"> + <string>Enter the name of the service to identify against</string> + </property> + <property name="whatsThis"> + <string>Service name can be <b><i>nickserv</i></b> or a network-dependent name such as <b><i>nickserv@services.dal.net</i></b></string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Password:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="passwordEdit"> + <property name="toolTip"> + <string>Enter the password</string> + </property> + <property name="echoMode"> + <enum>QLineEdit::Password</enum> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="awayTab"> + <attribute name="title"> + <string>Away</string> + </attribute> + </widget> + <widget class="QWidget" name="advancedTab"> + <attribute name="title"> + <string>Advanced</string> + </attribute> + </widget> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>identitiesCombo</tabstop> + <tabstop>addButton</tabstop> + <tabstop>copyButton</tabstop> + <tabstop>renameButton</tabstop> + <tabstop>deleteButton</tabstop> + <tabstop>identityTabWidget</tabstop> + <tabstop>realnameEdit</tabstop> + <tabstop>nicknameEdit</tabstop> + <tabstop>nicknamesList</tabstop> + <tabstop>nicknameAddButton</tabstop> + <tabstop>nicknameDeleteButton</tabstop> + <tabstop>nicknameUpButton</tabstop> + <tabstop>nicknameDownButton</tabstop> + <tabstop>serviceEdit</tabstop> + <tabstop>passwordEdit</tabstop> + <tabstop>buttonBox</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>IrcIdentitiesEditDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>IrcIdentitiesEditDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- a/Network/IRC/IrcNetworkEditDialog.py Sat Dec 01 11:48:52 2012 +0100 +++ b/Network/IRC/IrcNetworkEditDialog.py Sat Dec 01 19:51:46 2012 +0100 @@ -19,6 +19,7 @@ from .IrcNetworkManager import IrcIdentity, IrcChannel from .IrcChannelEditDialog import IrcChannelEditDialog from .IrcServerEditDialog import IrcServerEditDialog +from .IrcIdentitiesEditDialog import IrcIdentitiesEditDialog import UI.PixmapCache @@ -55,17 +56,7 @@ self.networkEdit.setText(networkName) # identities - identities = list(sorted(self.__manager.getIdentityNames())) - identities[identities.index(IrcIdentity.DefaultIdentityName)] = \ - IrcIdentity.DefaultIdentityDisplay - self.identityCombo.addItems(identities) - identity = self.__network.getIdentityName() - if identity == IrcIdentity.DefaultIdentityName: - identity = IrcIdentity.DefaultIdentityDisplay - index = self.identityCombo.findText(identity) - if index == -1: - index = 0 - self.identityCombo.setCurrentIndex(index) + self.__refreshIdentityCombo(self.__network.getIdentityName()) # server self.serverEdit.setText(self.__network.getServerName()) @@ -101,22 +92,45 @@ """ self.__updateOkButton() + def __refreshIdentityCombo(self, currentIdentity): + """ + Private method to refresh the identity combo. + + @param currentIdentity name of the identity to select (string) + """ + self.identityCombo.clear() + + identities = list(sorted(self.__manager.getIdentityNames())) + identities[identities.index(IrcIdentity.DefaultIdentityName)] = \ + IrcIdentity.DefaultIdentityDisplay + self.identityCombo.addItems(identities) + if currentIdentity == IrcIdentity.DefaultIdentityName: + currentIdentity = IrcIdentity.DefaultIdentityDisplay + index = self.identityCombo.findText(currentIdentity) + if index == -1: + index = 0 + self.identityCombo.setCurrentIndex(index) + @pyqtSlot(str) - def on_identityCombo_activated(self, identity): + def on_identityCombo_currentIndexChanged(self, identity): """ Private slot to handle the selection of an identity. @param identity selected entity (string) """ + if identity == IrcIdentity.DefaultIdentityDisplay: + identity = IrcIdentity.DefaultIdentityName self.__network.setIdentityName(identity) @pyqtSlot() def on_editIdentitiesButton_clicked(self): """ - Slot documentation goes here. + Private slot to edit the identities. """ - # TODO: not implemented yet - raise NotImplementedError + currentIdentity = self.identityCombo.currentText() + dlg = IrcIdentitiesEditDialog(self.__manager, currentIdentity, self) + dlg.exec_() + self.__refreshIdentityCombo(currentIdentity) @pyqtSlot() def on_editServerButton_clicked(self):
--- a/Network/IRC/IrcNetworkListDialog.py Sat Dec 01 11:48:52 2012 +0100 +++ b/Network/IRC/IrcNetworkListDialog.py Sat Dec 01 19:51:46 2012 +0100 @@ -16,6 +16,7 @@ from .IrcNetworkManager import IrcIdentity from .IrcNetworkEditDialog import IrcNetworkEditDialog +from .IrcIdentitiesEditDialog import IrcIdentitiesEditDialog class IrcNetworkListDialog(QDialog, Ui_IrcNetworkListDialog): @@ -34,14 +35,7 @@ self.__manager = manager - networkNames = self.__manager.getNetworkNames() - for networkName in networkNames: - topitm = QTreeWidgetItem(self.networksList, [networkName]) - self.__refreshNetworkEntry(topitm) - topitm.setExpanded(True) - self.__resizeColumns() - - self.__checkButtons() + self.__refreshNetworksList() def __resizeColumns(self): """ @@ -104,6 +98,21 @@ self.__resizeColumns() + def __refreshNetworksList(self): + """ + Private method to refresh the complete networks list. + """ + self.networksList.clear() + + networkNames = self.__manager.getNetworkNames() + for networkName in networkNames: + topitm = QTreeWidgetItem(self.networksList, [networkName]) + self.__refreshNetworkEntry(topitm) + topitm.setExpanded(True) + self.__resizeColumns() + + self.__checkButtons() + @pyqtSlot() def on_networksList_itemSelectionChanged(self): """ @@ -217,3 +226,24 @@ citm = itm.child(index) if citm.text(0) == self.trUtf8("Auto-Connect"): citm.setText(1, autoConnect) + + @pyqtSlot() + def on_editIdentitiesButton_clicked(self): + """ + Private slot to edit the identities. + """ + dlg = IrcIdentitiesEditDialog(self.__manager, "", self) + dlg.exec_() + + selectedNetwork = self.networksList.selectedItems() + if selectedNetwork: + selectedNetworkName = selectedNetwork[0].text(0) + else: + selectedNetworkName = "" + self.__refreshNetworksList() + if selectedNetworkName: + for index in range(self.networksList.topLevelItemCount()): + itm = self.networksList.topLevelItem(index) + if itm.text(0) == selectedNetworkName: + itm.setSelected(True) + break
--- a/Network/IRC/IrcNetworkListDialog.ui Sat Dec 01 11:48:52 2012 +0100 +++ b/Network/IRC/IrcNetworkListDialog.ui Sat Dec 01 19:51:46 2012 +0100 @@ -81,7 +81,7 @@ <string>Press to toggle the auto-connect flag of the selected network</string> </property> <property name="text"> - <string>Auto-Connect</string> + <string>&Auto-Connect</string> </property> <property name="checkable"> <bool>true</bool> @@ -89,6 +89,26 @@ </widget> </item> <item> + <widget class="Line" name="line"> + <property name="lineWidth"> + <number>2</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="editIdentitiesButton"> + <property name="toolTip"> + <string>Press to edit the identities</string> + </property> + <property name="text"> + <string>Edit &Identities...</string> + </property> + </widget> + </item> + <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -121,6 +141,7 @@ <tabstop>editButton</tabstop> <tabstop>deleteButton</tabstop> <tabstop>autoConnectButton</tabstop> + <tabstop>editIdentitiesButton</tabstop> <tabstop>buttonBox</tabstop> </tabstops> <resources/>
--- a/Network/IRC/IrcNetworkManager.py Sat Dec 01 11:48:52 2012 +0100 +++ b/Network/IRC/IrcNetworkManager.py Sat Dec 01 19:51:46 2012 +0100 @@ -7,6 +7,8 @@ Module implementing the IRC data structures and their manager. """ +import copy + from PyQt4.QtCore import pyqtSignal, QObject, QCoreApplication import Utilities @@ -35,6 +37,7 @@ self.__nickNames = [] self.__serviceName = "" self.__password = "" + self.__ident = Utilities.getUserName() def save(self, settings): """ @@ -43,6 +46,7 @@ @param settings reference to the settings object (QSettings) """ # no need to save the name because that is the group key + settings.setValue("Ident", self.__ident) settings.setValue("RealName", self.__realName) settings.setValue("NickNames", self.__nickNames) settings.setValue("ServiceName", self.__serviceName) @@ -54,11 +58,20 @@ @param settings reference to the settings object (QSettings) """ + self.__ident = settings.value("Ident", Utilities.getUserName()) self.__realName = settings.value("RealName", "") self.__nickNames = Preferences.toList(settings.value("NickNames", [])) self.__serviceName = settings.value("ServiceName", "") self.__password = settings.value("Password", "") + def setName(self, name): + """ + Public method to set the identity name. + + @param identity name (string) + """ + self.__name = name + def getName(self): """ Public method to get the identity name. @@ -67,19 +80,21 @@ """ return self.__name + def setIdent(self, name): + """ + Public method to set the real identity name. + + @param name real identity name (string) + """ + self.__ident = name + def getIdent(self): """ Public method to get the real identity name. - Note: This methdo takes care of converting the default - identity name to the user's user name. - @return real identity name (string) """ - if self.__name == IrcIdentity.DefaultIdentityName: - return Utilities.getUserName() - else: - return self.__name + return self.__ident def setRealName(self, name): """ @@ -153,9 +168,13 @@ @return default identity (IrcIdentity) """ userName = Utilities.getUserName() + realName = Utilities.getRealName() + if not realName: + realName = "eric IDE chat" identity = IrcIdentity(IrcIdentity.DefaultIdentityName) identity.setNickNames([userName, userName + "_", userName + "__"]) - identity.setRealName(userName) + identity.setRealName(realName) + identity.setIdent(userName) return identity @@ -479,7 +498,7 @@ @return list of channels for the network (list of IrcChannel) """ - return list(self.__channels.values()) + return list(copy.deepcopy(self.__channels).values()) def getChannelNames(self): """ @@ -620,6 +639,7 @@ self.__settings.beginGroup("IRC") # identities + self.__settings.remove("Identities") self.__settings.beginGroup("Identities") for key in self.__identities: self.__settings.beginGroup(key) @@ -628,6 +648,7 @@ self.__settings.endGroup() # networks + self.__settings.remove("Networks") self.__settings.beginGroup("Networks") for key in self.__networks: self.__settings.beginGroup(key) @@ -729,6 +750,29 @@ else: return None + def getIdentities(self): + """ + Public method to get a copy of all identities. + + @return dictionary of all identities (dict of IrcIdentity) + """ + return copy.deepcopy(self.__identities) + + def setIdentities(self, identities): + """ + Public method to set the identities. + + @param identities dictionary of all identities (dict of IrcIdentity) + """ + self.__identities = copy.deepcopy(identities) + self.identityChanged() + + # Check all networks, if the identity they use is still available. + # If it isn't, change them to use the default identity. + for network in self.__networks.values(): + if network.getIdentityName() not in self.__identities: + network.setIdentityName(IrcIdentity.DefaultIdentityName) + def getIdentityNames(self): """ Public method to get the names of all identities. @@ -826,36 +870,6 @@ self.__networks[name] = network self.networkChanged() - # TODO: check, if this method is needed -## def createNetwork(self, name, identity, server, channels=None): -## """ -## Public method to create a new network object. -## -## @param name name of the network (string) -## @param identity reference to an identity object to associate with -## this network (IrcIdentity) -## @param server reference to a server object to associate with this -## network (IrcServer) -## @param channels list of channels for the network (list of IrcChannel) -## @return reference to the created network object (IrcNetwork) -## """ -## if not self.__loaded: -## self.__load() -## -## if name in self.__networks: -## return None -## -## network = IrcNetwork(name) -## network.setIdentityName(identity.getName()) -#### network.setServerName(server.getServer()) -#### network.setChannels(channels[:]) -#### network.setAutoJoinChannels(autoJoinChannels) -## self.__networks[name] = network -## -## self.networkChanged() -## -## return network -## def deleteNetwork(self, name): """ Public method to delete the given network.
--- a/Network/IRC/IrcNetworkWidget.py Sat Dec 01 11:48:52 2012 +0100 +++ b/Network/IRC/IrcNetworkWidget.py Sat Dec 01 19:51:46 2012 +0100 @@ -160,7 +160,7 @@ return network.getChannels() @pyqtSlot(str) - def on_nickCombo_activated(self, nick): + def on_nickCombo_currentIndexChanged(self, nick): """ Private slot to use another nick name.
--- a/Utilities/__init__.py Sat Dec 01 11:48:52 2012 +0100 +++ b/Utilities/__init__.py Sat Dec 01 19:51:46 2012 +0100 @@ -1138,6 +1138,20 @@ return user +def getRealName(): + """ + Function to get the real name of the user. + + @return real name of the user (string) + """ + if isWindowsPlatform(): + return win32_getRealName() + else: + import pwd + user = getpass.getuser() + return pwd.getpwnam(user).pw_gecos + + def getHomeDir(): """ Function to get a users home directory @@ -1656,3 +1670,22 @@ except KeyError: u = getEnvironmentEntry('username', None) return u + + +def win32_getRealName(): + """ + Function to get the user's real name (aka. display name) under Win32. + + @return real name of the current user (string) + """ + import ctypes + + GetUserNameEx = ctypes.windll.secur32.GetUserNameExW + NameDisplay = 3 + + size = ctypes.pointer(ctypes.c_ulong(0)) + GetUserNameEx(NameDisplay, None, size) + + nameBuffer = ctypes.create_unicode_buffer(size.contents.value) + GetUserNameEx(NameDisplay, nameBuffer, size) + return nameBuffer.value
--- a/eric5.e4p Sat Dec 01 11:48:52 2012 +0100 +++ b/eric5.e4p Sat Dec 01 19:51:46 2012 +0100 @@ -1066,6 +1066,7 @@ <Source>Network/IRC/IrcNetworkEditDialog.py</Source> <Source>Network/IRC/IrcChannelEditDialog.py</Source> <Source>Network/IRC/IrcServerEditDialog.py</Source> + <Source>Network/IRC/IrcIdentitiesEditDialog.py</Source> </Sources> <Forms> <Form>PyUnit/UnittestDialog.ui</Form> @@ -1378,6 +1379,7 @@ <Form>Network/IRC/IrcNetworkEditDialog.ui</Form> <Form>Network/IRC/IrcChannelEditDialog.ui</Form> <Form>Network/IRC/IrcServerEditDialog.ui</Form> + <Form>Network/IRC/IrcIdentitiesEditDialog.ui</Form> </Forms> <Translations> <Translation>i18n/eric5_cs.qm</Translation>