Added the messages marker stuff to the IRC widget.

Mon, 03 Dec 2012 10:39:56 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 03 Dec 2012 10:39:56 +0100
changeset 2244
654aaddbc2b9
parent 2243
c0323a43d966
child 2245
cbddacb4bc2e

Added the messages marker stuff to the IRC widget.

Network/IRC/IrcChannelWidget.py file | annotate | diff | comparison | revisions
Network/IRC/IrcChannelWidget.ui file | annotate | diff | comparison | revisions
Network/IRC/IrcNetworkWidget.py file | annotate | diff | comparison | revisions
Network/IRC/IrcNetworkWidget.ui file | annotate | diff | comparison | revisions
Network/IRC/IrcWidget.py file | annotate | diff | comparison | revisions
--- 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>&lt;</b><font color="{1}">{3}</font>'
-            '<b>&gt;</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>&lt;</b><font color="{1}">{3}</font>'
+                '<b>&gt;</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

eric ide

mercurial