forked from M-Labs/artiq
1
0
Fork 0

add interactive_args

Simon Renblad 2024-03-07 16:07:45 +08:00
parent 332c9c0fcd
commit 6f2ddcb434
1 changed files with 153 additions and 0 deletions

View File

@ -0,0 +1,153 @@
import logging
import asyncio
from PyQt5 import QtCore, QtWidgets, QtGui
from artiq.gui.tools import LayoutWidget
from artiq.gui.models import DictSyncModel
from artiq.gui.applets import EntryArea
logger = logging.getLogger(__name__)
class Model(DictSyncModel):
def __init__(self, init):
DictSyncModel.__init__(self,
["RID", "argdesc"],
init)
def convert(self, k, v, column):
if column == 0:
return k
elif column == 1:
return v
else:
raise ValueError
def sort_key(self, k, v):
return k
class _InteractiveArgsArea(QtWidgets.QScrollArea):
supplied = QtCore.pyqtSignal(int, dict)
cancelled = QtCore.pyqtSignal(int)
def __init__(self, interactive_args_sub):
QtWidgets.QScrollArea.__init__(self)
self.setWidgetResizable(True)
self.interactive_args_sub = interactive_args_sub
self.request_stack = QtWidgets.QStackedWidget()
self.setWidget(self.request_stack)
self.model = Model({})
self.interactive_args_sub.add_setmodel_callback(self.setModel)
def setModel(self, model):
self.model = model
self.model.dataChanged.connect(self.update_widget)
self.model.rowsInserted.connect(self.insert)
self.model.rowsMoved.connect(self.move)
self.model.rowsRemoved.connect(self.remove)
def _insert_widget(self, index):
logger.info("inserting widget at index %d", index)
rid = self.model.row_to_key[index]
arglist_desc = self.model.backing_store[rid]
entry_area = EntryArea()
for args in arglist_desc:
entry_area.setattr_argument(*args)
self.request_stack.insertWidget(index, entry_area)
def update_widget(self, top_left, bottom_right, roles):
index = top_left.row()
widget = self.request_stack.widget(index)
self.request_stack.removeWidget(widget)
self._insert_widget(index)
widget.deleteLater()
def insert(self, parent, first, last):
self._insert_widget(first)
def move(self, src_parent, src_start, src_end, dest_parent, dest_end):
widget = self.request_stack.widget(src_start)
self.request_stack.insertWidget(dest_end)
def remove(self, parent, first, last):
widget = self.request_stack.widget(first)
self.request_stack.removeWidget(widget)
widget.deleteLater()
def set_active_widget(self, index):
self.request_stack.setCurrentIndex(index.row())
def supply_current(self):
index = self.request_stack.currentIndex()
self.supply(index)
def supply(self, index):
rid = self.model.row_to_key[index]
widget = self.request_stack.widget(index)
d = widget.get_values()
self.supplied.emit(rid, d)
def cancel_current(self):
index = self.request_stack.currentIndex()
self.cancel(index)
def cancel(self, index):
rid = self.model.row_to_key[index]
self.cancelled.emit(rid)
class InteractiveArgsDock(QtWidgets.QDockWidget):
def __init__(self, interactive_args_sub, interactive_args_rpc):
QtWidgets.QDockWidget.__init__(self, "Interactive Args")
self.interactive_args_sub = interactive_args_sub
self.interactive_args_rpc = interactive_args_rpc
layout = LayoutWidget(self)
self.setWidget(layout)
self.request_queue = QtWidgets.QListView()
model = Model({})
self.request_queue.setModel(model)
layout.addWidget(self.request_queue, 0, 0)
self.args_area = _InteractiveArgsArea(self.interactive_args_sub)
self.args_area.supplied.connect(self.supply)
self.args_area.cancelled.connect(self.cancel)
layout.addWidget(self.args_area, 0, 1, rowspan=5)
self.request_queue.clicked.connect(self.args_area.set_active_widget)
self.supply_btn = QtWidgets.QPushButton("Supply")
self.supply_btn.clicked.connect(self.args_area.supply_current)
layout.addWidget(self.supply_btn, 1, 0)
self.cancel_btn = QtWidgets.QPushButton("Cancel")
self.cancel_btn.clicked.connect(self.args_area.cancel_current)
layout.addWidget(self.cancel_btn, 2, 0)
self.supply_all_btn = QtWidgets.QPushButton("Supply all")
self.supply_all_btn.clicked.connect(self.supply_all)
layout.addWidget(self.supply_all_btn, 3, 0)
self.cancel_all_btn = QtWidgets.QPushButton("Cancel all")
self.cancel_all_btn.clicked.connect(self.cancel_all)
layout.addWidget(self.cancel_all_btn, 4, 0)
self.interactive_args_sub.add_setmodel_callback(self.request_queue.setModel)
def supply(self, rid, values):
asyncio.ensure_future(asyncio.wait_for(self.interactive_args_rpc.supply(rid, values), None))
def cancel(self, rid):
asyncio.ensure_future(asyncio.wait_for(self.interactive_args_rpc.cancel(rid), None))
def supply_all(self):
pass
def cancel_all(self):
pass