Thu, 29 Nov 2012 20:02:43 +0100
Continued with IRC management.
--- a/Network/IRC/IrcNetworkEditDialog.py Wed Nov 28 20:11:46 2012 +0100 +++ b/Network/IRC/IrcNetworkEditDialog.py Thu Nov 29 20:02:43 2012 +0100 @@ -12,6 +12,8 @@ from PyQt4.QtCore import pyqtSlot from PyQt4.QtGui import QDialog, QDialogButtonBox, QTreeWidgetItem +from E5Gui import E5MessageBox + from .Ui_IrcNetworkEditDialog import Ui_IrcNetworkEditDialog from .IrcNetworkManager import IrcIdentity, IrcChannel @@ -65,12 +67,7 @@ self.identityCombo.setCurrentIndex(index) # servers - self.serverCombo.addItems(self.__manager.getServerNames()) - server = self.__network.getServerName() - index = self.serverCombo.findText(server) - if index == -1: - index = 0 - self.serverCombo.setCurrentIndex(index) + self.serverEdit.setText(self.__network.getServerNames()[0]) # channels for channelName in sorted(self.__network.getChannelNames()): @@ -90,7 +87,7 @@ """ enable = True enable &= self.networkEdit.text() != "" - enable &= self.serverCombo.currentText() != "" + enable &= self.serverEdit.text() != "" self.__okButton.setEnabled(enable) @@ -111,15 +108,6 @@ # TODO: not implemented yet raise NotImplementedError - @pyqtSlot(str) - def on_serverCombo_activated(self, txt): - """ - Private slot to handle the selection of a server. - - @param txt selected server (string) - """ - self.__updateOkButton() - @pyqtSlot() def on_editServersButton_clicked(self): """ @@ -131,10 +119,9 @@ @pyqtSlot() def on_addChannelButton_clicked(self): """ - Slot documentation goes here. + Private slot to add a channel. """ - # TODO: not implemented yet - raise NotImplementedError + self.__editChannel(None) @pyqtSlot() def on_editChannelButton_clicked(self): @@ -148,10 +135,20 @@ @pyqtSlot() def on_deleteChannelButton_clicked(self): """ - Slot documentation goes here. + Private slot to delete the selected channel. """ - # TODO: not implemented yet - raise NotImplementedError + itm = self.channelList.selectedItems()[0] + if itm: + res = E5MessageBox.yesNo(self, + self.trUtf8("Delete Channel"), + self.trUtf8("""Do you really want to delete channel <b>{0}</b>?""")\ + .format(itm.text(0))) + if res: + self.__network.deleteChannel(itm.text(0)) + + index = self.channelList.indexOfTopLevelItem(itm) + self.channelList.takeTopLevelItem(index) + del itm @pyqtSlot(QTreeWidgetItem, int) def on_channelList_itemActivated(self, item, column): @@ -213,9 +210,9 @@ QTreeWidgetItem(self.channelList, [name, autoJoinTxt]) self.__network.addChannel(channel) - def getData(self): + def getNetwork(self): """ - Public method to get the network data. + Public method to get the network object. @return edited network object (IrcNetwork) """
--- a/Network/IRC/IrcNetworkEditDialog.ui Wed Nov 28 20:11:46 2012 +0100 +++ b/Network/IRC/IrcNetworkEditDialog.ui Thu Nov 29 20:02:43 2012 +0100 @@ -62,13 +62,6 @@ </property> </widget> </item> - <item row="2" column="1"> - <widget class="QComboBox" name="serverCombo"> - <property name="toolTip"> - <string>Select the server to be used for the IRC network</string> - </property> - </widget> - </item> <item row="2" column="2"> <widget class="QToolButton" name="editServersButton"> <property name="toolTip"> @@ -172,13 +165,23 @@ </property> </widget> </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="serverEdit"> + <property name="toolTip"> + <string>Shows the name of the server</string> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> </layout> </widget> <tabstops> <tabstop>networkEdit</tabstop> <tabstop>identityCombo</tabstop> <tabstop>editIdentitiesButton</tabstop> - <tabstop>serverCombo</tabstop> + <tabstop>serverEdit</tabstop> <tabstop>editServersButton</tabstop> <tabstop>channelList</tabstop> <tabstop>addChannelButton</tabstop>
--- a/Network/IRC/IrcNetworkListDialog.py Wed Nov 28 20:11:46 2012 +0100 +++ b/Network/IRC/IrcNetworkListDialog.py Thu Nov 29 20:02:43 2012 +0100 @@ -38,7 +38,7 @@ for networkName in networkNames: topitm = QTreeWidgetItem(self.networksList, [networkName]) network = self.__manager.getNetwork(networkName) - server = self.__manager.getServer(network.getServerName()) + server = network.getServer(network.getServerNames()[0]) identityName = network.getIdentityName() if identityName == IrcIdentity.DefaultIdentityName: identityName = IrcIdentity.DefaultIdentityDisplay @@ -46,7 +46,7 @@ [self.trUtf8("Identity"), identityName]) QTreeWidgetItem(topitm, [self.trUtf8("Server"), "{0}:{1}".format( - server.getServer(), server.getPort())]) + server.getName(), server.getPort())]) QTreeWidgetItem(topitm, [self.trUtf8("Channels"), ", ".join(network.getChannelNames())]) topitm.setExpanded(True) @@ -101,8 +101,7 @@ networkName = itm.text(0) dlg = IrcNetworkEditDialog(self.__manager, networkName, self) if dlg.exec_() == QDialog.Accepted: - pass - # TODO: not implemented yet + self.__manager.setNetwork(dlg.getNetwork()) @pyqtSlot() def on_deleteButton_clicked(self): @@ -114,7 +113,7 @@ 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>?""")\ + self.trUtf8("""Do you really want to delete IRC network <b>{0}</b>?""")\ .format(networkName)) if res: index = self.networksList.indexOfTopLevelItem(itm)
--- a/Network/IRC/IrcNetworkManager.py Wed Nov 28 20:11:46 2012 +0100 +++ b/Network/IRC/IrcNetworkManager.py Thu Nov 29 20:02:43 2012 +0100 @@ -67,6 +67,20 @@ """ return self.__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 + def setRealName(self, name): """ Public method to set the real name of the identity. @@ -130,6 +144,19 @@ @return password (string) """ return pwConvert(self.__password, encode=False) + + @classmethod + def createDefaultIdentity(cls): + """ + Class method to create the default identity. + + @return default identity (IrcIdentity) + """ + userName = Utilities.getUserName() + identity = IrcIdentity(IrcIdentity.DefaultIdentityName) + identity.setNickNames([userName, userName + "_", userName + "__"]) + identity.setRealName(userName) + return identity class IrcServer(object): @@ -172,7 +199,7 @@ self.__ssl = Preferences.toBool(settings.value("SSL", False)) self.__password = settings.value("Password", "") - def getServer(self): + def getName(self): """ Public method to get the server name. @@ -321,7 +348,7 @@ self.__name = name self.__identity = "" - self.__server = "" + self.__servers = {} self.__channels = {} def save(self, settings): @@ -332,7 +359,14 @@ """ # no need to save the network name because that is the group key settings.setValue("Identity", self.__identity) - settings.setValue("Server", self.__server) + + settings.beginGroup("Servers") + for key in self.__servers: + settings.beginGroup(key) + self.__servers[key].save(settings) + settings.endGroup() + settings.endGroup() + settings.beginGroup("Channels") for key in self.__channels: settings.beginGroup(key) @@ -347,7 +381,15 @@ @param settings reference to the settings object (QSettings) """ self.__identity = settings.value("Identity", "") - self.__server = settings.value("Server", "") + + settings.beginGroup("Servers") + for key in settings.childKeys(): + self.__servers[key] = IrcServer(key) + settings.beginGroup(key) + self.__servers[key].load(settings) + settings.endGroup() + settings.endGroup() + settings.beginGroup("Channels") for key in self.__channels: self.__channels[key] = IrcChannel(key) @@ -380,21 +422,63 @@ """ return self.__identity - def setServerName(self, name): + def setServers(self, servers): """ - Public method to set the server name. + Public method to set the list of servers. - @param name server name (string) + @param servers list of servers for the network (list of IrcServer) + """ + self.__servers = {} + for server in servers: + self.__servers[server.getName()] = server + + def getServers(self): """ - self.__server = name + Public method to get the servers. + + @return list of servers for the network (list of IrcServer) + """ + return list(self.__servers.values()) + + def getServerNames(self): + """ + Public method to get a list of all known server names. + + @return list of server names (list of string) + """ + return list(sorted(self.__servers.keys())) - def getServerName(self): + def getServer(self, name): + """ + Public method to get a server object. + + @param name name of the server to get (string) + @return reference to the server (IrcServer) """ - Public method to get the server name. + if name in self.__servers: + return self.__servers[name] + else: + return None + + def setServer(self, server): + """ + Public method to set a server. - @return server name (string) + @param server server object to set (IrcServer) + """ + serverName = server.getName() + if serverName in self.__servers: + self.__servers[serverName] = server + + def addServer(self, server): """ - return self.__server + Public method to add a server. + + @param server server object to add (IrcServer) + """ + serverName = server.getName() + if serverName not in self.__servers: + self.__servers[serverName] = server def setChannels(self, channels): """ @@ -453,6 +537,40 @@ channelName = channel.getName() if channelName not in self.__channels: self.__channels[channelName] = channel + + def deleteChannel(self, channelName): + """ + Public method to delete the given channel. + + @param channelName name of the channel to be deleted (string) + """ + if channelName in self.__channels: + del self.__channels[channelName] + + @classmethod + def createDefaultNetwork(cls): + """ + Class method to create the default network. + + @return default network object (IrcNetwork) + """ + # network + networkName = "Freenode" + network = IrcNetwork(networkName) + network.setIdentityName(IrcIdentity.DefaultIdentityName) + + # server + serverName = "chat.freenode.net" + server = IrcServer(serverName) + server.setPort(8001) + network.addServer(server) + + # channel + channel = IrcChannel("#eric-ide") + channel.setAutoJoin(False) + network.addChannel(channel) + + return network class IrcNetworkManager(QObject): @@ -480,7 +598,6 @@ self.__networks = {} self.__identities = {} - self.__servers = {} self.dataChanged.connect(self.__saveTimer.changeOccurred) @@ -508,14 +625,6 @@ self.__settings.endGroup() self.__settings.endGroup() - # servers - self.__settings.beginGroup("Servers") - for key in self.__servers: - self.__settings.beginGroup(key) - self.__servers[key].save(self.__settings) - self.__settings.endGroup() - self.__settings.endGroup() - # networks self.__settings.beginGroup("Networks") for key in self.__networks: @@ -545,15 +654,6 @@ self.__settings.endGroup() self.__settings.endGroup() - # servers - self.__settings.beginGroup("Servers") - for key in self.__settings.childKeys(): - self.__servers[key] = IrcServer(key) - self.__settings.beginGroup(key) - self.__servers[key].load(self.__settings) - self.__settings.endGroup() - self.__settings.endGroup() - # networks self.__settings.beginGroup("Networks") for key in self.__settings.childKeys(): @@ -589,30 +689,19 @@ self.__servers = {} # identity - userName = Utilities.getUserName() - identity = IrcIdentity(IrcIdentity.DefaultIdentityName) - identity.setNickNames([userName, userName + "_", userName + "__"]) - self.__identities[IrcIdentity.DefaultIdentityName] = identity + identity = IrcIdentity.createDefaultIdentity() + self.__identities[identity.getName()] = identity if not identityOnly: - # server - serverName = "chat.freenode.net" - server = IrcServer(serverName) - server.setPort(8001) - self.__servers[serverName] = server - - # network - networkName = "Freenode" - network = IrcNetwork(networkName) - network.setIdentityName(IrcIdentity.DefaultIdentityName) - network.setServerName(serverName) - channel = IrcChannel("#eric-ide") - channel.setAutoJoin(False) - network.addChannel(channel) - self.__networks[networkName] = network + network = IrcNetwork.createDefaultNetwork() + self.__networks[network.getName()] = network self.dataChanged.emit() + ################################################################## + ## Identity related methods below + ################################################################## + def getIdentity(self, name, create=False): """ Public method to get an identity object. @@ -691,50 +780,9 @@ """ self.dataChanged.emit() - # TODO: move server to network because it belongs there - def getServer(self, name, create=False): - """ - Public method to get a server object. - - @param name name of the server to get (string) - @param create flag indicating to create a new object, - if none exists (boolean) - @return reference to the server (IrcServer) - """ - if not name: - return None - - if not self.__loaded: - self.__load() - - if name in self.__servers: - return self.__servers[name] - elif create: - server = IrcServer(name) - self.__servers[name] = server - - self.dataChanged.emit() - - return server - else: - return None - - def serverChanged(self): - """ - Public method to indicate a change of a server object. - """ - self.dataChanged.emit() - - def getServerNames(self): - """ - Public method to get a list of all known server names. - - @return list of server names (list of string) - """ - if not self.__loaded: - self.__load() - - return list(sorted(self.__servers.keys())) + ################################################################## + ## Network related methods below + ################################################################## def getNetwork(self, name): """ @@ -751,37 +799,47 @@ else: return None - # TODO: check, if this method is needed - def createNetwork(self, name, identity, server, channels=None): + def setNetwork(self, network): """ - 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() + Public method to set a network. + @param network network object to set (IrcNetwork) + """ + name = network.getName() if name in self.__networks: - return None - - network = IrcNetwork(name) - network.setIdentityName(identity.getName()) - network.setServerName(server.getServer()) - # TODO: change this - network.setChannels(channels[:]) -## network.setAutoJoinChannels(autoJoinChannels) - self.__networks[name] = network - - self.networkChanged() - - return network + 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/IrcWidget.py Wed Nov 28 20:11:46 2012 +0100 +++ b/Network/IRC/IrcWidget.py Thu Nov 29 20:02:43 2012 +0100 @@ -58,6 +58,7 @@ self.__channelList = [] self.__channelTypePrefixes = "" self.__userName = "" + self.__identityName = "" self.__nickIndex = -1 self.__nickName = "" self.__server = None @@ -103,7 +104,7 @@ self.trUtf8("Disconnect from Server"), self.trUtf8("""<p>Do you really want to disconnect from""" """ <b>{0}</b>?</p><p>All channels will be closed.</p>""")\ - .format(self.__server.getServer())) + .format(self.__server.getName())) if ok: self.__socket.blockSignals(True) @@ -127,25 +128,26 @@ if connect: network = self.__ircNetworkManager.getNetwork(name) if network: - self.__server = self.__ircNetworkManager.getServer( - network.getServerName()) - self.__userName = network.getIdentityName() + self.__server = network.getServer(network.getServerNames()[0]) + self.__identityName = network.getIdentityName() + identity = self.__ircNetworkManager.getIdentity(self.__identityName) + self.__userName = identity.getIdent() 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.getName(), self.__server.getPort())) + self.__socket.connectToHost(self.__server.getName(), self.__server.getPort()) else: ok = E5MessageBox.yesNo(self, self.trUtf8("Disconnect from Server"), self.trUtf8("""<p>Do you really want to disconnect from""" """ <b>{0}</b>?</p><p>All channels will be closed.</p>""")\ - .format(self.__server.getServer())) + .format(self.__server.getName())) if ok: self.networkWidget.addServerMessage(self.trUtf8("Info"), self.trUtf8("Disconnecting from server {0}...").format( - self.__server.getServer())) + self.__server.getName())) while self.__channelList: channel = self.__channelList.pop() self.channelsWidget.removeTab(self.channelsWidget.indexOf(channel)) @@ -153,6 +155,8 @@ channel = None self.__send("QUIT :" + self.trUtf8("IRC for eric IDE")) self.__socket.close() + self.__userName = "" + self.__identityName = "" def __editNetwork(self, name): """ @@ -160,7 +164,6 @@ @param name name of the network to edit (string) """ - # TODO: implement this dlg = IrcNetworkListDialog(self.__ircNetworkManager, self) dlg.exec_() @@ -264,7 +267,7 @@ if not nick: self.__nickIndex = 0 try: - nick = self.__ircNetworkManager.getIdentity(self.__userName)\ + nick = self.__ircNetworkManager.getIdentity(self.__identityName)\ .getNickNames()[self.__nickIndex] except IndexError: nick = "" @@ -272,8 +275,11 @@ nick = self.__userName self.__nickName = nick self.networkWidget.setNickName(nick) + realName = self.__ircNetworkManager.getIdentity(self.__identityName).getRealName() + if not realName: + realName = "eric IDE chat" self.__send("NICK " + nick) - self.__send("USER " + self.__userName + " 0 * :eric IDE chat") + self.__send("USER " + self.__userName + " 0 * :" + realName) def __hostDisconnected(self): """ @@ -484,7 +490,7 @@ """ Private method to register to services. """ - identity = self.__ircNetworkManager.getIdentity(self.__userName) + identity = self.__ircNetworkManager.getIdentity(self.__identityName) service = identity.getName() password = identity.getPassword() if service and password: @@ -563,7 +569,7 @@ """ self.__nickIndex += 1 try: - nick = self.__ircNetworkManager.getIdentity(self.__userName)\ + nick = self.__ircNetworkManager.getIdentity(self.__identityName)\ .getNickNames()[self.__nickIndex] self.__nickName = nick except IndexError: