fix issues when closing tabs

- catch error on AsynTcp.shutdown (when already disconnected)
- avoid opening duplicate tabs
- shorten try except in mainWindow._handleTabClose to the minimum
+ fix an issue with frappy.client.CacheItem.formatted

Change-Id: Ice4086373a89a969f02e08ec90a173edbd5b0585
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30730
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
zolliker 2023-03-21 10:30:53 +01:00
parent c3796aa6eb
commit dd6ee398f2
3 changed files with 20 additions and 13 deletions

View File

@ -141,6 +141,8 @@ class CacheItem(tuple):
def formatted(self): def formatted(self):
"""format value with using unit""" """format value with using unit"""
if self[2]: # readerror
return repr(self[2])
return self.format_value(self[0]) return self.format_value(self[0])
def __repr__(self): def __repr__(self):

View File

@ -111,7 +111,6 @@ class MainWindow(QMainWindow):
self.recentNodesChanged.connect(greeter.loadRecent) self.recentNodesChanged.connect(greeter.loadRecent)
self.tab.addPanel(greeter, 'Welcome') self.tab.addPanel(greeter, 'Welcome')
self._nodes = {}
self._nodeWidgets = {} self._nodeWidgets = {}
# add localhost (if available) and SEC nodes given as arguments # add localhost (if available) and SEC nodes given as arguments
@ -187,6 +186,10 @@ class MainWindow(QMainWindow):
'Connecting to %s failed!' % host, str(e)) 'Connecting to %s failed!' % host, str(e))
def _addNode(self, host): def _addNode(self, host):
prevWidget = self._nodeWidgets.get(host)
if prevWidget:
self.tab.setCurrentWidget(prevWidget)
return
# create client # create client
node = QSECNode(host, self.log, parent=self) node = QSECNode(host, self.log, parent=self)
nodeWidget = NodeWidget(node) nodeWidget = NodeWidget(node)
@ -194,10 +197,8 @@ class MainWindow(QMainWindow):
nodeWidget._rebuildAdvanced(self.actionDetailed_View.isChecked()) nodeWidget._rebuildAdvanced(self.actionDetailed_View.isChecked())
# Node and NodeWidget created without error # Node and NodeWidget created without error
nodename = node.nodename
self._nodes[nodename] = node
self.tab.addTab(nodeWidget, node.equipmentId) self.tab.addTab(nodeWidget, node.equipmentId)
self._nodeWidgets[nodename] = nodeWidget self._nodeWidgets[host] = nodeWidget
self.tab.setCurrentWidget(nodeWidget) self.tab.setCurrentWidget(nodeWidget)
# add to recent nodes # add to recent nodes
@ -208,7 +209,6 @@ class MainWindow(QMainWindow):
recent.insert(0, host) recent.insert(0, host)
settings.setValue('recent', recent) settings.setValue('recent', recent)
self.recentNodesChanged.emit() self.recentNodesChanged.emit()
return nodename
def buildRecentNodeMenu(self): def buildRecentNodeMenu(self):
settings = QSettings() settings = QSettings()
@ -233,15 +233,17 @@ class MainWindow(QMainWindow):
self.recentNodesChanged.emit() self.recentNodesChanged.emit()
def _handleTabClose(self, index): def _handleTabClose(self, index):
nodeWidget = self.tab.widget(index)
try: try:
node = self.tab.widget(index).getSecNode() node = nodeWidget.getSecNode()
# disconnect node from all events
node.terminate_connection()
self._nodes.pop(node.nodename)
self.log.debug("Closing tab with node %s" % node.nodename)
except AttributeError: except AttributeError:
# Closing the greeter # Closing the greeter
self.log.debug("Greeter Tab closed") self.log.debug("Greeter Tab closed")
else:
# disconnect node from all events
node.terminate_connection()
self._nodeWidgets.pop(node.contactPoint)
self.log.debug("Closing tab with node %s" % node.nodename)
self.tab.removeTab(index) self.tab.removeTab(index)
def _rebuildAdvanced(self, advanced): def _rebuildAdvanced(self, advanced):
@ -253,7 +255,7 @@ class MainWindow(QMainWindow):
widget._rebuildAdvanced(advanced) widget._rebuildAdvanced(advanced)
def _onQuit(self): def _onQuit(self):
for node in self._nodes.values(): for widget in self._nodeWidgets.values():
# this is only qt signals deconnecting! # this is only qt signals deconnecting!
node.terminate_connection() widget.getSecNode().terminate_connection()
self.logwin.onClose() self.logwin.onClose()

View File

@ -182,7 +182,10 @@ class AsynTcp(AsynConn):
def shutdown(self): def shutdown(self):
if self.connection: if self.connection:
try:
self.connection.shutdown(socket.SHUT_RDWR) self.connection.shutdown(socket.SHUT_RDWR)
except OSError:
pass # in case socket is already disconnected
def disconnect(self): def disconnect(self):
if self.connection: if self.connection: