3
3
from functools import partial
4
4
from collections import OrderedDict
5
5
6
- from quamash import QtGui , QtCore
6
+ from quamash import QtGui , QtCore , QtWidgets
7
7
8
- from pyqtgraph import dockarea , LayoutWidget
8
+ from pyqtgraph import LayoutWidget
9
9
10
10
from artiq .gui .tools import log_level_to_name
11
11
from artiq .gui .entries import argty_to_entry
@@ -133,18 +133,24 @@ def restore_state(self, state):
133
133
pass
134
134
135
135
136
- class _ExperimentDock (dockarea .Dock ):
136
+ class _ExperimentDock (QtWidgets .QDockWidget ):
137
+ sigClosed = QtCore .pyqtSignal ()
138
+
137
139
def __init__ (self , manager , expurl ):
138
- dockarea .Dock .__init__ (self , "Exp: " + expurl , closable = True )
139
- self .setMinimumSize (QtCore .QSize (740 , 470 ))
140
+ QtWidgets .QDockWidget .__init__ (self , "Exp: " + expurl )
141
+
142
+ self .layout = QtWidgets .QGridLayout ()
143
+ top_widget = QtWidgets .QWidget ()
144
+ top_widget .setLayout (self .layout )
145
+ self .setWidget (top_widget )
140
146
self .layout .setSpacing (5 )
141
147
self .layout .setContentsMargins (5 , 5 , 5 , 5 )
142
148
143
149
self .manager = manager
144
150
self .expurl = expurl
145
151
146
152
self .argeditor = _ArgumentEditor (self .manager , self , self .expurl )
147
- self .addWidget (self .argeditor , 0 , 0 , colspan = 5 )
153
+ self .layout . addWidget (self .argeditor , 0 , 0 , 1 , 5 )
148
154
self .layout .setRowStretch (0 , 1 )
149
155
150
156
scheduling = manager .get_submission_scheduling (expurl )
@@ -153,8 +159,8 @@ def __init__(self, manager, expurl):
153
159
datetime = QtGui .QDateTimeEdit ()
154
160
datetime .setDisplayFormat ("MMM d yyyy hh:mm:ss" )
155
161
datetime_en = QtGui .QCheckBox ("Due date:" )
156
- self .addWidget (datetime_en , 1 , 0 )
157
- self .addWidget (datetime , 1 , 1 )
162
+ self .layout . addWidget (datetime_en , 1 , 0 )
163
+ self .layout . addWidget (datetime , 1 , 1 )
158
164
159
165
if scheduling ["due_date" ] is None :
160
166
datetime .setDate (QtCore .QDate .currentDate ())
@@ -175,8 +181,8 @@ def update_datetime_en(checked):
175
181
datetime_en .stateChanged .connect (update_datetime_en )
176
182
177
183
pipeline_name = QtGui .QLineEdit ()
178
- self .addWidget (QtGui .QLabel ("Pipeline:" ), 1 , 2 )
179
- self .addWidget (pipeline_name , 1 , 3 )
184
+ self .layout . addWidget (QtGui .QLabel ("Pipeline:" ), 1 , 2 )
185
+ self .layout . addWidget (pipeline_name , 1 , 3 )
180
186
181
187
pipeline_name .setText (scheduling ["pipeline_name" ])
182
188
def update_pipeline_name (text ):
@@ -185,8 +191,8 @@ def update_pipeline_name(text):
185
191
186
192
priority = QtGui .QSpinBox ()
187
193
priority .setRange (- 99 , 99 )
188
- self .addWidget (QtGui .QLabel ("Priority:" ), 2 , 0 )
189
- self .addWidget (priority , 2 , 1 )
194
+ self .layout . addWidget (QtGui .QLabel ("Priority:" ), 2 , 0 )
195
+ self .layout . addWidget (priority , 2 , 1 )
190
196
191
197
priority .setValue (scheduling ["priority" ])
192
198
def update_priority (value ):
@@ -195,7 +201,7 @@ def update_priority(value):
195
201
196
202
flush = QtGui .QCheckBox ("Flush" )
197
203
flush .setToolTip ("Flush the pipeline before starting the experiment" )
198
- self .addWidget (flush , 2 , 2 , colspan = 2 )
204
+ self .layout . addWidget (flush , 2 , 2 , 1 , 2 )
199
205
200
206
flush .setChecked (scheduling ["flush" ])
201
207
def update_flush (checked ):
@@ -209,8 +215,8 @@ def update_flush(checked):
209
215
log_level .setToolTip ("Minimum level for log entry production" )
210
216
log_level_label = QtGui .QLabel ("Logging level:" )
211
217
log_level_label .setToolTip ("Minimum level for log message production" )
212
- self .addWidget (log_level_label , 3 , 0 )
213
- self .addWidget (log_level , 3 , 1 )
218
+ self .layout . addWidget (log_level_label , 3 , 0 )
219
+ self .layout . addWidget (log_level , 3 , 1 )
214
220
215
221
log_level .setCurrentIndex (log_levels .index (
216
222
log_level_to_name (options ["log_level" ])))
@@ -224,8 +230,8 @@ def update_log_level(index):
224
230
repo_rev_label = QtGui .QLabel ("Revision:" )
225
231
repo_rev_label .setToolTip ("Experiment repository revision "
226
232
"(commit ID) to use" )
227
- self .addWidget (repo_rev_label , 3 , 2 )
228
- self .addWidget (repo_rev , 3 , 3 )
233
+ self .layout . addWidget (repo_rev_label , 3 , 2 )
234
+ self .layout . addWidget (repo_rev , 3 , 3 )
229
235
230
236
if options ["repo_rev" ] is not None :
231
237
repo_rev .setText (options ["repo_rev" ])
@@ -243,7 +249,7 @@ def update_repo_rev(text):
243
249
submit .setShortcut ("CTRL+RETURN" )
244
250
submit .setSizePolicy (QtGui .QSizePolicy .Expanding ,
245
251
QtGui .QSizePolicy .Expanding )
246
- self .addWidget (submit , 1 , 4 , rowspan = 2 )
252
+ self .layout . addWidget (submit , 1 , 4 , 2 , 1 )
247
253
submit .clicked .connect (self .submit_clicked )
248
254
249
255
reqterm = QtGui .QPushButton ("Terminate instances" )
@@ -253,7 +259,7 @@ def update_repo_rev(text):
253
259
reqterm .setShortcut ("CTRL+BACKSPACE" )
254
260
reqterm .setSizePolicy (QtGui .QSizePolicy .Expanding ,
255
261
QtGui .QSizePolicy .Expanding )
256
- self .addWidget (reqterm , 3 , 4 )
262
+ self .layout . addWidget (reqterm , 3 , 4 )
257
263
reqterm .clicked .connect (self .reqterm_clicked )
258
264
259
265
def submit_clicked (self ):
@@ -287,7 +293,11 @@ async def _recompute_arguments_task(self):
287
293
288
294
self .argeditor .deleteLater ()
289
295
self .argeditor = _ArgumentEditor (self .manager , self , self .expurl )
290
- self .addWidget (self .argeditor , 0 , 0 , colspan = 5 )
296
+ self .layout .addWidget (self .argeditor , 0 , 0 , 1 , 5 )
297
+
298
+ def closeEvent (self , event ):
299
+ QtWidgets .QDockWidget .closeEvent (self , event )
300
+ self .sigClosed .emit ()
291
301
292
302
def save_state (self ):
293
303
return self .argeditor .save_state ()
@@ -297,11 +307,10 @@ def restore_state(self, state):
297
307
298
308
299
309
class ExperimentManager :
300
- def __init__ (self , status_bar , dock_area ,
310
+ def __init__ (self , main_window ,
301
311
explist_sub , schedule_sub ,
302
312
schedule_ctl , experiment_db_ctl ):
303
- self .status_bar = status_bar
304
- self .dock_area = dock_area
313
+ self .main_window = main_window
305
314
self .schedule_ctl = schedule_ctl
306
315
self .experiment_db_ctl = experiment_db_ctl
307
316
@@ -385,11 +394,12 @@ def get_submission_arguments(self, expurl):
385
394
def open_experiment (self , expurl ):
386
395
if expurl in self .open_experiments :
387
396
dock = self .open_experiments [expurl ]
388
- self . dock_area . floatDock ( dock )
397
+ dock . setFloating ( True )
389
398
return dock
390
399
dock = _ExperimentDock (self , expurl )
391
400
self .open_experiments [expurl ] = dock
392
- self .dock_area .floatDock (dock )
401
+ self .main_window .addDockWidget (QtCore .Qt .RightDockWidgetArea , dock )
402
+ dock .setFloating (True )
393
403
dock .sigClosed .connect (partial (self .on_dock_closed , expurl ))
394
404
return dock
395
405
@@ -398,7 +408,8 @@ def on_dock_closed(self, expurl):
398
408
399
409
async def _submit_task (self , * args ):
400
410
rid = await self .schedule_ctl .submit (* args )
401
- self .status_bar .showMessage ("Submitted RID {}" .format (rid ))
411
+ self .main_window .statusBar ().showMessage (
412
+ "Submitted RID {}" .format (rid ))
402
413
403
414
def submit (self , expurl ):
404
415
file , class_name , _ = self .resolve_expurl (expurl )
@@ -436,8 +447,9 @@ async def _request_term_multiple(self, rids):
436
447
rid , exc_info = True )
437
448
438
449
def request_inst_term (self , expurl ):
439
- self .status_bar .showMessage ("Requesting termination of all instances "
440
- "of '{}'" .format (expurl ))
450
+ self .main_window .statusBar ().showMessage (
451
+ "Requesting termination of all instances "
452
+ "of '{}'" .format (expurl ))
441
453
file , class_name , use_repository = self .resolve_expurl (expurl )
442
454
rids = []
443
455
for rid , desc in self .schedule .items ():
0 commit comments