polishing for a demo
+ adopting additional requests Change-Id: If5ca29b5d247f1bc429ca101b0081b1d14f6e6f1
This commit is contained in:
@ -21,7 +21,7 @@
|
||||
#
|
||||
# *****************************************************************************
|
||||
|
||||
from PyQt4.QtGui import QMainWindow, QInputDialog, QTreeWidgetItem
|
||||
from PyQt4.QtGui import QMainWindow, QInputDialog, QTreeWidgetItem, QMessageBox
|
||||
from PyQt4.QtCore import pyqtSignature as qtsig, QObject, pyqtSignal
|
||||
|
||||
from secop.gui.util import loadUi
|
||||
@ -30,6 +30,8 @@ from secop.gui.modulectrl import ModuleCtrl
|
||||
from secop.gui.paramview import ParameterView
|
||||
from secop.client.baseclient import Client as SECNode
|
||||
|
||||
import sys
|
||||
|
||||
ITEM_TYPE_NODE = QTreeWidgetItem.UserType + 1
|
||||
ITEM_TYPE_MODULE = QTreeWidgetItem.UserType + 2
|
||||
ITEM_TYPE_PARAMETER = QTreeWidgetItem.UserType + 3
|
||||
@ -61,21 +63,34 @@ class QSECNode(SECNode, QObject):
|
||||
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super(MainWindow, self).__init__(parent)
|
||||
|
||||
loadUi(self, 'mainwindow.ui')
|
||||
|
||||
self.toolBar.hide()
|
||||
self.lineEdit.hide()
|
||||
|
||||
self.splitter.setStretchFactor(0, 1)
|
||||
self.splitter.setStretchFactor(1, 70)
|
||||
self.splitter.setSizes([50, 500])
|
||||
|
||||
self._nodes = {}
|
||||
self._nodeCtrls = {}
|
||||
self._topItems = {}
|
||||
self._currentWidget = self.splitter.widget(1).layout().takeAt(0)
|
||||
|
||||
# add localhost if available
|
||||
self._addNode('localhost')
|
||||
# add localhost (if available) and SEC nodes given as arguments
|
||||
args = sys.argv[1:]
|
||||
if '-d' in args:
|
||||
args.remove('-d')
|
||||
if not args:
|
||||
args = ['localhost']
|
||||
for host in args:
|
||||
try:
|
||||
self._addNode(host)
|
||||
except Exception as e:
|
||||
print e
|
||||
|
||||
@qtsig('')
|
||||
def on_actionAdd_SEC_node_triggered(self):
|
||||
@ -85,7 +100,11 @@ class MainWindow(QMainWindow):
|
||||
if not ok:
|
||||
return
|
||||
|
||||
self._addNode(host)
|
||||
try:
|
||||
self._addNode(host)
|
||||
except Exception as e:
|
||||
QMessageBox.critical(self.parent(),
|
||||
'Connecting to %s failed!' % host, str(e))
|
||||
|
||||
def on_treeWidget_currentItemChanged(self, current, previous):
|
||||
if current.type() == ITEM_TYPE_NODE:
|
||||
@ -94,8 +113,18 @@ class MainWindow(QMainWindow):
|
||||
self._displayModule(current.parent().text(0), current.text(0))
|
||||
elif current.type() == ITEM_TYPE_PARAMETER:
|
||||
self._displayParameter(current.parent().parent().text(0),
|
||||
current.parent().text(0),
|
||||
current.text(0))
|
||||
current.parent().text(0), current.text(0))
|
||||
|
||||
def _removeSubTree(self, toplevelItem):
|
||||
#....
|
||||
pass
|
||||
|
||||
def _nodeDisconnected_callback(self, host):
|
||||
node = self._nodes[host]
|
||||
topItem = self._topItems[node]
|
||||
self._removeSubTree(topItem)
|
||||
node.quit()
|
||||
QMessageBox(self.parent(), repr(host))
|
||||
|
||||
def _addNode(self, host):
|
||||
|
||||
@ -109,6 +138,7 @@ class MainWindow(QMainWindow):
|
||||
|
||||
host = '%s (%s)' % (node.equipment_id, host)
|
||||
self._nodes[host] = node
|
||||
node.register_shutdown_callback(self._nodeDisconnected_callback, host)
|
||||
|
||||
# fill tree
|
||||
nodeItem = QTreeWidgetItem(None, [host], ITEM_TYPE_NODE)
|
||||
@ -120,6 +150,7 @@ class MainWindow(QMainWindow):
|
||||
ITEM_TYPE_PARAMETER)
|
||||
|
||||
self.treeWidget.addTopLevelItem(nodeItem)
|
||||
self._topItems[node] = nodeItem
|
||||
|
||||
def _displayNode(self, node):
|
||||
|
||||
@ -135,10 +166,7 @@ class MainWindow(QMainWindow):
|
||||
|
||||
def _displayParameter(self, node, module, parameter):
|
||||
self._replaceCtrlWidget(
|
||||
ParameterView(
|
||||
self._nodes[node],
|
||||
module,
|
||||
parameter))
|
||||
ParameterView(self._nodes[node], module, parameter))
|
||||
|
||||
def _replaceCtrlWidget(self, new):
|
||||
old = self.splitter.widget(1).layout().takeAt(0)
|
||||
|
@ -21,7 +21,7 @@
|
||||
#
|
||||
# *****************************************************************************
|
||||
|
||||
from PyQt4.QtGui import QWidget, QLabel
|
||||
from PyQt4.QtGui import QWidget, QLabel, QMessageBox
|
||||
from PyQt4.QtCore import pyqtSignature as qtsig, Qt, pyqtSignal
|
||||
|
||||
from secop.gui.util import loadUi
|
||||
@ -30,8 +30,12 @@ from secop.gui.util import loadUi
|
||||
class ParameterButtons(QWidget):
|
||||
setRequested = pyqtSignal(str, str, str) # module, parameter, target
|
||||
|
||||
def __init__(self, module, parameter, initval='',
|
||||
readonly=True, parent=None):
|
||||
def __init__(self,
|
||||
module,
|
||||
parameter,
|
||||
initval='',
|
||||
readonly=True,
|
||||
parent=None):
|
||||
super(ParameterButtons, self).__init__(parent)
|
||||
loadUi(self, 'parambuttons.ui')
|
||||
|
||||
@ -42,6 +46,9 @@ class ParameterButtons(QWidget):
|
||||
if readonly:
|
||||
self.setPushButton.setEnabled(False)
|
||||
self.setLineEdit.setEnabled(False)
|
||||
else:
|
||||
self.setLineEdit.returnPressed.connect(
|
||||
self.on_setPushButton_clicked)
|
||||
|
||||
def on_setPushButton_clicked(self):
|
||||
self.setRequested.emit(self._module, self._parameter,
|
||||
@ -49,12 +56,12 @@ class ParameterButtons(QWidget):
|
||||
|
||||
|
||||
class ModuleCtrl(QWidget):
|
||||
|
||||
def __init__(self, node, module, parent=None):
|
||||
super(ModuleCtrl, self).__init__(parent)
|
||||
loadUi(self, 'modulectrl.ui')
|
||||
self._node = node
|
||||
self._module = module
|
||||
self._lastclick = None
|
||||
|
||||
self._paramWidgets = {} # widget cache do avoid garbage collection
|
||||
|
||||
@ -71,7 +78,16 @@ class ModuleCtrl(QWidget):
|
||||
font.setBold(True)
|
||||
|
||||
for param in sorted(self._node.getParameters(self._module)):
|
||||
label = QLabel(param + ':')
|
||||
labelstr = param + ':'
|
||||
unit = self._node.getProperties(self._module, param).get('unit',
|
||||
'')
|
||||
descr = self._node.getProperties(self._module,
|
||||
param).get('description', '')
|
||||
|
||||
if unit:
|
||||
labelstr = "%s (%s):" % (param, unit)
|
||||
|
||||
label = QLabel(labelstr)
|
||||
label.setFont(font)
|
||||
|
||||
props = self._node.getProperties(self._module, param)
|
||||
@ -80,7 +96,11 @@ class ModuleCtrl(QWidget):
|
||||
initValues[param].value,
|
||||
props['readonly'])
|
||||
|
||||
buttons.setRequested.connect(self._node.setParameter)
|
||||
# buttons.setRequested.connect(self._node.setParameter)
|
||||
buttons.setRequested.connect(self._set_Button_pressed)
|
||||
|
||||
if descr:
|
||||
buttons.setToolTip(descr)
|
||||
|
||||
self.paramGroupBox.layout().addWidget(label, row, 0)
|
||||
self.paramGroupBox.layout().addWidget(buttons, row, 1)
|
||||
@ -89,6 +109,16 @@ class ModuleCtrl(QWidget):
|
||||
|
||||
row += 1
|
||||
|
||||
def _set_Button_pressed(self, module, parameter, target):
|
||||
sig = (module, parameter, target)
|
||||
if self._lastclick == sig:
|
||||
return
|
||||
self._lastclick = sig
|
||||
try:
|
||||
self._node.setParameter(module, parameter, target)
|
||||
except Exception as e:
|
||||
QMessageBox.warning(self.parent(), 'Operation failed', str(e))
|
||||
|
||||
def _updateValue(self, module, parameter, value):
|
||||
if module != self._module:
|
||||
return
|
||||
|
@ -22,6 +22,7 @@
|
||||
# *****************************************************************************
|
||||
|
||||
import pprint
|
||||
import json
|
||||
|
||||
from PyQt4.QtGui import QWidget, QTextCursor, QFont, QFontMetrics
|
||||
from PyQt4.QtCore import pyqtSignature as qtsig, Qt
|
||||
@ -31,7 +32,6 @@ from secop.protocol.errors import SECOPError
|
||||
|
||||
|
||||
class NodeCtrl(QWidget):
|
||||
|
||||
def __init__(self, node, parent=None):
|
||||
super(NodeCtrl, self).__init__(parent)
|
||||
loadUi(self, 'nodectrl.ui')
|
||||
@ -50,14 +50,26 @@ class NodeCtrl(QWidget):
|
||||
if not msg:
|
||||
return
|
||||
|
||||
self._addLogEntry('<span style="font-weight:bold">Request:</span> '
|
||||
'%s:' % msg, raw=True)
|
||||
# msg = msg.split(' ', 2)
|
||||
self._addLogEntry(
|
||||
'<span style="font-weight:bold">Request:</span> '
|
||||
'%s:' % msg,
|
||||
raw=True)
|
||||
# msg = msg.split(' ', 2)
|
||||
try:
|
||||
reply = self._node.syncCommunicate(*self._node.decode_message(msg))
|
||||
self._addLogEntry(reply, newline=True, pretty=True)
|
||||
if msg == 'describe':
|
||||
_, eid, stuff = self._node.decode_message(reply)
|
||||
reply = '%s %s %s' % (_, eid, json.dumps(
|
||||
stuff, indent=2, separators=(',', ':'), sort_keys=True))
|
||||
self._addLogEntry(reply, newline=True, pretty=False)
|
||||
else:
|
||||
self._addLogEntry(reply, newline=True, pretty=True)
|
||||
except SECOPError as e:
|
||||
self._addLogEntry(e, newline=True, pretty=True, error=True)
|
||||
self._addLogEntry(
|
||||
'error %s %s' % (e.name, json.dumps(e.args)),
|
||||
newline=True,
|
||||
pretty=True,
|
||||
error=True)
|
||||
|
||||
@qtsig('')
|
||||
def on_clearPushButton_clicked(self):
|
||||
@ -70,19 +82,23 @@ class NodeCtrl(QWidget):
|
||||
self._addLogEntry('=========================')
|
||||
self._addLogEntry('', newline=True)
|
||||
|
||||
def _addLogEntry(self, msg, newline=False,
|
||||
pretty=False, raw=False, error=False):
|
||||
|
||||
def _addLogEntry(self,
|
||||
msg,
|
||||
newline=False,
|
||||
pretty=False,
|
||||
raw=False,
|
||||
error=False):
|
||||
if pretty:
|
||||
msg = pprint.pformat(msg, width=self._getLogWidth())
|
||||
msg = msg[1:-1]
|
||||
|
||||
if not raw:
|
||||
if error:
|
||||
msg = '<div style="color:#FF0000"><b><pre>%s</pre></b></div>' % Qt.escape(
|
||||
str(msg)).replace('\n', '<br />')
|
||||
else:
|
||||
msg = '<pre>%s</pre>' % Qt.escape(str(msg)
|
||||
).replace('\n', '<br />')
|
||||
msg = '<pre>%s</pre>' % Qt.escape(str(msg)).replace('\n',
|
||||
'<br />')
|
||||
|
||||
content = ''
|
||||
if self.logTextBrowser.toPlainText():
|
||||
|
@ -29,7 +29,6 @@ from secop.validators import validator_to_str
|
||||
|
||||
|
||||
class ParameterView(QWidget):
|
||||
|
||||
def __init__(self, node, module, parameter, parent=None):
|
||||
super(ParameterView, self).__init__(parent)
|
||||
loadUi(self, 'paramview.ui')
|
||||
@ -51,8 +50,8 @@ class ParameterView(QWidget):
|
||||
font = self.font()
|
||||
font.setBold(True)
|
||||
|
||||
props = self._node._getDescribingParameterData(
|
||||
self._module, self._parameter)
|
||||
props = self._node._getDescribingParameterData(self._module,
|
||||
self._parameter)
|
||||
for prop in sorted(props):
|
||||
label = QLabel(prop + ':')
|
||||
label.setFont(font)
|
||||
|
@ -25,7 +25,6 @@ from os import path
|
||||
|
||||
from PyQt4 import uic
|
||||
|
||||
|
||||
uipath = path.dirname(__file__)
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user