Skip to content

Commit

Permalink
browser: also support loading arguments by button and activation, closes
Browse files Browse the repository at this point in the history
jordens committed Jun 21, 2016
1 parent cae6e86 commit 88d6d0d
Showing 3 changed files with 46 additions and 14 deletions.
47 changes: 34 additions & 13 deletions artiq/browser/experiments.py
Original file line number Diff line number Diff line change
@@ -167,16 +167,15 @@ def __init__(self, area, expurl, arguments):
self.layout.setContentsMargins(5, 5, 5, 5)

self._area = area
self._run_task = None
self.expurl = expurl
self.arguments = arguments
self.options = {"log_level": logging.WARNING}

self.argeditor = _ArgumentEditor(self)
self.layout.addWidget(self.argeditor, 0, 0, 1, 5)
self.layout.setRowStretch(0, 1)

self.options = {"log_level": logging.WARNING}
self._run_task = None

log_level = QtWidgets.QComboBox()
log_level.addItems(log_levels)
log_level.setCurrentIndex(1)
@@ -195,15 +194,24 @@ def update_log_level(index):
log_level.currentIndexChanged.connect(update_log_level)
self.log_level = log_level

load = QtWidgets.QPushButton("Set arguments")
load.setToolTip("Set arguments from currently selected HDF5 "
"file (Ctrl+Space)")
load.setIcon(QtWidgets.QApplication.style().standardIcon(
QtWidgets.QStyle.SP_DialogApplyButton))
load.setShortcut("CTRL+SPACE")
load.clicked.connect(self._load_clicked)
self.layout.addWidget(load, 1, 4)

run = QtWidgets.QPushButton("Analyze")
run.setIcon(QtWidgets.QApplication.style().standardIcon(
QtWidgets.QStyle.SP_DialogOkButton))
run.setToolTip("Run analysis stage (Ctrl+Return)")
run.setShortcut("CTRL+RETURN")
run.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
QtWidgets.QSizePolicy.Expanding)
self.layout.addWidget(run, 1, 4, 2, 1)
run.clicked.connect(self.run_clicked)
self.layout.addWidget(run, 2, 4)
run.clicked.connect(self._run_clicked)
self._run = run

terminate = QtWidgets.QPushButton("Terminate")
@@ -214,7 +222,7 @@ def update_log_level(index):
terminate.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
QtWidgets.QSizePolicy.Expanding)
self.layout.addWidget(terminate, 3, 4)
terminate.clicked.connect(self.terminate_clicked)
terminate.clicked.connect(self._terminate_clicked)
terminate.setEnabled(False)
self._terminate = terminate

@@ -226,7 +234,7 @@ def dropEvent(self, ev):
for uri in ev.mimeData().urls():
if uri.scheme() == "file":
logger.debug("Loading HDF5 arguments from %s", uri.path())
asyncio.ensure_future(self._load_hdf5_task(uri.path()))
asyncio.ensure_future(self.load_hdf5_task(uri.path()))
break

async def compute_arginfo(self):
@@ -251,7 +259,7 @@ async def _recompute_arguments(self, overrides={}):
self.argeditor = _ArgumentEditor(self)
self.layout.addWidget(self.argeditor, 0, 0, 1, 5)

async def _load_hdf5_task(self, filename):
async def load_hdf5_task(self, filename):
try:
with h5py.File(filename, "r") as f:
expid = f["expid"][()]
@@ -272,7 +280,12 @@ async def _load_hdf5_task(self, filename):

await self._recompute_arguments(arguments)

def run_clicked(self):
def _load_clicked(self):
if self._area.dataset is None:
return
asyncio.ensure_future(self.load_hdf5_task(self._area.dataset))

def _run_clicked(self):
class_name, file = self.expurl.split("@", maxsplit=1)
expid = {
"repo_rev": "N/A",
@@ -308,13 +321,11 @@ async def _get_run_task(self, expid):
finally:
await worker.close()

def terminate_clicked(self):
def _terminate_clicked(self):
try:
self._run_task.cancel()
except:
# May happen when experiment has been removed
# from repository/explist
logger.error("Failed to request termination of instances of '%s'",
logger.error("Unexpected failure terminating '%s'",
self.expurl, exc_info=True)

def closeEvent(self, event):
@@ -355,6 +366,7 @@ def __init__(self, root, datasets_sub):
self.pixmap = QtGui.QPixmap(os.path.join(
artiq_dir, "gui", "logo20.svg"))
self.current_dir = root
self.dataset = None

self.open_experiments = []

@@ -367,6 +379,15 @@ def __init__(self, root, datasets_sub):
"update_dataset": self._ddb.update,
}

def dataset_changed(self, path):
self.dataset = path

def dataset_activated(self, path):
sub = self.currentSubWindow()
if sub is None:
return
asyncio.ensure_future(sub.load_hdf5_task(path))

def mousePressEvent(self, ev):
if ev.button() == QtCore.Qt.LeftButton:
self.select_experiment()
8 changes: 7 additions & 1 deletion artiq/browser/files.py
Original file line number Diff line number Diff line change
@@ -116,6 +116,9 @@ def data(self, idx, role):


class FilesDock(QtWidgets.QDockWidget):
dataset_activated = QtCore.pyqtSignal(str)
dataset_changed = QtCore.pyqtSignal(str)

def __init__(self, datasets, browse_root="", select=None):
QtWidgets.QDockWidget.__init__(self, "Files")
self.setObjectName("Files")
@@ -180,9 +183,12 @@ def list_current_changed(self, current, previous):
return
rd = {k: (True, v.value) for k, v in f["datasets"].items()}
self.datasets.init(rd)
self.dataset_changed.emit(info.filePath())

def list_activated(self, idx):
if not self.model.fileInfo(idx).isDir():
info = self.model.fileInfo(idx)
if not info.isDir():
self.dataset_activated.emit(info.filePath())
return
self.rl.setRootIndex(idx)
idx = self.rt.model().mapFromSource(idx)
5 changes: 5 additions & 0 deletions artiq/frontend/artiq_browser.py
Original file line number Diff line number Diff line change
@@ -61,6 +61,11 @@ def __init__(self, datasets_sub, browse_root, select):

self.files = files.FilesDock(datasets_sub, browse_root, select=select)

self.files.dataset_activated.connect(
self.experiments.dataset_activated)
self.files.dataset_changed.connect(
self.experiments.dataset_changed)

self.applets = applets.AppletsDock(self, datasets_sub)
atexit_register_coroutine(self.applets.stop)

0 comments on commit 88d6d0d

Please sign in to comment.