GUI fixes

- do not show command result dialog when result is None
- apply fmtstr, if available

+ fix io import in secop.core
+ change old style <basecls>.__init__(self, ...) calls to super().__init__(...)

Change-Id: I599d5d8e8ff430ea9454a0858d703290e87454fc
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/26397
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Jens Krueger <jens.krueger@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
zolliker 2021-07-15 16:00:47 +02:00
parent bc6a99e11b
commit f3978385b4
11 changed files with 39 additions and 36 deletions

View File

@ -36,4 +36,4 @@ from secop.params import Command, Parameter
from secop.poller import AUTO, DYNAMIC, REGULAR, SLOW from secop.poller import AUTO, DYNAMIC, REGULAR, SLOW
from secop.properties import Property from secop.properties import Property
from secop.proxy import Proxy, SecNode, proxy_class from secop.proxy import Proxy, SecNode, proxy_class
from secop.stringio import HasIodev, StringIO from secop.io import HasIodev, StringIO, BytesIO

View File

@ -1080,7 +1080,7 @@ UInt64 = IntRange(0, (1 << 64) - 1)
# Goodie: Convenience Datatypes for Programming # Goodie: Convenience Datatypes for Programming
class LimitsType(TupleOf): class LimitsType(TupleOf):
def __init__(self, members): def __init__(self, members):
TupleOf.__init__(self, members, members) super().__init__(members, members)
def __call__(self, value): def __call__(self, value):
limits = TupleOf.__call__(self, value) limits = TupleOf.__call__(self, value)
@ -1092,7 +1092,7 @@ class LimitsType(TupleOf):
class StatusType(TupleOf): class StatusType(TupleOf):
# shorten initialisation and allow access to status enumMembers from status values # shorten initialisation and allow access to status enumMembers from status values
def __init__(self, enum): def __init__(self, enum):
TupleOf.__init__(self, EnumType(enum), StringType()) super().__init__(EnumType(enum), StringType())
self._enum = enum self._enum = enum
def __getattr__(self, key): def __getattr__(self, key):

View File

@ -25,7 +25,7 @@
class SECoPError(RuntimeError): class SECoPError(RuntimeError):
def __init__(self, *args, **kwds): def __init__(self, *args, **kwds):
RuntimeError.__init__(self) super().__init__()
self.args = args self.args = args
for k, v in list(kwds.items()): for k, v in list(kwds.items()):
setattr(self, k, v) setattr(self, k, v)

View File

@ -39,7 +39,7 @@ COMMENT = 'comment'
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
def __init__(self, file_path=None, parent=None): def __init__(self, file_path=None, parent=None):
QMainWindow.__init__(self, parent) super().__init__(parent)
loadUi(self, 'mainwindow.ui') loadUi(self, 'mainwindow.ui')
self.tabWidget.currentChanged.connect(self.tab_relevant_btns_disable) self.tabWidget.currentChanged.connect(self.tab_relevant_btns_disable)
if file_path is None: if file_path is None:

View File

@ -26,7 +26,7 @@ from secop.gui.qt import QHBoxLayout, QSizePolicy, QSpacerItem, Qt, QWidget
class NodeDisplay(QWidget): class NodeDisplay(QWidget):
def __init__(self, file_path=None, parent=None): def __init__(self, file_path=None, parent=None):
QWidget.__init__(self, parent) super().__init__(parent)
loadUi(self, 'node_display.ui') loadUi(self, 'node_display.ui')
self.saved = bool(file_path) self.saved = bool(file_path)
self.created = self.tree_widget.set_file(file_path) self.created = self.tree_widget.set_file(file_path)

View File

@ -44,7 +44,7 @@ class TreeWidgetItem(QTreeWidgetItem):
the datatype passed onto ValueWidget should be on of secop.datatypes""" the datatype passed onto ValueWidget should be on of secop.datatypes"""
# TODO: like stated in docstring the datatype for parameters and # TODO: like stated in docstring the datatype for parameters and
# properties must be found out through their object # properties must be found out through their object
QTreeWidgetItem.__init__(self, parent) super().__init__(parent)
self.kind = kind self.kind = kind
self.name = name self.name = name
self.class_object = class_object self.class_object = class_object
@ -129,7 +129,7 @@ class ValueWidget(QWidget):
def __init__(self, name='', value='', datatype=None, kind='', parent=None): def __init__(self, name='', value='', datatype=None, kind='', parent=None):
# TODO: implement: change module/interface class # TODO: implement: change module/interface class
QWidget.__init__(self, parent) super().__init__(parent)
self.datatype = datatype self.datatype = datatype
self.layout = QVBoxLayout() self.layout = QVBoxLayout()
self.name_label = QLabel(name) self.name_label = QLabel(name)
@ -205,7 +205,7 @@ class ValueWidget(QWidget):
class ChangeNameDialog(QDialog): class ChangeNameDialog(QDialog):
def __init__(self, current_name='', invalid_names=None, parent=None): def __init__(self, current_name='', invalid_names=None, parent=None):
QWidget.__init__(self, parent) super().__init__(parent)
loadUi(self, 'change_name_dialog.ui') loadUi(self, 'change_name_dialog.ui')
self.invalid_names = invalid_names self.invalid_names = invalid_names
self.name.setText(current_name) self.name.setText(current_name)

