Initial commit (Vesion 0.1)
[tablet-suite] / src / ui / .svn / text-base / pcsdeviceviewer.py.svn-base
diff --git a/src/ui/.svn/text-base/pcsdeviceviewer.py.svn-base b/src/ui/.svn/text-base/pcsdeviceviewer.py.svn-base
new file mode 100644 (file)
index 0000000..17495a0
--- /dev/null
@@ -0,0 +1,292 @@
+# Authors: Amaury Medeiros and Paulo Ouriques
+# Software License: GPL
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from functools import partial
+from time import sleep
+
+from pcsdeviceinfoviewer import PcsDeviceInfoViewer
+from pcsdevicewidget import PcsDeviceWidget
+from pcsuiutils import *
+from tsuigeneralmethods import *
+from pcsutils import *
+
+from style.styleTabletSuite import *
+from backup.pcswindowmanager import *
+
+class PcsDeviceViewer(QFrame):
+
+    '''Class that displays the devices which are connected to the PC'''
+
+    _ip = "None"
+    CONNECTION_ERROR_MESSAGE = "Could not connect to device with the given IP " + \
+                    "address.\nCheck if device is turned on and is properly " + \
+                    "connected to network"
+    
+    def __init__(self, deviceManager, pcSuite):
+        super(PcsDeviceViewer, self).__init__()
+        self.deviceManager = deviceManager
+        self.deviceManager.loadDevices()
+#        self.pcSuite = pcSuite
+        self.setFixedSize(WINDOW_WIDTH, 150)
+        self.deviceWidget = PcsDeviceWidget(0)
+
+        # Create device connection type
+        self.deviceInfoViewer = PcsDeviceInfoViewer(pcSuite)
+
+        self.mainLayout = QHBoxLayout()
+        self.mainLayout.setMargin(0)
+
+        spacer = QSpacerItem(15, 15)
+        self.mainLayout.addItem(spacer)
+        self.mainLayout.addWidget(self.deviceWidget)
+        self.mainLayout.addItem(QSpacerItem(20,20))
+        self.mainLayout.addLayout(self.deviceInfoViewer)
+        self.mainLayout.addItem(spacer)
+        self.setLayout(self.mainLayout)
+        
+        self.connectDialog = None
+        
+    def checkIp(self, ip):
+        list = ip.split(".")
+        if len(list) != 4:
+            return False
+        for sublist in list:
+            if len(sublist) < 1 or len(sublist) > 3:
+                return False
+            for element in sublist:
+                if not str(element).isdigit():
+                    return False
+        return True  
+    
+    def showConnectDialog(self):
+        if(self.connectDialog == None):
+            self.connectDialog = QDialog(self, Qt.FramelessWindowHint)
+            self.connectDialog.setObjectName("connectDialog")
+            self.connectDialog.setWindowIcon(QIcon(TABLET_SUITE_LOGO))
+            self.connectDialog.setWindowTitle("Device Selection")
+            connectDialogLayout = QVBoxLayout()
+            
+            hLayout = QHBoxLayout()
+            addButton = QPushButton("Add")
+            addButton.setObjectName("smallButton")
+            self.connect(addButton, SIGNAL("clicked()"), self.addIp)
+            
+            self.ipField = QLineEdit()
+            self.ipField.setText("IP Number")
+            self.ipField.setObjectName("ipField")
+            hLayout.addWidget(self.ipField)
+            hLayout.addWidget(addButton)
+            
+            buttonLayout = QHBoxLayout()
+            self.connectButton = QPushButton("Connect")
+            self.connectButton.setObjectName("tsButton")
+            self.connect(self.connectButton, SIGNAL("clicked()"), self._connect)
+            
+            self.deleteButton = QPushButton("Delete")
+            self.deleteButton.setObjectName("tsButton")
+            self.connect(self.deleteButton, SIGNAL("clicked()"), self._deleteSelectedIp)
+            
+            cancelButton = QPushButton("Cancel")
+            cancelButton.setObjectName("tsButton")
+            setVisible = partial(self.connectDialog.setVisible, False)
+            self.connect(cancelButton, SIGNAL("clicked()"), setVisible)
+            
+            buttonLayout.addWidget(self.connectButton)
+            buttonLayout.addWidget(self.deleteButton)
+            buttonLayout.addWidget(cancelButton)
+            
+            vLayout = QVBoxLayout()
+            vLayout.setMargin(15)
+            vLayout.addWidget(QLabel("Select the device IP"))
+            vLayout.addLayout(hLayout)
+            vLayout.addWidget(self._createIpList())
+            connectDialogLayout.addLayout(vLayout)
+            connectDialogLayout.addLayout(buttonLayout)
+            self.connectDialog.setLayout(connectDialogLayout)
+            self._updateIpList()
+            self.connectDialog.exec_()
+            
+        else:
+            self._updateIpList()
+            self.connectDialog.setVisible(True)
+    
+    def _connect(self):
+        self._ip = self.getSelectedIp()
+        if not create_route(self._ip):
+            showMessageBox(self.CONNECTION_ERROR_MESSAGE,
+                              "Error while connecting to device")
+            return False
+        if not verify_exist_keys(self._ip):
+            dialog = QMessageBox()
+            dialog.setText( "Wrong Key, It seems that the device key " + \
+                            "changed. Do you want to exchange keys again?")
+            dialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
+            dialog.setWindowFlags(Qt.FramelessWindowHint)
+            dialog.setStyleSheet(MESSAGE_BOX_DEFAULT)
+            ret = dialog.exec_()
+            if ret == QMessageBox.Yes:
+                if not self.showPasswdDialog():
+                    return False
+            else:
+                return False
+        self._runAddDevice()
+
+    def _createIpList(self):
+        self.ipList = QTableView(self)
+        self.ipList.setObjectName("ipList")
+        self.ipList.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
+        self.ipList.setAlternatingRowColors(True)
+        self.ipList.setShowGrid(False)
+        self.ipList.setEditTriggers(QAbstractItemView.NoEditTriggers)
+        self.model = QStandardItemModel()
+        self.ipList.setModel(self.model)
+        self._updateButtonsState()
+        self.connect(self.ipList.selectionModel(), 
+                     SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
+                     self._updateButtonsState)
+        
+        hHeader = QHeaderView(Qt.Horizontal)
+        hHeader.setVisible(False)
+        hHeader.setResizeMode(QHeaderView.ResizeToContents)
+        hHeader.setMinimumSectionSize(225)
+        self.ipList.setHorizontalHeader(hHeader)  
+        
+        vHeader = QHeaderView(Qt.Vertical)
+        vHeader.setVisible(False)
+        self.ipList.setVerticalHeader(vHeader)
+        
+        return self.ipList 
+    
+    def _deleteSelectedIp(self):
+        dialog = QMessageBox()
+        dialog.setText("Remove selected ip?")
+        dialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
+        dialog.setWindowFlags(Qt.FramelessWindowHint)
+        dialog.setStyleSheet(MESSAGE_BOX_APP)
+        ret = dialog.exec_()
+        if ret == QMessageBox.Yes:
+            selectionModel = self.ipList.selectionModel()
+            indexList = selectionModel.selectedRows()
+            for index in indexList:
+                if index.isValid():
+                    try:
+                        ipAdress = self.model.itemData(index)[0].toString()
+                        self.deviceManager.removeDevice(ipAdress)
+                    except:
+                        pass
+                    finally:
+                        self.model.removeRow(index.row())
+        
+    def getSelectedIp(self):
+        selectionModel = self.ipList.selectionModel()
+        indexList = selectionModel.selectedRows()
+        
+        for index in indexList:
+            if index.isValid():
+                data = self.model.itemData(index)
+                return data[0].toString()
+    
+    def showInvalidIpDialog(self):
+        showMessageBox("Invalid ip adress", "Invalid ip")
+    
+    def addIp(self):
+        ip = self.ipField.text()
+             
+        if self.checkIp(ip):
+            for i in range(self.model.rowCount()):
+                if(self.model.item(i).text() == ip):
+                    self.ipField.setText("IP Number")
+                    return
+            item = QStandardItem(ip)
+            self.model.appendRow([item])
+            self.ipField.setText("IP Number")
+        else:
+            self.showInvalidIpDialog()
+
+    def showPasswdDialog(self):        
+        (passwd, ok) = QInputDialog.getText(self, "Device Selection",
+                                             "Root Password:",
+                                              QLineEdit.Password,
+                                              QString(), 
+                                              Qt.FramelessWindowHint)
+        if ok and not passwd.isEmpty():
+            self._passwd = passwd
+            if not keyExchange(self._ip, self._passwd):
+                errorMessage = "Could not connect to device with the given IP " + \
+                    "Could not exchange keys"
+                showMessageBox(errorMessage, "Error while connecting to device")
+                return False
+            return True
+    
+    def _updateButtonsState(self):
+        selectionModel = self.ipList.selectionModel()
+        indexList = selectionModel.selectedRows()
+        if len(indexList) > 1 or len(indexList) <= 0:
+            self.connectButton.setDisabled(True)
+            self.deleteButton.setDisabled(True)
+        else:
+            self.connectButton.setEnabled(True)
+            self.deleteButton.setEnabled(True)
+    
+    def _createWindowManager(self, deviceInf):
+         if deviceInf != None:
+                PcsWindowManager(deviceInf, self)
+    
+    def _runAddDevice(self):
+        self.connectingThread = connectingThread(self.deviceManager, self._ip)
+        self.connect(self.connectingThread, SIGNAL("connectException"), self._connectException)
+        self.connect(self.connectingThread, SIGNAL("createWindowManager"), self._createWindowManager)
+        self.connectingThread.start()
+        
+        self.connectionProgress()
+        self.connect(self.connectingThread, SIGNAL("connectionDone"), self.updateDeviceInformation)
+                
+    def updateDeviceInformation(self, deviceInfo):
+        self._progressDialog.cancel()
+        self.deviceInfo = deviceInfo
+        self.deviceManager.setCurrentDevice(self._ip)
+        if self.deviceInfo:
+            self.deviceManager.loadDevices()
+            self.deviceWidget.setDeviceInfo(self.deviceInfo)
+            self.deviceInfoViewer.setDeviceInfo(self.deviceInfo)
+        else:
+            showMessageBox("An error occurred while connect.", "Connection error")
+    
+    def _updateIpList(self):
+        self.model.clear()
+        devices = self.deviceManager.getDevices()
+        for device in devices:
+            self.model.appendRow(QStandardItem(str(device)))
+    
+    def connectionProgress(self):
+        self.connectDialog.setVisible(False)
+        self._progressDialog = QProgressDialog("Connecting...", 
+                                               QString(), 0, -1, self,
+                                               Qt.FramelessWindowHint)
+        self._progressDialog.setObjectName("progressDialog")
+        self._progressDialog.setWindowIcon(QIcon(BACKUP_IMAGE))
+        self._progressDialog.setValue(0)
+        self._progressDialog.show()
+        
+    def _connectException(self):
+        showMessageBox("", "Error while connect to device")
+
+
+class connectingThread(QThread):
+    def __init__(self, deviceManager, deviceIp):
+        QThread.__init__(self)
+        self.deviceManager = deviceManager
+        self.deviceIp = deviceIp
+    
+    def run(self):
+        try:
+            deviceInf = self.deviceManager._addDevice(self.deviceIp)
+            self.emit(SIGNAL("createWindowManager"), deviceInf)
+            self.emit(SIGNAL("connectionDone"), deviceInf)
+        except:
+            self.emit(SIGNAL("connectException"))
+            self.emit(SIGNAL("connectionDone"), None)
\ No newline at end of file