1 # Authors: Amaury Medeiros and Paulo Ouriques
2 # Software License: GPL
4 from PyQt4.QtCore import *
5 from PyQt4.QtGui import *
7 from functools import partial
10 from pcsdeviceinfoviewer import PcsDeviceInfoViewer
11 from pcsdevicewidget import PcsDeviceWidget
12 from pcsuiutils import *
13 from tsuigeneralmethods import *
14 from pcsutils import *
16 from style.styleTabletSuite import *
17 from backup.pcswindowmanager import *
19 class PcsDeviceViewer(QFrame):
21 '''Class that displays the devices which are connected to the PC'''
24 CONNECTION_ERROR_MESSAGE = "Could not connect to device with the given IP " + \
25 "address.\nCheck if device is turned on and is properly " + \
26 "connected to network"
28 def __init__(self, deviceManager, pcSuite):
29 super(PcsDeviceViewer, self).__init__()
30 self.deviceManager = deviceManager
31 self.deviceManager.loadDevices()
32 # self.pcSuite = pcSuite
33 self.setFixedSize(WINDOW_WIDTH, 150)
34 self.deviceWidget = PcsDeviceWidget(0)
36 # Create device connection type
37 self.deviceInfoViewer = PcsDeviceInfoViewer(pcSuite)
39 self.mainLayout = QHBoxLayout()
40 self.mainLayout.setMargin(0)
42 spacer = QSpacerItem(15, 15)
43 self.mainLayout.addItem(spacer)
44 self.mainLayout.addWidget(self.deviceWidget)
45 self.mainLayout.addItem(QSpacerItem(20,20))
46 self.mainLayout.addLayout(self.deviceInfoViewer)
47 self.mainLayout.addItem(spacer)
48 self.setLayout(self.mainLayout)
50 self.connectDialog = None
52 def checkIp(self, ip):
57 if len(sublist) < 1 or len(sublist) > 3:
59 for element in sublist:
60 if not str(element).isdigit():
64 def showConnectDialog(self):
65 if(self.connectDialog == None):
66 self.connectDialog = QDialog(self, Qt.FramelessWindowHint)
67 self.connectDialog.setObjectName("connectDialog")
68 self.connectDialog.setWindowIcon(QIcon(TABLET_SUITE_LOGO))
69 self.connectDialog.setWindowTitle("Device Selection")
70 connectDialogLayout = QVBoxLayout()
72 hLayout = QHBoxLayout()
73 addButton = QPushButton("Add")
74 addButton.setObjectName("smallButton")
75 self.connect(addButton, SIGNAL("clicked()"), self.addIp)
77 self.ipField = QLineEdit()
78 self.ipField.setText("IP Number")
79 self.ipField.setObjectName("ipField")
80 hLayout.addWidget(self.ipField)
81 hLayout.addWidget(addButton)
83 buttonLayout = QHBoxLayout()
84 self.connectButton = QPushButton("Connect")
85 self.connectButton.setObjectName("tsButton")
86 self.connect(self.connectButton, SIGNAL("clicked()"), self._connect)
88 self.deleteButton = QPushButton("Delete")
89 self.deleteButton.setObjectName("tsButton")
90 self.connect(self.deleteButton, SIGNAL("clicked()"), self._deleteSelectedIp)
92 cancelButton = QPushButton("Cancel")
93 cancelButton.setObjectName("tsButton")
94 setVisible = partial(self.connectDialog.setVisible, False)
95 self.connect(cancelButton, SIGNAL("clicked()"), setVisible)
97 buttonLayout.addWidget(self.connectButton)
98 buttonLayout.addWidget(self.deleteButton)
99 buttonLayout.addWidget(cancelButton)
101 vLayout = QVBoxLayout()
102 vLayout.setMargin(15)
103 vLayout.addWidget(QLabel("Select the device IP"))
104 vLayout.addLayout(hLayout)
105 vLayout.addWidget(self._createIpList())
106 connectDialogLayout.addLayout(vLayout)
107 connectDialogLayout.addLayout(buttonLayout)
108 self.connectDialog.setLayout(connectDialogLayout)
110 self.connectDialog.exec_()
114 self.connectDialog.setVisible(True)
117 self._ip = self.getSelectedIp()
118 if not create_route(self._ip):
119 showMessageBox(self.CONNECTION_ERROR_MESSAGE,
120 "Error while connecting to device")
122 if not verify_exist_keys(self._ip):
123 dialog = QMessageBox()
124 dialog.setText( "Wrong Key, It seems that the device key " + \
125 "changed. Do you want to exchange keys again?")
126 dialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
127 dialog.setWindowFlags(Qt.FramelessWindowHint)
128 dialog.setStyleSheet(MESSAGE_BOX_DEFAULT)
130 if ret == QMessageBox.Yes:
131 if not self.showPasswdDialog():
137 def _createIpList(self):
138 self.ipList = QTableView(self)
139 self.ipList.setObjectName("ipList")
140 self.ipList.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
141 self.ipList.setAlternatingRowColors(True)
142 self.ipList.setShowGrid(False)
143 self.ipList.setEditTriggers(QAbstractItemView.NoEditTriggers)
144 self.model = QStandardItemModel()
145 self.ipList.setModel(self.model)
146 self._updateButtonsState()
147 self.connect(self.ipList.selectionModel(),
148 SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
149 self._updateButtonsState)
151 hHeader = QHeaderView(Qt.Horizontal)
152 hHeader.setVisible(False)
153 hHeader.setResizeMode(QHeaderView.ResizeToContents)
154 hHeader.setMinimumSectionSize(225)
155 self.ipList.setHorizontalHeader(hHeader)
157 vHeader = QHeaderView(Qt.Vertical)
158 vHeader.setVisible(False)
159 self.ipList.setVerticalHeader(vHeader)
163 def _deleteSelectedIp(self):
164 dialog = QMessageBox()
165 dialog.setText("Remove selected ip?")
166 dialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
167 dialog.setWindowFlags(Qt.FramelessWindowHint)
168 dialog.setStyleSheet(MESSAGE_BOX_APP)
170 if ret == QMessageBox.Yes:
171 selectionModel = self.ipList.selectionModel()
172 indexList = selectionModel.selectedRows()
173 for index in indexList:
176 ipAdress = self.model.itemData(index)[0].toString()
177 self.deviceManager.removeDevice(ipAdress)
181 self.model.removeRow(index.row())
183 def getSelectedIp(self):
184 selectionModel = self.ipList.selectionModel()
185 indexList = selectionModel.selectedRows()
187 for index in indexList:
189 data = self.model.itemData(index)
190 return data[0].toString()
192 def showInvalidIpDialog(self):
193 showMessageBox("Invalid ip adress", "Invalid ip")
196 ip = self.ipField.text()
199 for i in range(self.model.rowCount()):
200 if(self.model.item(i).text() == ip):
201 self.ipField.setText("IP Number")
203 item = QStandardItem(ip)
204 self.model.appendRow([item])
205 self.ipField.setText("IP Number")
207 self.showInvalidIpDialog()
209 def showPasswdDialog(self):
210 (passwd, ok) = QInputDialog.getText(self, "Device Selection",
214 Qt.FramelessWindowHint)
215 if ok and not passwd.isEmpty():
216 self._passwd = passwd
217 if not keyExchange(self._ip, self._passwd):
218 errorMessage = "Could not connect to device with the given IP " + \
219 "Could not exchange keys"
220 showMessageBox(errorMessage, "Error while connecting to device")
224 def _updateButtonsState(self):
225 selectionModel = self.ipList.selectionModel()
226 indexList = selectionModel.selectedRows()
227 if len(indexList) > 1 or len(indexList) <= 0:
228 self.connectButton.setDisabled(True)
229 self.deleteButton.setDisabled(True)
231 self.connectButton.setEnabled(True)
232 self.deleteButton.setEnabled(True)
234 def _createWindowManager(self, deviceInf):
235 if deviceInf != None:
236 PcsWindowManager(deviceInf, self)
238 def _runAddDevice(self):
239 self.connectingThread = connectingThread(self.deviceManager, self._ip)
240 self.connect(self.connectingThread, SIGNAL("connectException"), self._connectException)
241 self.connect(self.connectingThread, SIGNAL("createWindowManager"), self._createWindowManager)
242 self.connectingThread.start()
244 self.connectionProgress()
245 self.connect(self.connectingThread, SIGNAL("connectionDone"), self.updateDeviceInformation)
247 def updateDeviceInformation(self, deviceInfo):
248 self._progressDialog.cancel()
249 self.deviceInfo = deviceInfo
250 self.deviceManager.setCurrentDevice(self._ip)
252 self.deviceManager.loadDevices()
253 self.deviceWidget.setDeviceInfo(self.deviceInfo)
254 self.deviceInfoViewer.setDeviceInfo(self.deviceInfo)
256 showMessageBox("An error occurred while connect.", "Connection error")
258 def _updateIpList(self):
260 devices = self.deviceManager.getDevices()
261 for device in devices:
262 self.model.appendRow(QStandardItem(str(device)))
264 def connectionProgress(self):
265 self.connectDialog.setVisible(False)
266 self._progressDialog = QProgressDialog("Connecting...",
267 QString(), 0, -1, self,
268 Qt.FramelessWindowHint)
269 self._progressDialog.setObjectName("progressDialog")
270 self._progressDialog.setWindowIcon(QIcon(BACKUP_IMAGE))
271 self._progressDialog.setValue(0)
272 self._progressDialog.show()
274 def _connectException(self):
275 showMessageBox("", "Error while connect to device")
278 class connectingThread(QThread):
279 def __init__(self, deviceManager, deviceIp):
280 QThread.__init__(self)
281 self.deviceManager = deviceManager
282 self.deviceIp = deviceIp
286 deviceInf = self.deviceManager._addDevice(self.deviceIp)
287 self.emit(SIGNAL("createWindowManager"), deviceInf)
288 self.emit(SIGNAL("connectionDone"), deviceInf)
290 self.emit(SIGNAL("connectException"))
291 self.emit(SIGNAL("connectionDone"), None)