View File

@ -31,7 +31,7 @@ from secop.gui.cfg_editor.utils import get_all_items, \
get_props, loadUi, set_name_edit_style, setActionIcon get_props, loadUi, set_name_edit_style, setActionIcon
from secop.gui.qt import QComboBox, QDialog, QDialogButtonBox, QLabel, \ from secop.gui.qt import QComboBox, QDialog, QDialogButtonBox, QLabel, \
QLineEdit, QMenu, QPoint, QSize, QStandardItem, QStandardItemModel, \ QLineEdit, QMenu, QPoint, QSize, QStandardItem, QStandardItemModel, \
Qt, QTabBar, QTextEdit, QTreeView, QTreeWidget, QWidget, pyqtSignal Qt, QTabBar, QTextEdit, QTreeView, QTreeWidget, pyqtSignal
NODE = 'node' NODE = 'node'
MODULE = 'module' MODULE = 'module'
@ -47,7 +47,7 @@ class TreeWidget(QTreeWidget):
add_canceled = pyqtSignal() add_canceled = pyqtSignal()
def __init__(self, parent=None): def __init__(self, parent=None):
QTreeWidget.__init__(self, parent) super().__init__(parent)
self.file_path = None self.file_path = None
self.setIconSize(QSize(24, 24)) self.setIconSize(QSize(24, 24))
self.setSelectionMode(QTreeWidget.SingleSelection) self.setSelectionMode(QTreeWidget.SingleSelection)
@ -335,7 +335,7 @@ class AddDialog(QDialog):
"""Notes: """Notes:
self.get_value: is mapped to the specific method for getting self.get_value: is mapped to the specific method for getting
the value from self.value""" the value from self.value"""
QWidget.__init__(self, parent) super().__init__(parent)
loadUi(self, 'add_dialog.ui') loadUi(self, 'add_dialog.ui')
self.setWindowTitle('add %s' % kind) self.setWindowTitle('add %s' % kind)
self.kind = kind self.kind = kind
@ -402,7 +402,7 @@ class AddDialog(QDialog):
class TabBar(QTabBar): class TabBar(QTabBar):
def __init__(self, parent=None): def __init__(self, parent=None):
QTabBar.__init__(self, parent) super().__init__(parent)
self.setContextMenuPolicy(Qt.CustomContextMenu) self.setContextMenuPolicy(Qt.CustomContextMenu)
self.context_pos = QPoint(0, 0) self.context_pos = QPoint(0, 0)
self.menu = QMenu() self.menu = QMenu()
@ -436,7 +436,7 @@ class TabBar(QTabBar):
class TreeComboBox(QComboBox): class TreeComboBox(QComboBox):
def __init__(self, value_dict, parent=None): def __init__(self, value_dict, parent=None):
QComboBox.__init__(self, parent) super().__init__(parent)
self.tree_view = QTreeView() self.tree_view = QTreeView()
self.tree_view.setHeaderHidden(True) self.tree_view.setHeaderHidden(True)
self.tree_view.expanded.connect(self.resize_length) self.tree_view.expanded.connect(self.resize_length)

View File

