forked from M-Labs/artiq
add interactive_args
parent
332c9c0fcd
commit
0e47c0c33e
|
@ -0,0 +1,133 @@
|
|||
import logging
|
||||
|
||||
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
|
||||
|
||||
|
||||
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.getCurrentIndex()
|
||||
self.supply(index)
|
||||
|
||||
def supply(self, index):
|
||||
rid = self.model.row_to_key[index]
|
||||
widget = self.request_stack.widget(index)
|
||||
self.supply.emit(rid, d)
|
||||
d = widget.get_values()
|
||||
|
||||
def cancel_current(self):
|
||||
index = self.request_stack.getCurrentIndex()
|
||||
self.cancel(index)
|
||||
|
||||
def cancel(self, index):
|
||||
rid = self.model.row_to_key[index]
|
||||
self.cancel.emit(rid)
|
||||
|
||||
|
||||
class InteractiveArgsDock(QtWidgets.QDockWidget):
|
||||
def __init__(self, interactive_args_sub, interactive_args_rpc):
|
||||
QtWidgets.QDockWidget.__init__(self, "Interactive Args")
|
||||
|
||||
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(interactive_args_sub)
|
||||
self.args_area.supplied.connect(interactive_args_rpc.supply)
|
||||
self.args_area.cancelled.connect(interactive_args_rpc.cancel)
|
||||
layout.addWidget(self.args_area, 0, 1)
|
||||
|
||||
self.request_queue.doubleClicked.connect(self.args_area.set_active_widget)
|
||||
|
||||
self.supply_all_btn = QtWidgets.QPushButton("Supply all")
|
||||
self.supply_all_btn.clicked.connect(self.supply_all)
|
||||
layout.addWidget(self.supply_all_btn, 1, 0)
|
||||
|
||||
self.cancel_all_btn = QtWidgets.QPushButton("Cancel all")
|
||||
self.cancel_all_btn.clicked.connect(self.cancel_all)
|
||||
layout.addWidget(self.cancel_all_btn, 1, 1)
|
||||
|
||||
interactive_args_sub.add_setmodel_callback(self.request_queue.setModel)
|
||||
|
||||
def supply_all(self):
|
||||
pass
|
||||
|
||||
def cancel_all(self):
|
||||
pass
|
Loading…
Reference in New Issue