7 Module implementing the IRC channel widget. |
7 Module implementing the IRC channel widget. |
8 """ |
8 """ |
9 |
9 |
10 import re |
10 import re |
11 |
11 |
12 from PyQt4.QtCore import pyqtSlot, pyqtSignal, QDateTime |
12 from PyQt4.QtCore import pyqtSlot, pyqtSignal, QDateTime, QPoint |
13 from PyQt4.QtGui import QWidget, QListWidgetItem, QIcon, QPainter |
13 from PyQt4.QtGui import QWidget, QListWidgetItem, QIcon, QPainter, QMenu |
14 |
14 |
15 from E5Gui import E5MessageBox |
15 from E5Gui import E5MessageBox |
16 from E5Gui.E5Application import e5App |
16 from E5Gui.E5Application import e5App |
17 |
17 |
18 from .Ui_IrcChannelWidget import Ui_IrcChannelWidget |
18 from .Ui_IrcChannelWidget import Ui_IrcChannelWidget |
180 super().__init__(parent) |
180 super().__init__(parent) |
181 self.setupUi(self) |
181 self.setupUi(self) |
182 |
182 |
183 self.__ui = e5App().getObject("UserInterface") |
183 self.__ui = e5App().getObject("UserInterface") |
184 |
184 |
|
185 self.__initMessagesMenu() |
|
186 |
185 self.__name = "" |
187 self.__name = "" |
186 self.__userName = "" |
188 self.__userName = "" |
187 self.__partMessage = "" |
189 self.__partMessage = "" |
188 self.__prefixToPrivilege = {} |
190 self.__prefixToPrivilege = {} |
|
191 |
|
192 self.__markerLine = "" |
189 |
193 |
190 self.__patterns = [ |
194 self.__patterns = [ |
191 # :foo_!n=foo@foohost.bar.net PRIVMSG #eric-ide :some long message |
195 # :foo_!n=foo@foohost.bar.net PRIVMSG #eric-ide :some long message |
192 (re.compile(r":([^!]+).*\sPRIVMSG\s([^ ]+)\s:(.*)"), self.__message), |
196 (re.compile(r":([^!]+).*\sPRIVMSG\s([^ ]+)\s:(.*)"), self.__message), |
193 # :foo_!n=foo@foohost.bar.net JOIN :#eric-ide |
197 # :foo_!n=foo@foohost.bar.net JOIN :#eric-ide |
226 def on_messageEdit_returnPressed(self): |
230 def on_messageEdit_returnPressed(self): |
227 """ |
231 """ |
228 Private slot to send a message to the channel. |
232 Private slot to send a message to the channel. |
229 """ |
233 """ |
230 msg = self.messageEdit.text() |
234 msg = self.messageEdit.text() |
231 self.messages.append( |
235 if msg: |
232 '<font color="{0}">{2} <b><</b><font color="{1}">{3}</font>' |
236 self.messages.append( |
233 '<b>></b> {4}</font>'.format( |
237 '<font color="{0}">{2} <b><</b><font color="{1}">{3}</font>' |
234 Preferences.getIrc("ChannelMessageColour"), |
238 '<b>></b> {4}</font>'.format( |
235 Preferences.getIrc("OwnNickColour"), |
239 Preferences.getIrc("ChannelMessageColour"), |
236 ircTimestamp(), self.__userName, Utilities.html_encode(msg))) |
240 Preferences.getIrc("OwnNickColour"), |
237 self.sendData.emit("PRIVMSG " + self.__name + " :" + msg) |
241 ircTimestamp(), self.__userName, Utilities.html_encode(msg))) |
238 self.messageEdit.clear() |
242 self.sendData.emit("PRIVMSG " + self.__name + " :" + msg) |
|
243 self.messageEdit.clear() |
239 |
244 |
240 def requestLeave(self): |
245 def requestLeave(self): |
241 """ |
246 """ |
242 Public method to leave the channel. |
247 Public method to leave the channel. |
243 """ |
248 """ |
656 else: |
661 else: |
657 color = Preferences.getIrc("ChannelInfoColour") |
662 color = Preferences.getIrc("ChannelInfoColour") |
658 self.messages.append( |
663 self.messages.append( |
659 '<font color="{0}">{1} <b>[</b>{2}<b>]</b> {3}</font>'.format( |
664 '<font color="{0}">{1} <b>[</b>{2}<b>]</b> {3}</font>'.format( |
660 color, ircTimestamp(), indicator, message)) |
665 color, ircTimestamp(), indicator, message)) |
|
666 |
|
667 def setMarkerLine(self): |
|
668 """ |
|
669 Public method to draw a line to mark the current position. |
|
670 """ |
|
671 self.unsetMarkerLine() |
|
672 # TODO: make colors configurable |
|
673 self.__markerLine = \ |
|
674 '<span style=" color:#000000; background-color:#ffff00;">{0}</span>'.format( |
|
675 self.trUtf8('--- New From Here ---')) |
|
676 self.messages.append(self.__markerLine) |
|
677 |
|
678 def unsetMarkerLine(self): |
|
679 """ |
|
680 Public method to remove the marker line. |
|
681 """ |
|
682 if self.__markerLine: |
|
683 txt = self.messages.toHtml() |
|
684 if txt.endswith(self.__markerLine + "</p></body></html>"): |
|
685 # remove empty last paragraph |
|
686 pos = txt.rfind("<p") |
|
687 txt = txt[:pos] + "</body></html>" |
|
688 else: |
|
689 txt = txt.replace(self.__markerLine, "") |
|
690 self.messages.setHtml(txt) |
|
691 self.__markerLine = "" |
|
692 |
|
693 def __initMessagesMenu(self): |
|
694 """ |
|
695 Private slot to initialize the context menu of the messages pane. |
|
696 """ |
|
697 self.__messagesMenu = QMenu(self) |
|
698 ## self.__cutMessagesAct = \ |
|
699 ## self.__messagesMenu.addAction( |
|
700 ## UI.PixmapCache.getIcon("editCut.png"), |
|
701 ## self.trUtf8("Cut"), self.__cutMessages) |
|
702 ## self.__copyMessagesAct = \ |
|
703 ## self.__messagesMenu.addAction( |
|
704 ## UI.PixmapCache.getIcon("editCopy.png"), |
|
705 ## self.trUtf8("Copy"), self.__copyMessages) |
|
706 ## self.__messagesMenu.addSeparator() |
|
707 ## self.__cutAllMessagesAct = \ |
|
708 ## self.__messagesMenu.addAction( |
|
709 ## UI.PixmapCache.getIcon("editCut.png"), |
|
710 ## self.trUtf8("Cut all"), self.__cutAllMessages) |
|
711 ## self.__copyAllMessagesAct = \ |
|
712 ## self.__messagesMenu.addAction( |
|
713 ## UI.PixmapCache.getIcon("editCopy.png"), |
|
714 ## self.trUtf8("Copy all"), self.__copyAllMessages) |
|
715 ## self.__messagesMenu.addSeparator() |
|
716 ## self.__clearMessagesAct = \ |
|
717 ## self.__messagesMenu.addAction( |
|
718 ## UI.PixmapCache.getIcon("editDelete.png"), |
|
719 ## self.trUtf8("Clear"), self.__clearMessages) |
|
720 ## self.__messagesMenu.addSeparator() |
|
721 ## self.__saveMessagesAct = \ |
|
722 ## self.__messagesMenu.addAction( |
|
723 ## UI.PixmapCache.getIcon("fileSave.png"), |
|
724 ## self.trUtf8("Save"), self.__saveMessages) |
|
725 self.__setMarkerMessagesAct = \ |
|
726 self.__messagesMenu.addAction(self.trUtf8("Mark Current Position"), |
|
727 self.setMarkerLine) |
|
728 self.__unsetMarkerMessagesAct = \ |
|
729 self.__messagesMenu.addAction(self.trUtf8("Remove Position Marker"), |
|
730 self.unsetMarkerLine) |
|
731 |
|
732 @pyqtSlot(QPoint) |
|
733 def on_messages_customContextMenuRequested(self, pos): |
|
734 """ |
|
735 Private slot to show the context menu of the messages pane. |
|
736 """ |
|
737 self.__setMarkerMessagesAct.setEnabled(self.__markerLine == "") |
|
738 self.__unsetMarkerMessagesAct.setEnabled(self.__markerLine != "") |
|
739 self.__messagesMenu.popup(self.messages.mapToGlobal(pos)) |
|
740 |
|
741 @pyqtSlot(QPoint) |
|
742 def on_usersList_customContextMenuRequested(self, pos): |
|
743 """ |
|
744 Private slot to show the context menu of the users list. |
|
745 """ |
|
746 # TODO: not implemented yet |
|
747 return |