Started implementing the IRC network management dialog.

Tue, 27 Nov 2012 18:50:02 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Tue, 27 Nov 2012 18:50:02 +0100
changeset 2232
47290dad6d0b
parent 2231
241df9311ade
child 2233
26b34180a943

Started implementing the IRC network management dialog.

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
Network/IRC/IrcWidget.py file | annotate | diff | comparison | revisions
eric5.e4p file | annotate | diff | comparison | revisions
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Network/IRC/IrcNetworkListDialog.py	Tue Nov 27 18:50:02 2012 +0100
@@ -0,0 +1,138 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to list the configured IRC networks.
+"""
+
+from PyQt4.QtCore import pyqtSlot
+from PyQt4.QtGui import QDialog, QTreeWidgetItem
+
+from E5Gui import E5MessageBox
+
+from .Ui_IrcNetworkListDialog import Ui_IrcNetworkListDialog
+
+from .IrcNetworkManager import IrcIdentity
+
+
+class IrcNetworkListDialog(QDialog, Ui_IrcNetworkListDialog):
+    """
+    Class implementing a dialog to list the configured IRC networks.
+    """
+    def __init__(self, manager, parent=None):
+        """
+        Constructor
+        
+        @param manager reference to the IRC network manager (IrcNetworkManager)
+        @param parent reference to the parent widget (QWidget)
+        """
+        super().__init__(parent)
+        self.setupUi(self)
+        
+        self.__manager = manager
+        
+        networkNames = self.__manager.getNetworkNames()
+        for networkName in networkNames:
+            topitm = QTreeWidgetItem(self.networksList, [networkName])
+            network = self.__manager.getNetwork(networkName)
+            server = self.__manager.getServer(network.getServerName())
+            identityName = network.getIdentityName()
+            if identityName == IrcIdentity.DefaultIdentityName:
+                identityName = IrcIdentity.DefaultIdentityDisplay
+            QTreeWidgetItem(topitm,
+                [self.trUtf8("Identity"), identityName])
+            QTreeWidgetItem(topitm,
+                [self.trUtf8("Server"), "{0}:{1}".format(
+                 server.getServer(), server.getPort())])
+            QTreeWidgetItem(topitm,
+                [self.trUtf8("Channels"), ", ".join(network.getChannels())])
+            if network.autoJoinChannels():
+                autoJoin = self.trUtf8("Yes")
+            else:
+                autoJoin = self.trUtf8("No")
+            QTreeWidgetItem(topitm,
+                [self.trUtf8("Auto-join Channels"), autoJoin])
+            topitm.setExpanded(True)
+        self.__resizeColumns()
+        
+        self.__checkButtons()
+
+    def __resizeColumns(self):
+        """
+        Private slot to resize all columns to their contents.
+        """
+        for col in range(self.networksList.columnCount()):
+            self.networksList.resizeColumnToContents(col)
+    
+    def __checkButtons(self):
+        """
+        Public slot to set the enabled state of the buttons.
+        """
+        enable = True
+        selectedItems = self.networksList.selectedItems()
+        if len(selectedItems) == 0:
+            enable = False
+        else:
+            for itm in selectedItems:
+                enable &= itm.parent() is None
+        
+        self.editButton.setEnabled(enable)
+        self.deleteButton.setEnabled(enable)
+    
+    @pyqtSlot()
+    def on_networksList_itemSelectionChanged(self):
+        """
+        Slot documentation goes here.
+        """
+        self.__checkButtons()
+    
+    @pyqtSlot()
+    def on_newButton_clicked(self):
+        """
+        Slot documentation goes here.
+        """
+        # TODO: not implemented yet
+        raise NotImplementedError
+    
+    @pyqtSlot()
+    def on_editButton_clicked(self):
+        """
+        Slot documentation goes here.
+        """
+        # TODO: not implemented yet
+        raise NotImplementedError
+    
+    @pyqtSlot()
+    def on_deleteButton_clicked(self):
+        """
+        Private slot to delete the selected entry.
+        """
+        itm = self.networksList.selectedItems()[0]
+        if itm.parent() is None:
+            networkName = itm.text(0)
+            res = E5MessageBox.yesNo(self,
+                self.trUtf8("Delete Irc Network"),
+                self.trUtf8("""Do you really want to delete  IRC network <b>{0}</b>?""")\
+                    .format(networkName))
+            if res:
+                index = self.networksList.indexOfTopLevelItem(itm)
+                self.networksList.takeTopLevelItem(index)
+                del itm
+                
+                self.__manager.deleteNetwork(networkName)
+    
+    @pyqtSlot(QTreeWidgetItem)
+    def on_networksList_itemExpanded(self, item):
+        """
+        Private slot handling the expansion of a top level item.
+        """
+        self.__resizeColumns()
+    
+    @pyqtSlot(QTreeWidgetItem)
+    def on_networksList_itemCollapsed(self, item):
+        """
+        Private slot handling the collapse of a top level item.
+        """
+        self.__resizeColumns()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Network/IRC/IrcNetworkListDialog.ui	Tue Nov 27 18:50:02 2012 +0100
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IrcNetworkListDialog</class>
+ <widget class="QDialog" name="IrcNetworkListDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>500</width>
+    <height>350</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>IRC Networks</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <widget class="QTreeWidget" name="networksList">
+     <property name="editTriggers">
+      <set>QAbstractItemView::NoEditTriggers</set>
+     </property>
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+     <property name="columnCount">
+      <number>2</number>
+     </property>
+     <attribute name="headerVisible">
+      <bool>false</bool>
+     </attribute>
+     <column>
+      <property name="text">
+       <string notr="true">1</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string notr="true">2</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <widget class="QPushButton" name="newButton">
+       <property name="toolTip">
+        <string>Press to define a new network</string>
+       </property>
+       <property name="text">
+        <string>&amp;New...</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="editButton">
+       <property name="toolTip">
+        <string>Press to edit the selected network</string>
+       </property>
+       <property name="text">
+        <string>&amp;Edit...</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="deleteButton">
+       <property name="toolTip">
+        <string>Press to delete the selected network</string>
+       </property>
+       <property name="text">
+        <string>&amp;Delete</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="verticalSpacer">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0" colspan="2">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Close</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>networksList</tabstop>
+  <tabstop>newButton</tabstop>
+  <tabstop>editButton</tabstop>
+  <tabstop>deleteButton</tabstop>
+  <tabstop>buttonBox</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>IrcNetworkListDialog</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>IrcNetworkListDialog</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/IrcNetworkManager.py	Mon Nov 26 19:50:06 2012 +0100
+++ b/Network/IRC/IrcNetworkManager.py	Tue Nov 27 18:50:02 2012 +0100
@@ -7,7 +7,7 @@
 Module implementing the IRC data structures and their manager.
 """
 
