Mon, 03 Dec 2012 10:39:56 +0100
Added the messages marker stuff to the IRC widget.
--- a/Network/IRC/IrcChannelWidget.py Sun Dec 02 18:52:03 2012 +0100 +++ b/Network/IRC/IrcChannelWidget.py Mon Dec 03 10:39:56 2012 +0100 @@ -9,8 +9,8 @@ import re -from PyQt4.QtCore import pyqtSlot, pyqtSignal, QDateTime -from PyQt4.QtGui import QWidget, QListWidgetItem, QIcon, QPainter +from PyQt4.QtCore import pyqtSlot, pyqtSignal, QDateTime, QPoint +from PyQt4.QtGui import QWidget, QListWidgetItem, QIcon, QPainter, QMenu from E5Gui import E5MessageBox from E5Gui.E5Application import e5App @@ -182,11 +182,15 @@ self.__ui = e5App().getObject("UserInterface") + self.__initMessagesMenu() + self.__name = "" self.__userName = "" self.__partMessage = "" self.__prefixToPrivilege = {} + self.__markerLine = "" + self.__patterns = [ # :foo_!n=foo@foohost.bar.net PRIVMSG #eric-ide :some long message (re.compile(r":([^!]+).*\sPRIVMSG\s([^ ]+)\s:(.*)"), self.__message), @@ -228,14 +232,15 @@ Private slot to send a message to the channel. """ msg = self.messageEdit.text() - self.messages.append( - '<font color="{0}">{2} <b><</b><font color="{1}">{3}</font>' - '<b>></b> {4}</font>'.format( - Preferences.getIrc("ChannelMessageColour"), - Preferences.getIrc("OwnNickColour"), - ircTimestamp(), self.__userName, Utilities.html_encode(msg))) - self.sendData.emit("PRIVMSG " + self.__name + " :" + msg) - self.messageEdit.clear() + if msg: + self.messages.append( + '<font color="{0}">{2} <b><</b><font color="{1}">{3}</font>' + '<b>></b> {4}</font>'.format( + Preferences.getIrc("ChannelMessageColour"), + Preferences.getIrc("OwnNickColour"), + ircTimestamp(), self.__userName, Utilities.html_encode(msg))) + self.sendData.emit("PRIVMSG " + self.__name + " :" + msg) + self.messageEdit.clear() def requestLeave(self): """ @@ -658,3 +663,85 @@ self.messages.append( '<font color="{0}">{1} <b>[</b>{2}<b>]</b> {3}</font>'.format( color, ircTimestamp(), indicator, message)) + + def setMarkerLine(self): + """ + Public method to draw a line to mark the current position. + """ + self.unsetMarkerLine() + # TODO: make colors configurable + self.__markerLine = \ + '<span style=" color:#000000; background-color:#ffff00;">{0}</span>'.format( + self.trUtf8('--- New From Here ---')) + self.messages.append(self.__markerLine) + + def unsetMarkerLine(self): + """ + Public method to remove the marker line. + """ + if self.__markerLine: + txt = self.messages.toHtml() + if txt.endswith(self.__markerLine + "</p></body></html>"): + # remove empty last paragraph + pos = txt.rfind("<p") + txt = txt[:pos] + "</body></html>" + else: + txt = txt.replace(self.__markerLine, "") + self.messages.setHtml(txt) + self.__markerLine = "" + + def __initMessagesMenu(self): + """ + Private slot to initialize the context menu of the messages pane. + """ + self.__messagesMenu = QMenu(self) +## self.__cutMessagesAct = \ +## self.__messagesMenu.addAction( +## UI.PixmapCache.getIcon("editCut.png"), +## self.trUtf8("Cut"), self.__cutMessages) +## self.__copyMessagesAct = \ +## self.__messagesMenu.addAction( +## UI.PixmapCache.getIcon("editCopy.png"), +## self.trUtf8("Copy"), self.__copyMessages) +## self.__messagesMenu.addSeparator() +## self.__cutAllMessagesAct = \ +## self.__messagesMenu.addAction( +## UI.PixmapCache.getIcon("editCut.png"), +## self.trUtf8("Cut all"), self.__cutAllMessages) +## self.__copyAllMessagesAct = \ +## self.__messagesMenu.addAction( +## UI.PixmapCache.getIcon("editCopy.png"), +## self.trUtf8("Copy all"), self.__copyAllMessages) +## self.__messagesMenu.addSeparator() +## self.__clearMessagesAct = \ +## self.__messagesMenu.addAction( +## UI.PixmapCache.getIcon("editDelete.png"), +## self.trUtf8("Clear"), self.__clearMessages) +## self.__messagesMenu.addSeparator() +## self.__saveMessagesAct = \ +## self.__messagesMenu.addAction( +## UI.PixmapCache.getIcon("fileSave.png"), +## self.trUtf8("Save"), self.__saveMessages) + self.__setMarkerMessagesAct = \ + self.__messagesMenu.addAction(self.trUtf8("Mark Current Position"), + self.setMarkerLine) + self.__unsetMarkerMessagesAct = \ + self.__messagesMenu.addAction(self.trUtf8("Remove Position Marker"), + self.unsetMarkerLine) + + @pyqtSlot(QPoint) + def on_messages_customContextMenuRequested(self, pos): + """ + Private slot to show the context menu of the messages pane. + """ + self.__setMarkerMessagesAct.setEnabled(self.__markerLine == "") + self.__unsetMarkerMessagesAct.setEnabled(self.__markerLine != "") + self.__messagesMenu.popup(self.messages.mapToGlobal(pos)) + + @pyqtSlot(QPoint) + def on_usersList_customContextMenuRequested(self, pos): + """ + Private slot to show the context menu of the users list. + """ + # TODO: not implemented yet + return
--- a/Network/IRC/IrcChannelWidget.ui Sun Dec 02 18:52:03 2012 +0100 +++ b/Network/IRC/IrcChannelWidget.ui Mon Dec 03 10:39:56 2012 +0100 @@ -33,6 +33,9 @@ <enum>Qt::Vertical</enum> </property> <widget class="QListWidget" name="usersList"> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> <property name="toolTip"> <string>Shows the list of users</string> </property> @@ -50,6 +53,9 @@ <verstretch>1</verstretch> </sizepolicy> </property> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> <property name="toolTip"> <string>Shows the channel messages</string> </property>
--- a/Network/IRC/IrcNetworkWidget.py Sun Dec 02 18:52:03 2012 +0100 +++ b/Network/IRC/IrcNetworkWidget.py Mon Dec 03 10:39:56 2012 +0100 @@ -52,10 +52,13 @@ self.connectButton.setIcon(UI.PixmapCache.getIcon("ircConnect.png")) self.editButton.setIcon(UI.PixmapCache.getIcon("ircConfigure.png")) self.joinButton.setIcon(UI.PixmapCache.getIcon("ircJoinChannel.png")) + self.joinButton.setEnabled(False) + self.nickCombo.setEnabled(False) self.__manager = None self.__connected = False + self.__registered = False def initialize(self, manager): """ @@ -120,7 +123,7 @@ @param txt current text of the channel combo (string) """ - on = bool(txt) and self.__connected + on = bool(txt) and self.__registered self.joinButton.setEnabled(on) @pyqtSlot() @@ -150,10 +153,8 @@ network.getIdentityName()) if identity: self.nickCombo.addItems(identity.getNickNames()) - self.nickCombo.setEnabled(True) else: self.channelCombo.setEnabled(False) - self.nickCombo.setEnabled(False) def getNetworkChannels(self): """ @@ -252,5 +253,13 @@ else: self.connectButton.setIcon(UI.PixmapCache.getIcon("ircConnect.png")) - on = bool(self.channelCombo.currentText()) and self.__connected + def setRegistered(self, registered): + """ + Public slot to set the registered state. + + @param connected flag indicating the connection state (boolean) + """ + self.__registered = registered + on = bool(self.channelCombo.currentText()) and self.__registered self.joinButton.setEnabled(on) + self.nickCombo.setEnabled(registered)
--- a/Network/IRC/IrcNetworkWidget.ui Sun Dec 02 18:52:03 2012 +0100 +++ b/Network/IRC/IrcNetworkWidget.ui Mon Dec 03 10:39:56 2012 +0100 @@ -14,6 +14,9 @@ <string/> </property> <layout class="QVBoxLayout" name="verticalLayout"> + <property name="margin"> + <number>0</number> + </property> <item> <widget class="QTextBrowser" name="messages"> <property name="toolTip">
--- a/Network/IRC/IrcWidget.py Sun Dec 02 18:52:03 2012 +0100 +++ b/Network/IRC/IrcWidget.py Mon Dec 03 10:39:56 2012 +0100 @@ -351,6 +351,7 @@ """ self.networkWidget.addServerMessage(self.trUtf8("Info"), self.trUtf8("Server disconnected.")) + self.networkWidget.setRegistered(False) self.networkWidget.setConnected(False) self.__server = None self.__nickName = "" @@ -545,6 +546,7 @@ # register with services after the welcome message self.__connectionState = IrcWidget.ServerConnected self.__registerWithServices() + self.networkWidget.setRegistered(True) QTimer.singleShot(1000, self.__autoJoinChannels) elif code == 5: # extract the user privilege prefixes