Extend Node and Module widgets

- put nodeinfo elements into ui file
- add per-module detailed view
- add first version of grouping (cleanup in a follow-up commit)

Change-Id: If35bc4a8f4ed0a313e97f88797e70186d7c0d9bc
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30631
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
This commit is contained in:
Alexander Zaft 2023-03-09 07:13:42 +01:00 committed by Markus Zolliker
parent 0464d60f68
commit 23c9aa6038
9 changed files with 4500 additions and 4114 deletions

View File

@ -171,6 +171,7 @@ class MainWindow(QMainWindow):
node = QSECNode(host, self.log, parent=self)
nodeWidget = NodeWidget(node)
nodeWidget.setParent(self)
nodeWidget._rebuildAdvanced(self.actionDetailed_View.isChecked())
# Node and NodeWidget created without error
nodename = node.nodename

View File

@ -1,5 +1,5 @@
from frappy.gui.qt import QDialog, QIcon, QLabel, QLineEdit, QMessageBox, \
QPushButton, QToolButton, QWidget, pyqtSignal
from frappy.gui.qt import QDialog, QHBoxLayout, QIcon, QLabel, QLineEdit, \
QMessageBox, QPushButton, Qt, QToolButton, QWidget, pyqtSignal, pyqtSlot
from frappy.gui.util import Colors, loadUi
from frappy.gui.valuewidgets import get_widget
@ -88,15 +88,17 @@ class ModuleWidget(QWidget):
loadUi(self, 'modulewidget.ui')
self._node = node
self._name = name
self.detailed = False
self._paramDisplays = {}
self._paramInputs = {}
self._addbtns = []
self._paramWidgets = {}
self._groups = {}
self._groupStatus = {}
self.independentParams = []
self.moduleName.setText(name)
props = self._node.getModuleProperties(self._name)
description = props.get('description', '')
self.moduleDescription.setText(description)
self._initModuleInfo()
self.infoGrid.hide()
row = 0
params = dict(self._node.getParameters(self._name))
@ -112,14 +114,70 @@ class ModuleWidget(QWidget):
params.pop('target')
self._addRWParam('target', row)
row += 1
allGroups = set()
for param in params:
paramProps = self._node.getProperties(self._name, param)
if paramProps['readonly']:
self._addRParam(param, row)
props = self._node.getProperties(self._name, param)
group = props.get('group', '')
if group:
allGroups.add(group)
self._groups.setdefault(group, []).append(param)
else:
self._addRWParam(param, row)
row += 1
self._setParamHidden(param, True)
self.independentParams.append(param)
for key in sorted(allGroups.union(set(self.independentParams))):
if key in allGroups:
if key in self._groups[key]:
# Param with same name as group
self._addParam(key, row)
name = QLabel(key)
button = QToolButton()
button.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextOnly)
button.setText('+')
button.pressed.connect(
lambda group=key: self._toggleGroupCollapse(group))
box = QHBoxLayout()
box.addWidget(name)
box.addWidget(button)
groupLabel = QWidget()
groupLabel.setLayout(box)
l = self.moduleDisplay.layout()
label = l.itemAtPosition(row, 0).widget()
l.replaceWidget(label, groupLabel)
row += 1
old = self._paramWidgets[key].pop(0)
old.setParent(None)
self._paramWidgets[key].append(groupLabel)
self._setParamHidden(key, True)
else:
name = QLabel(key)
button = QToolButton()
button.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextOnly)
button.setText('+')
button.pressed.connect(
lambda group=key: self._toggleGroupCollapse(group))
box = QHBoxLayout()
box.addWidget(name)
box.addWidget(button)
groupLabel = QWidget()
groupLabel.setLayout(box)
l = self.moduleDisplay.layout()
l.addWidget(groupLabel, row, 0)
row += 1
self._paramWidgets[key] = [groupLabel]
self._groups[key].append(key)
self._setParamHidden(key, True)
for p in self._groups[key]:
if p == key:
continue
self._addParam(p, row)
row += 1
self._setParamHidden(p, True)
else:
self._addParam(key, row)
row += 1
self._setParamHidden(key, True)
self._addCommands(row)
@ -129,6 +187,40 @@ class ModuleWidget(QWidget):
node.newData.connect(self._updateValue)
def _initModuleInfo(self):
props = dict(self._node.getModuleProperties(self._name))
self.moduleName.setText(self._name)
self.moduleDescription.setText(props.get('description',
'no description provided'))
self.groupInfo.setText(props.get('group', '-'))
feats = ','.join(props.get('features', [])) or '-'
self.featuresInfo.setText(feats)
self.implementationInfo.setText(props.pop('implementation', 'MISSING'))
ifaces = ','.join(props.pop('interface_classes', [])) or '-'
self.interfaceClassesInfo.setText(ifaces)
# any additional properties are added after the standard ones
row = 2
count = 0
for prop, value in props.items():
l = QHBoxLayout()
l.setContentsMargins(0,0,0,0)
name = QLabel('<b>%s:</b>' % prop.capitalize())
val = QLabel(str(value))
val.setWordWrap(True)
l.addWidget(name)
l.addWidget(val)
additional = QWidget()
additional.setLayout(l)
self.infoGrid.layout().addWidget(
additional, row + count // 2, count % 2)
count += 1
@pyqtSlot()
def on_showDetailsBtn_pressed(self):
self.showDetails(not self.detailed)
def _updateValue(self, mod, param, val):
if mod != self._name:
return
@ -141,6 +233,13 @@ class ModuleWidget(QWidget):
else '%s') % (val.value,)
self._paramDisplays[param].setText(strvalue)
def _addParam(self, param, row):
paramProps = self._node.getProperties(self._name, param)
if paramProps['readonly']:
self._addRParam(param, row)
else:
self._addRWParam(param, row)
def _addRParam(self, param, row):
props = self._node.getProperties(self._name, param)
@ -248,14 +347,32 @@ class ModuleWidget(QWidget):
for w in self._paramWidgets[param]:
w.setHidden(hidden)
def _setGroupHidden(self, group):
pass
def _toggleGroupCollapse(self, group):
collapsed = not self._groupStatus.get(group, True)
self._groupStatus[group] = collapsed
for param in self._groups[group]:
if param == group: # dont hide the top level
continue
self._setParamHidden(param, collapsed)
def rebuildAdvanced(self, advanced):
for param in self._paramWidgets:
def _setGroupHidden(self, group, show):
for param in self._groups[group]:
if show and param == group: # dont hide the top level
self._setParamHidden(param, False)
elif show and self._groupStatus.get(group, False):
self._setParamHidden(param, False)
else:
self._setParamHidden(param, True)
def showDetails(self, show):
self.detailed = show
self.infoGrid.setHidden(not show)
for param in self.independentParams:
if param in ['value', 'status', 'target']:
continue
self._setParamHidden(param, not advanced)
self._setParamHidden(param, not show)
for group in self._groups:
self._setGroupHidden(group, show)
def _button_pressed(self, param):
target = self._paramInputs[param].text()

