Cooperation/ChatWidget.py

changeset 158
6a561f87bc07
parent 155
375e3c884874
child 160
32cc58d56d4d
--- a/Cooperation/ChatWidget.py	Sun Mar 28 09:27:19 2010 +0000
+++ b/Cooperation/ChatWidget.py	Tue Mar 30 13:49:13 2010 +0000
@@ -7,9 +7,13 @@
 Module implementing the chat dialog.
 """
 
-from PyQt4.QtCore import Qt, pyqtSlot, QDateTime
+from PyQt4.QtCore import Qt, pyqtSlot, pyqtSignal, QDateTime
 from PyQt4.QtGui import QWidget, QColor, QListWidgetItem
 
+from E5Gui.E5Application import e5App
+
+from QScintilla.Editor import Editor
+
 from .CooperationClient import CooperationClient
 
 from .Ui_ChatWidget import Ui_ChatWidget
@@ -20,7 +24,24 @@
 class ChatWidget(QWidget, Ui_ChatWidget):
     """
     Class implementing the chat dialog.
+    
+    @signal connected(connected) emitted to signal a change of the connected
+            state (boole)
+    @signal editorCommand(hash, filename, message) emitted when an editor command
+            has been received (string, string, string)
+    @signal shareEditor(share) emitted to signal a share is requested (bool)
+    @signal startEdit() emitted to start a shared edit session
+    @signal sendEdit() emitted to send a shared edit session
+    @signal cancelEdit() emitted to cancel a shared edit session
     """
+    connected = pyqtSignal(bool)
+    editorCommand = pyqtSignal(str, str, str)
+    
+    shareEditor = pyqtSignal(bool)
+    startEdit = pyqtSignal()
+    sendEdit = pyqtSignal()
+    cancelEdit = pyqtSignal()
+    
     def __init__(self, port = -1, parent = None):
         """
         Constructor
@@ -31,6 +52,15 @@
         QWidget.__init__(self, parent)
         self.setupUi(self)
         
+        self.shareButton.setIcon(
+            UI.PixmapCache.getIcon("sharedEditDisconnected.png"))
+        self.startEditButton.setIcon(
+            UI.PixmapCache.getIcon("sharedEditStart.png"))
+        self.sendEditButton.setIcon(
+            UI.PixmapCache.getIcon("sharedEditSend.png"))
+        self.cancelEditButton.setIcon(
+            UI.PixmapCache.getIcon("sharedEditCancel.png"))
+        
         self.__client = CooperationClient()
         self.__myNickName = self.__client.nickName()
         
@@ -41,6 +71,7 @@
         self.__client.participantLeft.connect(self.__participantLeft)
         self.__client.connectionError.connect(self.__showErrorMessage)
         self.__client.cannotConnect.connect(self.__initialConnectionRefused)
+        self.__client.editorCommand.connect(self.__editorCommandMessage)
         
         self.serverButton.setText(self.trUtf8("Start Server"))
         self.serverLed.setColor(QColor(Qt.red))
@@ -194,21 +225,26 @@
         @param connected new connected state (boolean)
         """
         if connected:
-            self.__connected = True
             self.connectButton.setText(self.trUtf8("Disconnect"))
             self.connectButton.setEnabled(True)
-            self.hostEdit.setEnabled(False)
-            self.portSpin.setEnabled(False)
             self.connectionLed.setColor(QColor(Qt.green))
-            self.serverButton.setEnabled(False)
         else:
-            self.__connected = False
             self.connectButton.setText(self.trUtf8("Connect"))
             self.connectButton.setEnabled(self.hostEdit.text() != "")
-            self.hostEdit.setEnabled(True)
-            self.portSpin.setEnabled(True)
             self.connectionLed.setColor(QColor(Qt.red))
-            self.serverButton.setEnabled(True)
+            self.cancelEditButton.click()
+            self.shareButton.click()
+        self.__connected = connected
+        self.hostEdit.setEnabled(not connected)
+        self.portSpin.setEnabled(not connected)
+        self.serverButton.setEnabled(not connected)
+        self.sharingGroup.setEnabled(connected)
+        
+        if connected:
+            vm = e5App().getObject("ViewManager")
+            aw = vm.activeWindow()
+            if aw:
+                self.checkEditorActions(aw)
     
     def __showErrorMessage(self, message):
         """