-from PyQt4.QtCore import pyqtSignal, QObject
+from PyQt4.QtCore import pyqtSignal, QObject, QCoreApplication
 
 import Utilities
 from Utilities.AutoSaver import AutoSaver
@@ -20,6 +20,7 @@
     Class implementing the IRC identity object.
     """
     DefaultIdentityName = "0default"
+    DefaultIdentityDisplay = QCoreApplication.translate("IrcIdentity", "Default Identity")
     
     def __init__(self, name, parent=None):
         """
@@ -351,8 +352,12 @@
 class IrcNetworkManager(QObject):
     """
     Class implementing the IRC identity object.
+    
+    @signal dataChanged() emitted after some data has changed
+    @signal networksChanged() emitted after a network object has changed
     """
     dataChanged = pyqtSignal()
+    networksChanged = pyqtSignal()
     
     def __init__(self, parent=None):
         """
@@ -543,7 +548,7 @@
         """
         name = identity.getName()
         self.__identities[name] = identity
-        self.dataChanged.emit()
+        self.identityChanged()
     
     def deleteIdentity(self, name):
         """
@@ -553,7 +558,7 @@
         """
         if name in self.__identities and name != IrcIdentity.DefaultIdentityName:
             del self.__identities[name]
-            self.dataChanged.emit()
+            self.identityChanged()
     
     def renameIdentity(self, oldName, newName):
         """
@@ -570,7 +575,7 @@
                 if network.getIdentityName() == oldName:
                     network.setIdentityName(newName)
             
-            self.dataChanged.emit()
+            self.identityChanged()
     
     def identityChanged(self):
         """
@@ -658,11 +663,22 @@
         
         return network
     
+    def deleteNetwork(self, name):
+        """
+        Public method to delete the given network.
+        
+        @param name name of the network to delete (string)
+        """
+        if name in self.__networks:
+            del self.__networks[name]
+            self.networkChanged()
+    
     def networkChanged(self):
         """
         Public method to indicate a change of a network object.
         """
         self.dataChanged.emit()
