Continued with the IRC management.

Sat, 01 Dec 2012 19:51:46 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 01 Dec 2012 19:51:46 +0100
changeset 2239
a47b50e80a20
parent 2238
9977d3081ab6
child 2240
11445430c553

Continued with the IRC management.

Network/IRC/IrcIdentitiesEditDialog.py file | annotate | diff | comparison | revisions
Network/IRC/IrcIdentitiesEditDialog.ui file | annotate | diff | comparison | revisions
Network/IRC/IrcNetworkEditDialog.py file | annotate | diff | comparison | revisions
Network/IRC/IrcNetworkListDialog.py file | annotate | diff | comparison | revisions
Network/IRC/IrcNetworkListDialog.ui file | annotate | diff | comparison | revisions
Network/IRC/IrcNetworkManager.py file | annotate | diff | comparison | revisions
Network/IRC/IrcNetworkWidget.py file | annotate | diff | comparison | revisions
Utilities/__init__.py file | annotate | diff | comparison | revisions
eric5.e4p file | annotate | diff | comparison | revisions
icons/default/editRename.png file | annotate | diff | comparison | revisions
--- /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 &lt;b&gt;&lt;i&gt;nickserv&lt;/i&gt;&lt;/b&gt; or a network-dependent name such as &lt;b&gt;&lt;i&gt;nickserv@services.dal.net&lt;/i&gt;&lt;/b&gt;</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>&amp;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 &amp;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>
Binary file icons/default/editRename.png has changed

eric ide

mercurial