forked from M-Labs/artiq
1
0
Fork 0
artiq/artiq/gui/results.py

113 lines
3.5 KiB
Python
Raw Normal View History

2015-07-14 23:31:18 +08:00
import asyncio
2015-07-17 02:52:53 +08:00
from collections import OrderedDict
from functools import partial
2015-07-14 23:31:18 +08:00
from quamash import QtGui, QtCore
from pyqtgraph import dockarea
from pyqtgraph import LayoutWidget
from artiq.protocols.sync_struct import Subscriber
2015-07-22 06:01:09 +08:00
from artiq.gui.tools import DictSyncModel, short_format
2015-07-17 02:52:53 +08:00
from artiq.gui.displays import *
2015-07-14 23:31:18 +08:00
class ResultsModel(DictSyncModel):
def __init__(self, parent, init):
2015-07-22 06:01:09 +08:00
DictSyncModel.__init__(self, ["Result", "Value"],
2015-07-14 23:31:18 +08:00
parent, init)
def sort_key(self, k, v):
return k
def convert(self, k, v, column):
if column == 0:
return k
elif column == 1:
2015-07-22 06:01:09 +08:00
return short_format(v)
2015-07-14 23:31:18 +08:00
else:
raise ValueError
class ResultsDock(dockarea.Dock):
2015-07-17 02:52:53 +08:00
def __init__(self, dialog_parent, dock_area):
2015-07-14 23:31:18 +08:00
dockarea.Dock.__init__(self, "Results", size=(1500, 500))
2015-07-17 02:52:53 +08:00
self.dialog_parent = dialog_parent
self.dock_area = dock_area
2015-07-14 23:31:18 +08:00
grid = LayoutWidget()
self.addWidget(grid)
self.table = QtGui.QTableView()
2015-07-15 01:08:08 +08:00
self.table.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
2015-07-23 22:36:52 +08:00
self.table.horizontalHeader().setResizeMode(
QtGui.QHeaderView.ResizeToContents)
2015-07-14 23:31:18 +08:00
grid.addWidget(self.table, 0, 0)
add_display_box = QtGui.QGroupBox("Add display")
grid.addWidget(add_display_box, 0, 1)
display_grid = QtGui.QGridLayout()
add_display_box.setLayout(display_grid)
2015-07-17 02:52:53 +08:00
for n, name in enumerate(display_types.keys()):
2015-07-14 23:31:18 +08:00
btn = QtGui.QPushButton(name)
display_grid.addWidget(btn, n, 0)
2015-07-17 02:52:53 +08:00
btn.clicked.connect(partial(self.create_dialog, name))
self.displays = dict()
2015-07-14 23:31:18 +08:00
2015-07-25 00:36:16 +08:00
def get_result(self, key):
return self.table_model.backing_store[key]
2015-07-14 23:31:18 +08:00
@asyncio.coroutine
def sub_connect(self, host, port):
2015-07-17 02:52:53 +08:00
self.subscriber = Subscriber("rt_results", self.init_results_model,
self.on_mod)
2015-07-14 23:31:18 +08:00
yield from self.subscriber.connect(host, port)
@asyncio.coroutine
def sub_close(self):
yield from self.subscriber.close()
def init_results_model(self, init):
2015-07-17 02:52:53 +08:00
self.table_model = ResultsModel(self.table, init)
self.table.setModel(self.table_model)
return self.table_model
def on_mod(self, mod):
if mod["action"] == "init":
for display in self.displays.values():
display.update_data(self.table_model.backing_store)
return
if mod["action"] == "setitem":
source = mod["key"]
elif mod["path"]:
source = mod["path"][0]
else:
return
for display in self.displays.values():
if source in display.data_sources():
display.update_data(self.table_model.backing_store)
def create_dialog(self, ty):
dlg_class = display_types[ty][0]
dlg = dlg_class(self.dialog_parent, None, dict(),
sorted(self.table_model.backing_store.keys()),
partial(self.create_display, ty, None))
dlg.open()
def create_display(self, ty, prev_name, name, settings):
if prev_name is not None and prev_name in self.displays:
raise NotImplementedError
dsp_class = display_types[ty][1]
dsp = dsp_class(name, settings)
self.displays[name] = dsp
dsp.update_data(self.table_model.backing_store)
def on_close():
del self.displays[name]
dsp.sigClosed.connect(on_close)
self.dock_area.addDock(dsp)
self.dock_area.floatDock(dsp)