+        self.networksChanged.emit()
     
     def getNetworkNames(self):
         """
--- a/Network/IRC/IrcNetworkWidget.py	Mon Nov 26 19:50:06 2012 +0100
+++ b/Network/IRC/IrcNetworkWidget.py	Tue Nov 27 18:50:02 2012 +0100
@@ -58,6 +58,25 @@
         self.__manager = manager
         
         self.networkCombo.addItems(self.__manager.getNetworkNames())
+        
+        self.__manager.networksChanged.connect(self.__refreshNetworks)
+    
+    @pyqtSlot()
+    def __refreshNetworks(self):
+        """
+        Private slot to refresh all network related widgets.
+        """
+        currentNetwork = self.networkCombo.currentText()
+##        currentNick = self.nickCombo.currentText()
+##        currentChannel = self.channelCombo.currentText()
+        self.networkCombo.clear()
+        self.networkCombo.addItems(self.__manager.getNetworkNames())
+        row = self.networkCombo.findText(currentNetwork)
+        if row == -1:
+            row = 0
+        self.networkCombo.setCurrentIndex(row)
+##        self.nickCombo.setEditText(currentNick)
+##        self.channelCombo.setEditText(currentChannel)
     
     @pyqtSlot()
     def on_connectButton_clicked(self):
@@ -102,6 +121,8 @@
         """
         network = self.__manager.getNetwork(networkName)
         self.channelCombo.clear()
+        self.nickCombo.clear()
+        self.channelCombo.clear()
         if network:
             channels = network.getChannels()
             self.channelCombo.addItems(channels)
@@ -110,8 +131,10 @@
                 network.getIdentityName())
             if identity:
                 self.nickCombo.addItems(identity.getNickNames())
+            self.nickCombo.setEnabled(True)
         else:
             self.channelCombo.setEnabled(False)
+            self.nickCombo.setEnabled(False)
     
     @pyqtSlot(str)
     def on_nickCombo_activated(self, nick):
--- a/Network/IRC/IrcWidget.py	Mon Nov 26 19:50:06 2012 +0100
+++ b/Network/IRC/IrcWidget.py	Tue Nov 27 18:50:02 2012 +0100
@@ -20,6 +20,7 @@
 
 from .IrcNetworkManager import IrcNetworkManager
 from .IrcChannelWidget import IrcChannelWidget
+from .IrcNetworkListDialog import IrcNetworkListDialog
 
 import Preferences
 import UI.PixmapCache
@@ -125,14 +126,16 @@
         """
         if connect:
             network = self.__ircNetworkManager.getNetwork(name)
-            self.__server = self.__ircNetworkManager.getServer(network.getServerName())
-            self.__userName = network.getIdentityName()
-            if self.__server:
-                self.networkWidget.addServerMessage(self.trUtf8("Info"),
-                    self.trUtf8("Looking for server {0} (port {1})...").format(
-                        self.__server.getServer(), self.__server.getPort()))
-                self.__socket.connectToHost(self.__server.getServer(),
-                                            self.__server.getPort())
+            if network:
+                self.__server = self.__ircNetworkManager.getServer(
+                    network.getServerName())
+                self.__userName = network.getIdentityName()
+                if self.__server:
+                    self.networkWidget.addServerMessage(self.trUtf8("Info"),
+                        self.trUtf8("Looking for server {0} (port {1})...").format(
+                            self.__server.getServer(), self.__server.getPort()))
+                    self.__socket.connectToHost(self.__server.getServer(),
+                                                self.__server.getPort())
         else:
             ok = E5MessageBox.yesNo(self,
                 self.trUtf8("Disconnect from Server"),
@@ -158,6 +161,8 @@
         @param name name of the network to edit (string)
         """
         # TODO: implement this
+        dlg = IrcNetworkListDialog(self.__ircNetworkManager, self)
+        dlg.exec_()
     
     def __joinChannel(self, name):
         """
--- a/eric5.e4p	Mon Nov 26 19:50:06 2012 +0100
+++ b/eric5.e4p	Tue Nov 27 18:50:02 2012 +0100
@@ -1062,6 +1062,7 @@
     <Source>Network/IRC/IrcWidget.py</Source>
     <Source>Network/IRC/IrcUtilities.py</Source>
     <Source>Preferences/ConfigurationPages/IrcPage.py</Source>
+    <Source>Network/IRC/IrcNetworkListDialog.py</Source>
   </Sources>
   <Forms>
     <Form>PyUnit/UnittestDialog.ui</Form>
@@ -1370,6 +1371,7 @@
     <Form>Network/IRC/IrcWidget.ui</Form>
     <Form>Network/IRC/IrcNetworkWidget.ui</Form>
     <Form>Preferences/ConfigurationPages/IrcPage.ui</Form>
+    <Form>Network/IRC/IrcNetworkListDialog.ui</Form>
   </Forms>
   <Translations>
     <Translation>i18n/eric5_cs.qm</Translation>

eric ide

mercurial