View File

@ -1,9 +1,9 @@
import json
from collections import OrderedDict
from frappy.gui.qt import QCursor, QFont, QFontMetrics, QGridLayout, QIcon, \
QInputDialog, QLabel, QMenu, QPlainTextEdit, QTextCursor, QVBoxLayout, \
QWidget, pyqtSignal, pyqtSlot, toHtmlEscaped
from frappy.gui.qt import QCursor, QFont, QFontMetrics, QIcon, QInputDialog, \
QMenu, QTextCursor, QVBoxLayout, QWidget, pyqtSignal, pyqtSlot, \
toHtmlEscaped
from frappy.errors import SECoPError
from frappy.gui.modulectrl import ModuleCtrl
@ -96,6 +96,7 @@ class NodeWidget(QWidget):
self._node = node
self._node.stateChange.connect(self._set_node_state)
self.detailed = False
self._modules = OrderedDict()
self._detailedModules = {}
self._detailedParams = {}
@ -123,6 +124,7 @@ class NodeWidget(QWidget):
self.plotParam(module, param))
widget.plotAdd.connect(lambda param, module=module:
self._plotPopUp(module, param))
widget.showDetails(self.detailed)
self.noPlots.connect(widget.plotsPresent)
self._modules[module] = widget
details = ModuleCtrl(node, module)
@ -150,28 +152,10 @@ class NodeWidget(QWidget):
self.tree.itemChanged.connect(self.changeViewContent)
self.tree.customContextMenuRequested.connect(self._treeContextMenu)
self._description = QPlainTextEdit(
self.descriptionEdit.setPlainText(
self._node.properties.get('description','no description available'))
self._description_label = QLabel('Description:')
self._description.setReadOnly(True)
self._host = QLabel(self._node.conn.uri)
self._host.hide()
self._host_label = QLabel('Host:')
self._host_label.hide()
self._protocoll = QLabel(self._node.conn.secop_version)
self._protocoll.setWordWrap(True)
self._protocoll.hide()
self._protocoll_label = QLabel('Protocoll Version:')
self._protocoll_label.hide()
layout = QGridLayout()
layout.addWidget(self._host_label, 0, 0)
layout.addWidget(self._host, 0, 1)
layout.addWidget(self._protocoll_label, 1, 0)
layout.addWidget(self._protocoll, 1, 1)
layout.addWidget(self._description_label, 2, 0)
layout.addWidget(self._description, 3, 0, -1, -1)
self.nodeinfo.setLayout(layout)
self.hostLabel.setText(self._node.conn.uri)
self.protocolLabel.setText(self._node.conn.secop_version)
def _set_node_state(self, nodename, online, state):
p = self.palette()
@ -186,13 +170,10 @@ class NodeWidget(QWidget):
def _rebuildAdvanced(self, advanced):
self._host.setHidden(not advanced)
self._host_label.setHidden(not advanced)
self._protocoll.setHidden(not advanced)
self._protocoll_label.setHidden(not advanced)
self.detailed = advanced
self.tree._rebuildAdvanced(advanced)
for m in self._modules.values():
m.rebuildAdvanced(advanced)
m.showDetails(advanced)
def getSecNode(self):
return self._node

File diff suppressed because it is too large Load Diff

View File

@ -8323,6 +8323,52 @@ a\x9a\x8f4}u\xca\xb4\xaf\xec\xff\x06\x8c2\xc4\xc2\
\x8f\xbaV\xd0(wdV\x7f\xc8\xd8\x90> Z}\
\xa3\xb8\xff\x12`\x00\x16\xa7\x22\x09\x8f\x08\x940\x00\x00\
\x00\x00IEND\xaeB`\x82\
\x00\x00\x02\xbc\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\
\x00\x00\x00\x19tEXtSoftware\
\x00Adobe ImageRead\
yq\xc9e<\x00\x00\x02^IDATx\xda\x8c\
\x93Mh\x13Q\x10\xc7\xdf~\x9ad\x93l\xb6\xb2Z\
\xabM\xfa\x15\xb1!m\xb5U\xe3\xa1\xa41\x15\x04\x8b\
\xa9\x14\x14\x11\x02\x05\x0b\xea\xb5\xad\x87\x9e\xedU(\x08\
\xbdi\xc1\x8b(\xf5\x10\x10\xe9A\xd0\x83\x1f\x84B!\
P\x1bM)\xbd\xa4\x11\x83&\xa91\xc9n6\xbb\xeb\
\xbc\x90b\xb3n\xc1\x81\x1f\xef\x83\xff\xcc\x9b\x99\xf7\x1e\
\x11\x89D\x90\x99Q\x14\x85\x11\x08\x82\x18\x80e\x1b\xc0\
\x01% \xa3\xebzBU\xd5<\x80ht\xb0u\xda\
\xec\xfc\xc5\xf3\xa3\x91\xde3\x83\xe7z\xdaDgkU\
\x96s\xf1x\xfc\xeb\x9bW/\xbb\x8a\xbb\xb9\xb7\xa0\xd9\
\xa6\xbc^/\x82\x88M\x80\x09\x9c\xd356q{6\
\xd8}\xf2\x94\xdf}\xc4)\xd2$A\xb3\x0c\xe3\xf0t\
txZ\xbb\xfa\x1c\xc9\xc4*)K\xe5m\x12\xa7a\
\xa4V\xab\x0d\x06\xc2\x11\x9fC8\xec\x118\x96%\x09\
D\xec\xa5\x85\xe7\xee\x13\xc7z\x86/_\xeb\xc3:\xba\
Z\xad\x9a\xa5\xdf\xee\xf5\x0f\xb9\xf1$\x93\xafH\x18\xa3\
\xc07p\xb6sy\xe9Q;\xad(\x8aY\x00\xdeb\
\xb5\xb6\xa8Z\xbd\x1c\xd4{\xdc\xe94\x0a\xd2\xb9\x0a\x03\
\xbe\xfcA\x19\x945E*\x22\xea\x10o\xe6\x5c/E\
\xad\x16\xc1\xb7L\xca\xb2\x8cLH'\xd7>eh\x8a\
\xa4\x94\x9a\xae\x1a\x9dqb\xebk\x1fw\xb0\x8e\x14\x04\
\x01\xf1<\x8f\x1c\x0e\x07\xb2\xdb\xed\x88\xe38\xc4\xb2\xec\
f\xec\xf9R\x9a\xa9\xfdV\xaa\xaa\xd6|2IP\xbb\
?\xbfg\x1f/.$K\xa5\xd2*i\x8c\x0e\xd7\xe8\
a\x18f\xfc\xde\x9d\xbb\xf3S7\xaf\xc6Wb/R\
\xba\x22\x95\xad,e!T\xb9\xb2\x12[\xfer}\xfc\
\xca\x87\x8d\xcf\xeb\xaf%I\xfaA\x84\xc3a\xa4i\xda\
\x1e>\x9b\x8d\x9b\x98\x9e\xbe\xff \x1a\xbd5\x9f\xcf\xe7\
\x9eAL?\xd0\x0d\xe0^\xfc\x02\xb6\x80w6\x9b-\
\xebr\xb9\xfe\xbeD8\xf9\x82(\x1e\x8d\xcc\xcc\xcc\xcd\
E\xa37\x1e\x82\xf3S\xd8\xde\x046\xcc\x9a\x08o\x00\
e\xb3Y\x84B\xa1\x10\x0a\x06\x83c\x93\x93S\x0b\x89\
\xc4\x96\xde\xdf\x7fz\x91\xa6\xe9!\xfc\x17\xe0\x1f@\xcd\
\xe4?4\x99\xdb\xedF\x81@`6\x95\xca\xea##\
\xa3O\xc0\xf9\x12v\xfc_\xc3J\x8b(\x8a\xc3PB\
\xa8P(|\x83\xd4\xde\xc3\x1e\xbe\xbaZ\x03e\xdf\xa8\
\xec[c\x8d\x8a\x03\xe0>\xb44F\xbd\x81f\x82j\
\x18\xeb\xba?\x02\x0c\x00\xdbg#\xc50\xdaG\x97\x00\
\x00\x00\x00IEND\xaeB`\x82\
\x00\x00\x02\xd9\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@ -8619,6 +8665,10 @@ qt_resource_name = b"\
\x0aeKd\
\x00c\
\x00o\x00n\x00n\x00e\x00c\x00t\
\x00\x07\
\x0a\xca\x80\xf3\
\x00d\
\x00e\x00t\x00a\x00i\x00l\x00s\
\x00\x04\
\x00\x07\xab`\
\x00s\
@ -8640,58 +8690,60 @@ qt_resource_name = b"\
qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x10\x00\x02\x00\x00\x00\x08\x00\x00\x00\x1b\
\x00\x00\x00\x10\x00\x02\x00\x00\x00\x08\x00\x00\x00\x1c\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x15\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00\x15\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x1e\x00\x02\x00\x00\x00\x11\x00\x00\x00\x04\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x008\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x84\xcd\xf2r)\
\x00\x00\x01\x86\xc5\x04*\x88\
\x00\x00\x01,\x00\x00\x00\x00\x00\x01\x00\x00\x9bI\
\x00\x00\x01\x84\xcd\xf2r)\
\x00\x00\x01\x86\xc5\x04*\x88\
\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x01\x00\x00,\xba\
\x00\x00\x01\x84\xcd\xf2r)\
\x00\x00\x01\x86\xc5\x04*\x89\
\x00\x00\x02\x0a\x00\x00\x00\x00\x00\x01\x00\x01\x5c\x85\
\x00\x00\x01\x84\xcd\xf2r)\
\x00\x00\x01\x86\xc5\x04*\x88\
\x00\x00\x01N\x00\x00\x00\x00\x00\x01\x00\x00\xa9\xb9\
\x00\x00\x01\x84\xcd\xf2r)\
\x00\x00\x01\x86\xc5\x04*\x88\
\x00\x00\x01\x04\x00\x00\x00\x00\x00\x01\x00\x00\x83\xa0\
\x00\x00\x01\x84\xcd\xf2r)\
\x00\x00\x01\x86\xc5\x04*\x88\
\x00\x00\x01\x8c\x00\x00\x00\x00\x00\x01\x00\x00\xc5<\
\x00\x00\x01\x84\xcd\xf2r*\
\x00\x00\x01\x86\xc5\x04*\x89\
\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x01\x00\x00Gz\
\x00\x00\x01\x84\xcd\xf2r)\
\x00\x00\x01\x86\xc5\x04*\x89\
\x00\x00\x01\xa2\x00\x00\x00\x00\x00\x01\x00\x00\xce\x02\
\x00\x00\x01\x84\xcd\xf2r*\
\x00\x00\x01\x86\xc5\x04*\x89\
\x00\x00\x01\xc0\x00\x01\x00\x00\x00\x01\x00\x01\x11\xd6\
\x00\x00\x01\x84\xcd\xf2r)\
\x00\x00\x01\x86\xc5\x04*\x89\
\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x01\x00\x00q\xfa\
\x00\x00\x01\x84\xcd\xf2r*\
\x00\x00\x01\x86\xc5\x04*\x89\
\x00\x00\x01v\x00\x00\x00\x00\x00\x01\x00\x00\xbc\xec\
\x00\x00\x01\x84\xcd\xf2r*\
\x00\x00\x01\x86\xc5\x04*\x89\
\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x01\x00\x01Ij\
\x00\x00\x01\x84\xcd\xf2r)\
\x00\x00\x01\x86\xc5\x04*\x89\
\x00\x00\x00\xca\x00\x00\x00\x00\x00\x01\x00\x00fq\
\x00\x00\x01\x84\xcd\xf2r)\
\x00\x00\x01\x86\xc5\x04*\x89\
\x00\x00\x01\xd8\x00\x00\x00\x00\x00\x01\x00\x01\x12\x91\
\x00\x00\x01\x84\xcd\xf2r)\
\x00\x00\x01\x86\xc5\x04*\x88\
\x00\x00\x00p\x00\x00\x00\x00\x00\x01\x00\x005\xfe\
\x00\x00\x01\x84\xcd\xf2r)\
\x00\x00\x01\x86\xc5\x04*\x88\
\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x01\x00\x00]\xc9\
\x00\x00\x01\x84\xcd\xf2r)\
\x00\x00\x03\x0c\x00\x00\x00\x00\x00\x01\x00\x02\x0c \
\x00\x00\x01\x86\xc5\x04*\x88\
\x00\x00\x03 \x00\x00\x00\x00\x00\x01\x00\x02\x0e\xe0\
\x00\x00\x01\x86\xb5\xb8\x9e\xf4\
\x00\x00\x02\xd6\x00\x00\x00\x00\x00\x01\x00\x02\x04&\
\x00\x00\x02\xea\x00\x00\x00\x00\x00\x01\x00\x02\x06\xe6\
\x00\x00\x01\x86\xb5\xb8\x9e\xf4\
\x00\x00\x02\xb2\x00\x00\x00\x00\x00\x01\x00\x01\xfe\xab\
\x00\x00\x01\x86\xb5\xb8\x9e\xf4\
\x00\x00\x02\xf6\x00\x00\x00\x00\x00\x01\x00\x02\x09\x8e\
\x00\x00\x03\x0a\x00\x00\x00\x00\x00\x01\x00\x02\x0cN\
\x00\x00\x01\x86\xb5\xb8\x9e\xf4\
\x00\x00\x02\xe4\x00\x00\x00\x00\x00\x01\x00\x02\x07\x03\
\x00\x00\x02\xf8\x00\x00\x00\x00\x00\x01\x00\x02\x09\xc3\
\x00\x00\x01\x86\xb5\xb8\x9e\xf4\
\x00\x00\x02\xc2\x00\x00\x00\x00\x00\x01\x00\x02\x017\
\x00\x00\x01\x86\xb5\xb8\x9e\xf4\
\x00\x00\x02\xd6\x00\x00\x00\x00\x00\x01\x00\x02\x04&\
\x00\x00\x01\x86\xc5\x04*\x8e\
\x00\x00\x02@\x00\x00\x00\x00\x00\x01\x00\x01\x96\xda\
\x00\x00\x01\x86\xb5\xb8\x9e\xf4\
\x00\x00\x02\xa4\x00\x00\x00\x00\x00\x01\x00\x01\xf8\xb7\

View File

@ -13,9 +13,15 @@
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1,10,0">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="topMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1,10,0,0">
<item>
<widget class="QLabel" name="moduleName">
<property name="font">
@ -28,6 +34,9 @@
<property name="text">
<string>moduleName</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
</widget>
</item>
<item>
@ -46,7 +55,10 @@
<item>
<widget class="QLabel" name="moduleDescription">
<property name="text">
<string>TextLabel</string>
<string>description</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
@ -66,12 +78,132 @@
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="showDetailsBtn">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../resources/frappy-gui.qrc">
<normaloff>:/icons/details</normaloff>:/icons/details</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<item>
<widget class="QWidget" name="infoGrid" native="true">
<layout class="QGridLayout" name="infoGrid_0">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="horizontalSpacing">
<number>0</number>
</property>
<property name="verticalSpacing">
<number>3</number>
</property>
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>&lt;b&gt;Implementation:&lt;/b&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="implementationInfo">
<property name="text">
<string>&lt;impl&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>&lt;b&gt;Features:&lt;/b&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="featuresInfo">
<property name="text">
<string>&lt;features&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>&lt;b&gt;Interface Classes:&lt;/b&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="interfaceClassesInfo">
<property name="text">
<string>&lt;interfaces&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_8">
<property name="text">
<string>&lt;b&gt;Group:&lt;/b&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="groupInfo">
<property name="text">
<string>&lt;group&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QGridLayout" name="moduleDisplay"/>
</item>
<item row="2" column="0">
<item>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -86,6 +218,8 @@
</item>
</layout>
</widget>
<resources/>
<resources>
<include location="../../../resources/frappy-gui.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -73,6 +73,53 @@
<property name="title">
<string>NodeInfo</string>
</property>
<layout class="QGridLayout" name="gridLayout" columnstretch="1,3">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Host:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="hostLabel">
<property name="text">
<string>&lt;host&gt;</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Protocoll Version:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="protocolLabel">
<property name="text">
<string>&lt;version&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Description:</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QPlainTextEdit" name="descriptionEdit">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>

View File

@ -29,6 +29,7 @@
<file alias="save.png">cfg_editor/icons/save.png</file>
</qresource>
<qresource prefix="icons">
<file alias="details">icons/magnifier.png</file>
<file alias="stop">icons/cross-circle.png</file>
<file alias="trash">icons/bin.png</file>
<file alias="plot-add">icons/system-monitor--plus.png</file>

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 B