@@ -243,3 +279,100 @@
         Public method to get a reference to the cooperation client.
         """
         return self.__client
+    
+    def __editorCommandMessage(self, hash, fileName, message):
+        """
+        Private slot to handle editor command messages from the client.
+        
+        @param hash hash of the project (string)
+        @param fileName project relative file name of the editor (string)
+        @param message command message (string)
+        """
+        self.editorCommand.emit(hash, fileName, message)
+        
+        if message.startswith(Editor.StartEditToken + Editor.Separator) or \
+           message.startswith(Editor.EndEditToken + Editor.Separator):
+            vm = e5App().getObject("ViewManager")
+            aw = vm.activeWindow()
+            if aw:
+                self.checkEditorActions(aw)
+    
+    @pyqtSlot(bool)
+    def on_shareButton_clicked(self, checked):
+        """
+        Private slot to share the current editor.
+        
+        @param checked flag indicating the button state (boolean)
+        """
+        if checked:
+            self.shareButton.setIcon(
+                UI.PixmapCache.getIcon("sharedEditConnected.png"))
+        else:
+            self.shareButton.setIcon(
+                UI.PixmapCache.getIcon("sharedEditDisconnected.png"))
+        self.startEditButton.setEnabled(checked)
+        
+        self.shareEditor.emit(checked)
+    
+    @pyqtSlot(bool)
+    def on_startEditButton_clicked(self, checked):
+        """
+        Private slot to start a shared edit session.
+        
+        @param checked flag indicating the button state (boolean)
+        """
+        if checked:
+            self.sendEditButton.setEnabled(True)
+            self.cancelEditButton.setEnabled(True)
+            self.shareButton.setEnabled(False)
+            self.startEditButton.setEnabled(False)
+            
+            self.startEdit.emit()
+    
+    @pyqtSlot()
+    def on_sendEditButton_clicked(self):
+        """
+        Private slot to end a shared edit session and send the changes.
+        """
+        self.sendEditButton.setEnabled(False)
+        self.cancelEditButton.setEnabled(False)
+        self.shareButton.setEnabled(True)
+        self.startEditButton.setEnabled(True)
+        self.startEditButton.setChecked(False)
+        
+        self.sendEdit.emit()
+    
+    @pyqtSlot()
+    def on_cancelEditButton_clicked(self):
+        """
+        Private slot to cancel a shared edit session.
+        """
+        self.sendEditButton.setEnabled(False)
+        self.cancelEditButton.setEnabled(False)
+        self.shareButton.setEnabled(True)
+        self.startEditButton.setEnabled(True)
+        self.startEditButton.setChecked(False)
+        
+        self.cancelEdit.emit()
+    
+    def checkEditorActions(self, editor):
+        """
+        Public slot to set action according to an editor's state.
+        
+        @param editor reference to the editor (Editor)
+        """
+        shareable, sharing, editing, remoteEditing = editor.getSharingStatus()
+        
+        self.shareButton.setChecked(sharing)
+        if sharing:
+            self.shareButton.setIcon(
+                UI.PixmapCache.getIcon("sharedEditConnected.png"))
+        else:
+            self.shareButton.setIcon(
+                UI.PixmapCache.getIcon("sharedEditDisconnected.png"))
+        self.startEditButton.setChecked(editing)
+        
+        self.shareButton.setEnabled(shareable and not editing)
+        self.startEditButton.setEnabled(sharing and not editing and not remoteEditing)
+        self.sendEditButton.setEnabled(editing)
+        self.cancelEditButton.setEnabled(editing)

eric ide

mercurial