@ -44,7 +44,7 @@ class QSECNode(QObject):
logEntry = pyqtSignal(str) logEntry = pyqtSignal(str)
def __init__(self, uri, parent=None): def __init__(self, uri, parent=None):
QObject.__init__(self, parent) super().__init__(parent)
self.conn = conn = secop.client.SecopClient(uri) self.conn = conn = secop.client.SecopClient(uri)
conn.validate_data = True conn.validate_data = True
self.log = conn.log self.log = conn.log
@ -83,10 +83,7 @@ class QSECNode(QObject):
return self.conn.getParameter(module, parameter, True) return self.conn.getParameter(module, parameter, True)
def execCommand(self, module, command, argument): def execCommand(self, module, command, argument):
try: return self.conn.execCommand(module, command, argument)
return self.conn.execCommand(module, command, argument)
except Exception as e:
return 'ERROR: %r' % e, {}
def queryCache(self, module): def queryCache(self, module):
return {k: Value(*self.conn.cache[(module, k)]) return {k: Value(*self.conn.cache[(module, k)])
@ -115,7 +112,7 @@ class QSECNode(QObject):
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
def __init__(self, hosts, parent=None): def __init__(self, hosts, parent=None):
super(MainWindow, self).__init__(parent) super().__init__(parent)
loadUi(self, 'mainwindow.ui') loadUi(self, 'mainwindow.ui')

View File

@ -160,7 +160,7 @@ class MiniPlotFitCurve(MiniPlotCurve):
return float('-inf') return float('-inf')
def __init__(self, formula, params): def __init__(self, formula, params):
super(MiniPlotFitCurve, self).__init__() super().__init__()
self.formula = formula self.formula = formula
self.params = params self.params = params
@ -193,7 +193,7 @@ class MiniPlot(QWidget):
autoticky = True autoticky = True
def __init__(self, parent=None): def __init__(self, parent=None):
QWidget.__init__(self, parent) super().__init__(parent)
self.xmin = self.xmax = None self.xmin = self.xmax = None
self.ymin = self.ymax = None self.ymin = self.ymax = None
self.curves = [] self.curves = []

View File

@ -32,7 +32,7 @@ from secop.gui.valuewidgets import get_widget
class CommandDialog(QDialog): class CommandDialog(QDialog):
def __init__(self, cmdname, argument, parent=None): def __init__(self, cmdname, argument, parent=None):
super(CommandDialog, self).__init__(parent) super().__init__(parent)
loadUi(self, 'cmddialog.ui') loadUi(self, 'cmddialog.ui')
self.setWindowTitle('Arguments for %s' % cmdname) self.setWindowTitle('Arguments for %s' % cmdname)
@ -58,7 +58,7 @@ class CommandDialog(QDialog):
return True, self.widgets[0].get_value() return True, self.widgets[0].get_value()
def exec_(self): def exec_(self):
if super(CommandDialog, self).exec_(): if super().exec_():
return self.get_value() return self.get_value()
return None return None
@ -71,16 +71,17 @@ def showCommandResultDialog(command, args, result, extras=''):
m.exec_() m.exec_()
def showErrorDialog(error): def showErrorDialog(command, args, error):
m = QMessageBox() m = QMessageBox()
m.setText('Error %r' % error) args = '' if args is None else repr(args)
m.setText('calling: %s(%s)\nraised %r' % (command, args, error))
m.exec_() m.exec_()
class ParameterGroup(QWidget): class ParameterGroup(QWidget):
def __init__(self, groupname, parent=None): def __init__(self, groupname, parent=None):
super(ParameterGroup, self).__init__(parent) super().__init__(parent)
loadUi(self, 'paramgroup.ui') loadUi(self, 'paramgroup.ui')
self._groupname = groupname self._groupname = groupname
@ -112,7 +113,7 @@ class ParameterGroup(QWidget):
class CommandButton(QPushButton): class CommandButton(QPushButton):
def __init__(self, cmdname, cmdinfo, cb, parent=None): def __init__(self, cmdname, cmdinfo, cb, parent=None):
super(CommandButton, self).__init__(parent) super().__init__(parent)
self._cmdname = cmdname self._cmdname = cmdname
self._argintype = cmdinfo['datatype'].argument # single datatype self._argintype = cmdinfo['datatype'].argument # single datatype
@ -140,7 +141,7 @@ class CommandButton(QPushButton):
class ModuleCtrl(QWidget): class ModuleCtrl(QWidget):
def __init__(self, node, module, parent=None): def __init__(self, node, module, parent=None):
super(ModuleCtrl, self).__init__(parent) super().__init__(parent)
loadUi(self, 'modulectrl.ui') loadUi(self, 'modulectrl.ui')
self._node = node self._node = node
self._module = module self._module = module
@ -161,11 +162,11 @@ class ModuleCtrl(QWidget):
try: try:
result, qualifiers = self._node.execCommand( result, qualifiers = self._node.execCommand(
self._module, command, args) self._module, command, args)
except TypeError: except Exception as e:
result = None showErrorDialog(command, args, e)
qualifiers = {} return
# XXX: flag missing data report as error if result is not None:
showCommandResultDialog(command, args, result, qualifiers) showCommandResultDialog(command, args, result, qualifiers)
def _initModuleWidgets(self): def _initModuleWidgets(self):
initValues = self._node.queryCache(self._module) initValues = self._node.queryCache(self._module)

View File

@ -39,7 +39,7 @@ class ParameterWidget(QWidget):
initvalue=None, initvalue=None,
readonly=True, readonly=True,
parent=None): parent=None):
super(ParameterWidget, self).__init__(parent) super().__init__(parent)
self._module = module self._module = module
self._paramcmd = paramcmd self._paramcmd = paramcmd
self._datatype = datatype self._datatype = datatype
@ -76,7 +76,12 @@ class GenericParameterWidget(ParameterWidget):
self.setLineEdit.text()) self.setLineEdit.text())
def updateValue(self, value): def updateValue(self, value):
self.currentLineEdit.setText(str(value)) fmtstr = getattr(self._datatype, 'fmtstr', '%s')
if value.readerror:
value = str(value)
else:
value = fmtstr % (value.value,)
self.currentLineEdit.setText(value)
class EnumParameterWidget(GenericParameterWidget): class EnumParameterWidget(GenericParameterWidget):