artiq/artiq/gui/schedule.py

121 lines
4.1 KiB
Python
Raw Normal View History

2015-05-22 17:05:15 +08:00
import asyncio
import time
from functools import partial
2015-05-22 17:05:15 +08:00
2015-05-24 23:20:52 +08:00
from quamash import QtGui, QtCore
from pyqtgraph import dockarea
2015-05-22 17:05:15 +08:00
from artiq.protocols.sync_struct import Subscriber
2015-10-12 19:46:14 +08:00
from artiq.gui.tools import DictSyncModel
from artiq.tools import elide
2015-05-22 17:05:15 +08:00
class _ScheduleModel(DictSyncModel):
def __init__(self, parent, init):
DictSyncModel.__init__(self,
2015-05-24 01:09:22 +08:00
["RID", "Pipeline", "Status", "Prio", "Due date",
2015-08-07 15:51:56 +08:00
"Revision", "File", "Class name"],
2015-05-22 17:05:15 +08:00
parent, init)
def sort_key(self, k, v):
# order by priority, and then by due date and RID
return (-v["priority"], v["due_date"] or 0, k)
2015-05-22 17:05:15 +08:00
def convert(self, k, v, column):
if column == 0:
return k
elif column == 1:
return v["pipeline"]
elif column == 2:
return v["status"]
elif column == 3:
2015-05-24 01:09:22 +08:00
return str(v["priority"])
elif column == 4:
2015-05-22 17:05:15 +08:00
if v["due_date"] is None:
return ""
else:
return time.strftime("%m/%d %H:%M:%S",
time.localtime(v["due_date"]))
elif column == 5:
2015-08-07 15:51:56 +08:00
expid = v["expid"]
if "repo_rev" in expid:
r = expid["repo_rev"]
if v["repo_msg"]:
r += "\n" + elide(v["repo_msg"], 40)
return r
2015-08-07 15:51:56 +08:00
else:
return "Outside repo."
2015-05-24 01:09:22 +08:00
elif column == 6:
2015-08-07 15:51:56 +08:00
return v["expid"]["file"]
elif column == 7:
2015-07-15 17:08:12 +08:00
if v["expid"]["class_name"] is None:
2015-05-22 17:05:15 +08:00
return ""
else:
2015-07-15 17:08:12 +08:00
return v["expid"]["class_name"]
2015-05-22 17:05:15 +08:00
else:
raise ValueError
class ScheduleDock(dockarea.Dock):
2015-07-25 15:08:27 +08:00
def __init__(self, status_bar, schedule_ctl):
dockarea.Dock.__init__(self, "Schedule", size=(1000, 300))
2015-05-22 17:05:15 +08:00
2015-07-25 15:08:27 +08:00
self.status_bar = status_bar
2015-05-24 23:20:52 +08:00
self.schedule_ctl = schedule_ctl
2015-05-22 17:05:15 +08:00
self.table = QtGui.QTableView()
self.table.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
2015-07-15 01:08:08 +08:00
self.table.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
2015-07-23 22:36:52 +08:00
self.table.horizontalHeader().setResizeMode(
QtGui.QHeaderView.ResizeToContents)
self.table.verticalHeader().setResizeMode(
QtGui.QHeaderView.ResizeToContents)
2015-05-22 17:05:15 +08:00
self.addWidget(self.table)
2015-05-24 23:20:52 +08:00
self.table.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
request_termination_action = QtGui.QAction("Request termination", self.table)
request_termination_action.triggered.connect(partial(self.delete_clicked, True))
2015-10-27 18:20:25 +08:00
request_termination_action.setShortcut("DELETE")
self.table.addAction(request_termination_action)
2015-05-24 23:20:52 +08:00
delete_action = QtGui.QAction("Delete", self.table)
delete_action.triggered.connect(partial(self.delete_clicked, False))
2015-10-27 18:20:25 +08:00
delete_action.setShortcut("SHIFT+DELETE")
2015-05-24 23:20:52 +08:00
self.table.addAction(delete_action)
2015-10-03 19:28:57 +08:00
async def sub_connect(self, host, port):
2015-05-22 17:05:15 +08:00
self.subscriber = Subscriber("schedule", self.init_schedule_model)
2015-10-03 19:28:57 +08:00
await self.subscriber.connect(host, port)
2015-05-22 17:05:15 +08:00
2015-10-03 19:28:57 +08:00
async def sub_close(self):
await self.subscriber.close()
2015-05-22 17:05:15 +08:00
def get_current_schedule(self):
try:
table_model = self.table_model
except AttributeError:
return dict()
return table_model.backing_store
2015-05-22 17:05:15 +08:00
def init_schedule_model(self, init):
2015-05-24 23:20:52 +08:00
self.table_model = _ScheduleModel(self.table, init)
self.table.setModel(self.table_model)
return self.table_model
async def delete(self, rid, graceful):
if graceful:
await self.schedule_ctl.request_termination(rid)
else:
await self.schedule_ctl.delete(rid)
2015-05-24 23:20:52 +08:00
def delete_clicked(self, graceful):
2015-05-24 23:20:52 +08:00
idx = self.table.selectedIndexes()
if idx:
row = idx[0].row()
rid = self.table_model.row_to_key[row]
if graceful:
msg = "Requested termination of RID {}".format(rid)
else:
msg = "Deleted RID {}".format(rid)
self.status_bar.showMessage(msg)
asyncio.ensure_future(self.delete(rid, graceful))